diff --git a/src/com/mirantis/mcp-qa/Common.groovy b/src/com/mirantis/mcp-qa/Common.groovy
new file mode 100644
index 0000000..72842d2
--- /dev/null
+++ b/src/com/mirantis/mcp-qa/Common.groovy
@@ -0,0 +1,99 @@
+package com.mirantis.mcp-qa
+
+/**
+ * Get latest artifacts
+ * @param imageRepoName is the repo name where image is located
+ * @param imageTagName is the name of the image tag to be used
+ */
+
+def getLatestArtifacts(imageRepoName, imageTagName) {
+    def imageRepo = env.getAt(imageRepoName)
+    def imageTag = env.getAt(imageTagName)
+    if ( imageTag != null && (! imageTag || imageTag.equals('latest')) ) {
+        if ( imageRepo ) {
+            def registry = imageRepo.replaceAll(/\/.*/, '')
+            def image = imageRepo.minus(registry + '/')
+            def hyperkubeImageTag = latestImageTagLookup(registry, image)
+            return "${imageTagName}=${hyperkubeImageTag}"
+        } else {
+            echo "${imageRepoName} variable isn't set, can't inspect 'latest' image!"
+            return null
+        }
+    }
+}
+
+def jsonParse(def json) {
+    new groovy.json.JsonSlurperClassic().parseText(json)
+}
+
+/**
+ * Get digest metadata
+ * @param tag is the image tag to be used
+ * @param registry is the url of registry
+ * @param image is the image which info is looked for
+ */
+
+def get_digest(def tag, def registry, def image) {
+    def digest_link = sprintf('https://%1$s/v2/%2$s/manifests/%3$s', [registry, image, tag])
+    def digest_url = new URL(digest_link)
+    def connection = digest_url.openConnection()
+    connection.setRequestProperty('Accept', 'application/vnd.docker.distribution.manifest.v2+json')
+    def digest = connection.getHeaderField("Docker-Content-Digest")
+    return digest
+}
+
+/**
+ * Get latest tag metadata
+ * @param registry is the url of registry
+ * @param image is the image which tags are looked for
+ */
+
+def latestImageTagLookup(registry, image) {
+    def tags_link = sprintf('https://%1$s/v2/%2$s/tags/list', [registry, image])
+    def tags_url = new URL(tags_link)
+    def tags = jsonParse(tags_url.getText())['tags']
+    def latest_digest = get_digest('latest', registry, image)
+    def same_digest_tags = []
+
+    for (tag in tags) {
+        if (tag == 'latest') {
+            continue
+        }
+        if (get_digest(tag, registry, image) == latest_digest) {
+            same_digest_tags<< tag
+        }
+    }
+
+    return same_digest_tags[0] ?: 'latest'
+}
+
+
+/**
+ * Fetch custom refs
+ * @param gerritUrl is url of gerrit
+ * @param project is the name of project in gerrit
+ * @param targetDir is dir where to fetch changes
+ * @param refs is refs that need to be fetched
+ */
+
+def getCustomRefs(gerritUrl, project, targetDir, refs) {
+    def remote = "${gerritUrl}/${project}"
+    dir(targetDir) {
+        for(int i=0; i<refs.size(); i++) {
+            sh "git fetch ${remote} ${refs[i]} && git checkout FETCH_HEAD"
+        }
+    }
+}
+
+/**
+ * Set downstream k8s artifacts
+ * @param jobSetParameters are current job parameters that can be extended with kubernetes tag
+ */
+
+def set_downstream_k8s_artifacts(jobSetParameters) {
+    def k8sTag = getLatestArtifacts('HYPERKUBE_IMAGE_REPO', 'HYPERKUBE_IMAGE_TAG')
+    if (k8sTag) {
+        jobSetParameters.add(k8sTag)
+    }
+    return jobSetParameters
+}
diff --git a/src/com/mirantis/mcp-qa/EnvActions.groovy b/src/com/mirantis/mcp-qa/EnvActions.groovy
new file mode 100644
index 0000000..03a6a1b
--- /dev/null
+++ b/src/com/mirantis/mcp-qa/EnvActions.groovy
@@ -0,0 +1,34 @@
+package com.mirantis.mcp-qa
+
+/**
+ * Activate virtual environment and check k8s deployer is specified
+ */
+
+def prepareEnv() {
+    sh '''
+        if [ ! -r "${VENV_PATH}/bin/activate" ]; then
+            echo 'Python virtual environment not found! Set correct VENV_PATH!'
+            exit 1
+        fi
+    '''
+
+    sh '''
+        if [ ! -r "${WORKSPACE}/fuel-ccp-installer/${DEPLOY_SCRIPT_REL_PATH}" ]; then
+            echo "Deploy script \"${DEPLOY_SCRIPT_REL_PATH}\" not found in" \
+            "\"${WORKSPACE}/fuel-ccp-installer/\"!"
+        fi
+    '''
+}
+
+/**
+ * Destroy running environment
+ */
+
+def destroyEnv() {
+    if ( !(env.KEEP_BEFORE.equals('yes') || env.KEEP_BEFORE.equals('true')) ) {
+        sh '''
+            . ${VENV_PATH}/bin/activate
+            dos.py destroy ${ENV_NAME} || true
+        '''
+    }
+}
diff --git a/src/com/mirantis/mcp-qa/RunTest.groovy b/src/com/mirantis/mcp-qa/RunTest.groovy
new file mode 100644
index 0000000..a12d0ea
--- /dev/null
+++ b/src/com/mirantis/mcp-qa/RunTest.groovy
@@ -0,0 +1,34 @@
+package com.mirantis.mcp-qa
+
+/**
+ * Run mcp-qa test by specified group
+ * @param testGroup defines what tests to run, options are '-m test_mark', '-k test_expression'
+ * @param jobSetParameters is additional params needed to run mcp-qa test
+ */
+
+def runTest(testGroup, jobSetParameters) {
+    def testArgs = [ '-s', '-ra' ]
+    testArgs.add(testGroup)
+    jobSetParameters.add("TEST_ARGS=${testArgs.join(' ')}")
+    echo("The current tags, args, which were set by job: ${jobSetParameters.join(' ')}")
+    withEnv(jobSetParameters) {
+        sh '''\
+            . ${VENV_PATH}/bin/activate
+            exit_code=0
+            export IMAGE_PATH=$(readlink -f "${IMAGE_PATH}")
+            if ! py.test ${TEST_ARGS}; then
+            exit_code=1
+            fi
+            # erase environment if test passed and KEEP_AFTER isn't set to 'yes' or 'true'
+            if [ ${exit_code} -eq 0 ]; then
+            if ! [[ "${KEEP_AFTER}" == "yes" || "${KEEP_AFTER}" == "true" ]]; then
+            dos.py erase "${ENV_NAME}" || true
+            fi
+            fi
+            if [ ${exit_code} -gt 0 ]; then
+            echo "Tests failed!"
+            exit 1
+            fi
+            '''.stripIndent()
+    }
+}
