diff --git a/cleanup.sh b/cleanup.sh
new file mode 100644
index 0000000..0e9b0ac
--- /dev/null
+++ b/cleanup.sh
@@ -0,0 +1,334 @@
+#!/bin/bash
+export OS_INTERFACE='admin'
+mask='s_rally\|rally_\|tempest_\|tempest-\|spt-'
+exclude='manual\|-static-'
+stack_alt=false
+stack_regex='api-[0-9]+-[a-z]+'
+dry_run=false
+clean_projects=false
+make_servers_active=false
+serial=false
+batch_size=10
+# granularity values: days,hours,minutes,seconds
+stack_granularity=days
+stack_granularity_value=1
+
+function show_help {
+    printf "Resource cleaning script\nMask is: %s\n\t-h, -?\tShow this help\n" ${mask}
+    printf "\t-t\tDry run mode, no cleaning done\n"
+    printf "\t-P\tForce cleaning of projects\n"
+    printf "\t-s\tUse single thread of 'openstack' client for cleanup\n"
+    printf "\t-S\tSet servers to ACTIVE before deletion (bare metal reqiured)\n"
+    printf "\t-f\tForce stack cleanup with an additional mask of '%s'\n" ${stack_regex}
+    printf "\t-F\tForce purge deleted stacks. Batch size: %s, >%s %s\n" ${batch_size} ${stack_granularity_value} ${stack_granularity}
+}
+
+OPTIND=1 # Reset in case getopts has been used previously in the shell.
+while getopts "h?:tsSPfF" opt; do
+    case "$opt" in
+    h|\?)
+        show_help
+        exit 0
+        ;;
+    t)  dry_run=true
+        printf "Running in dry-run mode\n"
+        ;;
+    s)  serial=true
+        printf "Single threaded mode enabled\n"
+        ;;
+    S)  make_servers_active=true
+        printf "Servers will be set to ACTIVE before deletion\n"
+        ;;
+    P)  clean_projects=true
+        printf "Project cleanning enabled\n"
+        ;;
+    f)  stack_alt=true
+        printf "Cleaning stacks using additional mask '%s'\n" ${stack_regex}
+        ;;
+    F)  purge_deleted_stacks=true
+        printf "Purging stacks deleted >$stack_granularity_value $stack_granularity ago enabled, batch size %s\n" $stack_batch_size
+        ;;
+    esac
+done
+
+shift $((OPTIND-1))
+[ "${1:-}" = "--" ] && shift
+
+### Execute collected commands and flush the temp file
+function _clean_and_flush {
+    if [ "$dry_run" = true ] ; then
+        return 0
+    fi
+    if [ -s ${cmds} ]; then
+        if [ "${serial}" = false ] ; then
+            echo "... processing $(cat ${cmds} | wc -l) commands, worker threads ${batch_size}"
+            cat ${cmds} | tr '\n' '\0' | xargs -P ${batch_size} -n 1 -0 echo | openstack
+            #cat ${cmds} | openstack
+            truncate -s 0 ${cmds}
+        else
+            echo "... processing $(cat ${cmds} | wc -l) commands"
+            cat ${cmds} | tr '\n' '\0' | xargs -P 1 -n 1 -0 echo | openstack
+            truncate -s 0 ${cmds}
+        fi
+    fi
+}
+
+function _clean_and_flush_cinder {
+    if [ "$dry_run" = true ] ; then
+        return 0
+    fi
+    if [ -s ${cmds} ]; then
+        if [ "${serial}" = false ] ; then
+            echo "... processing $(cat ${cmds} | wc -l) commands, worker threads ${batch_size}"
+            cat ${cmds} | tr '\n' '\0' | xargs -I{} -P ${batch_size} -n 1 -0 /bin/bash -c 'cinder --os-volume-api-version 3.43 {}'
+            #cat ${cmds} | cinder --os-volume-api-version 3.43
+            truncate -s 0 ${cmds}
+        else
+            echo "... processing $(cat ${cmds} | wc -l) commands"
+            cat ${cmds} | tr '\n' '\0' | xargs -I{} -P 1 -n 1 -0 /bin/bash -c 'cinder --os-volume-api-version 3.43 {}'
+            truncate -s 0 ${cmds}
+        fi
+    fi
+}
+
+### Users
+function _clean_users {
+    users=( $(openstack user list -c ID -c Name -f value | grep ${mask} | grep -v ${exclude} | cut -d' ' -f1) )
+    echo "-> ${#users[@]} users containing '${mask}' found"
+    printf "%s\n" ${users[@]} | xargs -I{} echo user delete {} >>${cmds}
+    _clean_and_flush
+}
+
+### Roles
+function _clean_roles {
+    roles=( $(openstack role list -c ID -c Name -f value | grep ${mask} | grep -v ${exclude} | cut -d' ' -f1) )
+    echo "-> ${#roles[@]} roles containing '${mask}' found"
+    printf "%s\n" ${roles[@]} | xargs -I{} echo role delete {} >>${cmds}
+    _clean_and_flush
+}
+
+### Projects
+function _clean_projects {
+    projects=( $(openstack project list -c ID -c Name -f value | grep ${mask} | grep -v ${exclude} | cut -d' ' -f1) )
+    echo "-> ${#projects[@]} projects containing '${mask}' found"
+    printf "%s\n" ${projects[@]} | xargs -I{} echo project delete {} >>${cmds}
+    _clean_and_flush
+}
+
+### Servers
+function _clean_servers {
+    servers=( $(openstack server list -c ID -c Name -f value --all | grep "${mask}" | grep -v ${exclude} | cut -d' ' -f1) )
+    echo "-> ${#servers[@]} servers containing '${mask}' found"
+    if [ "$make_servers_active" = true ]; then
+        printf "%s\n" ${servers[@]} | xargs -I{} echo server set --state active {} >>${cmds}
+    fi
+    printf "%s\n" ${servers[@]} | xargs -I{} echo server delete {} >>${cmds}
+    _clean_and_flush
+}
+
+### Reset snapshot state and delete
+function _clean_snapshots {
+    snapshots=( $(openstack volume snapshot list --all -c ID -c Name -f value | grep ${mask} | grep -v ${exclude} | cut -d' ' -f1) )
+    echo "-> ${#snapshots[@]} snapshots containing '${mask}' found"
+    printf "%s\n" ${snapshots[@]} | xargs -I{} echo volume snapshot set --state available {} >>${cmds}
+    printf "%s\n" ${snapshots[@]} | xargs -I{} echo volume snapshot delete {} >>${cmds}
+    _clean_and_flush
+}
+
+function _clean_volumes {
+    volumes=( $(openstack volume list --all -c ID -c Name -c Type -f value | grep ${mask} | grep -v ${exclude} | cut -d' ' -f1) )
+    echo "-> ${#volumes[@]} volumes containing '${mask}' found"
+    printf "%s\n" ${volumes[@]} | xargs -I{} echo volume set --state available {} >>${cmds}
+    printf "%s\n" ${volumes[@]} | xargs -I{} echo volume delete {} >>${cmds}
+    _clean_and_flush
+}
+
+function _clean_volume_groups {
+    groups=( $(cinder --os-volume-api-version 3.43 group-list --all-tenants 1 | grep ${mask} | grep -v ${exclude} | awk '{print $2}') )
+    echo "-> ${#groups[@]} groups containing '${mask}' found"
+    printf "%s\n" ${groups[@]} | xargs -I{} echo group-delete {} >>${cmds}
+    _clean_and_flush_cinder
+}
+
+function _clean_volume_group_types {
+    group_types=( $(cinder --os-volume-api-version 3.43 group-type-list | grep ${mask} | grep -v ${exclude} | awk '{print $2}') )
+    echo "-> ${#group_types[@]} group types containing '${mask}' found"
+    printf "%s\n" ${group_types[@]} | xargs -I{} echo group-type-delete {} >>${cmds}
+    _clean_and_flush_cinder
+}
+
+### Volume types
+function _clean_volume_types {
+    vtypes=( $(openstack volume type list -c ID -c Name -f value | grep ${mask} | grep -v ${exclude} | cut -d' ' -f1) )
+    echo "-> ${#vtypes[@]} volume types containing '${mask}' found"
+    printf "%s\n" ${vtypes[@]} | xargs -I{} echo volume type delete {} >>${cmds}
+    _clean_and_flush
+}
+
+### Images
+function _clean_images {
+    images=( $(openstack image list -c ID -c Name -f value | grep ${mask} | grep -v ${exclude} | cut -d' ' -f1) )
+    echo "-> ${#images[@]} images containing '${mask}' found"
+    printf "%s\n" ${images[@]} | xargs -I{} echo image delete {} >>${cmds}
+    _clean_and_flush
+}
+
+### Sec groups
+function _clean_sec_groups {
+    projects=( $(openstack project list -c ID -c Name -f value | grep ${mask} | grep -v ${exclude} | cut -d' ' -f1) )
+    sgroups=( $(printf "%s\n" ${projects[@]} | xargs -I{} /bin/bash -c "openstack security group list -c ID -c Project -f value | grep {} | cut -d' ' -f1") )
+    echo "-> ${#sgroups[@]} security groups for project containing '${mask}' found"
+    printf "%s\n" ${sgroups[@]} | xargs -I{} echo security group delete {} >>${cmds}
+    _clean_and_flush
+
+    # Additional step to cleanup 'hanged' groups
+    sgroups_raw=( $(openstack security group list -c ID -c Name -f value | grep ${mask} | grep -v ${exclude} | cut -d' ' -f1) )
+    echo "-> ${#sgroups_raw[@]} security groups for '${mask}' found"
+    printf "%s\n" ${sgroups_raw[@]} | xargs -I{} echo security group delete {} >>${cmds}
+    _clean_and_flush
+}
+
+### Keypairs
+function _clean_keypairs {
+    keypairs=( $(openstack keypair list -c Name -f value | grep ${mask} | grep -v ${exclude}) )
+    echo "-> ${#keypairs[@]} keypairs containing '${mask}' found"
+    printf "%s\n" ${keypairs[@]} | xargs -I{} echo keypair delete {} >>${cmds}
+    _clean_and_flush
+}
+
+### Routers and Networks
+function _clean_routers_and_networks {
+    routers=( $(openstack router list -c ID -c Name -f value | grep ${mask} | grep -v ${exclude} | cut -d ' ' -f1) )
+    if [ ${#routers[@]} -eq 0 ]; then
+        echo "-> No routers containing '${mask}' found"
+    else
+        echo "-> ${#routers[@]} routers containing '${mask}' found"
+        echo "... unsetting gateways"
+        printf "%s\n" ${routers[@]} | xargs -I{} echo router unset --external-gateway {} >>${cmds}
+        _clean_and_flush
+
+        echo "... removing ports"
+        for router in ${routers[@]}; do
+            r_ports=( $(openstack port list --router ${router} -f value -c ID) )
+            if [ ${#r_ports[@]} -eq 0 ]; then
+                echo "... no ports to unplug for ${router}"
+            else
+                for r_port in ${r_ports[@]}; do
+                    echo "... queued removal of port '${r_port}' from router '${router}'"
+                    echo "router remove port ${router} ${r_port}" >>${cmds}
+                done
+            fi
+        done
+        _clean_and_flush
+
+        echo "... deleting routers"
+        printf "%s\n" ${routers[@]} | xargs -I{} echo router delete {} >>${cmds}
+        _clean_and_flush
+    fi
+
+    networks=( $(openstack network list | grep "${mask}" | grep -v ${exclude} | cut -d' ' -f2) )
+    if [ ${#networks[@]} -eq 0 ]; then
+        echo "-> No networks containing '${mask}' found"
+    else
+        ports=()
+        subnets=()
+        for((idx=0;idx<${#networks[@]};idx++)) do
+            ports+=( $(openstack port list --network ${networks[idx]} -c ID -f value) )
+            subnets+=( $(openstack subnet list --network ${networks[idx]} -c ID -f value) )
+            echo "-> $((${idx}+1)) of ${#networks[@]}, total ${#ports[@]} ports, ${#subnets[@]} subnets"
+        done
+        printf "%s\n" ${ports[@]} | xargs -I{} echo port delete {} >>${cmds}
+        printf "%s\n" ${subnets[@]} | xargs -I{} echo subnet delete {} >>${cmds}
+        echo network delete ${networks[@]} >>${cmds}
+        echo "-> ${#routers[@]} routers, ${#ports[@]} ports, ${#subnets[@]} subnets, ${#networks[@]} networks"
+    fi
+    _clean_and_flush
+}
+
+### Regions
+function _clean_regions {
+    regions=( $(openstack region list -c Region -f value | grep ${mask} | grep -v ${exclude}) )
+    echo "-> ${#regions[@]} regions containing '${mask}' found"
+    printf "%s\n" ${regions[@]} | xargs -I{} echo region delete {} >>${cmds}
+    _clean_and_flush
+}
+
+### Stacks
+function _clean_stacks {
+    # By default openstack denies use of global_index for everyone.
+    # In case you want to have handy cleanup, consider updating policy.json here:
+    # root@ctl0x:~# cat -n /etc/heat/policy.json | grep global_index
+    # 48      "stacks:global_index": "rule:deny_everybody",
+    # 73      "software_configs:global_index": "rule:deny_everybody",
+    # After this you will be able to use --all option
+
+    stacks=( $(openstack stack list --nested --hidden -c ID -c "Stack Name" -f value | grep ${mask} | grep -v ${exclude} | cut -d' ' -f1) )
+    echo "-> ${#stacks[@]} stacks containing '${mask}' found"
+    printf "%s\n" ${stacks[@]} | xargs -I{} echo stack check {} >>${cmds}
+    printf "%s\n" ${stacks[@]} | xargs -I{} echo stack delete -y {} >>${cmds}
+    _clean_and_flush
+
+    if [ "$stack_alt" = true ]; then
+        stacks=( $(openstack stack list --nested --hidden -c ID -c "Stack Name" -f value | grep -E ${stack_regex} | cut -d' ' -f1) )
+        echo "-> ${#stacks[@]} stacks containing '${stack_regex}' found"
+        printf "%s\n" ${stacks[@]} | xargs -I{} echo stack check {} >>${cmds}
+        printf "%s\n" ${stacks[@]} | xargs -I{} echo stack delete -y {} >>${cmds}
+        _clean_and_flush
+    fi
+
+    if [ "$purge_deleted_stacks" = true ]; then
+        heat-manage purge_deleted -g ${stack_granularity} -b ${batch_size} ${stack_granularity_value} | wc -l | xargs -I{} echo "-> Purged {} stacks"
+    fi
+}
+
+### Containers
+function _clean_containers {
+    containers=( $(openstack container list --all -c ID -c Name -f value | grep ${mask} | grep -v ${exclude} | cut -d' ' -f1) )
+    echo "-> ${#containers[@]} containers containing '${mask}' found"
+    printf "%s\n" ${containers[@]} | xargs -I{} echo container delete {} >>${cmds}
+    _clean_and_flush
+}
+
+function _clean_flavors {
+    flavors=( $(openstack flavor list --all -c ID -c Name -f value | grep ${mask} | grep -v ${exclude} | cut -d' ' -f1) )
+    echo "-> ${#flavors[@]} flavors containing '${mask}' found"
+    printf "%s\n" ${flavors[@]} | xargs -I{} echo flavor delete {} >>${cmds}
+    _clean_and_flush
+}
+
+###################
+### Main
+###################
+# temp file for commands
+cmds=$(mktemp)
+trap "rm -f ${cmds}" EXIT
+echo "Using tempfile: '${cmds}'"
+
+# Consider cleaning contrail resources carefully
+# ...and only after that - clean projects
+
+_clean_stacks
+_clean_servers
+_clean_flavors
+_clean_users
+_clean_roles
+_clean_snapshots
+_clean_volumes
+_clean_volume_groups
+_clean_volume_group_types
+_clean_volume_types
+_clean_images
+_clean_sec_groups
+_clean_keypairs
+_clean_routers_and_networks
+_clean_regions
+_clean_containers
+
+# project cleaning disabled by default
+# Coz cleaning Contrail with no projects is a hard task
+if [ "$clean_projects" = true ]; then
+    _clean_projects
+fi
+
+# remove temp file
+rm ${cmds}
diff --git a/scripts/prepare.sh b/scripts/prepare.sh
new file mode 100644
index 0000000..10f005a
--- /dev/null
+++ b/scripts/prepare.sh
@@ -0,0 +1,397 @@
+#!/bin/bash
+export OS_INTERFACE='admin'
+
+# local vars
+name_prefix=cvp
+filename=${name_prefix}.manifest
+rcfile=${name_prefix}rc
+huge_pages=false
+logfile=prepare.log
+
+# Project, User, Roles
+project=${name_prefix}.project
+user=${name_prefix}.user
+admin=${name_prefix}.admin
+password=mcp1234
+
+# Security group
+sg_all=${name_prefix}.sg.all
+sg_icmp=${name_prefix}.sg.icmp
+sg_ssh=${name_prefix}.sg.ssh
+sg_iperf=${name_prefix}.sg.perf
+
+# Testkey
+key=${name_prefix}_testkey
+
+# Flavors: tiny, small (cirrus and migration), medium (ubuntu and volume/stress activities)
+flavor_t=${name_prefix}.tiny
+flavor_s=${name_prefix}.small
+flavor_m=${name_prefix}.medium
+flavor_h=${name_prefix}.high
+
+# Fixed Networks (2, for testing router interconnection)
+net_left=${name_prefix}.net.1
+net_right=${name_prefix}.net.2
+subnet1=${name_prefix}.subnet.1
+subnet2=${name_prefix}.subnet.2
+
+# Router
+router=${name_prefix}.router
+
+# Images: cirros (3.5, 4.0), ubuntu (16.04)
+cirros3=${name_prefix}.cirros.35
+cirros4=${name_prefix}.cirros.40
+ubuntu16=${name_prefix}.ubuntu.1604
+ubuntuspt=${name_prefix}.ubuntu.spt
+
+cirros3_link=http://download.cirros-cloud.net/0.3.5/cirros-0.3.5-x86_64-disk.img
+cirros4_link=http://download.cirros-cloud.net/0.4.0/cirros-0.4.0-aarch64-disk.img
+ubuntu16_link=https://cloud-images.ubuntu.com/xenial/current/xenial-server-cloudimg-amd64-disk1.img
+
+# Volume (2GB)
+volume=${name_prefix}.volume
+
+function show_help {
+    printf "CVP Pipeline: Resource creation script\n\t-h, -?\t\tShow this help\n"
+    printf "\t-H\t\tAdds '--property hw:mem_page_size=large' to flavors, i.e. huge_pages for DPDK\n"
+    printf "\t-w <path>\tSets working folder"
+}
+
+OPTIND=1 # Reset in case getopts has been used previously in the shell.
+while getopts "h?:Hw:" opt; do
+    case "$opt" in
+    h|\?)
+        show_help
+        exit 0
+        ;;
+    w)  working_folder=${OPTARG}
+        printf "# Working folder is ${working_folder}\n"
+        ;;
+    h)  huge_pages=true
+        printf "# Using 'huge_pages' property in flavors\n"
+        ;;
+    esac
+done
+
+shift $((OPTIND-1))
+[ "${1:-}" = "--" ] && shift
+
+function put() {
+    echo "$1=$2" | tee -a ${filename}
+}
+
+# now, some hard to understand stuff...
+# f1 $(<command with output to cut>)
+function f1() { echo $1 | cut -d' ' -f1; };
+# <commands with output to cut> | p1
+function p1() { while read input; do echo ${input} | cut -d' ' -f1; done; };
+# ol1 is short for openstack list with 1 param. Also grep and cut
+# "ol1 network public" will list all networks, grep by name public and return IDs
+function ol1() { echo $(openstack $1 list -c ID -c Name -f value | grep $2 | cut -d' ' -f1); }
+# same as ol1 but with 2 initial commands before list
+function ol2() { echo $(openstack $1 $2 list -c ID -c Name -f value | grep $3 | cut -d' ' -f1); }
+
+function print_manifest() {
+    touch ./${filename}
+    truncate -s 0 ${filename}
+    printf "\n\n# Checking and filling manifest: $(pwd)/${filename}\n"
+    put project_name ${project}
+    put project_id $(ol1 project ${project})
+    put user_name ${user}
+    put user_id $(ol1 user ${user})
+    put admin_name ${admin}
+    put admin_id $(ol1 user ${admin})
+    # sg
+    put secgroup_all_name ${sg_all}
+    put secgroup_all_id $(ol2 security group ${sg_all})
+    put secgroup_icmp_name ${sg_icmp}
+    put secgroup_icmp_id $(ol2 security group ${sg_icmp})
+    put secgroup_ssh_name ${sg_ssh}
+    put secgroup_ssh_id $(ol2 security group ${sg_ssh})
+    put secgroup_iperf_name ${sg_iperf}
+    put secgroup_iperf_id $(ol2 security group ${sg_iperf})
+
+    # keypair
+    put keypair_name ${key}
+    put keypair_id $(ol1 keypair ${key})
+
+    # flavors
+    put flavor_tiny_name ${flavor_t}
+    put flavor_tiny_id $(ol1 flavor ${flavor_t})
+    put flavor_small_name ${flavor_s}
+    put flavor_small_id $(ol1 flavor ${flavor_s})
+    put flavor_medium_name ${flavor_m}
+    put flavor_medium_id $(ol1 flavor ${flavor_m})
+    put flavor_high_name ${flavor_h}
+    put flavor_high_id $(ol1 flavor ${flavor_h})
+
+    # fixed nets
+    put fixed_net_left_name ${net_left}
+    put fixed_net_left_id $(ol1 network ${net_left})
+    put fixed_net_right_name ${net_right}
+    put fixed_net_right_id $(ol1 network ${net_right})
+    put fixed_net_left_subnet_name ${subnet1}
+    put fixed_net_left_subnet_id $(openstack subnet list --network ${net_left} -c ID -f value | p1)
+    put fixed_net_right_subnet_name ${subnet2}
+    put fixed_net_right_subnet_id $(openstack subnet list --network ${net_right} -c ID -f value | p1)
+
+    # router
+    put router_name ${router}
+    put router_id $(ol1 router ${router})
+
+    # volumes
+    put volume_name ${volume}
+    put volume_id $(ol1 volume ${volume})
+
+    # images
+    put cirros35_name ${cirros3}
+    put cirros35_id $(ol1 image ${cirros3})
+    put cirros40_name ${cirros4}
+    put cirros40_id $(ol1 image ${cirros4})
+    put ubuntu16_name ${ubuntu16}
+    put ubuntu16_id $(ol1 image ${ubuntu16})
+    put ubuntuspt_name ${ubuntuspt}
+    put ubuntuspt_id $(ol1 image ${ubuntuspt})
+}
+
+# create rc file out of current ENV vars
+function putrc() {
+    printf "# Saving ${1} file\n"
+    echo "export OS_IDENTITY_API_VERSION=${OS_IDENTITY_API_VERSION:-3}" >${1}
+    echo "export OS_AUTH_URL=${OS_AUTH_URL}" >>${1}
+    echo "export OS_PROJECT_DOMAIN_NAME=${OS_PROJECT_DOMAIN_NAME}" >>${1}
+    echo "export OS_USER_DOMAIN_NAME=${OS_USER_DOMAIN_NAME}" >>${1}
+    echo "export OS_PROJECT_NAME=${OS_PROJECT_NAME}" >>${1}
+    echo "export OS_TENANT_NAME=${OS_TENANT_NAME}" >>${1}
+    echo "export OS_USERNAME=${OS_USERNAME}" >>${1}
+    echo "export OS_PASSWORD=${OS_PASSWORD}" >>${1}
+    echo "export OS_REGION_NAME=${OS_REGION_NAME}" >>${1}
+    echo "export OS_INTERFACE=${OS_INTERFACE}" >>${1}
+    echo "export OS_ENDPOINT_TYPE=${OS_ENDPOINT_TYPE}" >>${1}
+    echo "export OS_CACERT=${OS_CACERT}" >>${1}
+}
+
+# update ENV vars to newly created project
+function updatesession() {
+    export OS_PROJECT_NAME=${project}
+    export OS_TENANT_NAME=${project}
+    export OS_USERNAME=${admin}
+    export OS_PASSWORD=${password}
+}
+
+function process_cmds() {
+    if [ -s ${cmds} ]; then
+        cat ${cmds} | tr '\n' '\0' | xargs -P 1 -n 1 -0 echo | tee /dev/tty | openstack -v 2>&1 >>${logfile}
+        truncate -s 0 ${cmds}
+    fi
+}
+
+function _project() {
+    echo project create ${project} >>${cmds}
+    echo role add --user admin --project ${project} admin >>${cmds}
+}
+
+function _users() {
+    echo user create --project ${project} --password ${password} ${user} >>${cmds}
+    echo user create --project ${project} --password ${password} ${admin} >>${cmds}
+    echo role add --user ${admin} --project ${project} admin >>${cmds}
+    echo role add --user ${admin} --project ${project} creator >>${cmds}
+    echo role add --user ${user} --project ${project} member >>${cmds}
+    echo role add --user ${user} --project ${project} creator >>${cmds}
+
+}
+
+function _sg_all() {
+    echo security group create --project ${project} ${sg_all} >>${cmds}
+    # icmp
+    echo security group rule create --protocol icmp ${sg_all} >>${cmds}
+    # ssh
+    echo security group rule create --protocol tcp --dst-port 22 ${sg_all} >>${cmds}
+    # iperf
+    echo security group rule create --protocol tcp --dst-port 5001 ${sg_all} >>${cmds}
+    # iperf3
+    echo security group rule create --protocol tcp --dst-port 5201 ${sg_all} >>${cmds}
+    # nc connectivity
+    echo security group rule create --protocol tcp --dst-port 3000 ${sg_all} >>${cmds}
+    # http
+    echo security group rule create --protocol tcp --dst-port 80 ${sg_all} >>${cmds}
+    # https
+    echo security group rule create --protocol tcp --dst-port 443 ${sg_all} >>${cmds}
+}
+
+function _sg_icmp() {
+    echo security group create --project ${project} ${sg_icmp} >>${cmds}
+    echo security group rule create --protocol icmp ${sg_icmp} >>${cmds}
+}
+
+function _sg_ssh() {
+    echo security group create --project ${project} ${sg_ssh} >>${cmds}
+    # icmp
+    echo security group rule create --protocol icmp ${sg_ssh} >>${cmds}
+    # ssh
+    echo security group rule create --protocol tcp --dst-port 22 ${sg_ssh} >>${cmds}
+}
+
+function _sg_iperf() {
+    echo security group create --project ${project} ${sg_iperf} >>${cmds}
+    # icmp
+    echo security group rule create --protocol icmp ${sg_iperf} >>${cmds}
+    # iperf
+    echo security group rule create --protocol tcp --dst-port 5001 ${sg_iperf} >>${cmds}
+    # iperf3
+    echo security group rule create --protocol tcp --dst-port 5201 ${sg_iperf} >>${cmds}
+}
+
+function create_keypair() {
+    echo "# Creating keypair"
+    openstack keypair create ${key} >${key}
+    chmod 600 ${key}
+    echo "-> created keyfile: $(pwd)/${key}"
+}
+
+function _flavors() {
+    # huge paged flavors
+    if [ "$huge_pages" = true ]; then
+        echo flavor create --id 1 --ram 64 --disk 1 --vcpus 1 ${flavor_t} --property hw:mem_page_size=large >>${cmds}
+        echo flavor create --id 2 --ram 256 --disk 2 --vcpus 1 ${flavor_s} --property hw:mem_page_size=large >>${cmds}
+        echo flavor create --id 3 --ram 2048 --disk 10 --vcpus 2 ${flavor_m} --property hw:mem_page_size=large >>${cmds}
+        echo flavor create --id 4 --ram 2048 --disk 20 --vcpus 4 ${flavor_h} --property hw:mem_page_size=large >>${cmds}
+    else
+        echo flavor create --id 1 --ram 64 --disk 1 --vcpus 1 ${flavor_t} >>${cmds}
+        echo flavor create --id 2 --ram 256 --disk 2 --vcpus 1 ${flavor_s} >>${cmds}
+        echo flavor create --id 3 --ram 2048 --disk 10 --vcpus 2 ${flavor_m} >>${cmds}
+        echo flavor create --id 4 --ram 2048 --disk 20 --vcpus 4 ${flavor_h} >>${cmds}
+    fi
+}
+
+function _volumes() {
+    echo volume create --size 2 ${volume} >>${cmds}
+}
+
+function create_fixed_nets() {
+    echo "# Creating fixed networks"
+    echo network create --project ${project} ${net_left} >>${cmds}
+    echo subnet create ${subnet1} --network ${net_left} --subnet-range 10.10.11.0/24 >>${cmds}
+    echo network set --share ${net_left} >>${cmds}
+    echo network create --project ${project} ${net_right} >>${cmds}
+    echo subnet create ${subnet2} --network ${net_right} --subnet-range 10.10.12.0/24 >>${cmds}
+    echo network set --share ${net_right} >>${cmds}
+    process_cmds
+
+    # get subnet ids
+    subnet1_id=$(openstack subnet list --network ${net_left} -c ID -f value)
+    subnet2_id=$(openstack subnet list --network ${net_right} -c ID -f value)
+
+    echo router create --project ${project} ${router} >>${cmds}
+    process_cmds
+
+    router_id=$(openstack router list -c ID -c Name -f value | grep ${router} | cut -d' ' -f1)
+    echo router add subnet ${router_id} ${subnet1_id} >>${cmds}
+    echo router add subnet ${router_id} ${subnet2_id} >>${cmds}
+    process_cmds
+
+    # TODO: Search for external net
+    external=prod-public
+    echo router set ${router} --external-gateway ${external} >>${cmds}
+    process_cmds
+}
+
+function _get_image() {
+    # build vars for name and link
+    name="${1}"
+    link="${1}_link"
+    which wget >/dev/null
+    if [ $? -ne 0 ]; then
+        printf "\nERROR: 'wget' not detected. Download skipped: ${!name}\n"
+    else
+        # no redownloads, quet, save named and show progress
+        r=$(wget --no-check-certificate -nc -q -O ./${!name} --show-progress ${!link})
+        if [ $? -ne 0 ]; then
+            # non-empty output on error
+            echo ${r}
+        fi
+    fi
+}
+
+function create_image() {
+    name="${1}"
+    # Check if image is in the cloud
+    echo "# Checking image '${!name}'"
+    ids=( $(ol1 image ${!name}) )
+    # if array is empty, download and upload it
+    if [ ${#ids[@]} -eq 0 ]; then
+        # check and download
+        if [ ! -f ${!name} ]; then
+            r=$(_get_image ${1})
+        else
+            r=""
+        fi
+        # check if output is not empty
+        if [ ${#r} -eq 0 ]; then
+            image_id=$(openstack image create --public --disk-format qcow2 --container-format bare --file ${!name} ${!name} -c id -f value)
+            echo "-> created ${!name} (${image_id})"
+        else
+            printf "\n-> Error detected, creation skipped\n"
+        fi
+    else
+        # image(s) already there, list them
+        for id in ${ids[@]}; do
+            echo "-> found ${!name} with ID of '${id}'"
+        done
+    fi
+}
+
+###################
+### Main
+###################
+if [[ -z ${working_folder+x} ]]; then
+    # cwd into working dir
+    cd ${working_folder}
+fi
+
+cmds=$(mktemp)
+trap "rm -f ${cmds}" EXIT
+echo "Using tempfile: '${cmds}'"
+
+touch ${logfile}
+echo "Using log file: '${logfile}'"
+
+# Create
+echo "# Creating project and users"
+_project
+_users
+process_cmds
+
+echo "# Creating 'rc' and switching"
+putrc "./adminrc"
+updatesession
+putrc "./${rcfile}"
+
+echo "# Creating basic resources"
+# not dependent stuff
+_sg_all
+_sg_icmp
+_sg_ssh
+_sg_iperf
+_flavors
+_volumes
+process_cmds
+
+# sophisticated, step dependent stuff
+create_keypair
+create_fixed_nets
+
+# images
+#create_image cirros3
+#create_image cirros4
+#create_image ubuntu16
+# update image name to correct one uploaded
+#ubuntuspt_file="ubuntuspt.img"
+#openstack image create --public --disk-format qcow2 --container-format bare --file ${ubuntuspt_file} ${ubuntuspt} -c id -f value
+
+### Manifest and fall back to original rc
+print_manifest
+printf ="\n\nSetting quota\n"
+openstack quota set --cores -1 --ram -1 --instances -1 --volumes -1 --gigabytes -1 cvp.project
+source "./adminrc"
+printf "\n\nOriginal rc preserved and backed up in 'adminrc'\nNew rc is '${rcfile}'\n"
