diff --git a/src/com/mirantis/mk/ReleaseWorkflow.groovy b/src/com/mirantis/mk/ReleaseWorkflow.groovy
index 8fe21ae..5d54776 100644
--- a/src/com/mirantis/mk/ReleaseWorkflow.groovy
+++ b/src/com/mirantis/mk/ReleaseWorkflow.groovy
@@ -1,5 +1,4 @@
 package com.mirantis.mk
-
 /**
  * ReleaseWorkflow functions
  *
@@ -10,92 +9,79 @@
  *
  * @param key metadata key
  * @param value metadata value
- * @param image image name
- * @param imageRelease image release name
+ * @param params string map with credentialsID, metadataRepoUrl, metadataGerritBranch and crTopic
  */
 
-def updateReleaseMetadata(key, value, image, imageRelease){
+def updateReleaseMetadata(key, value, String[] params) {
+    credentialsID = params['credentialsID'] ?: "mcp-ci-gerrit"
+    metadataRepoUrl = params['metadataRepoUrl'] ?: "ssh://mcp-ci-gerrit@gerrit.mcp.mirantis.net:29418/mcp/release-matadata"
+    metadataGerritBranch = params['metadataGerritBranch'] ?: "master"
+    crTopic = params['crTopic'] ?: ""
     def python = new com.mirantis.mk.Python()
     def gerrit = new com.mirantis.mk.Gerrit()
     def git = new com.mirantis.mk.Git()
     def changeAuthorName = "MCP-CI"
     def changeAuthorEmail = "mcp-ci-jenkins@ci.mcp.mirantis.net"
-    def cred = common.getCredentials(env["CREDENTIALS_ID"], 'key')
+    def cred = common.getCredentials(credentialsID, 'key')
     String gerritUser = cred.username
-    def gerritHost = env["METADATA_REPO_URL.tokenize"]('@')[-1].tokenize(':')[0]
-    def metadataProject = env["METADATA_REPO_URL"].tokenize('/')[-2..-1].join('/')
-    def gerritPort = env["METADATA_REPO_URL"].tokenize(':')[-1].tokenize('/')[0]
+    def gerritHost = metadataRepoUrl.tokenize('@')[-1].tokenize(':')[0]
+    def metadataProject = metadataRepoUrl.tokenize('/')[-2..-1].join('/')
+    def gerritPort = metadataRepoUrl.tokenize(':')[-1].tokenize('/')[0]
     def workspace = common.getWorkspace()
     def venvDir = "${workspace}/gitreview-venv"
     def repoDir = "${venvDir}/repo"
     def metadataDir = "${repoDir}/metadata"
-    def imageChangeId
+    def ChangeId
     def commitMessage
     def gitRemote
-    if (env["RELEASE_METADATA_CR"].toBoolean()) {
-        stage("Installing virtualenv") {
-            python.setupVirtualenv(venvDir, 'python3', ['git-review', 'PyYaml'])
+    stage("Installing virtualenv") {
+        python.setupVirtualenv(venvDir, 'python3', ['git-review', 'PyYaml'])
+    }
+    stage('Cleanup repo dir') {
+        dir(repoDir) {
+            deleteDir()
         }
-
-        stage('Cleanup repo dir') {
-            dir(repoDir) {
-                deleteDir()
-            }
+    }
+    stage('Cloning release-metadata repository') {
+        git.checkoutGitRepository(repoDir, metadataRepoUrl, metadataGerritBranch, credentialsID, true, 10, 0)
+        dir(repoDir) {
+            gitRemote = sh(
+                    script:
+                            'git remote -v | head -n1 | cut -f1',
+                    returnStdout: true,
+            ).trim()
         }
-        stage('Cloning release-metadata repository') {
-            git.checkoutGitRepository(repoDir, env["METADATA_REPO_URL"], env["METADATA_GERRIT_BRANCH"], env["CREDENTIALS_ID"], true, 10, 0)
-            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(credentialsID, gerritAuth, changeParams)
+        git.changeGitBranch(repoDir, metadataGerritBranch)
+        if (gerritChange) {
+            def jsonChange = readJSON text: gerritChange
+            changeNum = jsonChange['number']
+            ChangeId = 'Change-Id: '
+            ChangeId += jsonChange['id']
+            //get existent change from gerrit
+            gerrit.getGerritChangeByNum(credentialsID, venvDir, repoDir, gitRemote, changeNum)
+        } else {
+            ChangeId = ''
+            git.createGitBranch(repoDir, crTopic)
         }
-        stage('Creating CRs') {
-            for (openstackRelease in resultBuiltImages.keySet()) {
-                def crTopic = "nightly_update_images_" + openstackRelease
-                //Check if CR already exist
+        cmdText = "python ${repoDir}/utils/app.py --path ${metadataDir} update --key ${key} --value ${value}"
+        python.runVirtualenvCommand(venvDir, cmdText)
+        commitMessage =
+                """[oscore] Auto-update ${metadataProject}
 
-                def gerritAuth = ['PORT': gerritPort, 'USER': gerritUser, 'HOST': gerritHost]
-                def changeParams = ['owner': gerritUser, 'status': 'open', 'project': metadataProject, 'branch': env["METADATA_GERRIT_BRANCH"], 'topic': crTopic]
-                def gerritChange = gerrit.findGerritChange(env["CREDENTIALS_ID"], gerritAuth, changeParams)
-
-                git.changeGitBranch(repoDir, env["METADATA_GERRIT_BRANCH"])
-                if (gerritChange) {
-                    def jsonChange = readJSON text: gerritChange
-                    changeNum = jsonChange['number']
-                    imageChangeId = 'Change-Id: '
-                    imageChangeId += jsonChange['id']
-                    //get existent change from gerrit
-                    gerrit.getGerritChangeByNum(env["CREDENTIALS_ID"], venvDir, repoDir, gitRemote, changeNum)
-                } else {
-                    imageChangeId = ''
-                    git.createGitBranch(repoDir, crTopic)
-                }
-
-                for (component in resultBuiltImages[openstackRelease].keySet()) {
-                    resultBuiltImages[openstackRelease][component].each {
-                        cmdText = "python ${repoDir}/utils/app.py --path ${metadataDir} update --key images:${image}:${imageRelease}:${component}:${key} --value ${value}"
-                        python.runVirtualenvCommand(venvDir, cmdText)
-                    }
-                }
-
-                commitMessage =
-                        """[oscore] Auto-update ${metadataProject}
-
-               |${imageChangeId}
+               |${ChangeId}
             """.stripMargin()
-                //commit change
-                if (gerritChange) {
-                    git.commitGitChanges(repoDir, commitMessage, changeAuthorEmail, changeAuthorName, false, true)
-                } else {
-                    git.commitGitChanges(repoDir, commitMessage, changeAuthorEmail, changeAuthorName, false)
-                }
-                //post change
-                gerrit.postGerritReview(CREDENTIALS_ID, venvDir, repoDir, changeAuthorName, changeAuthorEmail, gitRemote, crTopic, METADATA_GERRIT_BRANCH)
-
-            }
+        //commit change
+        if (gerritChange) {
+            git.commitGitChanges(repoDir, commitMessage, changeAuthorEmail, changeAuthorName, false, true)
+        } else {
+            git.commitGitChanges(repoDir, commitMessage, changeAuthorEmail, changeAuthorName, false)
         }
+        //post change
+        gerrit.postGerritReview(credentialsID, venvDir, repoDir, changeAuthorName, changeAuthorEmail, gitRemote, crTopic, metadataGerritBranch)
     }
 }
\ No newline at end of file
