diff --git a/src/ci/mcp/Tools.groovy b/src/ci/mcp/Tools.groovy
deleted file mode 100644
index 565232f..0000000
--- a/src/ci/mcp/Tools.groovy
+++ /dev/null
@@ -1,329 +0,0 @@
-package ci.mcp
-
-/**
-* Please do not add new functions to this file. Add them to corresponding
-* files in com/mirantis/mcp instead.
-**/
-
-/**
- * https://issues.jenkins-ci.org/browse/JENKINS-26481
- * fix groovy List.collect()
-**/
-@NonCPS
-def constructString(ArrayList options, String keyOption, String separator = " ") {
-  return options.collect{ keyOption + it }.join(separator).replaceAll("\n", "")
-}
-
-/**
- * Build command line options, e.g:
- *    cmd_opts=["a=b", "c=d", "e=f"]
- *    key = "--build-arg "
- *    separator = " "
- *    def options = getCommandBuilder(cmd_opts, key, separator)
- *    println options
- *    > --build-arg a=b --build-arg c=d --build-arg e=f
- *
- * @param options List of Strings (options that should be populated)
- * @param keyOption key that should be added before each option
- * @param separator Separator between key+Option pairs
- */
-def getCommandBuilder(ArrayList options, String keyOption, String separator = " ") {
-  return constructString(options, keyOption)
-}
-
-/**
-* Add LABEL to the end of the Dockerfile
-* User can also add some custom properties
-*
-* @param dockerfilePath is the path to Dockerfile, the default is ./Dockerfile
-* @param customProperties a Array of Strings that should be added to mandatory props
-*        in format ["prop1=value1", "prop2=value2"]
-**/
-def setDockerfileLabels(String dockerfilePath = "./Dockerfile", ArrayList customProperties = null){
-
-  if (!fileExists(dockerfilePath)){
-    throw new RuntimeException("Unable to add LABEL to Dockerfile, ${dockerfilePath} doesn't exists")
-  }
-  echo "Updating ${dockerfilePath}"
-
-  def namespace = "com.mirantis.image-specs."
-  def properties = [
-    "gerritProject=${env.GERRIT_PROJECT}",
-    "gerritChangeNumber=${env.GERRIT_CHANGE_NUMBER}",
-    "gerritPatchsetNumber=${env.GERRIT_PATCHSET_NUMBER}",
-    "gerritChangeId=${env.GERRIT_CHANGE_ID}",
-    "gerritPatchsetRevision=${env.GERRIT_PATCHSET_REVISION}"
-  ]
-
-  if (customProperties != null){
-    properties.addAll(customProperties)
-  }
-
-  def metadata = constructString(properties, namespace, " ")
-  sh """
-      cat <<EOF>> ${dockerfilePath}
-      # Apply additional build metadata
-      LABEL ${metadata}
-  """
-  return metadata
-}
-
-/**
-* Return string of mandatory build properties for binaries
-* User can also add some custom properties
-*
-* @param customProperties a Array of Strings that should be added to mandatory props
-*        in format ["prop1=value1", "prop2=value2"]
-**/
-def getBinaryBuildProperties(ArrayList customProperties) {
-
-  def namespace = "com.mirantis."
-  def properties = [
-    "gerritProject=${env.GERRIT_PROJECT}",
-    "gerritChangeNumber=${env.GERRIT_CHANGE_NUMBER}",
-    "gerritPatchsetNumber=${env.GERRIT_PATCHSET_NUMBER}",
-    "gerritChangeId=${env.GERRIT_CHANGE_ID}",
-    "gerritPatchsetRevision=${env.GERRIT_PATCHSET_REVISION}"
-  ]
-
-  if (customProperties){
-    properties.addAll(customProperties)
-  }
-
-  return constructString(properties, namespace, ";")
-}
-
-/**
- * Parse HEAD of current directory and return commit hash
- */
-def getGitCommit() {
-    git_commit = sh (
-        script: 'git rev-parse HEAD',
-        returnStdout: true
-    ).trim()
-    return git_commit
-}
-
-/**
- * Describe a commit using the most recent tag reachable from it
- */
-def getGitDescribe() {
-    git_commit = sh (
-        script: 'git describe --tags',
-        returnStdout: true
-    ).trim()
-    return git_commit
-}
-
-/**
- * Generate current timestamp
- *
- * @param format    Defaults to yyyyMMddHHmmss
- */
-def getDatetime(format="yyyyMMddHHmmss") {
-    def now = new Date();
-    return now.format(format, TimeZone.getTimeZone('UTC'));
-}
-
-/**
-* Get URL to artifact by properties
-* Returns String with URL to found artifact or null if nothing
-*
-* @param artifactoryURL String, an URL to Artifactory
-* @param properties LinkedHashMap, a Hash of properties (key-value) which
-*        which should determine artifact in Artifactory
-*/
-def uriByProperties(String artifactoryURL, LinkedHashMap properties) {
-    def key, value
-    def properties_str = ''
-    for ( int i = 0; i < properties.size(); i++ ) {
-        // avoid serialization errors
-        key = properties.entrySet().toArray()[i].key
-        value = properties.entrySet().toArray()[i].value
-        properties_str += "${key}=${value}&"
-    }
-    def search_url = "${artifactoryURL}/api/search/prop?${properties_str}"
-
-    def result = sh(script: "bash -c \"curl -X GET \'${search_url}\'\"",
-            returnStdout: true).trim()
-    def content = new groovy.json.JsonSlurperClassic().parseText(result)
-    def uri = content.get("results")
-    if ( uri ) {
-        return uri.last().get("uri")
-    } else {
-        return null
-    }
-}
-
-/**
-* Get URL to artifact by properties
-* Returns String with URL to found artifact or null if nothing
-*
-* @param artifactoryURL String, an URL to Artifactory
-* @param properties String, URI in format prop1=val1&prop2=val2&prop3val3
-*        which should determine artifact in Artifactory
-*/
-def uriByProperties(String artifactoryURL, String properties) {
-
-  def search_url = "${artifactoryURL}/api/search/prop?${properties}"
-
-  def result = sh(script: "bash -c \"curl -X GET \'${search_url}\'\"",
-          returnStdout: true).trim()
-  def content = new groovy.json.JsonSlurperClassic().parseText(result)
-  def uri = content.get("results")
-  if ( uri ) {
-      return uri.last().get("uri")
-  } else {
-      return null
-  }
-}
-
-/**
-* Set properties for artifact in Artifactory repo
-*
-* @param artifactUrl String, an URL to artifact in Artifactory repo
-* @param properties LinkedHashMap, a Hash of properties (key-value) which
-*        should be assigned for choosen artifact
-* @param recursive Boolean, if artifact_url is a directory, whether to set
-*        properties recursively or not
-*/
-def setProperties (String artifactUrl, LinkedHashMap properties, Boolean recursive=false) {
-    def properties_str = 'properties='
-    def key,value
-    if (recursive) {
-        recursive = 'recursive=1'
-    } else {
-        recursive = 'recursive=0'
-    }
-    for ( int i = 0; i < properties.size(); i++ ) {
-        // avoid serialization errors
-        key = properties.entrySet().toArray()[i].key
-        value = properties.entrySet().toArray()[i].value
-        properties_str += "${key}=${value}|"
-    }
-    def url = "${artifactUrl}?${properties_str}&${recursive}"
-    withCredentials([
-            [$class: 'UsernamePasswordMultiBinding',
-             credentialsId: 'artifactory',
-             passwordVariable: 'ARTIFACTORY_PASSWORD',
-             usernameVariable: 'ARTIFACTORY_LOGIN']
-    ]) {
-        sh "bash -c \"curl -X PUT -u ${ARTIFACTORY_LOGIN}:${ARTIFACTORY_PASSWORD} \'${url}\'\""
-    }
-}
-
-/**
-* Get properties for specified artifact in Artifactory
-* Returns LinkedHashMap of properties
-*
-* @param artifactUrl String, an URL to artifact in Artifactory repo
-*/
-def getPropertiesForArtifact(String artifactUrl) {
-    def url = "${artifactUrl}?properties"
-    def result
-    withCredentials([
-            [$class: 'UsernamePasswordMultiBinding',
-             credentialsId: 'artifactory',
-             passwordVariable: 'ARTIFACTORY_PASSWORD',
-             usernameVariable: 'ARTIFACTORY_LOGIN']
-    ]) {
-        result = sh(script: "bash -c \"curl -X GET -u ${ARTIFACTORY_LOGIN}:${ARTIFACTORY_PASSWORD} \'${url}\'\"",
-                returnStdout: true).trim()
-    }
-    def properties = new groovy.json.JsonSlurperClassic().parseText(result)
-    return properties.get("properties")
-}
-
-/**
-* Upload docker image to Artifactory
-*
-* @param artifactoryURL String, an URL to Artifactory
-* @param registry String, the name of Docker registry
-* @param image String, Docker image name
-* @param version String, Docker image version
-* @param repository String, The name of Artifactory Docker repository
-*/
-def uploadImageToArtifactory (String artifactoryURL, String registry, String image,
-                              String version, String repository) {
-    // TODO Switch to Artifactoy image' pushing mechanism once we will
-    // prepare automatical way for enabling artifactory build-proxy
-    //def artDocker
-    withCredentials([
-            [$class: 'UsernamePasswordMultiBinding',
-             credentialsId: 'artifactory',
-             passwordVariable: 'ARTIFACTORY_PASSWORD',
-             usernameVariable: 'ARTIFACTORY_LOGIN']
-    ]) {
-        sh ("docker login -u ${ARTIFACTORY_LOGIN} -p ${ARTIFACTORY_PASSWORD} ${registry}")
-        //artDocker = Artifactory.docker("${env.ARTIFACTORY_LOGIN}", "${env.ARTIFACTORY_PASSWORD}")
-    }
-
-    sh ("docker push ${registry}/${image}:${version}")
-    //artDocker.push("${registry}/${image}:${version}", "${repository}")
-    def image_url = "${artifactoryURL}/api/storage/${repository}/${image}/${version}"
-
-    def properties = ['com.mirantis.build_name':"${env.JOB_NAME}",
-                      'com.mirantis.build_id': "${env.BUILD_NUMBER}",
-                      'com.mirantis.changeid': "${env.GERRIT_CHANGE_ID}",
-                      'com.mirantis.patchset_number': "${env.GERRIT_PATCHSET_NUMBER}",
-                      'com.mirantis.target_tag': "${version}"]
-    setProperties(image_url, properties)
-}
-
-/**
-* Upload binaries to Artifactory
-*
-* @param server ArtifactoryServer, the instance of Artifactory server
-* @param buildInfo BuildInfo, the instance of a build-info object which can be published
-* @param uploadSpec String, a spec which is a JSON file that specifies which files should be
-*        uploaded or downloaded and the target path
-* @param publishInfo Boolean, whether publish a build-info object to Artifactory
-*/
-def uploadBinariesToArtifactory (server, buildInfo, String uploadSpec,
-                                 Boolean publishInfo=false) {
-    buildInfo.append(server.upload(uploadSpec))
-
-    if ( publishInfo ) {
-        buildInfo.env.capture = true
-        buildInfo.env.filter.addInclude("*")
-        buildInfo.env.filter.addExclude("*PASSWORD*")
-        buildInfo.env.filter.addExclude("*password*")
-        buildInfo.env.collect()
-        server.publishBuildInfo(buildInfo)
-    }
-}
-
-/**
-* Promote Docker image artifact to release repo
-*
-* @param artifactoryURL String, an URL to Artifactory
-* @param artifactoryDevRepo String, the source dev repository name
-* @param artifactoryProdRepo String, the target repository for the move or copy
-* @param dockerRepo String, the docker repository name to promote
-* @param artifactTag String, an image tag name to promote
-* @param targetTag String, target tag to assign the image after promotion
-* @param copy Boolean, an optional value to set whether to copy instead of move
-*        Default: false
-*/
-def promoteDockerArtifact(String artifactoryURL, String artifactoryDevRepo,
-                          String artifactoryProdRepo, String dockerRepo,
-                          String artifactTag, String targetTag, Boolean copy=false) {
-    def url = "${artifactoryURL}/api/docker/${artifactoryDevRepo}/v2/promote"
-    writeFile file: "query.json",
-              text: """{
-                  \"targetRepo\": \"${artifactoryProdRepo}\",
-                  \"dockerRepository\": \"${dockerRepo}\",
-                  \"tag\": \"${artifactTag}\",
-                  \"targetTag\" : \"${targetTag}\",
-                  \"copy\": \"${copy}\"
-              }""".stripIndent()
-    sh "cat query.json"
-    withCredentials([
-            [$class: 'UsernamePasswordMultiBinding',
-             credentialsId: 'artifactory',
-             passwordVariable: 'ARTIFACTORY_PASSWORD',
-             usernameVariable: 'ARTIFACTORY_LOGIN']
-    ]) {
-        sh "bash -c \"curl  -u ${ARTIFACTORY_LOGIN}:${ARTIFACTORY_PASSWORD} -H \"Content-Type:application/json\" -X POST -d @query.json ${url}\""
-    }
-}
diff --git a/src/ci/mcp/Tools.txt b/src/ci/mcp/Tools.txt
deleted file mode 100644
index 8229970..0000000
--- a/src/ci/mcp/Tools.txt
+++ /dev/null
@@ -1,218 +0,0 @@
-getBinaryBuildProperties
-------------------------
-
-1. getBinaryBuildProperties() should be used to define mandatory
-properties for binary artifact, which are:
-
-    "gerritProject=${env.GERRIT_PROJECT}",
-    "gerritChangeNumber=${env.GERRIT_CHANGE_NUMBER}",
-    "gerritPatchsetNumber=${env.GERRIT_PATCHSET_NUMBER}",
-    "gerritChangeId=${env.GERRIT_CHANGE_ID}",
-    "gitSha=${env.GERRIT_PATCHSET_REVISION}"
-
-2. User can add some custom properties, e.g:
-
-def properties = tools.getBinaryBuildProperties(
-   ["test=123",
-    "prop1=val1",
-     prop2=val2"
-   ])
-
-3. The resulting values will be the string in props format with
-namespace com.mirantis, e.g:
-
-  com.mirantis.gerritProject=asd;com.mirantis.gerritChangeNumber=123;com.mirantis.gerritChangeId=ddd
-
-4. How to use:
-
-    def tools = new ci.mcp.Tools()
-    ...
-    def buildInfo = Artifactory.newBuildInfo()
-    ...
-    def properties = tools.getBinaryBuildProperties()
-    ...
-    // Create the upload spec.
-    def uploadSpec = """{
-        "files": [
-                {
-                    "pattern": "**",
-                    "target": "some/target",
-                    "props": "${properties}"
-                }
-            ]
-        }"""
-    server.upload(uploadSpec, buildInfo)
-    server.publishBuildInfo buildInfo
-
-
-setDockerfileLabels
--------------------
-// simple usage, which adds mandatory properties to Dockerfile which is
-// located in current directory
-tools.setDockerfileLabels()
-
-// extended usage
-// add Labels to calico ctl and node images
-  def properties = [
-    "CALICO_NODE_IMAGE_REPO=${calicoNodeImageRepo}",
-    "CALICOCTL_IMAGE_REPO=${calicoCtlImageRepo}",
-    "CALICO_VERSION=${calicoVersion}"
-  ]
-  tools.setDockerfileLabels("./calicoctl/Dockerfile", properties)
-  tools.setDockerfileLabels("./calico_node/Dockerfile", properties)
-
-
-
-uriByProperties
----------------
-
-1. uriByProperties() should be used to get URL for some artifact
-with specified properties, like:
-
-    "gerritChangeId=${env.GERRIT_CHANGE_ID}",
-    "gerritPatchsetNumber=${env.GERRIT_PATCHSET_NUMBER}"
-
-2. Also can be used custom user' properties.
-
-3. The resulting value will be the string in URL format, e.g:
-
-    "https://ci.mcp-ci.local/artifactory/mcp-k8s-ci/images-info/conformance_image_v1.4.1-5_1476965708283.yaml"
-
-4. How to use:
-
-    def tools = new ci.mcp.Tools()
-    ...
-    def properties = ['com.mirantis.changeid': "${env.GERRIT_CHANGE_ID}",
-                      'com.mirantis.patchset_number': "${env.GERRIT_PATCHSET_NUMBER}" ]
-    def artifact_uri = tools.uriByProperties(properties)
-
-5. Important notes:
-
-    - if specified properties are set for few artifacts will be taken last.
-
-
-setProperties
--------------
-
-1. setProperties() should be used to set some properties to specified artifact in repo, like:
-
-    "gerritChangeId=${env.GERRIT_CHANGE_ID}",
-    "gerritPatchsetNumber=${env.GERRIT_PATCHSET_NUMBER}"
-
-2. How to use:
-
-    def tools = new ci.mcp.Tools()
-    ...
-    def artifact_url = "${env.ARTIFACTORY_URL}/api/storage/${repository}/${tag}/${version}"
-    // for example: https://ci.mcp-ci.local/artifactory/api/storage/mcp-k8s-local/hyperkube-amd64/v1.4.1-5
-    def properties = ['com.mirantis.build_name':"${env.JOB_NAME}",
-                      'com.mirantis.build_id': "${env.BUILD_NUMBER}",
-                      'com.mirantis.changeid': "${env.GERRIT_CHANGE_ID}",
-                      'com.mirantis.patchset_number': "${env.GERRIT_PATCHSET_NUMBER}"]
-
-    tools.setProperties(artifact_url, properties)
-
-3. As result provided artifact in repo will be tagged by specified properties.
-
-
-getPropertiesForArtifact
-------------------------
-
-1. getPropertiesForArtifact() should be used to get properties for specified artifact in repo, like:
-
-    "https://ci.mcp-ci.local:443/artifactory/api/storage/mcp-k8s-ci/hyperkube-amd64/v1.4.1-5"
-
-2. As a result will be returned LinkedHashMap of properties for specified artifact URL.
-
-3. How to use:
-
-    def tools = new ci.mcp.Tools()
-    ...
-    //
-    def artifact_url = "${env.ARTIFACTORY_URL}/api/storage/${repository}/${tag}"
-    def properties = tools.getPropertiesForArtifact(artifact_url)
-
-4. Important notes:
-
-    - will be returned LinkedHashMap of properties key-value pairs. Each value is an Array by default,
-      because each key can have few values.
-    - each key is available by get() method.
-
-
-uploadImageToArtifactory
-------------------------
-
-1. uploadImageToArtifactory() should be used to upload Docker image to Artifactory.
-
-2. How to use:
-
-    def tools = new ci.mcp.Tools()
-    ...
-    // Docker registry for binaries and images
-    def docker_registry = 'ci.mcp-ci.local:5001'
-    def docker_image_name = 'hyperkube-amd64'
-    def docker_image_version = 'some_version'
-    def docker_repo = 'mcp-ci-local'
-    ...
-    <docker build steps>
-    ...
-    tools.uploadImageToArtifactory(docker_registry, docker_image_name, docker_image_version, docker_repo)
-
-3. As a result specified image will be pushed to artifactory docker repo.
-
-
-uploadBinariesToArtifactory
----------------------------
-
-1. uploadBinariesToArtifactory() should be used to upload binaries to Artifactory, like:
-
-    - some executive binaries, which were built during job execution;
-    - *.yml files, etc.
-
-2. How to use:
-
-    def tools = new ci.mcp.Tools()
-    ...
-    def server = Artifactory.server('mcp-ci')
-    def buildInfo = Artifactory.BuildInfo()
-    ...
-    def uploadSpec = """{
-        "files": [
-            {
-                "pattern": "hyperkube*.yaml",
-                "target": "${artifactory_dev_repo}/images-info/"
-            },
-            {
-                "pattern": "artifacts/hyperkube**",
-                "target": "${artifactory_dev_repo}/hyperkube-binaries/"
-            }
-        ]
-    }"""
-    tools.uploadBinariesToArtifactory(server, buildInfo, uploadSpec)
-
-
-promoteDockerArtifact
----------------------
-
-1. promoteDockerArtifact() should be used to promote docker image to production repo,
-because native promotion mechanism is not allow to do it due to Artifactory bug.
-
-2. How to use:
-
-    def tools = new ci.mcp.Tools()
-    ...
-    def artifactory_dev_repo = 'docker-local'
-    def artifactory_prod_repo = 'docker-prod'
-    def docker_repo = 'hyperkube-amd64'
-    ...
-    // functions above shall be used
-    <getting all tag's and artifact's information>
-    ...
-    def artifactImageTag = 'v1.4.0-XXXX'
-    def targetArtifactImageTag = 'v1.4.0'
-    ...
-    tools.promoteDockerArtifact(artifactory_dev_repo,
-                                artifactory_prod_repo,
-                                docker_repo,
-                                artifactImageTag,
-                                targetArtifactImageTag)
\ No newline at end of file
