diff --git a/src/com/mirantis/mk/Gerrit.groovy b/src/com/mirantis/mk/Gerrit.groovy
index 6de6b1d..7cbd1fd 100644
--- a/src/com/mirantis/mk/Gerrit.groovy
+++ b/src/com/mirantis/mk/Gerrit.groovy
@@ -1,5 +1,6 @@
 package com.mirantis.mk
 
+import java.util.regex.Pattern
 /**
  * Gerrit functions
  *
@@ -13,6 +14,7 @@
  *          - credentialsId, id of user which should make checkout
  *          - withMerge, prevent detached mode in repo
  *          - withWipeOut, wipe repository and force clone
+ * @return boolean result
  *
  * Usage example:
  * //anonymous gerrit checkout
@@ -42,47 +44,38 @@
     def depth = config.get('depth', 0)
     def timeout = config.get('timeout', 20)
 
-    // default parameters
-    def scmExtensions = [
-        [$class: 'CleanCheckout'],
-        [$class: 'BuildChooserSetting', buildChooser: [$class: 'GerritTriggerBuildChooser']],
-        [$class: 'CheckoutOption', timeout: timeout],
-        [$class: 'CloneOption', depth: depth, noTags: false, reference: '', shallow: depth > 0, timeout: timeout]
-    ]
-    def scmUserRemoteConfigs = [
-        name: 'gerrit',
-        refspec: gerritRefSpec
-    ]
+    if(_validGerritConfig(config)){
+        // default parameters
+        def scmExtensions = [
+            [$class: 'CleanCheckout'],
+            [$class: 'BuildChooserSetting', buildChooser: [$class: 'GerritTriggerBuildChooser']],
+            [$class: 'CheckoutOption', timeout: timeout],
+            [$class: 'CloneOption', depth: depth, noTags: false, reference: '', shallow: depth > 0, timeout: timeout]
+        ]
+        def scmUserRemoteConfigs = [
+            name: 'gerrit',
+            refspec: gerritRefSpec
+        ]
 
-    if (credentials == '') {
-        // then try to checkout in anonymous mode
-        scmUserRemoteConfigs.put('url',"${gerritScheme}://${gerritHost}/${gerritProject}")
-    } else {
-        // else use ssh checkout
-        scmUserRemoteConfigs.put('url',"ssh://${gerritName}@${gerritHost}:${gerritPort}/${gerritProject}.git")
-        scmUserRemoteConfigs.put('credentialsId',credentials)
-    }
+        if (credentials == '') {
+            // then try to checkout in anonymous mode
+            scmUserRemoteConfigs.put('url',"${gerritScheme}://${gerritHost}/${gerritProject}")
+        } else {
+            // else use ssh checkout
+            scmUserRemoteConfigs.put('url',"ssh://${gerritName}@${gerritHost}:${gerritPort}/${gerritProject}.git")
+            scmUserRemoteConfigs.put('credentialsId',credentials)
+        }
 
-    // if we need to "merge" code from patchset to GERRIT_BRANCH branch
-    if (merge) {
-        scmExtensions.add([$class: 'LocalBranch', localBranch: "${gerritBranch}"])
-    }
-    // we need wipe workspace before checkout
-    if (wipe) {
-        scmExtensions.add([$class: 'WipeWorkspace'])
-    }
+        // if we need to "merge" code from patchset to GERRIT_BRANCH branch
+        if (merge) {
+            scmExtensions.add([$class: 'LocalBranch', localBranch: "${gerritBranch}"])
+        }
+        // we need wipe workspace before checkout
+        if (wipe) {
+            scmExtensions.add([$class: 'WipeWorkspace'])
+        }
 
-    if (path == "") {
-        checkout(
-            scm: [
-                $class: 'GitSCM',
-                branches: [[name: "${gerritBranch}"]],
-                extensions: scmExtensions,
-                userRemoteConfigs: [scmUserRemoteConfigs]
-            ]
-        )
-    } else {
-        dir(path) {
+        if (path == "") {
             checkout(
                 scm: [
                     $class: 'GitSCM',
@@ -91,6 +84,52 @@
                     userRemoteConfigs: [scmUserRemoteConfigs]
                 ]
             )
+        } else {
+            dir(path) {
+                checkout(
+                    scm: [
+                        $class: 'GitSCM',
+                        branches: [[name: "${gerritBranch}"]],
+                        extensions: scmExtensions,
+                        userRemoteConfigs: [scmUserRemoteConfigs]
+                    ]
+                )
+            }
         }
+        return true
     }
+    return false
+}
+/**
+ * Execute git clone and checkout stage from gerrit review
+ *
+ * @param gitUrl git url with scheme
+ *    "${GERRIT_SCHEME}://${GERRIT_NAME}@${GERRIT_HOST}:${GERRIT_PORT}/${GERRIT_PROJECT}.git
+ * @param gitRef git ref spec
+ * @return boolean result
+ */
+def gerritPatchsetCheckout(gitUrl, gitRef) {
+    def gitUrlPattern = Pattern.compile("(.+):\\/\\/(.+)@(.+):(.+)\\/(.+)")
+    def gitUrlMatcher = gitUrlPattern.matcher(gitUrl)
+    if(gitUrlMatcher.find()){
+        gerritPatchsetCheckout([
+          credentialsId : CREDENTIALS_ID,
+          gerritRefSpec: gitRef,
+          gerritScheme: gitUrlMatcher.group(1),
+          gerritName: gitUrlMatcher.group(2),
+          gerritHost: gitUrlMatcher.group(3),
+          gerritPort: gitUrlMatcher.group(4),
+          gerritProject: gitUrlMatcher.group(5)
+        ])
+        return true
+    }
+    return false
+}
+
+def _validGerritConfig(LinkedHashMap config){
+    return config.get("gerritScheme","") != "" &&
+           config.get("gerritName","") != "" &&
+           config.get("gerritHost","") != "" &&
+           config.get("gerritPort","") != "" &&
+           config.get("gerritProject","") != ""
 }
\ No newline at end of file
