diff --git a/src/com/mirantis/mk/Aws.groovy b/src/com/mirantis/mk/Aws.groovy
new file mode 100644
index 0000000..c6d73a7
--- /dev/null
+++ b/src/com/mirantis/mk/Aws.groovy
@@ -0,0 +1,116 @@
+package com.mirantis.mk
+
+
+
+/**
+ *
+ * AWS function functions
+ *
+ */
+
+def setupVirtualEnv(venv_path = 'aws_venv') {
+    def python = new com.mirantis.mk.Python()
+
+    def requirements = [
+        'awscli'
+    ]
+
+    python.setupVirtualenv(venv_path, 'python2', requirements)
+}
+
+def getEnvVars(credentials_id, region = 'us-west-2') {
+    def common = new com.mirantis.mk.Common()
+
+    def creds = common.getCredentials(credentials_id)
+
+    return [
+        "AWS_ACCESS_KEY_ID=${creds.username}",
+        "AWS_SECRET_ACCESS_KEY=${creds.password}",
+        "AWS_DEFAULT_REGION=${region}"
+    ]
+}
+
+def createStack(venv_path, env_vars, template_file, stack_name, parameters = []) {
+    def python = new com.mirantis.mk.Python()
+
+    def cmd = "aws cloudformation create-stack --stack-name ${stack_name} --template-body file://template/${template_file}"
+
+    if (parameters != null && parameters.size() > 0) {
+        cmd = "${cmd} --parameters"
+
+        for (int i=0; i<parameters.size(); i++) {
+           cmd = "${cmd} ${parameters[i]}"
+        }
+    }
+
+    withEnv(env_vars) {
+        def out = python.runVirtualenvCommand(venv_path, cmd)
+    }
+}
+
+def describeStack(venv_path, env_vars, stack_name) {
+    def python = new com.mirantis.mk.Python()
+    def common = new com.mirantis.mk.Common()
+
+    def cmd = "aws cloudformation describe-stacks --stack-name ${stack_name}"
+
+    withEnv(env_vars) {
+        def out = python.runVirtualenvCommand(venv_path, cmd)
+        def out_json = common.parseJSON(out)
+        def stack_info = out_json['Stacks'][0]
+        common.prettyPrint(stack_info)
+
+        return stack_info
+    }
+}
+
+def waitForStatus(venv_path, env_vars, stack_name, state, timeout = 600, loop_sleep = 30) {
+    def aws = new com.mirantis.mk.Aws()
+    def common = new com.mirantis.mk.Common()
+    def python = new com.mirantis.mk.Python()
+
+    timeout = timeout * 1000
+    Date date = new Date()
+    def time_start = date.getTime() // in seconds
+
+    withEnv(env_vars) {
+        while (true) {
+            // get stack state
+            def stack_info = aws.describeStack(venv_path, env_vars, stack_name)
+            common.infoMsg('Stack status is ' + stack_info['StackStatus'])
+
+            if (stack_info['StackStatus'] == state) {
+                common.successMsg("Stack ${stack_name} in in state ${state}")
+                common.prettyPrint(stack_info)
+                break
+            }
+
+            // check for timeout
+            if (time_start + timeout < date.getTime()) {
+                throw new Exception("Timeout while waiting for state ${state} for stack ${stack}")
+            }
+
+            // wait for next loop
+            sleep(loop_sleep)
+        }
+    }
+}
+
+def getOutputs(venv_path, env_vars, stack_name, key = '') {
+    def aws = new com.mirantis.mk.Aws()
+    def common = new com.mirantis.mk.Common()
+    def output = {}
+
+    def stack_info = aws.describeStack(venv_path, env_vars, stack_name)
+    common.prettyPrint(stack_info)
+
+    for (int i=0; i<stack_info['Outputs'].size(); i++) {
+        output[stack_info['Outputs'][i]['OutputKey']] = stack_info['Outputs'][i]['OutputValue']
+    }
+
+    if (key != null && key != '') {
+        return output[key]
+    } else {
+        return output
+    }
+}
