diff --git a/src/com/mirantis/mk/KaasReleaseWorkflow.groovy b/src/com/mirantis/mk/KaasReleaseWorkflow.groovy
new file mode 100644
index 0000000..6cc39e3
--- /dev/null
+++ b/src/com/mirantis/mk/KaasReleaseWorkflow.groovy
@@ -0,0 +1,160 @@
+package com.mirantis.mk
+/**
+ * Checkout KaaS release metadata repo with clone or without, if cloneRepo parameter is set
+ *
+ * @param params map with expected parameters:
+ *    - metadataCredentialsId
+ *    - metadataGitRepoUrl
+ *    - metadataGitRepoBranch
+ *    - repoDir
+ *    - cloneRepo
+ */
+def checkoutKaasReleaseMetadataRepo(Map params = [:]) {
+    def git = new com.mirantis.mk.Git()
+
+    String gitCredentialsId = params.get('metadataCredentialsId', 'mcp-ci-gerrit')
+    String gitUrl           = params.get('metadataGitRepoUrl', "ssh://${gitCredentialsId}@gerrit.mcp.mirantis.net:29418/kaas/releases")
+    String gitBranch        = params.get('metadataGitRepoBranch', 'master')
+    String gitRef           = params.get('metadataGitRepoRef', 'HEAD')
+    String repoDir          = params.get('repoDir', 'releases')
+    Boolean cloneRepo       = params.get('cloneRepo', true)
+    if (cloneRepo) {
+        stage('Cleanup repo dir') {
+            dir(repoDir) {
+                deleteDir()
+            }
+        }
+        stage('Cloning artifact-metadata repository') {
+            git.checkoutGitRepository(repoDir, gitUrl, gitBranch, gitCredentialsId, true, 10, 0, gitRef)
+        }
+    } else {
+        git.changeGitBranch(repoDir, gitRef ?: gitBranch)
+    }
+}
+
+
+/**
+ * Update KaaS release metadata value and upload CR to release metadata repository
+ *
+ * @param key metadata key (Several keys could be passed joined by ';' character)
+ * @param value metadata value (Several values could be passed joined by ';' character)
+ * @param params map with expected parameters:
+ *    - metadataCredentialsId
+ *    - metadataGitRepoUrl
+ *    - metadataGitRepoBranch
+ *    - repoDir
+ *    - comment
+ *    - crTopic
+ *    - crAuthorName
+ *    - crAuthorEmail
+ *    - kaasMetadataFileToUpdate
+ */
+
+def updateKaasReleaseMetadata(String key, String value, Map params) {
+    String gitCredentialsId     = params.get('metadataCredentialsId', 'mcp-ci-gerrit')
+    String metadataRepoUrl      = params.get('metadataGitRepoUrl', "ssh://${gitCredentialsId}@gerrit.mcp.mirantis.net:29418/kaas/releases")
+    String metadataGerritBranch = params.get('metadataGitRepoBranch', 'master')
+    String repoDir              = params.get('repoDir', 'releases')
+    String comment              = params.get('comment', '')
+    String crTopic              = params.get('crTopic', '')
+    String changeAuthorName     = params.get('crAuthorName', 'MCP-CI')
+    String changeAuthorEmail    = params.get('crAuthorEmail', 'mcp-ci-jenkins@ci.mcp.mirantis.net')
+    String fileToUpdatePath     = params.get('kaasMetadataFileToUpdatePath', '')
+    String updateChartVersion   = params.get('kaasMetadataUpdateChartVersion', '1')
+    String updateTagVersion     = params.get('kaasMetadataUpdateTagVersion', '1')
+
+    def common = new com.mirantis.mk.Common()
+    def python = new com.mirantis.mk.Python()
+    def gerrit = new com.mirantis.mk.Gerrit()
+    def git    = new com.mirantis.mk.Git()
+
+    def cred = common.getCredentials(gitCredentialsId, 'key')
+    String gerritUser = cred.username
+    String gerritHost = metadataRepoUrl.tokenize('@')[-1].tokenize(':')[0]
+    String metadataProject = metadataRepoUrl.tokenize('/')[-2..-1].join('/')
+    String gerritPort = metadataRepoUrl.tokenize(':')[-1].tokenize('/')[0]
+    String workspace = common.getWorkspace()
+    String venvDir = "${workspace}/gitreview-venv"
+    String ChangeId
+    String commitMessage
+    String gitRemote
+    stage("Installing virtualenv") {
+        python.setupVirtualenv(venvDir, 'python3', ['git-review'])
+    }
+    checkoutKaasReleaseMetadataRepo(params)
+    dir(repoDir) {
+        gitRemote = sh(
+            script:
+                'git remote -v | head -n1 | cut -f1',
+                returnStdout: true,
+        ).trim()
+    }
+
+    stage('Creating CR') {
+        def gerritAuth = ['PORT': gerritPort, 'USER': gerritUser, 'HOST': gerritHost]
+        def changeParams = ['owner': gerritUser, 'status': 'open', 'project': metadataProject, 'branch': metadataGerritBranch, 'topic': crTopic]
+        def gerritChange = gerrit.findGerritChange(gitCredentialsId, gerritAuth, changeParams)
+        git.changeGitBranch(repoDir, metadataGerritBranch)
+        if (gerritChange) {
+            def jsonChange = readJSON text: gerritChange
+            changeNum = jsonChange['number']
+            ChangeId = 'Change-Id: '
+            ChangeId += jsonChange['id']
+        } else {
+            ChangeId = ''
+            git.createGitBranch(repoDir, crTopic)
+        }
+
+        def keyArr = key.split(';')
+        def valueArr = value.split(';')
+        if (keyArr.size() == valueArr.size()) {
+            for (i in 0..keyArr.size()-1) {
+                common.infoMsg("Setting ${keyArr[i]} version to: ${valueArr[i]}")
+                sh '''set +x
+                tmpfile=\$(mktemp kaas_tmp_file.XXXXXX)
+                trap "rm -f \$tmpfile" 1 2 3 6
+
+                awk \
+                  -v key_name='''+keyArr[i]+''' \
+                  -v key_ver='''+valueArr[i]+''' \
+                  -v update_chart_version='''+updateChartVersion+''' \
+                  -v update_tag_version='''+updateTagVersion+''' '
+BEGIN {
+    match_found = 0;
+}
+
+// {
+if ($0 ~ "^\\\\s+- name: "key_name) {
+    match_found = 1;
+    print $0;
+    next;
+}
+if ($0 ~ /^\\s+- name: /) {
+    match_found = 0;
+}
+if (update_chart_version && match_found && $0 ~ /^\\s+version: /) {
+    print gensub(/(\\s+version:).*/,"\\\\1 "key_ver,1,$0);
+    next;
+}
+if (update_tag_version && match_found && $0 ~ /^\\s+tag: /) {
+    print gensub(/(\\s+tag:).*/,"\\\\1 "key_ver,1,$0);
+    next;
+}
+print $0
+}' '''+repoDir+'/'+fileToUpdatePath+''' > "\$tmpfile"
+                mv "\${tmpfile}" '''+repoDir+'/'+fileToUpdatePath+'''
+                '''
+            }
+        }
+
+        commitMessage =
+                """${comment}
+
+               |${ChangeId}
+            """.stripMargin()
+        //commit change
+        git.commitGitChanges(repoDir, commitMessage, changeAuthorEmail, changeAuthorName, false)
+        //post change
+        gerrit.postGerritReview(gitCredentialsId, venvDir, repoDir, changeAuthorName, changeAuthorEmail, gitRemote, crTopic, metadataGerritBranch)
+    }
+}
