diff --git a/src/com/mirantis/mk/Aptly.groovy b/src/com/mirantis/mk/Aptly.groovy
index ddbe4fd..c5aaca0 100644
--- a/src/com/mirantis/mk/Aptly.groovy
+++ b/src/com/mirantis/mk/Aptly.groovy
@@ -157,3 +157,130 @@
     writeFile(file: "tmpFile", text: publish)
     sh("aptly-publisher restore --url ${server} --restore-file tmpFile --components ${components} ${opts}")
 }
+
+/**
+ * The function return name of the snapshot belongs to repo considering the prefix with storage by REST API.
+ *
+ * @param server        URI the server to connect to aptly API
+ * @param destribution  Destiribution of the repo which have to be found
+ * @param prefix        Prefix of the repo including storage eg. prefix or s3:aptcdn:prefix
+ * @param component     Component of the repo
+ *
+ * @return snapshot name
+ **/
+def getSnapshotByAPI(server, distribution, prefix, component) {
+    http = new com.mirantis.mk.Http()
+    def list_published = http.restGet(server, '/api/publish')
+    def storage
+    for (items in list_published) {
+        for (row in items) {
+            if (prefix.tokenize(':')[1]) {
+                storage = prefix.tokenize(':')[0] + ':' + prefix.tokenize(':')[1]
+            } else {
+                storage = ''
+            }
+            if (row.key == 'Distribution' && row.value == distribution && items['Prefix'] == prefix.tokenize(':').last() && items['Storage'] == storage) {
+                for (source in items['Sources']){
+                    if (source['Component'] == component) {
+                        if(env.getEnvironment().containsKey('DEBUG') && env['DEBUG'] == "true"){
+                            println ('Snapshot belongs to ' + distribution + '/' + prefix + ': ' + source['Name'])
+                        }
+                        return source['Name']
+                    }
+                }
+            }
+        }
+    }
+    return false
+}
+
+/**
+ * Returns list of the packages matched to pattern and
+ * belonged to particular snapshot by REST API
+ *
+ * @param server            URI of the server insluding port and protocol
+ * @param snapshotName      Snapshot to check
+ * @param packagesList      Pattern of the components to be compared
+ **/
+def snapshotPackagesByAPI(server, snapshotName, packagesList) {
+    http = new com.mirantis.mk.Http()
+    def pkgs = http.restGet(server, "/api/snapshots/${snapshotName}/packages")
+    def packages = []
+
+    for (package_pattern in packagesList.tokenize(',')) {
+        def pkg = pkgs.find { item -> item.contains(package_pattern) }
+        packages.add(pkg)
+    }
+
+    return packages
+}
+
+
+/**
+ * Creates snapshot of the repo or package refs by REST API
+ * @param server               URI of the server insluding port and protocol
+ * @param repo                 Local repo name
+ * @param snapshotName         Snapshot name is going to be created
+ * @param snapshotDescription  Snapshot description
+ * @param packageRefs          List of the packages are going to be included into the snapshot
+ **/
+def snapshotCreateByAPI(server, repo, snapshotName, snapshotDescription = null, packageRefs = null) {
+    http = new com.mirantis.mk.Http()
+    def data  = [:]
+    data['Name'] = snapshotName
+    if (snapshotDescription) {
+        data['Description'] = snapshotDescription
+    } else {
+        data['Description'] = "Snapshot of ${repo} repo"
+    }
+    if (packageRefs) {
+        data['PackageRefs'] = packageRefs
+        http.restPost(server, '/api/snapshots', data)
+    } else {
+        http.restPost(server + "/api/repos/${repo}/snapshots", data)
+    }
+}
+
+/**
+ * Publishes the snapshot accodgin to distribution, components and prefix by REST API
+ * @param server        URI of the server insluding port and protocol
+ * @param snapshotName  Snapshot is going to be published
+ * @param distribution  Distribution for the published repo
+ * @param components    Component for the published repo
+ * @param prefix        Prefix for thepubslidhed repo including storage
+ **/
+def snapshotPublishByAPI(server, snapshotName, distribution, components, prefix) {
+    http = new com.mirantis.mk.Http()
+    def source = [:]
+    source['Name'] = snapshotName
+    source['Component'] = components
+    def data = [:]
+    data['SourceKind'] = 'snapshot'
+    data['Sources'] = [source]
+    data['Architectures'] = ['amd64']
+    data['Distribution'] = distribution
+    return http.restPost(server, "/api/publish/${prefix}", data)
+}
+
+/**
+ * Unpublish Aptly repo by REST API
+ *
+ * @param aptlyServer Aptly connection object
+ * @param aptlyPrefix Aptly prefix where need to delete a repo
+ * @param aptlyRepo  Aptly repo name
+ */
+def unpublishByAPI(aptlyServer, aptlyPrefix, aptlyRepo){
+    http = new com.mirantis.mk.Http()
+    http.restDelete(aptlyServer, "/api/publish/${aptlyPrefix}/${aptlyRepo}")
+}
+
+/**
+ * Delete Aptly repo by REST API
+ *
+ * @param aptlyServer Aptly connection object
+ * @param aptlyRepo  Aptly repo name
+ */
+def deleteRepoByAPI(aptlyServer, aptlyRepo){
+    http = new com.mirantis.mk.Http()
+    http.restDelete(aptlyServer, "/api/repos/${aptlyRepo}")
+}
diff --git a/src/com/mirantis/mk/Http.groovy b/src/com/mirantis/mk/Http.groovy
index 7e22ca6..e14a523 100644
--- a/src/com/mirantis/mk/Http.groovy
+++ b/src/com/mirantis/mk/Http.groovy
@@ -184,6 +184,16 @@
 }
 
 /**
+ * Make DELETE request using Salt REST API and return parsed JSON
+ *
+ * @param master   Salt connection object
+ * @param uri   URI which will be appended to Salt server base URL
+ */
+def restDelete(master, uri, data = null) {
+    return restCall(master, uri, 'DELETE', data)
+}
+
+/**
  * Set HTTP and HTTPS proxy for running JVM
  * @param host HTTP proxy host
  * @param port HTTP proxy port
