Merge "Configure to run Robot w/chrome headless option dd"
diff --git a/docker/Dockerfile b/docker/Dockerfile
index 871e849..6822f37 100644
--- a/docker/Dockerfile
+++ b/docker/Dockerfile
@@ -7,15 +7,28 @@
 LABEL usage="docker run -e ROBOT_TEST=<testname> -ti openecompete"
 
 # Install Python Pip, Robot framework, firefox, lighttpd web server, wget
-RUN apt-get update && \
-    apt-get --assume-yes install python=2.7.11-1 && \
-    apt-get --assume-yes install build-essential dbus dnsutils git libappindicator1 \
-				 libffi-dev libindicator7 libssl-dev libxss1 \
-				 lighttpd net-tools python-dev python-pip unzip \
-				 wget xvfb && \
-    pip install --upgrade pip && \
-    pip install robotframework && \
-    python --version
+# Restructuring so we can see where it fails in the build.
+RUN apt-get update
+RUN apt-get --assume-yes install python=2.7.11-1
+RUN apt-get --assume-yes install build-essential
+RUN apt-get --assume-yes install dbus
+RUN apt-get --assume-yes install dnsutils
+RUN apt-get --assume-yes install git
+RUN apt-get --assume-yes install libappindicator1
+RUN apt-get --assume-yes install libffi-dev
+RUN apt-get --assume-yes install libindicator7
+RUN apt-get --assume-yes install libssl-dev
+RUN apt-get --assume-yes install libxss1
+RUN apt-get --assume-yes install lighttpd
+RUN apt-get --assume-yes install net-tools
+RUN apt-get --assume-yes install python-dev
+RUN apt-get --assume-yes install python-pip
+RUN apt-get --assume-yes install unzip
+RUN apt-get --assume-yes install wget
+RUN apt-get --assume-yes install xvfb
+RUN pip install --upgrade pip
+RUN pip install robotframework
+RUN python --version
 
 # Install chrome
 RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - && \
diff --git a/docker/lighttpd.conf b/docker/lighttpd.conf
index ac92070..e9a5a37 100644
--- a/docker/lighttpd.conf
+++ b/docker/lighttpd.conf
@@ -7,14 +7,23 @@
 
 dir-listing.activate = "disable"
 
+alias.url = ( "/logs/" => "/share/logs/" )
+$HTTP["url"] =~ "^/logs/" {
+    dir-listing.activate = "enable"
+}
+
 mimetype.assign = (
-  ".html" => "text/html"
+  ".log" => "text/plain",
+  ".txt" => "text/plain",
+  ".html" => "text/html",
+  ".xml" => "text/xml"
 )
 
 static-file.exclude-extensions = ( ".fcgi", ".php", ".rb", "~", ".inc", ".cgi" )
 index-file.names = ( "index.html" )
 
 server.modules += ( "mod_auth" )
+server.modules += ( "mod_alias" )
 auth.debug = 2
 auth.backend = "plain"
 auth.backend.plain.userfile = "/etc/lighttpd/authorization"
diff --git a/robot/assets/asdc/base_clearwater/MANIFEST.json b/robot/assets/asdc/base_clearwater/MANIFEST.json
deleted file mode 100644
index f2beda9..0000000
--- a/robot/assets/asdc/base_clearwater/MANIFEST.json
+++ /dev/null
@@ -1,52 +0,0 @@
-{
-    "name": "Project Clearwater",
-    "description": "Project Clearwater IMS",
-    "data": [
-        {
-            "file": "base_clearwater.yaml",
-            "type": "HEAT",
-            "isBase": "true",
-            "data": [
-                {
-                    "file": "base_clearwater.env",
-                    "type": "HEAT_ENV"
-                }
-            ]
-        },
-        {
-            "file": "bono.yaml",
-            "type": "HEAT",
-            "isBase": "false"
-        },
-        {
-            "file": "dns.yaml",
-            "type": "HEAT",
-            "isBase": "false"
-        },
-        {
-            "file": "ellis.yaml",
-            "type": "HEAT",
-            "isBase": "false"
-        },
-        {
-            "file": "homer.yaml",
-            "type": "HEAT",
-            "isBase": "false"
-        },
-        {
-            "file": "homestead.yaml",
-            "type": "HEAT",
-            "isBase": "false"
-        },
-        {
-            "file": "ralf.yaml",
-            "type": "HEAT",
-            "isBase": "false"
-        },
-        {
-            "file": "sprout.yaml",
-            "type": "HEAT",
-            "isBase": "false"
-        }
-    ]
-}
diff --git a/robot/assets/asdc/base_clearwater/base_clearwater.env b/robot/assets/asdc/base_clearwater/base_clearwater.env
deleted file mode 100644
index d4a77e4..0000000
--- a/robot/assets/asdc/base_clearwater/base_clearwater.env
+++ /dev/null
@@ -1,21 +0,0 @@
-parameters:
-  public_net_id: 00000000-0000-0000-0000-000000000000
-  bono_flavor_name: 4 GB General Purpose v1
-  sprout_flavor_name: 4 GB General Purpose v1
-  homer_flavor_name: 4 GB General Purpose v1
-  homestead_flavor_name: 4 GB General Purpose v1
-  ralf_flavor_name: 4 GB General Purpose v1
-  ellis_flavor_name: 4 GB General Purpose v1
-  dns_flavor_name: 4 GB General Purpose v1
-  bono_image_name: Ubuntu 14.04 LTS (Trusty Tahr) (PVHVM)
-  sprout_image_name: Ubuntu 14.04 LTS (Trusty Tahr) (PVHVM)
-  homer_image_name: Ubuntu 14.04 LTS (Trusty Tahr) (PVHVM)
-  homestead_image_name: Ubuntu 14.04 LTS (Trusty Tahr) (PVHVM)
-  ralf_image_name: Ubuntu 14.04 LTS (Trusty Tahr) (PVHVM)
-  ellis_image_name: Ubuntu 14.04 LTS (Trusty Tahr) (PVHVM)
-  dns_image_name: Ubuntu 14.04 LTS (Trusty Tahr) (PVHVM)
-  repo_url: http://repo.cw-ngv.com/stable
-  zone: me.cw-ngv.com
-  dn_range_start: "2425550000"
-  dn_range_length: "10000"
-  dnssec_key: 9FPdYTWhk5+LbhrqtTPQKw==
\ No newline at end of file
diff --git a/robot/assets/asdc/base_clearwater/base_clearwater.yaml b/robot/assets/asdc/base_clearwater/base_clearwater.yaml
deleted file mode 100644
index c41b050..0000000
--- a/robot/assets/asdc/base_clearwater/base_clearwater.yaml
+++ /dev/null
@@ -1,322 +0,0 @@
-# Project Clearwater - IMS in the Cloud
-# Copyright (C) 2015  Metaswitch Networks Ltd
-#
-# This program is free software: you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the
-# Free Software Foundation, either version 3 of the License, or (at your
-# option) any later version, along with the "Special Exception" for use of
-# the program along with SSL, set forth below. This program is distributed
-# in the hope that it will be useful, but WITHOUT ANY WARRANTY;
-# without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-# A PARTICULAR PURPOSE.  See the GNU General Public License for more
-# details. You should have received a copy of the GNU General Public
-# License along with this program.  If not, see
-# <http://www.gnu.org/licenses/>.
-#
-# The author can be reached by email at clearwater@metaswitch.com or by
-# post at Metaswitch Networks Ltd, 100 Church St, Enfield EN2 6BQ, UK
-#
-# Special Exception
-# Metaswitch Networks Ltd  grants you permission to copy, modify,
-# propagate, and distribute a work formed by combining OpenSSL with The
-# Software, or a work derivative of such a combination, even if such
-# copying, modification, propagation, or distribution would otherwise
-# violate the terms of the GPL. You must comply with the GPL in all
-# respects for all of the code used other than OpenSSL.
-# "OpenSSL" means OpenSSL toolkit software distributed by the OpenSSL
-# Project and licensed under the OpenSSL Licenses, or a work based on such
-# software and licensed under the OpenSSL Licenses.
-# "OpenSSL Licenses" means the OpenSSL License and Original SSLeay License
-# under which the OpenSSL Project distributes the OpenSSL toolkit software,
-# as those licenses appear in the file LICENSE-OPENSSL.
-
-heat_template_version: 2013-05-23
-
-description: >
-  Base Project Clearwater deployment on ONAP (Open Network Automation Platform)
-
-parameters:
-  vnf_id:
-    type: string
-    label: VNF ID
-    description: The VNF ID provided by ONAP
-  vf_module_id:
-    type: string
-    label: VNF module ID
-    description: The VNF module ID provided by ONAP
-  public_net_id:
-    type: string
-    description: ID of public network
-    constraints:
-      - custom_constraint: neutron.network
-        description: Must be a valid network ID
-  bono_flavor_name:
-    type: string
-    description: VM flavor for bono VMs
-    constraints:
-      - custom_constraint: nova.flavor
-        description: Must be a valid flavor name
-  sprout_flavor_name:
-    type: string
-    description: VM flavor for sprout VMs
-    constraints:
-      - custom_constraint: nova.flavor
-        description: Must be a valid flavor name
-  homestead_flavor_name:
-    type: string
-    description: VM flavor for homestead VMs
-    constraints:
-      - custom_constraint: nova.flavor
-        description: Must be a valid flavor name
-  homer_flavor_name:
-    type: string
-    description: VM flavor for homer VMs
-    constraints:
-      - custom_constraint: nova.flavor
-        description: Must be a valid flavor name
-  ralf_flavor_name:
-    type: string
-    description: VM flavor for ralf VMs
-    constraints:
-      - custom_constraint: nova.flavor
-        description: Must be a valid flavor name
-  ellis_flavor_name:
-    type: string
-    description: VM flavor for ellis VM
-    constraints:
-      - custom_constraint: nova.flavor
-        description: Must be a valid flavor name
-  dns_flavor_name:
-    type: string
-    description: VM flavor for dns VM
-    constraints:
-      - custom_constraint: nova.flavor
-        description: Must be a valid flavor name
-  bono_image_name:
-    type: string
-    description: Name of image for bono VMs
-  sprout_image_name:
-    type: string
-    description: Name of image for sprout VMs
-  homestead_image_name:
-    type: string
-    description: Name of image for homestead VMs
-  homer_image_name:
-    type: string
-    description: Name of image for homer VMs
-  ralf_image_name:
-    type: string
-    description: Name of image for ralf VMs
-  ellis_image_name:
-    type: string
-    description: Name of image for ellis VM
-  dns_image_name:
-    type: string
-    description: Name of image for dns VMs
-  key_name:
-    type: string
-    description: Name of keypair to create
-  pub_key:
-    type: string
-    label: Public key
-    description: Public key to be installed on all compute instances
-  repo_url:
-    type: string
-    description: URL for Clearwater repository
-    default: http://repo.cw-ngv.com/stable
-  zone:
-    type: string
-    description: DNS zone
-    default: example.com
-  dn_range_start:
-    type: string
-    description: First directory number in pool
-    default: "6505550000"
-    constraints:
-      - allowed_pattern: "[0-9]+"
-        description: Must be numeric
-  dn_range_length:
-    type: string
-    description: Number of directory numbers to add to pool
-    default: "1000"
-    constraints:
-      - allowed_pattern: "[0-9]+"
-        description: Must be numeric
-  dnssec_key:
-    type: string
-    description: DNSSEC private key (Base64-encoded)
-    constraints:
-      - allowed_pattern: "[0-9A-Za-z+/=]+"
-        description: Must be Base64-encoded
-
-resources:
-  cw_keypair:
-    type: OS::Nova::KeyPair
-    properties:
-      name: { get_param: key_name }
-      public_key: { get_param: pub_key }
-      save_private_key: false
-
-# security_groups:
-#   type: security-groups.yaml
-#   properties:
-#     name_prefix: { get_param: "OS::stack_name" }
-
-  dns:
-    type: dns.yaml
-    properties:
-      vnf_id: { get_param: vnf_id }
-      vf_module_id: { get_param: vf_module_id }
-      public_net_id: { get_param: public_net_id }
-      dns_flavor_name: { get_param: dns_flavor_name }
-      dns_image_name: { get_param: dns_image_name }
-      key_name: { get_resource: cw_keypair }
-#     dns_security_group: { get_attr: [ security_groups, dns ] }
-      zone: { get_param: zone }
-      dnssec_key: { get_param: dnssec_key }
-
-
-  ellis:
-    type: ellis.yaml
-    properties:
-      vnf_id: { get_param: vnf_id }
-      vf_module_id: { get_param: vf_module_id }
-      public_net_id: { get_param: public_net_id }
-      ellis_flavor_name: { get_param: ellis_flavor_name }
-      ellis_image_name: { get_param: ellis_image_name }
-      key_name: { get_resource: cw_keypair }
-#     base_mgmt_security_group: { get_attr: [ security_groups, base_mgmt ] }
-#     ellis_mgmt_security_group: { get_attr: [ security_groups, ellis_mgmt ] }
-      repo_url: { get_param: repo_url }
-      zone: { get_param: zone }
-      dn_range_start: { get_param: dn_range_start }
-      dn_range_length: { get_param: dn_range_length }
-      dns_ip: { get_attr: [ dns, dns_ip ] }
-      dnssec_key: { get_param: dnssec_key }
-
-  bono:
-    type: OS::Heat::ResourceGroup
-    properties:
-      count: 2
-      index_var: "__index__"
-      resource_def:
-        type: bono.yaml
-        properties:
-          vnf_id: { get_param: vnf_id }
-          vf_module_id: { get_param: vf_module_id }
-          public_net_id: { get_param: public_net_id }
-          bono_flavor_name: { get_param: bono_flavor_name }
-          bono_image_name: { get_param: bono_image_name }
-          key_name: { get_resource: cw_keypair }
-#         base_mgmt_security_group: { get_attr: [ security_groups, base_mgmt ] }
-#         bono_sig_security_group: { get_attr: [ security_groups, bono_sig ] }
-          repo_url: { get_param: repo_url }
-          zone: { get_param: zone }
-          dns_ip: { get_attr: [ dns, dns_ip ] }
-          dnssec_key: { get_param: dnssec_key }
-          etcd_ip: { get_attr: [ ellis, public_ip ] }
-          index: __index__
-
-  sprout:
-    type: OS::Heat::ResourceGroup
-    properties:
-      count: 2
-      index_var: __index__
-      resource_def:
-        type: sprout.yaml
-        properties:
-          vnf_id: { get_param: vnf_id }
-          vf_module_id: { get_param: vf_module_id }
-          public_net_id: { get_param: public_net_id }
-          sprout_flavor_name: { get_param: sprout_flavor_name }
-          sprout_image_name: { get_param: sprout_image_name }
-          key_name: { get_resource: cw_keypair }
-#         base_mgmt_security_group: { get_attr: [ security_groups, base_mgmt ] }
-#         sprout_sig_security_group: { get_attr: [ security_groups, sprout_sig ] }
-#         sprout_sig2_security_group: { get_attr: [ security_groups, sprout_sig2 ] }
-          repo_url: { get_param: repo_url }
-          zone: { get_param: zone }
-          dns_ip: { get_attr: [ dns, dns_ip ] }
-          dnssec_key: { get_param: dnssec_key }
-          etcd_ip: { get_attr: [ ellis, public_ip ] }
-          index: __index__
-
-  homer:
-    type: OS::Heat::ResourceGroup
-    properties:
-      count: 2
-      index_var: __index__
-      resource_def:
-        type: homer.yaml
-        properties:
-          vnf_id: { get_param: vnf_id }
-          vf_module_id: { get_param: vf_module_id }
-          public_net_id: { get_param: public_net_id }
-          homer_flavor_name: { get_param: homer_flavor_name }
-          homer_image_name: { get_param: homer_image_name }
-          key_name: { get_resource: cw_keypair }
-#         base_mgmt_security_group: { get_attr: [ security_groups, base_mgmt ] }
-#         homer_mgmt_security_group: { get_attr: [ security_groups, homer_mgmt ] }
-#         homer_sig_security_group: { get_attr: [ security_groups, homer_sig ] }
-          repo_url: { get_param: repo_url }
-          zone: { get_param: zone }
-          dns_ip: { get_attr: [ dns, dns_ip ] }
-          dnssec_key: { get_param: dnssec_key }
-          etcd_ip: { get_attr: [ ellis, public_ip ] }
-          index: __index__
-
-  homestead:
-    type: OS::Heat::ResourceGroup
-    properties:
-      count: 2
-      index_var: __index__
-      resource_def:
-        type: homestead.yaml
-        properties:
-          vnf_id: { get_param: vnf_id }
-          vf_module_id: { get_param: vf_module_id }
-          public_net_id: { get_param: public_net_id }
-          homestead_flavor_name: { get_param: homestead_flavor_name }
-          homestead_image_name: { get_param: homestead_image_name }
-          key_name: { get_resource: cw_keypair }
-#         base_mgmt_security_group: { get_attr: [ security_groups, base_mgmt ] }
-#         homestead_mgmt_security_group: { get_attr: [ security_groups, homestead_mgmt ] }
-#         homestead_sig_security_group: { get_attr: [ security_groups, homestead_sig ] }
-          repo_url: { get_param: repo_url }
-          zone: { get_param: zone }
-          dns_ip: { get_attr: [ dns, dns_ip ] }
-          dnssec_key: { get_param: dnssec_key }
-          etcd_ip: { get_attr: [ ellis, public_ip ] }
-          index: __index__
-
-  ralf:
-    type: OS::Heat::ResourceGroup
-    properties:
-      count: 2
-      index_var: __index__
-      resource_def:
-        type: ralf.yaml
-        properties:
-          vnf_id: { get_param: vnf_id }
-          vf_module_id: { get_param: vf_module_id }
-          public_net_id: { get_param: public_net_id }
-          ralf_flavor_name: { get_param: ralf_flavor_name }
-          ralf_image_name: { get_param: ralf_image_name }
-          key_name: { get_resource: cw_keypair }
-#         base_mgmt_security_group: { get_attr: [ security_groups, base_mgmt ] }
-#         ralf_sig_security_group: { get_attr: [ security_groups, ralf_sig ] }
-          repo_url: { get_param: repo_url }
-          zone: { get_param: zone }
-          dns_ip: { get_attr: [ dns, dns_ip ] }
-          dnssec_key: { get_param: dnssec_key }
-          etcd_ip: { get_attr: [ ellis, public_ip ] }
-          index: __index__
-
-outputs:
-  zone:
-    description: DNS zone
-    value: { get_param: zone }
-  dns_ip:
-    description: IP address of DNS
-    value: { get_attr: [ dns, dns_ip ] }
-
diff --git a/robot/assets/asdc/base_clearwater/bono.yaml b/robot/assets/asdc/base_clearwater/bono.yaml
deleted file mode 100644
index 575dbb9..0000000
--- a/robot/assets/asdc/base_clearwater/bono.yaml
+++ /dev/null
@@ -1,191 +0,0 @@
-# Project Clearwater - IMS in the Cloud
-# Copyright (C) 2015  Metaswitch Networks Ltd
-#
-# This program is free software: you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the
-# Free Software Foundation, either version 3 of the License, or (at your
-# option) any later version, along with the "Special Exception" for use of
-# the program along with SSL, set forth below. This program is distributed
-# in the hope that it will be useful, but WITHOUT ANY WARRANTY;
-# without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-# A PARTICULAR PURPOSE.  See the GNU General Public License for more
-# details. You should have received a copy of the GNU General Public
-# License along with this program.  If not, see
-# <http://www.gnu.org/licenses/>.
-#
-# The author can be reached by email at clearwater@metaswitch.com or by
-# post at Metaswitch Networks Ltd, 100 Church St, Enfield EN2 6BQ, UK
-#
-# Special Exception
-# Metaswitch Networks Ltd  grants you permission to copy, modify,
-# propagate, and distribute a work formed by combining OpenSSL with The
-# Software, or a work derivative of such a combination, even if such
-# copying, modification, propagation, or distribution would otherwise
-# violate the terms of the GPL. You must comply with the GPL in all
-# respects for all of the code used other than OpenSSL.
-# "OpenSSL" means OpenSSL toolkit software distributed by the OpenSSL
-# Project and licensed under the OpenSSL Licenses, or a work based on such
-# software and licensed under the OpenSSL Licenses.
-# "OpenSSL Licenses" means the OpenSSL License and Original SSLeay License
-# under which the OpenSSL Project distributes the OpenSSL toolkit software,
-# as those licenses appear in the file LICENSE-OPENSSL.
-
-heat_template_version: 2013-05-23
-
-description: >
-  Clearwater Bono node
-
-parameters:
-  vnf_id:
-    type: string
-    label: VNF ID
-    description: The VNF ID provided by ONAP
-  vf_module_id:
-    type: string
-    label: VNF module ID
-    description: The VNF module ID provided by ONAP
-  public_net_id:
-    type: string
-    description: ID of public network
-    constraints:
-      - custom_constraint: neutron.network
-        description: Must be a valid network ID
-  bono_flavor_name:
-    type: string
-    description: Flavor to use
-    constraints:
-      - custom_constraint: nova.flavor
-        description: Must be a valid flavor name
-  bono_image_name:
-    type: string
-    description: Name of image to use
-  key_name:
-    type: string
-    description: Name of keypair to assign
-    constraints:
-      - custom_constraint: nova.keypair
-        description: Must be a valid keypair name
-# base_mgmt_security_group:
-#   type: string
-#   description: ID of base security group for all Clearwater nodes (managment)
-# bono_sig_security_group:
-#   type: string
-#   description: ID of security group for Bono nodes (signaling)
-  repo_url:
-    type: string
-    description: URL for Clearwater repository
-    default: http://repo.cw-ngv.com/stable
-  zone:
-    type: string
-    description: DNS zone
-    default: example.com
-  dns_ip:
-    type: string
-    description: IP address for DNS server on management network
-  dnssec_key:
-    type: string
-    description: DNSSEC private key (Base64-encoded)
-    constraints:
-      - allowed_pattern: "[0-9A-Za-z+/=]+"
-        description: Must be Base64-encoded
-  etcd_ip:
-    type: string
-    description: IP address of an existing member of the etcd cluster
-    default: ""
-  index:
-    type: number
-    description: Index of this Bono node in the Bono cluster
-    default: 0
-
-resources:
-  server:
-    type: OS::Nova::Server
-    properties:
-      name: { str_replace: { params: { __index__: { get_param: index }, __zone__: { get_param: zone } }, template: bono-__index__.__zone__ } }
-      image: { get_param: bono_image_name }
-      flavor: { get_param: bono_flavor_name }
-      key_name: { get_param: key_name }
-      networks:
-        - network: { get_param: public_net_id }
-      metadata: {vnf_id: { get_param: vnf_id }, vf_module_id: { get_param: vf_module_id }}
-      user_data_format: RAW
-      user_data:
-        str_replace:
-          params:
-            __repo_url__: { get_param: repo_url }
-            __zone__: { get_param: zone }
-            __dns_ip__: { get_param: dns_ip }
-            __dnssec_key__: { get_param: dnssec_key }
-            __etcd_ip__ : { get_param: etcd_ip }
-            __index__ : { get_param: index }
-          template: |
-            #!/bin/bash
-
-            # Log all output to file.
-            exec > >(tee -a /var/log/clearwater-heat-bono.log) 2>&1
-            set -x
-
-            # Configure the APT software source.
-            echo 'deb __repo_url__ binary/' > /etc/apt/sources.list.d/clearwater.list
-            curl -L http://repo.cw-ngv.com/repo_key | apt-key add -
-            apt-get update
-
-            # Get the public IP address from eth0
-            sudo apt-get install ipcalc
-            ADDR=`ip addr show eth0 | awk '/inet /{print $2}'`
-            PUBLIC_ADDR=`ipcalc -n -b $ADDR | awk '/Address:/{print $2}'`
-
-            # Configure /etc/clearwater/local_config.
-            mkdir -p /etc/clearwater
-            etcd_ip=__etcd_ip__
-            [ -n "$etcd_ip" ] || etcd_ip=$PUBLIC_ADDR
-            cat > /etc/clearwater/local_config << EOF
-            management_local_ip=$PUBLIC_ADDR
-            local_ip=$PUBLIC_ADDR
-            public_ip=$PUBLIC_ADDR
-            public_hostname=__index__.bono.__zone__
-            etcd_cluster=$etcd_ip
-            EOF
-
-            # Now install the software.
-            DEBIAN_FRONTEND=noninteractive apt-get install bono-node --yes --force-yes
-            DEBIAN_FRONTEND=noninteractive apt-get install clearwater-management --yes --force-yes
-
-            # Function to give DNS record type and IP address for specified IP address
-            ip2rr() {
-              if echo $1 | grep -q -e '[^0-9.]' ; then
-                echo AAAA $1
-              else
-                echo A $1
-              fi
-            }
-
-            # Update DNS
-            retries=0
-            while ! { nsupdate -y "__zone__:__dnssec_key__" -v << EOF
-            server __dns_ip__
-            update add bono-__index__.__zone__. 30 $(ip2rr $PUBLIC_ADDR)
-            update add __index__.bono.__zone__. 30 $(ip2rr $PUBLIC_ADDR)
-            update add __zone__. 30 $(ip2rr $PUBLIC_ADDR)
-            update add __zone__. 30 NAPTR 0 0 "s" "SIP+D2T" "" _sip._tcp.__zone__.
-            update add __zone__. 30 NAPTR 0 0 "s" "SIP+D2U" "" _sip._udp.__zone__.
-            update add _sip._tcp.__zone__. 30 SRV 0 0 5060 __index__.bono.__zone__.
-            update add _sip._udp.__zone__. 30 SRV 0 0 5060 __index__.bono.__zone__.
-            send
-            EOF
-            } && [ $retries -lt 10 ]
-            do
-              retries=$((retries + 1))
-              echo 'nsupdate failed - retrying (retry '$retries')...'
-              sleep 5
-            done
-
-            # Use the DNS server.
-            echo 'nameserver __dns_ip__' > /etc/dnsmasq.resolv.conf
-            echo 'RESOLV_CONF=/etc/dnsmasq.resolv.conf' >> /etc/default/dnsmasq
-            service dnsmasq force-reload
-
-outputs:
-  public_ip:
-    description: IP address in public network
-    value: { get_attr: [ server, accessIPv4 ] }
diff --git a/robot/assets/asdc/base_clearwater/dns.yaml b/robot/assets/asdc/base_clearwater/dns.yaml
deleted file mode 100644
index f257d24..0000000
--- a/robot/assets/asdc/base_clearwater/dns.yaml
+++ /dev/null
@@ -1,159 +0,0 @@
-# Project Clearwater - IMS in the Cloud
-# Copyright (C) 2015  Metaswitch Networks Ltd
-#
-# This program is free software: you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the
-# Free Software Foundation, either version 3 of the License, or (at your
-# option) any later version, along with the "Special Exception" for use of
-# the program along with SSL, set forth below. This program is distributed
-# in the hope that it will be useful, but WITHOUT ANY WARRANTY;
-# without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-# A PARTICULAR PURPOSE.  See the GNU General Public License for more
-# details. You should have received a copy of the GNU General Public
-# License along with this program.  If not, see
-# <http://www.gnu.org/licenses/>.
-#
-# The author can be reached by email at clearwater@metaswitch.com or by
-# post at Metaswitch Networks Ltd, 100 Church St, Enfield EN2 6BQ, UK
-#
-# Special Exception
-# Metaswitch Networks Ltd  grants you permission to copy, modify,
-# propagate, and distribute a work formed by combining OpenSSL with The
-# Software, or a work derivative of such a combination, even if such
-# copying, modification, propagation, or distribution would otherwise
-# violate the terms of the GPL. You must comply with the GPL in all
-# respects for all of the code used other than OpenSSL.
-# "OpenSSL" means OpenSSL toolkit software distributed by the OpenSSL
-# Project and licensed under the OpenSSL Licenses, or a work based on such
-# software and licensed under the OpenSSL Licenses.
-# "OpenSSL Licenses" means the OpenSSL License and Original SSLeay License
-# under which the OpenSSL Project distributes the OpenSSL toolkit software,
-# as those licenses appear in the file LICENSE-OPENSSL.
-
-heat_template_version: 2013-05-23
-
-description: >
-  DNS server exposing dynamic DNS using DNSSEC
-
-parameters:
-  vnf_id:
-    type: string
-    label: VNF ID
-    description: The VNF ID provided by ONAP
-  vf_module_id:
-    type: string
-    label: VNF module ID
-    description: The VNF module ID provided by ONAP
-  public_net_id:
-    type: string
-    description: ID of public network
-    constraints:
-      - custom_constraint: neutron.network
-        description: Must be a valid network ID
-  dns_flavor_name:
-    type: string
-    description: Flavor to use
-    constraints:
-      - custom_constraint: nova.flavor
-        description: Must be a valid flavor name
-  dns_image_name:
-    type: string
-    description: Name of image to use
-  key_name:
-    type: string
-    description: Name of keypair to assign
-    constraints:
-      - custom_constraint: nova.keypair
-        description: Must be a valid keypair name
-# dns_security_group:
-#   type: string
-#   description: ID of security group for DNS nodes
-  zone:
-    type: string
-    description: DNS zone
-    default: example.com
-  dnssec_key:
-    type: string
-    description: DNSSEC private key (Base64-encoded)
-
-resources:
-  server:
-    type: OS::Nova::Server
-    properties:
-      name: { str_replace: { params: { __zone__: { get_param: zone } }, template: ns.__zone__ } }
-      image: { get_param: dns_image_name }
-      flavor: { get_param: dns_flavor_name }
-      key_name: { get_param: key_name }
-      networks:
-        - network: { get_param: public_net_id }
-      metadata: {vnf_id: { get_param: vnf_id }, vf_module_id: { get_param: vf_module_id }}
-      user_data_format: RAW
-      user_data:
-        str_replace:
-          params:
-            __zone__: { get_param: zone }
-            __dnssec_key__: { get_param: dnssec_key }
-          template: |
-            #!/bin/bash
-
-            # Log all output to file.
-            exec > >(tee -a /var/log/clearwater-heat-dns.log) 2>&1
-            set -x
-
-            # Install BIND.
-            apt-get update
-            DEBIAN_FRONTEND=noninteractive apt-get install bind9 --yes
-
-            # Get the public IP address from eth0
-            sudo apt-get install ipcalc
-            ADDR=`ip addr show eth0 | awk '/inet /{print $2}'`
-            PUBLIC_ADDR=`ipcalc -n -b $ADDR | awk '/Address:/{print $2}'`
-
-            # Update BIND configuration with the specified zone and key.
-            cat >> /etc/bind/named.conf.local << EOF
-            key __zone__. {
-              algorithm "HMAC-MD5";
-              secret "__dnssec_key__";
-            };
-
-            zone "__zone__" IN {
-              type master;
-              file "/var/lib/bind/db.__zone__";
-              allow-update {
-                key __zone__.;
-              };
-            };
-            EOF
-
-            # Function to give DNS record type and IP address for specified IP address
-            ip2rr() {
-              if echo $1 | grep -q -e '[^0-9.]' ; then
-                echo AAAA $1
-              else
-                echo A $1
-              fi
-            }
-
-            # Create basic zone configuration.
-            cat > /var/lib/bind/db.__zone__ << EOF
-            \$ORIGIN __zone__.
-            \$TTL 1h
-            @ IN SOA ns admin\@__zone__. ( $(date +%Y%m%d%H) 1d 2h 1w 30s )
-            @ NS ns
-            ns $(ip2rr $PUBLIC_ADDR)
-            EOF
-            chown root:bind /var/lib/bind/db.__zone__
-
-            # Now that BIND configuration is correct, kick it to reload.
-            service bind9 reload
-
-outputs:
-  dns_ip:
-    description: IP address of DNS server
-    value: { get_attr: [ server, accessIPv4 ] }
-  zone:
-    description: DNS zone
-    value: { get_param: zone }
-  dnssec_key:
-    description: DNSSEC private key (Base64-encoded)
-    value: { get_param: dnssec_key }
diff --git a/robot/assets/asdc/base_clearwater/ellis.yaml b/robot/assets/asdc/base_clearwater/ellis.yaml
deleted file mode 100644
index 76e68b0..0000000
--- a/robot/assets/asdc/base_clearwater/ellis.yaml
+++ /dev/null
@@ -1,242 +0,0 @@
-# Project Clearwater - IMS in the Cloud
-# Copyright (C) 2015  Metaswitch Networks Ltd
-#
-# This program is free software: you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the
-# Free Software Foundation, either version 3 of the License, or (at your
-# option) any later version, along with the "Special Exception" for use of
-# the program along with SSL, set forth below. This program is distributed
-# in the hope that it will be useful, but WITHOUT ANY WARRANTY;
-# without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-# A PARTICULAR PURPOSE.  See the GNU General Public License for more
-# details. You should have received a copy of the GNU General Public
-# License along with this program.  If not, see
-# <http://www.gnu.org/licenses/>.
-#
-# The author can be reached by email at clearwater@metaswitch.com or by
-# post at Metaswitch Networks Ltd, 100 Church St, Enfield EN2 6BQ, UK
-#
-# Special Exception
-# Metaswitch Networks Ltd  grants you permission to copy, modify,
-# propagate, and distribute a work formed by combining OpenSSL with The
-# Software, or a work derivative of such a combination, even if such
-# copying, modification, propagation, or distribution would otherwise
-# violate the terms of the GPL. You must comply with the GPL in all
-# respects for all of the code used other than OpenSSL.
-# "OpenSSL" means OpenSSL toolkit software distributed by the OpenSSL
-# Project and licensed under the OpenSSL Licenses, or a work based on such
-# software and licensed under the OpenSSL Licenses.
-# "OpenSSL Licenses" means the OpenSSL License and Original SSLeay License
-# under which the OpenSSL Project distributes the OpenSSL toolkit software,
-# as those licenses appear in the file LICENSE-OPENSSL.
-
-heat_template_version: 2013-05-23
-
-description: >
-  Clearwater Ellis node
-
-parameters:
-  vnf_id:
-    type: string
-    label: VNF ID
-    description: The VNF ID provided by ONAP
-  vf_module_id:
-    type: string
-    label: VNF module ID
-    description: The VNF module ID provided by ONAP
-  public_net_id:
-    type: string
-    description: ID of public network
-    constraints:
-      - custom_constraint: neutron.network
-        description: Must be a valid network ID
-  ellis_flavor_name:
-    type: string
-    description: Flavor to use
-    constraints:
-      - custom_constraint: nova.flavor
-        description: Must be a valid flavor name
-  ellis_image_name:
-    type: string
-    description: Name of image to use
-  key_name:
-    type: string
-    description: Name of keypair to assign
-    constraints:
-      - custom_constraint: nova.keypair
-        description: Must be a valid keypair name
-# base_mgmt_security_group:
-#   type: string
-#   description: ID of base security group for all Clearwater nodes (management)
-# ellis_mgmt_security_group:
-#   type: string
-#   description: ID of security group for Ellis nodes (management)
-  repo_url:
-    type: string
-    description: URL for Clearwater repository
-    default: http://repo.cw-ngv.com/stable
-  zone:
-    type: string
-    description: DNS zone
-    default: example.com
-  dn_range_start:
-    type: string
-    description: First directory number in pool
-    default: "6505550000"
-    constraints:
-      - allowed_pattern: "[0-9]+"
-        description: Must be numeric
-  dn_range_length:
-    type: string
-    description: Number of directory numbers to add to pool
-    default: "1000"
-    constraints:
-      - allowed_pattern: "[0-9]+"
-        description: Must be numeric
-  dns_ip:
-    type: string
-    description: IP address for DNS server
-  dnssec_key:
-    type: string
-    description: DNSSEC private key (Base64-encoded)
-    constraints:
-      - allowed_pattern: "[0-9A-Za-z+/=]+"
-        description: Must be Base64-encoded
-  etcd_ip:
-    type: string
-    description: IP address of an existing member of the etcd cluster
-    default: ""
-  index:
-    type: number
-    description: Index of this Ellis node in the Ellis cluster
-    default: 0
-
-resources:
-  server:
-    type: OS::Nova::Server
-    properties:
-      name: { str_replace: { params: { __index__: { get_param: index }, __zone__: { get_param: zone } }, template: ellis-__index__.__zone__ } }
-      image: { get_param: ellis_image_name }
-      flavor: { get_param: ellis_flavor_name }
-      key_name: { get_param: key_name }
-      networks:
-        - network: { get_param: public_net_id }
-      metadata: {vnf_id: { get_param: vnf_id }, vf_module_id: { get_param: vf_module_id }}
-      user_data_format: RAW
-      user_data:
-        str_replace:
-          params:
-            __repo_url__: { get_param: repo_url }
-            __zone__: { get_param: zone }
-            __dn_range_start__: { get_param: dn_range_start }
-            __dn_range_length__: { get_param: dn_range_length }
-            __dns_ip__: { get_param: dns_ip }
-            __dnssec_key__: { get_param: dnssec_key }
-            __etcd_ip__ : { get_param: etcd_ip }
-            __index__ : { get_param: index }
-          template: |
-            #!/bin/bash
-
-            # Log all output to file.
-            exec > >(tee -a /var/log/clearwater-heat-ellis.log) 2>&1
-            set -x
-
-            # Configure the APT software source.
-            echo 'deb __repo_url__ binary/' > /etc/apt/sources.list.d/clearwater.list
-            curl -L http://repo.cw-ngv.com/repo_key | apt-key add -
-            apt-get update
-
-            # Get the public IP address from eth0
-            sudo apt-get install ipcalc
-            ADDR=`ip addr show eth0 | awk '/inet /{print $2}'`
-            PUBLIC_ADDR=`ipcalc -n -b $ADDR | awk '/Address:/{print $2}'`
-
-            # Configure /etc/clearwater/local_config.  Add xdms_hostname here to use Homer's management
-            # hostname instead of signaling.  This will override shared_config.  This works around
-            # https://github.com/Metaswitch/ellis/issues/153.
-            mkdir -p /etc/clearwater
-            etcd_ip=__etcd_ip__
-            [ -n "$etcd_ip" ] || etcd_ip=$PUBLIC_ADDR
-            cat > /etc/clearwater/local_config << EOF
-            local_ip=$PUBLIC_ADDR
-            public_ip=$PUBLIC_ADDR
-            public_hostname=ellis-__index__.__zone__
-            etcd_cluster=$etcd_ip
-            xdms_hostname=homer-0.__zone__:7888
-            EOF
-
-            # Now install the software.
-            DEBIAN_FRONTEND=noninteractive apt-get install ellis-node --yes --force-yes
-            DEBIAN_FRONTEND=noninteractive apt-get install clearwater-management --yes --force-yes
-
-            # Wait until etcd is up and running before uploading the shared_config
-            /usr/share/clearwater/clearwater-etcd/scripts/wait_for_etcd
-
-            # Configure and upload /etc/clearwater/shared_config.
-            cat > /etc/clearwater/shared_config << EOF
-            # Deployment definitions
-            home_domain=__zone__
-            sprout_hostname=sprout.__zone__
-            hs_hostname=hs.__zone__:8888
-            hs_provisioning_hostname=hs-prov.__zone__:8889
-            ralf_hostname=ralf.__zone__:10888
-            xdms_hostname=homer.__zone__:7888
-            sprout_registration_store=sprout.__zone__
-            ralf_session_store=ralf.__zone__
-
-            upstream_port=0
-
-            # Email server configuration
-            smtp_smarthost=localhost
-            smtp_username=username
-            smtp_password=password
-            email_recovery_sender=clearwater@example.org
-
-            # Keys
-            signup_key=secret
-            turn_workaround=secret
-            ellis_api_key=secret
-            ellis_cookie_key=secret
-            EOF
-            sudo /usr/share/clearwater/clearwater-config-manager/scripts/upload_shared_config
-
-            # Allocate a pool of numbers to assign to users.  Before we do this,
-            # restart clearwater-infrastructure to make sure that
-            # local_settings.py runs to pick up the configuration changes.
-            service clearwater-infrastructure restart
-            service ellis stop
-            /usr/share/clearwater/ellis/env/bin/python /usr/share/clearwater/ellis/src/metaswitch/ellis/tools/create_numbers.py --start __dn_range_start__ --count __dn_range_length__
-
-            # Function to give DNS record type and IP address for specified IP address
-            ip2rr() {
-              if echo $1 | grep -q -e '[^0-9.]' ; then
-                echo AAAA $1
-              else
-                echo A $1
-              fi
-            }
-
-            # Update DNS
-            retries=0
-            while ! { nsupdate -y "__zone__:__dnssec_key__" -v << EOF
-            server __dns_ip__
-            update add ellis-__index__.__zone__. 30 $(ip2rr $PUBLIC_ADDR)
-            update add ellis.__zone__. 30 $(ip2rr $PUBLIC_ADDR)
-            send
-            EOF
-            } && [ $retries -lt 10 ]
-            do
-              retries=$((retries + 1))
-              echo 'nsupdate failed - retrying (retry '$retries')...'
-              sleep 5
-            done
-
-            # Use the DNS server.
-            echo 'nameserver __dns_ip__' > /etc/dnsmasq.resolv.conf
-            echo 'RESOLV_CONF=/etc/dnsmasq.resolv.conf' >> /etc/default/dnsmasq
-            service dnsmasq force-reload
-
-outputs:
-  public_ip:
-    description: IP address in public network
-    value: { get_attr: [ server, accessIPv4 ] }
diff --git a/robot/assets/asdc/base_clearwater/homer.yaml b/robot/assets/asdc/base_clearwater/homer.yaml
deleted file mode 100644
index cbf9733..0000000
--- a/robot/assets/asdc/base_clearwater/homer.yaml
+++ /dev/null
@@ -1,190 +0,0 @@
-# Project Clearwater - IMS in the Cloud
-# Copyright (C) 2015  Metaswitch Networks Ltd
-#
-# This program is free software: you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the
-# Free Software Foundation, either version 3 of the License, or (at your
-# option) any later version, along with the "Special Exception" for use of
-# the program along with SSL, set forth below. This program is distributed
-# in the hope that it will be useful, but WITHOUT ANY WARRANTY;
-# without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-# A PARTICULAR PURPOSE.  See the GNU General Public License for more
-# details. You should have received a copy of the GNU General Public
-# License along with this program.  If not, see
-# <http://www.gnu.org/licenses/>.
-#
-# The author can be reached by email at clearwater@metaswitch.com or by
-# post at Metaswitch Networks Ltd, 100 Church St, Enfield EN2 6BQ, UK
-#
-# Special Exception
-# Metaswitch Networks Ltd  grants you permission to copy, modify,
-# propagate, and distribute a work formed by combining OpenSSL with The
-# Software, or a work derivative of such a combination, even if such
-# copying, modification, propagation, or distribution would otherwise
-# violate the terms of the GPL. You must comply with the GPL in all
-# respects for all of the code used other than OpenSSL.
-# "OpenSSL" means OpenSSL toolkit software distributed by the OpenSSL
-# Project and licensed under the OpenSSL Licenses, or a work based on such
-# software and licensed under the OpenSSL Licenses.
-# "OpenSSL Licenses" means the OpenSSL License and Original SSLeay License
-# under which the OpenSSL Project distributes the OpenSSL toolkit software,
-# as those licenses appear in the file LICENSE-OPENSSL.
-
-heat_template_version: 2013-05-23
-
-description: >
-  Clearwater Homer node
-
-parameters:
-  vnf_id:
-    type: string
-    label: VNF ID
-    description: The VNF ID provided by ONAP
-  vf_module_id:
-    type: string
-    label: VNF module ID
-    description: The VNF module ID provided by ONAP
-  public_net_id:
-    type: string
-    description: ID of public network
-    constraints:
-      - custom_constraint: neutron.network
-        description: Must be a valid network ID
-  homer_flavor_name:
-    type: string
-    description: Flavor to use
-    constraints:
-      - custom_constraint: nova.flavor
-        description: Must be a valid flavor name
-  homer_image_name:
-    type: string
-    description: Name of image to use
-  key_name:
-    type: string
-    description: Name of keypair to assign
-    constraints:
-      - custom_constraint: nova.keypair
-        description: Must be a valid keypair name
-# base_mgmt_security_group:
-#   type: string
-#   description: ID of base security group for all Clearwater nodes (management)
-# homer_mgmt_security_group:
-#   type: string
-#   description: ID of security group for Homer nodes (maangement)
-# homer_sig_security_group:
-#   type: string
-#   description: ID of security group for Homer nodes (signaling)
-  repo_url:
-    type: string
-    description: URL for Clearwater repository
-    default: http://repo.cw-ngv.com/stable
-  zone:
-    type: string
-    description: DNS zone
-    default: example.com
-  dns_ip:
-    type: string
-    description: IP address for DNS server on management network
-  dnssec_key:
-    type: string
-    description: DNSSEC private key (Base64-encoded)
-    constraints:
-      - allowed_pattern: "[0-9A-Za-z+/=]+"
-        description: Must be Base64-encoded
-  etcd_ip:
-    type: string
-    description: IP address of an existing member of the etcd cluster
-    default: ""
-  index:
-    type: number
-    description: Index of this Homer node in the Homer cluster
-    default: 0
-
-resources:
-  server:
-    type: OS::Nova::Server
-    properties:
-      name: { str_replace: { params: { __index__: { get_param: index }, __zone__: { get_param: zone } }, template: homer-__index__.__zone__ } }
-      image: { get_param: homer_image_name }
-      flavor: { get_param: homer_flavor_name }
-      key_name: { get_param: key_name }
-      networks:
-        - network: { get_param: public_net_id }
-      metadata: {vnf_id: { get_param: vnf_id }, vf_module_id: { get_param: vf_module_id }}
-      user_data_format: RAW
-      user_data:
-        str_replace:
-          params:
-            __repo_url__: { get_param: repo_url }
-            __zone__: { get_param: zone }
-            __dns_ip__: { get_param: dns_ip }
-            __dnssec_key__: { get_param: dnssec_key }
-            __etcd_ip__ : { get_param: etcd_ip }
-            __index__ : { get_param: index }
-          template: |
-            #!/bin/bash
-
-            # Log all output to file.
-            exec > >(tee -a /var/log/clearwater-heat-homer.log) 2>&1
-            set -x
-
-            # Configure the APT software source.
-            echo 'deb __repo_url__ binary/' > /etc/apt/sources.list.d/clearwater.list
-            curl -L http://repo.cw-ngv.com/repo_key | apt-key add -
-            apt-get update
-
-            # Get the public IP address from eth0
-            sudo apt-get install ipcalc
-            ADDR=`ip addr show eth0 | awk '/inet /{print $2}'`
-            PUBLIC_ADDR=`ipcalc -n -b $ADDR | awk '/Address:/{print $2}'`
-
-            # Configure /etc/clearwater/local_config.
-            mkdir -p /etc/clearwater
-            etcd_ip=__etcd_ip__
-            [ -n "$etcd_ip" ] || etcd_ip=$PUBLIC_ADDR
-            cat > /etc/clearwater/local_config << EOF
-            management_local_ip=$PUBLIC_ADDR
-            local_ip=$PUBLIC_ADDR
-            public_ip=$PUBLIC_ADDR
-            public_hostname=homer-__index__.__zone__
-            etcd_cluster=$etcd_ip
-            EOF
-
-            # Now install the software.
-            DEBIAN_FRONTEND=noninteractive apt-get install homer-node --yes --force-yes
-            DEBIAN_FRONTEND=noninteractive apt-get install clearwater-management --yes --force-yes
-
-            # Function to give DNS record type and IP address for specified IP address
-            ip2rr() {
-              if echo $1 | grep -q -e '[^0-9.]' ; then
-                echo AAAA $1
-              else
-                echo A $1
-              fi
-            }
-
-            # Update DNS
-            retries=0
-            while ! { nsupdate -y "__zone__:__dnssec_key__" -v << EOF
-            server __dns_ip__
-            update add homer-__index__.__zone__. 30 $(ip2rr $PUBLIC_ADDR)
-            update add homer.__zone__. 30 $(ip2rr $PUBLIC_ADDR)
-            send
-            EOF
-            } && [ $retries -lt 10 ]
-            do
-              retries=$((retries + 1))
-              echo 'nsupdate failed - retrying (retry '$retries')...'
-              sleep 5
-            done
-
-            # Use the DNS server.
-            # Use the DNS server.
-            echo 'nameserver __dns_ip__' > /etc/dnsmasq.resolv.conf
-            echo 'RESOLV_CONF=/etc/dnsmasq.resolv.conf' >> /etc/default/dnsmasq
-            service dnsmasq force-reload
-
-outputs:
-  public_ip:
-    description: IP address in public network
-    value: { get_attr: [ server, accessIPv4 ] }
diff --git a/robot/assets/asdc/base_clearwater/homestead.yaml b/robot/assets/asdc/base_clearwater/homestead.yaml
deleted file mode 100644
index f3519bb..0000000
--- a/robot/assets/asdc/base_clearwater/homestead.yaml
+++ /dev/null
@@ -1,190 +0,0 @@
-# Project Clearwater - IMS in the Cloud
-# Copyright (C) 2015  Metaswitch Networks Ltd
-#
-# This program is free software: you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the
-# Free Software Foundation, either version 3 of the License, or (at your
-# option) any later version, along with the "Special Exception" for use of
-# the program along with SSL, set forth below. This program is distributed
-# in the hope that it will be useful, but WITHOUT ANY WARRANTY;
-# without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-# A PARTICULAR PURPOSE.  See the GNU General Public License for more
-# details. You should have received a copy of the GNU General Public
-# License along with this program.  If not, see
-# <http://www.gnu.org/licenses/>.
-#
-# The author can be reached by email at clearwater@metaswitch.com or by
-# post at Metaswitch Networks Ltd, 100 Church St, Enfield EN2 6BQ, UK
-#
-# Special Exception
-# Metaswitch Networks Ltd  grants you permission to copy, modify,
-# propagate, and distribute a work formed by combining OpenSSL with The
-# Software, or a work derivative of such a combination, even if such
-# copying, modification, propagation, or distribution would otherwise
-# violate the terms of the GPL. You must comply with the GPL in all
-# respects for all of the code used other than OpenSSL.
-# "OpenSSL" means OpenSSL toolkit software distributed by the OpenSSL
-# Project and licensed under the OpenSSL Licenses, or a work based on such
-# software and licensed under the OpenSSL Licenses.
-# "OpenSSL Licenses" means the OpenSSL License and Original SSLeay License
-# under which the OpenSSL Project distributes the OpenSSL toolkit software,
-# as those licenses appear in the file LICENSE-OPENSSL.
-
-heat_template_version: 2013-05-23
-
-description: >
-  Clearwater Homestead node
-
-parameters:
-  vnf_id:
-    type: string
-    label: VNF ID
-    description: The VNF ID provided by ONAP
-  vf_module_id:
-    type: string
-    label: VNF module ID
-    description: The VNF module ID provided by ONAP
-  public_net_id:
-    type: string
-    description: ID of public network
-    constraints:
-      - custom_constraint: neutron.network
-        description: Must be a valid network ID
-  homestead_flavor_name:
-    type: string
-    description: Flavor to use
-    constraints:
-      - custom_constraint: nova.flavor
-        description: Must be a valid flavor name
-  homestead_image_name:
-    type: string
-    description: Name of image to use
-  key_name:
-    type: string
-    description: Name of keypair to assign
-    constraints:
-      - custom_constraint: nova.keypair
-        description: Must be a valid keypair name
-# base_mgmt_security_group:
-#   type: string
-#   description: ID of base security group for all Clearwater nodes (management)
-# homestead_mgmt_security_group:
-#   type: string
-#   description: ID of security group for Homestead nodes (management)
-# homestead_sig_security_group:
-#   type: string
-#   description: ID of security group for Homestead nodes (signaling)
-  repo_url:
-    type: string
-    description: URL for Clearwater repository
-    default: http://repo.cw-ngv.com/stable
-  zone:
-    type: string
-    description: DNS zone
-    default: example.com
-  dns_ip:
-    type: string
-    description: IP address for DNS server on management network
-  dnssec_key:
-    type: string
-    description: DNSSEC private key (Base64-encoded)
-    constraints:
-      - allowed_pattern: "[0-9A-Za-z+/=]+"
-        description: Must be Base64-encoded
-  etcd_ip:
-    type: string
-    description: IP address of an existing member of the etcd cluster
-    default: ""
-  index:
-    type: number
-    description: Index of this Homestead node in the Homestead cluster
-    default: 0
-
-resources:
-  server:
-    type: OS::Nova::Server
-    properties:
-      name: { str_replace: { params: { __index__: { get_param: index }, __zone__: { get_param: zone } }, template: homestead-__index__.__zone__ } }
-      image: { get_param: homestead_image_name }
-      flavor: { get_param: homestead_flavor_name }
-      key_name: { get_param: key_name }
-      networks:
-        - network: { get_param: public_net_id }
-      metadata: {vnf_id: { get_param: vnf_id }, vf_module_id: { get_param: vf_module_id }}
-      user_data_format: RAW
-      user_data:
-        str_replace:
-          params:
-            __repo_url__: { get_param: repo_url }
-            __zone__: { get_param: zone }
-            __dns_ip__: { get_param: dns_ip }
-            __dnssec_key__: { get_param: dnssec_key }
-            __etcd_ip__ : { get_param: etcd_ip }
-            __index__ : { get_param: index }
-          template: |
-            #!/bin/bash
-
-            # Log all output to file.
-            exec > >(tee -a /var/log/clearwater-heat-homestead.log) 2>&1
-            set -x
-
-            # Configure the APT software source.
-            echo 'deb __repo_url__ binary/' > /etc/apt/sources.list.d/clearwater.list
-            curl -L http://repo.cw-ngv.com/repo_key | apt-key add -
-            apt-get update
-
-            # Get the public IP address from eth0
-            sudo apt-get install ipcalc
-            ADDR=`ip addr show eth0 | awk '/inet /{print $2}'`
-            PUBLIC_ADDR=`ipcalc -n -b $ADDR | awk '/Address:/{print $2}'`
-
-            # Configure /etc/clearwater/local_config.
-            mkdir -p /etc/clearwater
-            etcd_ip=__etcd_ip__
-            [ -n "$etcd_ip" ] || etcd_ip=$PUBLIC_ADDR
-            cat > /etc/clearwater/local_config << EOF
-            management_local_ip=$PUBLIC_ADDR
-            local_ip=$PUBLIC_ADDR
-            public_ip=$PUBLIC_ADDR
-            public_hostname=homestead-__index__.__zone__
-            etcd_cluster=$etcd_ip
-            EOF
-
-            # Now install the software.
-            DEBIAN_FRONTEND=noninteractive apt-get install homestead-node clearwater-prov-tools --yes --force-yes
-            DEBIAN_FRONTEND=noninteractive apt-get install clearwater-management --yes --force-yes
-
-            # Function to give DNS record type and IP address for specified IP address
-            ip2rr() {
-              if echo $1 | grep -q -e '[^0-9.]' ; then
-                echo AAAA $1
-              else
-                echo A $1
-              fi
-            }
-
-            # Update DNS
-            retries=0
-            while ! { nsupdate -y "__zone__:__dnssec_key__" -v << EOF
-            server __dns_ip__
-            update add homestead-__index__.__zone__. 30 $(ip2rr $PUBLIC_ADDR)
-            update add hs-prov.__zone__. 30 $(ip2rr $PUBLIC_ADDR)
-            update add hs.__zone__. 30 $(ip2rr $PUBLIC_ADDR)
-            send
-            EOF
-            } && [ $retries -lt 10 ]
-            do
-              retries=$((retries + 1))
-              echo 'nsupdate failed - retrying (retry '$retries')...'
-              sleep 5
-            done
-
-            # Use the DNS server.
-            echo 'nameserver __dns_ip__' > /etc/dnsmasq.resolv.conf
-            echo 'RESOLV_CONF=/etc/dnsmasq.resolv.conf' >> /etc/default/dnsmasq
-            service dnsmasq force-reload
-
-outputs:
-  public_ip:
-    description: IP address in public network
-    value: { get_attr: [ server, accessIPv4 ] }
diff --git a/robot/assets/asdc/base_clearwater/ralf.yaml b/robot/assets/asdc/base_clearwater/ralf.yaml
deleted file mode 100644
index 301a561..0000000
--- a/robot/assets/asdc/base_clearwater/ralf.yaml
+++ /dev/null
@@ -1,205 +0,0 @@
-# Project Clearwater - IMS in the Cloud
-# Copyright (C) 2015  Metaswitch Networks Ltd
-#
-# This program is free software: you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the
-# Free Software Foundation, either version 3 of the License, or (at your
-# option) any later version, along with the "Special Exception" for use of
-# the program along with SSL, set forth below. This program is distributed
-# in the hope that it will be useful, but WITHOUT ANY WARRANTY;
-# without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-# A PARTICULAR PURPOSE.  See the GNU General Public License for more
-# details. You should have received a copy of the GNU General Public
-# License along with this program.  If not, see
-# <http://www.gnu.org/licenses/>.
-#
-# The author can be reached by email at clearwater@metaswitch.com or by
-# post at Metaswitch Networks Ltd, 100 Church St, Enfield EN2 6BQ, UK
-#
-# Special Exception
-# Metaswitch Networks Ltd  grants you permission to copy, modify,
-# propagate, and distribute a work formed by combining OpenSSL with The
-# Software, or a work derivative of such a combination, even if such
-# copying, modification, propagation, or distribution would otherwise
-# violate the terms of the GPL. You must comply with the GPL in all
-# respects for all of the code used other than OpenSSL.
-# "OpenSSL" means OpenSSL toolkit software distributed by the OpenSSL
-# Project and licensed under the OpenSSL Licenses, or a work based on such
-# software and licensed under the OpenSSL Licenses.
-# "OpenSSL Licenses" means the OpenSSL License and Original SSLeay License
-# under which the OpenSSL Project distributes the OpenSSL toolkit software,
-# as those licenses appear in the file LICENSE-OPENSSL.
-
-heat_template_version: 2013-05-23
-
-description: >
-  Clearwater Ralf node
-
-parameters:
-  vnf_id:
-    type: string
-    label: VNF ID
-    description: The VNF ID provided by ONAP
-  vf_module_id:
-    type: string
-    label: VNF module ID
-    description: The VNF module ID provided by ONAP
-  public_net_id:
-    type: string
-    description: ID of public network
-    constraints:
-      - custom_constraint: neutron.network
-        description: Must be a valid network ID
-  ralf_flavor_name:
-    type: string
-    description: Flavor to use
-    constraints:
-      - custom_constraint: nova.flavor
-        description: Must be a valid flavor name
-  ralf_image_name:
-    type: string
-    description: Name of image to use
-  key_name:
-    type: string
-    description: Name of keypair to assign
-    constraints:
-      - custom_constraint: nova.keypair
-        description: Must be a valid keypair name
-# base_mgmt_security_group:
-#   type: string
-#   description: ID of base security group for all Clearwater nodes (management)
-# ralf_sig_security_group:
-#   type: string
-#   description: ID of security group for Ralf nodes (signaling)
-  repo_url:
-    type: string
-    description: URL for Clearwater repository
-    default: http://repo.cw-ngv.com/stable
-  zone:
-    type: string
-    description: DNS zone
-    default: example.com
-  dns_ip:
-    type: string
-    description: IP address for DNS server
-  dnssec_key:
-    type: string
-    description: DNSSEC private key (Base64-encoded)
-    constraints:
-      - allowed_pattern: "[0-9A-Za-z+/=]+"
-        description: Must be Base64-encoded
-  etcd_ip:
-    type: string
-    description: IP address of an existing member of the etcd cluster
-    default: ""
-  index:
-    type: number
-    description: Index of this Ralf node in the Ralf cluster
-    default: 0
-
-resources:
-  server:
-    type: OS::Nova::Server
-    properties:
-      name: { str_replace: { params: { __index__: { get_param: index }, __zone__: { get_param: zone } }, template: ralf-__index__.__zone__ } }
-      image: { get_param: ralf_image_name }
-      flavor: { get_param: ralf_flavor_name }
-      key_name: { get_param: key_name }
-      networks:
-        - network: { get_param: public_net_id }
-      metadata: {vnf_id: { get_param: vnf_id }, vf_module_id: { get_param: vf_module_id }}
-      user_data_format: RAW
-      user_data:
-        str_replace:
-          params:
-            __repo_url__: { get_param: repo_url }
-            __zone__: { get_param: zone }
-            __dns_ip__: { get_param: dns_ip }
-            __dnssec_key__: { get_param: dnssec_key }
-            __etcd_ip__ : { get_param: etcd_ip }
-            __index__ : { get_param: index }
-          template: |
-            #!/bin/bash
-
-            # Log all output to file.
-            exec > >(tee -a /var/log/clearwater-heat-ralf.log) 2>&1
-            set -x
-
-            # Configure the APT software source.
-            echo 'deb __repo_url__ binary/' > /etc/apt/sources.list.d/clearwater.list
-            curl -L http://repo.cw-ngv.com/repo_key | apt-key add -
-            apt-get update
-
-            # Get the public IP address from eth0
-            sudo apt-get install ipcalc
-            ADDR=`ip addr show eth0 | awk '/inet /{print $2}'`
-            PUBLIC_ADDR=`ipcalc -n -b $ADDR | awk '/Address:/{print $2}'`
-
-            # Configure /etc/clearwater/local_config.
-            mkdir -p /etc/clearwater
-            etcd_ip=__etcd_ip__
-            [ -n "$etcd_ip" ] || etcd_ip=$PUBLIC_ADDR
-            cat > /etc/clearwater/local_config << EOF
-            management_local_ip=$PUBLIC_ADDR
-            local_ip=$PUBLIC_ADDR
-            public_ip=$PUBLIC_ADDR
-            public_hostname=ralf-__index__.__zone__
-            etcd_cluster=$etcd_ip
-            EOF
-
-            # Create /etc/chronos/chronos.conf.
-            mkdir -p /etc/chronos
-            cat > /etc/chronos/chronos.conf << EOF
-            [http]
-            bind-address = $PUBLIC_ADDR
-            bind-port = 7253
-            threads = 50
-
-            [logging]
-            folder = /var/log/chronos
-            level = 2
-
-            [alarms]
-            enabled = true
-
-            [exceptions]
-            max_ttl = 600
-            EOF
-
-            # Now install the software.
-            DEBIAN_FRONTEND=noninteractive apt-get install ralf-node --yes --force-yes
-            DEBIAN_FRONTEND=noninteractive apt-get install clearwater-management --yes --force-yes
-
-            # Function to give DNS record type and IP address for specified IP address
-            ip2rr() {
-              if echo $1 | grep -q -e '[^0-9.]' ; then
-                echo AAAA $1
-              else
-                echo A $1
-              fi
-            }
-
-            # Update DNS
-            retries=0
-            while ! { nsupdate -y "__zone__:__dnssec_key__" -v << EOF
-            server __dns_ip__
-            update add ralf-__index__.__zone__. 30 $(ip2rr $PUBLIC_ADDR)
-            update add ralf.__zone__. 30 $(ip2rr $PUBLIC_ADDR)
-            send
-            EOF
-            } && [ $retries -lt 10 ]
-            do
-              retries=$((retries + 1))
-              echo 'nsupdate failed - retrying (retry '$retries')...'
-              sleep 5
-            done
-
-            # Use the DNS server.
-            echo 'nameserver __dns_ip__' > /etc/dnsmasq.resolv.conf
-            echo 'RESOLV_CONF=/etc/dnsmasq.resolv.conf' >> /etc/default/dnsmasq
-            service dnsmasq force-reload
-
-outputs:
-  public_ip:
-    description: IP address in public network
-    value: { get_attr: [ server, accessIPv4 ] }
diff --git a/robot/assets/asdc/base_clearwater/sprout.yaml b/robot/assets/asdc/base_clearwater/sprout.yaml
deleted file mode 100644
index 7fb9dd8..0000000
--- a/robot/assets/asdc/base_clearwater/sprout.yaml
+++ /dev/null
@@ -1,217 +0,0 @@
-# Project Clearwater - IMS in the Cloud
-# Copyright (C) 2015  Metaswitch Networks Ltd
-#
-# This program is free software: you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the
-# Free Software Foundation, either version 3 of the License, or (at your
-# option) any later version, along with the "Special Exception" for use of
-# the program along with SSL, set forth below. This program is distributed
-# in the hope that it will be useful, but WITHOUT ANY WARRANTY;
-# without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-# A PARTICULAR PURPOSE.  See the GNU General Public License for more
-# details. You should have received a copy of the GNU General Public
-# License along with this program.  If not, see
-# <http://www.gnu.org/licenses/>.
-#
-# The author can be reached by email at clearwater@metaswitch.com or by
-# post at Metaswitch Networks Ltd, 100 Church St, Enfield EN2 6BQ, UK
-#
-# Special Exception
-# Metaswitch Networks Ltd  grants you permission to copy, modify,
-# propagate, and distribute a work formed by combining OpenSSL with The
-# Software, or a work derivative of such a combination, even if such
-# copying, modification, propagation, or distribution would otherwise
-# violate the terms of the GPL. You must comply with the GPL in all
-# respects for all of the code used other than OpenSSL.
-# "OpenSSL" means OpenSSL toolkit software distributed by the OpenSSL
-# Project and licensed under the OpenSSL Licenses, or a work based on such
-# software and licensed under the OpenSSL Licenses.
-# "OpenSSL Licenses" means the OpenSSL License and Original SSLeay License
-# under which the OpenSSL Project distributes the OpenSSL toolkit software,
-# as those licenses appear in the file LICENSE-OPENSSL.
-
-heat_template_version: 2013-05-23
-
-description: >
-  Clearwater Sprout node
-
-parameters:
-  vnf_id:
-    type: string
-    label: VNF ID
-    description: The VNF ID provided by ONAP
-  vf_module_id:
-    type: string
-    label: VNF module ID
-    description: The VNF module ID provided by ONAP
-  public_net_id:
-    type: string
-    description: ID of public network
-    constraints:
-      - custom_constraint: neutron.network
-        description: Must be a valid network ID
-  sprout_flavor_name:
-    type: string
-    description: Flavor to use
-    constraints:
-      - custom_constraint: nova.flavor
-        description: Must be a valid flavor name
-  sprout_image_name:
-    type: string
-    description: Name of image to use
-  key_name:
-    type: string
-    description: Name of keypair to assign
-    constraints:
-      - custom_constraint: nova.keypair
-        description: Must be a valid keypair name
-# base_mgmt_security_group:
-#   type: string
-#   description: ID of base security group for all Clearwater nodes (management)
-# sprout_sig_security_group:
-#   type: string
-#   description: ID of security group for Sprout nodes (signaling)
-# sprout_sig2_security_group:
-#   type: string
-#   description: ID of additional security group for Sprout nodes (signaling)
-  repo_url:
-    type: string
-    description: URL for Clearwater repository
-    default: http://repo.cw-ngv.com/stable
-  zone:
-    type: string
-    description: DNS zone
-    default: example.com
-  dns_ip:
-    type: string
-    description: IP address for DNS server on network
-  dnssec_key:
-    type: string
-    description: DNSSEC private key (Base64-encoded)
-    constraints:
-      - allowed_pattern: "[0-9A-Za-z+/=]+"
-        description: Must be Base64-encoded
-  etcd_ip:
-    type: string
-    description: IP address of an existing member of the etcd cluster
-    default: ""
-  index:
-    type: number
-    description: Index of this Sprout node in the Sprout cluster
-    default: 0
-
-resources:
-  server:
-    type: OS::Nova::Server
-    properties:
-      name: { str_replace: { params: { __index__: { get_param: index }, __zone__: { get_param: zone } }, template: sprout-__index__.__zone__ } }
-      image: { get_param: sprout_image_name }
-      flavor: { get_param: sprout_flavor_name }
-      key_name: { get_param: key_name }
-      networks:
-        - network: { get_param: public_net_id }
-      metadata: {vnf_id: { get_param: vnf_id }, vf_module_id: { get_param: vf_module_id }}
-      user_data_format: RAW
-      user_data:
-        str_replace:
-          params:
-            __repo_url__: { get_param: repo_url }
-            __zone__: { get_param: zone }
-            __dns_ip__: { get_param: dns_ip }
-            __dnssec_key__: { get_param: dnssec_key }
-            __etcd_ip__ : { get_param: etcd_ip }
-            __index__ : { get_param: index }
-          template: |
-            #!/bin/bash
-
-            # Log all output to file.
-            exec > >(tee -a /var/log/clearwater-heat-sprout.log) 2>&1
-            set -x
-
-            # Configure the APT software source.
-            echo 'deb __repo_url__ binary/' > /etc/apt/sources.list.d/clearwater.list
-            curl -L http://repo.cw-ngv.com/repo_key | apt-key add -
-            apt-get update
-
-            # Get the public IP address from eth0
-            sudo apt-get install ipcalc
-            ADDR=`ip addr show eth0 | awk '/inet /{print $2}'`
-            PUBLIC_ADDR=`ipcalc -n -b $ADDR | awk '/Address:/{print $2}'`
-
-            # Configure /etc/clearwater/local_config.
-            mkdir -p /etc/clearwater
-            etcd_ip=__etcd_ip__
-            [ -n "$etcd_ip" ] || etcd_ip=$PUBLIC_ADDR
-            cat > /etc/clearwater/local_config << EOF
-            management_local_ip=$PUBLIC_ADDR
-            local_ip=$PUBLIC_ADDR
-            public_ip=$PUBLIC_ADDR
-            public_hostname=__index__.sprout.__zone__
-            etcd_cluster=$etcd_ip
-            EOF
-
-            # Create /etc/chronos/chronos.conf.
-            mkdir -p /etc/chronos
-            cat > /etc/chronos/chronos.conf << EOF
-            [http]
-            bind-address = $PUBLIC_ADDR
-            bind-port = 7253
-            threads = 50
-
-            [logging]
-            folder = /var/log/chronos
-            level = 2
-
-            [alarms]
-            enabled = true
-
-            [exceptions]
-            max_ttl = 600
-            EOF
-
-            # Now install the software.
-            DEBIAN_FRONTEND=noninteractive apt-get install sprout-node --yes --force-yes
-            DEBIAN_FRONTEND=noninteractive apt-get install clearwater-management --yes --force-yes
-
-            # Function to give DNS record type and IP address for specified IP address
-            ip2rr() {
-              if echo $1 | grep -q -e '[^0-9.]' ; then
-                echo AAAA $1
-              else
-                echo A $1
-              fi
-            }
-
-            # Update DNS
-            retries=0
-            while ! { nsupdate -y "__zone__:__dnssec_key__" -v << EOF
-            server __dns_ip__
-            update add sprout-__index__.__zone__. 30 $(ip2rr $PUBLIC_ADDR)
-            update add __index__.sprout.__zone__. 30 $(ip2rr $PUBLIC_ADDR)
-            update add sprout.__zone__. 30 $(ip2rr $PUBLIC_ADDR)
-            update add scscf.sprout.__zone__. 30 $(ip2rr $PUBLIC_ADDR)
-            update add icscf.sprout.__zone__. 30 $(ip2rr $PUBLIC_ADDR)
-            update add sprout.__zone__. 30 NAPTR 0 0 "s" "SIP+D2T" "" _sip._tcp.sprout.__zone__.
-            update add _sip._tcp.sprout.__zone__. 30 SRV 0 0 5054 __index__.sprout.__zone__.
-            update add icscf.sprout.__zone__. 30 NAPTR 0 0 "s" "SIP+D2T" "" _sip._tcp.icscf.sprout.__zone__.
-            update add _sip._tcp.icscf.sprout.__zone__. 30 SRV 0 0 5052 __index__.sprout.__zone__.
-            update add scscf.sprout.__zone__. 30 NAPTR 0 0 "s" "SIP+D2T" "" _sip._tcp.scscf.sprout.__zone__.
-            update add _sip._tcp.scscf.sprout.__zone__. 30 SRV 0 0 5054 __index__.sprout.__zone__.
-            send
-            EOF
-            } && [ $retries -lt 10 ]
-            do
-              retries=$((retries + 1))
-              echo 'nsupdate failed - retrying (retry '$retries')...'
-              sleep 5
-            done
-
-            # Use the DNS server.
-            echo 'nameserver __dns_ip__' > /etc/dnsmasq.resolv.conf
-            echo 'RESOLV_CONF=/etc/dnsmasq.resolv.conf' >> /etc/default/dnsmasq
-            service dnsmasq force-reload
-
-outputs:
-  public_ip:
-    description: IP address in public network
-    value: { get_attr: [ server, accessIPv4 ] }
diff --git a/robot/assets/asdc/base_vcpe_infra/base_vcpe_infra.env b/robot/assets/asdc/base_vcpe_infra/base_vcpe_infra.env
index 689d1cf..1d82070 100644
--- a/robot/assets/asdc/base_vcpe_infra/base_vcpe_infra.env
+++ b/robot/assets/asdc/base_vcpe_infra/base_vcpe_infra.env
@@ -1,17 +1,19 @@
 parameters:
-  vcpe_image_name: Ubuntu 16.04 LTS (Xenial Xerus) (PVHVM)
-  vcpe_flavor_name: 4 GB General Purpose v1
-  public_net_id: 00000000-0000-0000-0000-000000000000
+  vcpe_image_name: PUT THE IMAGE NAME HERE (Ubuntu 1604 SUGGESTED)
+  vcpe_flavor_name: PUT THE FLAVOR NAME HERE (MEDIUM FLAVOR SUGGESTED)
+  public_net_id: PUT THE PUBLIC NETWORK ID HERE
   cpe_signal_net_id: zdfw1cpe01_private
+  cpe_signal_subnet_id: zdfw1cpe01_sub_private
   cpe_public_net_id: zdfw1cpe01_public
+  cpe_public_subnet_id: zdfw1cpe01_sub_public
   onap_private_net_id: PUT THE ONAP PRIVATE NETWORK NAME HERE
-  onap_private_subnet_id: PUT THE ONAP PRIVATE NETWORK NAME HERE
+  onap_private_subnet_id: PUT THE ONAP PRIVATE SUBNETWORK NAME HERE
   onap_private_net_cidr: 10.0.0.0/16
   cpe_signal_net_cidr: 10.4.0.0/24
   cpe_public_net_cidr: 10.2.0.0/24
   vdhcp_private_ip_0: 10.4.0.1
   vdhcp_private_ip_1: 10.0.101.1
-  vaaa_private_ip_0: 10.4.0.2
+  vaaa_private_ip_0: 10.4.0.4
   vaaa_private_ip_1: 10.0.101.2
   vdns_private_ip_0: 10.2.0.1
   vdns_private_ip_1: 10.0.101.3
@@ -32,4 +34,4 @@
   install_script_version: 1.1.0-SNAPSHOT
   key_name: vaaa_key
   pub_key: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDQXYJYYi3/OUZXUiCYWdtc7K0m5C0dJKVxPG0eI8EWZrEHYdfYe6WoTSDJCww+1qlBSpA5ac/Ba4Wn9vh+lR1vtUKkyIC/nrYb90ReUd385Glkgzrfh5HdR5y5S2cL/Frh86lAn9r6b3iWTJD8wBwXFyoe1S2nMTOIuG4RPNvfmyCTYVh8XTCCE8HPvh3xv2r4egawG1P4Q4UDwk+hDBXThY2KS8M5/8EMyxHV0ImpLbpYCTBA6KYDIRtqmgS6iKyy8v2D1aSY5mc9J0T5t9S2Gv+VZQNWQDDKNFnxqYaAo1uEoq/i1q63XC5AD3ckXb2VT6dp23BQMdDfbHyUWfJN
-  cloud_env: rackspace
+  cloud_env: PUT THE CLOUD PROVIDED HERE (openstack or rackspace)
diff --git a/robot/assets/asdc/base_vcpe_infra/base_vcpe_infra.yaml b/robot/assets/asdc/base_vcpe_infra/base_vcpe_infra.yaml
index c0a1875..c634958 100644
--- a/robot/assets/asdc/base_vcpe_infra/base_vcpe_infra.yaml
+++ b/robot/assets/asdc/base_vcpe_infra/base_vcpe_infra.yaml
@@ -24,7 +24,7 @@
 
 heat_template_version: 2013-05-23
 
-description: Heat template to deploy vCPE Infrastructue emlements (vAAA, vDHCP, vDNS_DHCP, webServer_sink) for ONAP
+description: Heat template to deploy vCPE Infrastructue emlements (vAAA, vDHCP, vDNS_DHCP, webServer)
 
 ##############
 #            #
@@ -61,6 +61,10 @@
     type: string
     label: vAAA private network name or ID
     description: Private network that connects vAAA with vDNSs
+  cpe_signal_subnet_id:
+    type: string
+    label: CPE Signal subnet
+    description: CPE Signal subnet
   cpe_signal_net_cidr:
     type: string
     label: vAAA private network CIDR
@@ -69,6 +73,10 @@
     type: string
     label: vCPE Public network (emulates internet) name or ID
     description: Private network that connects vGW to emulated internet
+  cpe_public_subnet_id:
+    type: string
+    label: CPE Public subnet
+    description: CPE Public subnet
   cpe_public_net_cidr:
     type: string
     label: vCPE public network CIDR
@@ -195,37 +203,13 @@
       public_key: { get_param: pub_key }
       save_private_key: false
 
-  cpe_signal_network:
-    type: OS::Neutron::Net
-    properties:
-      name: { get_param: cpe_signal_net_id }
-
-  cpe_signal_subnet:
-    type: OS::Neutron::Subnet
-    properties:
-      name: { get_param: cpe_signal_net_id }
-      network_id: { get_resource: cpe_signal_network }
-      cidr: { get_param: cpe_signal_net_cidr }
-
-  cpe_public_network:
-    type: OS::Neutron::Net
-    properties:
-      name: { get_param: cpe_public_net_id }
-
-  cpe_public_subnet:
-    type: OS::Neutron::Subnet
-    properties:
-      name: { get_param: cpe_public_net_id }
-      network_id: { get_resource: cpe_public_network }
-      cidr: { get_param: cpe_public_net_cidr }
-
 
   # Virtual AAA server Instantiation
   vaaa_private_0_port:
     type: OS::Neutron::Port
     properties:
-      network: { get_resource: cpe_signal_network }
-      fixed_ips: [{"subnet": { get_resource: cpe_signal_subnet }, "ip_address": { get_param: vaaa_private_ip_0 }}]
+      network: { get_param: cpe_signal_net_id }
+      fixed_ips: [{"subnet": { get_param: cpe_signal_subnet_id }, "ip_address": { get_param: vaaa_private_ip_0 }}]
 
   vaaa_private_1_port:
     type: OS::Neutron::Port
@@ -288,8 +272,8 @@
   vdns_private_0_port:
     type: OS::Neutron::Port
     properties:
-      network: { get_resource: cpe_public_network }
-      fixed_ips: [{"subnet": { get_resource: cpe_public_subnet }, "ip_address": { get_param: vdns_private_ip_0 }}]
+      network: { get_param: cpe_public_net_id }
+      fixed_ips: [{"subnet": { get_param: cpe_public_subnet_id }, "ip_address": { get_param: vdns_private_ip_0 }}]
 
   vdns_private_1_port:
     type: OS::Neutron::Port
@@ -348,8 +332,8 @@
   vdhcp_private_0_port:
     type: OS::Neutron::Port
     properties:
-      network: { get_resource: cpe_signal_network }
-      fixed_ips: [{"subnet": { get_resource: cpe_signal_subnet }, "ip_address": { get_param: vdhcp_private_ip_0 }}]
+      network: { get_param: cpe_signal_net_id }
+      fixed_ips: [{"subnet": { get_param: cpe_signal_subnet_id }, "ip_address": { get_param: vdhcp_private_ip_0 }}]
 
   vdhcp_private_1_port:
     type: OS::Neutron::Port
@@ -409,8 +393,8 @@
   vweb_private_0_port:
     type: OS::Neutron::Port
     properties:
-      network: { get_resource: cpe_public_network }
-      fixed_ips: [{"subnet": { get_resource: cpe_public_subnet }, "ip_address": { get_param: vweb_private_ip_0 }}]
+      network: { get_param: cpe_public_net_id }
+      fixed_ips: [{"subnet": { get_param: cpe_public_subnet_id }, "ip_address": { get_param: vweb_private_ip_0 }}]
 
   vweb_private_1_port:
     type: OS::Neutron::Port
diff --git a/robot/assets/asdc/base_vcpe_vbng/MANIFEST.json b/robot/assets/asdc/base_vcpe_vbng/MANIFEST.json
index f4fbb30..0b34111 100644
--- a/robot/assets/asdc/base_vcpe_vbng/MANIFEST.json
+++ b/robot/assets/asdc/base_vcpe_vbng/MANIFEST.json
@@ -3,12 +3,12 @@
     "description": "", 
     "data": [
         {
-            "file": "base_vcpe_vbng_rackspace.yaml", 
+            "file": "base_vcpe_vbng.yaml", 
             "type": "HEAT", 
             "isBase": "true", 
             "data": [
                 {
-                    "file": "base_vcpe_vbng_rackspace.env", 
+                    "file": "base_vcpe_vbng.env", 
                     "type": "HEAT_ENV"
                 }
             ]
diff --git a/robot/assets/asdc/base_vcpe_vbng/base_vcpe_vbng_rackspace.env b/robot/assets/asdc/base_vcpe_vbng/base_vcpe_vbng.env
similarity index 61%
rename from robot/assets/asdc/base_vcpe_vbng/base_vcpe_vbng_rackspace.env
rename to robot/assets/asdc/base_vcpe_vbng/base_vcpe_vbng.env
index e363b3d..be4f972 100644
--- a/robot/assets/asdc/base_vcpe_vbng/base_vcpe_vbng_rackspace.env
+++ b/robot/assets/asdc/base_vcpe_vbng/base_vcpe_vbng.env
@@ -1,13 +1,16 @@
  parameters:
-  vcpe_image_name: Ubuntu 16.04 LTS (Xenial Xerus) (PVHVM)
-  vcpe_flavor_name: 4 GB General Purpose v1
-  public_net_id: 00000000-0000-0000-0000-000000000000
+  vcpe_image_name: PUT THE IMAGE NAME HERE (Ubuntu 1604 SUGGESTED)
+  vcpe_flavor_name: PUT THE FLAVOR NAME HERE (MEDIUM FLAVOR SUGGESTED)
+  public_net_id: PUT THE PUBLIC NETWORK ID HERE
   brgemu_bng_private_net_id: zdfw1bngin01_private
+  brgemu_bng_private_subnet_id: zdfw1bngin01_sub_private
   bng_gmux_private_net_id: zdfw1bngmux01_private
-  onap_private_net_id: <PUT_YOUR_ONAP_NET_ID_HERE>
-  onap_private_subnet_id: <PUT_YOUR_ONAP_NET_ID_HERE>
+  bng_gmux_private_subnet_id: zdfw1bngmux01_sub_private
+  onap_private_net_id: PUT THE ONAP PRIVATE NETWORK NAME HERE
+  onap_private_subnet_id: PUT THE ONAP PRIVATE SUBNETWORK NAME HERE
   onap_private_net_cidr: 10.0.0.0/16
   cpe_signal_net_id: zdfw1cpe01_private
+  cpe_signal_subnet_id: zdfw1cpe01_sub_private
   brgemu_bng_private_net_cidr: 10.3.0.0/24
   bng_gmux_private_net_cidr: 10.1.0.0/24
   cpe_signal_private_net_cidr: 10.4.0.0/24
@@ -26,4 +29,7 @@
   install_script_version: 1.1.0-SNAPSHOT
   key_name: vbng_key
   pub_key: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDQXYJYYi3/OUZXUiCYWdtc7K0m5C0dJKVxPG0eI8EWZrEHYdfYe6WoTSDJCww+1qlBSpA5ac/Ba4Wn9vh+lR1vtUKkyIC/nrYb90ReUd385Glkgzrfh5HdR5y5S2cL/Frh86lAn9r6b3iWTJD8wBwXFyoe1S2nMTOIuG4RPNvfmyCTYVh8XTCCE8HPvh3xv2r4egawG1P4Q4UDwk+hDBXThY2KS8M5/8EMyxHV0ImpLbpYCTBA6KYDIRtqmgS6iKyy8v2D1aSY5mc9J0T5t9S2Gv+VZQNWQDDKNFnxqYaAo1uEoq/i1q63XC5AD3ckXb2VT6dp23BQMdDfbHyUWfJN
-  cloud_env: rackspace
+  cloud_env: PUT THE CLOUD PROVIDED HERE (openstack or rackspace)
+  vpp_source_repo_url: https://gerrit.fd.io/r/vpp
+  vpp_source_repo_branch: stable/1704
+  vpp_patch_url: https://git.onap.org/demo/plain/vnfs/vCPE/vpp-radius-client-for-vbng/src/patches/Vpp-Integrate-FreeRADIUS-Client-for-vBNG.patch
diff --git a/robot/assets/asdc/base_vcpe_vbng/base_vcpe_vbng_rackspace.yaml b/robot/assets/asdc/base_vcpe_vbng/base_vcpe_vbng.yaml
similarity index 84%
rename from robot/assets/asdc/base_vcpe_vbng/base_vcpe_vbng_rackspace.yaml
rename to robot/assets/asdc/base_vcpe_vbng/base_vcpe_vbng.yaml
index d5c0eed..9cc4484 100644
--- a/robot/assets/asdc/base_vcpe_vbng/base_vcpe_vbng_rackspace.yaml
+++ b/robot/assets/asdc/base_vcpe_vbng/base_vcpe_vbng.yaml
@@ -24,7 +24,7 @@
 
 heat_template_version: 2013-05-23
 
-description: Heat template to deploy vCPE virtual Broadband Network Gateway (vBNG) for ONAP
+description: Heat template to deploy vCPE virtual Broadband Network Gateway (vBNG)
 
 ##############
 #            #
@@ -49,6 +49,10 @@
     type: string
     label: vBNG IN private network name or ID
     description: Private network that connects vBRG to vBNG
+  brgemu_bng_private_subnet_id:
+    type: string
+    label: vBNG IN private sub-network name or ID
+    description: vBNG IN private sub-network name or ID
   brgemu_bng_private_net_cidr:
     type: string
     label: vBNG IN private network CIDR
@@ -57,6 +61,10 @@
     type: string
     label: vBNG vGMUX private network name or ID
     description: Private network that connects vBNG to vGMUX
+  bng_gmux_private_subnet_id:
+    type: string
+    label: vBNG vGMUX private sub-network name or ID
+    description: vBNG vGMUX private sub-network name or ID
   bng_gmux_private_net_cidr:
     type: string
     label: vGMUX private network CIDR
@@ -77,6 +85,10 @@
     type: string
     label: vCPE private network name or ID
     description: Private network that connects vCPE elements with vCPE infrastructure elements
+  cpe_signal_subnet_id:
+    type: string
+    label: vCPE private sub-network name or ID
+    description: vCPE private sub-network name or ID
   cpe_signal_private_net_cidr:
     type: string
     label: vAAA private network CIDR
@@ -145,6 +157,18 @@
     type: string
     label: Cloud environment
     description: Cloud environment (e.g., openstack, rackspace)
+  vpp_source_repo_url:
+    type: string
+    label: VPP Source Git Repo
+    description: URL for VPP source codes
+  vpp_source_repo_branch:
+    type: string
+    label: VPP Source Git Branch
+    description: Git Branch for the VPP source codes
+  vpp_patch_url:
+    type: string
+    label: VPP Patch URL
+    description: URL for VPP patch for vBNG
 
 #############
 #           #
@@ -171,24 +195,13 @@
       public_key: { get_param: pub_key }
       save_private_key: false
 
-  brgemu_bng_private_network:
-    type: OS::Neutron::Net
-    properties:
-      name: { get_param: brgemu_bng_private_net_id }
-
-  brgemu_bng_private_subnet:
-    type: OS::Neutron::Subnet
-    properties:
-      name: { get_param: brgemu_bng_private_net_id }
-      network_id: { get_resource: brgemu_bng_private_network }
-      cidr: { get_param: brgemu_bng_private_net_cidr }
 
   # Virtual BNG Instantiation
   vbng_private_0_port:
     type: OS::Neutron::Port
     properties:
-      network: { get_resource: brgemu_bng_private_network }
-      fixed_ips: [{"subnet": { get_resource: brgemu_bng_private_subnet }, "ip_address": { get_param: vbng_private_ip_0 }}]
+      network: { get_param: brgemu_bng_private_net_id }
+      fixed_ips: [{"subnet": { get_param: brgemu_bng_private_subnet_id }, "ip_address": { get_param: vbng_private_ip_0 }}]
 
   vbng_private_1_port:
     type: OS::Neutron::Port
@@ -200,13 +213,13 @@
     type: OS::Neutron::Port
     properties:
       network: { get_param: cpe_signal_net_id }
-      fixed_ips: [{"subnet": { get_param: cpe_signal_net_id }, "ip_address": { get_param: vbng_private_ip_2 }}]
+      fixed_ips: [{"subnet": { get_param: cpe_signal_subnet_id }, "ip_address": { get_param: vbng_private_ip_2 }}]
 
   vbng_private_3_port:
     type: OS::Neutron::Port
     properties:
       network: { get_param: bng_gmux_private_net_id }
-      fixed_ips: [{"subnet": { get_param: bng_gmux_private_net_id }, "ip_address": { get_param: vbng_private_ip_3 }}]
+      fixed_ips: [{"subnet": { get_param: bng_gmux_private_subnet_id }, "ip_address": { get_param: vbng_private_ip_3 }}]
 
   vbng_0:
     type: OS::Nova::Server
@@ -240,6 +253,9 @@
             __demo_artifacts_version__ : { get_param: demo_artifacts_version }
             __install_script_version__ : { get_param: install_script_version }
             __cloud_env__ : { get_param: cloud_env }
+            __vpp_source_repo_url__ : { get_param: vpp_source_repo_url }
+            __vpp_source_repo_branch__ : { get_param: vpp_source_repo_branch }
+            __vpp_patch_url__ : { get_param: vpp_patch_url }
           template: |
             #!/bin/bash
 
@@ -260,6 +276,9 @@
             echo "__demo_artifacts_version__" > /opt/config/demo_artifacts_version.txt
             echo "__install_script_version__" > /opt/config/install_script_version.txt
             echo "__cloud_env__" > /opt/config/cloud_env.txt
+            echo "__vpp_source_repo_url__" > /opt/config/vpp_source_repo_url.txt
+            echo "__vpp_source_repo_branch__" > /opt/config/vpp_source_repo_branch.txt
+            echo "__vpp_patch_url__" > /opt/config/vpp_patch_url.txt
 
             # Download and run install script
             curl -k __repo_url_blob__/org.onap.demo/vnfs/vcpe/__install_script_version__/v_bng_install.sh -o /opt/v_bng_install.sh
diff --git a/robot/assets/asdc/base_vcpe_vbrgemu/MANIFEST.json b/robot/assets/asdc/base_vcpe_vbrgemu/MANIFEST.json
index 0edc4b9..603f92d 100644
--- a/robot/assets/asdc/base_vcpe_vbrgemu/MANIFEST.json
+++ b/robot/assets/asdc/base_vcpe_vbrgemu/MANIFEST.json
@@ -3,12 +3,12 @@
     "description": "", 
     "data": [
         {
-            "file": "base_vcpe_vbrgemu_rackspace.yaml", 
+            "file": "base_vcpe_vbrgemu.yaml", 
             "type": "HEAT", 
             "isBase": "true", 
             "data": [
                 {
-                    "file": "base_vcpe_vbrgemu_rackspace.env", 
+                    "file": "base_vcpe_vbrgemu.env", 
                     "type": "HEAT_ENV"
                 }
             ]
diff --git a/robot/assets/asdc/base_vcpe_vbrgemu/base_vcpe_vbrgemu.env b/robot/assets/asdc/base_vcpe_vbrgemu/base_vcpe_vbrgemu.env
new file mode 100644
index 0000000..ea8bc82
--- /dev/null
+++ b/robot/assets/asdc/base_vcpe_vbrgemu/base_vcpe_vbrgemu.env
@@ -0,0 +1,27 @@
+ parameters:
+  vcpe_image_name: PUT THE IMAGE NAME HERE (Ubuntu 1604 SUGGESTED)
+  vcpe_flavor_name: PUT THE FLAVOR NAME HERE (MEDIUM FLAVOR SUGGESTED)
+  public_net_id: PUT THE PUBLIC NETWORK ID HERE
+  vbrgemu_bng_private_net_id: zdfw1bngin01_private
+  vbrgemu_bng_private_subnet_id: zdfw1bngin01_sub_private
+  vbrgemu_bng_private_net_cidr: 10.3.0.0/24
+  vbrgemu_private_net_id: zdfw1vbrgemu01_private
+  vbrgemu_private_net_cidr: 192.168.1.0/24
+  vbrgemu_private_ip_0: 10.3.0.4
+  vbrgemu_private_ip_1: 192.168.1.1
+  sdnc_ip: 10.0.7.1
+  vbrgemu_name_0: zdcpe1cpe01brgemu01
+  vnf_id: vCPE_Infrastructure_BGREMU_demo_app
+  vf_module_id: vCPE_Customer_BRGEMU
+  repo_url_blob: https://nexus.onap.org/content/sites/raw
+  repo_url_artifacts: https://nexus.onap.org/content/groups/staging
+  demo_artifacts_version: 1.1.0
+  install_script_version: 1.1.0-SNAPSHOT
+  key_name: vbrgemu_key
+  pub_key: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDQXYJYYi3/OUZXUiCYWdtc7K0m5C0dJKVxPG0eI8EWZrEHYdfYe6WoTSDJCww+1qlBSpA5ac/Ba4Wn9vh+lR1vtUKkyIC/nrYb90ReUd385Glkgzrfh5HdR5y5S2cL/Frh86lAn9r6b3iWTJD8wBwXFyoe1S2nMTOIuG4RPNvfmyCTYVh8XTCCE8HPvh3xv2r4egawG1P4Q4UDwk+hDBXThY2KS8M5/8EMyxHV0ImpLbpYCTBA6KYDIRtqmgS6iKyy8v2D1aSY5mc9J0T5t9S2Gv+VZQNWQDDKNFnxqYaAo1uEoq/i1q63XC5AD3ckXb2VT6dp23BQMdDfbHyUWfJN
+  cloud_env: PUT THE CLOUD PROVIDED HERE (openstack or rackspace)
+  vpp_source_repo_url: https://gerrit.fd.io/r/vpp
+  vpp_source_repo_branch: stable/1704
+  hc2vpp_source_repo_url: https://gerrit.fd.io/r/hc2vpp
+  hc2vpp_source_repo_branch: stable/1704
+  vpp_patch_url: https://git.onap.org/demo/plain/vnfs/vCPE/vpp-option-82-for-vbrg/src/patches/VPP-Add-Option82-Nat-Filter-For-vBRG.patch
diff --git a/robot/assets/asdc/base_vcpe_vbrgemu/base_vcpe_vbrgemu_rackspace.yaml b/robot/assets/asdc/base_vcpe_vbrgemu/base_vcpe_vbrgemu.yaml
similarity index 79%
rename from robot/assets/asdc/base_vcpe_vbrgemu/base_vcpe_vbrgemu_rackspace.yaml
rename to robot/assets/asdc/base_vcpe_vbrgemu/base_vcpe_vbrgemu.yaml
index 6f926eb..a9eb872 100644
--- a/robot/assets/asdc/base_vcpe_vbrgemu/base_vcpe_vbrgemu_rackspace.yaml
+++ b/robot/assets/asdc/base_vcpe_vbrgemu/base_vcpe_vbrgemu.yaml
@@ -24,7 +24,7 @@
 
 heat_template_version: 2013-05-23
 
-description: Heat template to deploy vCPE vBRG Emulator (vBRGEMU) for ONAP
+description: Heat template to deploy vCPE vBRG Emulator (vBRGEMU)
 
 #######################################################################
 #                                                                     #
@@ -51,6 +51,10 @@
     type: string
     label: vBNG private network name or ID
     description: Private network that connects vBRGEMU to vBNG
+  vbrgemu_bng_private_subnet_id:
+    type: string
+    label: vBNG private sub-network name or ID
+    description: vBNG private sub-network name or ID
   vbrgemu_bng_private_net_cidr:
     type: string
     label: vBNG IN private network CIDR
@@ -111,6 +115,30 @@
     type: string
     label: Cloud environment
     description: Cloud environment (e.g., openstack, rackspace)
+  vpp_source_repo_url:
+    type: string
+    label: VPP Source Git Repo
+    description: URL for VPP source codes
+  vpp_source_repo_branch:
+    type: string
+    label: VPP Source Git Branch
+    description: Git Branch for the VPP source codes
+  hc2vpp_source_repo_url:
+    type: string
+    label: Honeycomb Source Git Repo
+    description: URL for Honeycomb source codes
+  hc2vpp_source_repo_branch:
+    type: string
+    label: Honeycomb Source Git Branch
+    description: Git Branch for the Honeycomb source codes
+  vpp_patch_url:
+    type: string
+    label: VPP Patch URL
+    description: URL for VPP patch for vBRG Emulator
+  sdnc_ip:
+    type: string
+    label: SDNC ip address
+    description: SDNC ip address uesd to set NAT
 
 #############
 #           #
@@ -155,7 +183,7 @@
     type: OS::Neutron::Port
     properties:
       network: { get_param: vbrgemu_bng_private_net_id }
-      fixed_ips: [{"subnet": { get_param: vbrgemu_bng_private_net_id }, "ip_address": { get_param: vbrgemu_private_ip_0 }}]
+      fixed_ips: [{"subnet": { get_param: vbrgemu_bng_private_subnet_id }, "ip_address": { get_param: vbrgemu_private_ip_0 }}]
 
   vbrgemu_private_1_port:
     type: OS::Neutron::Port
@@ -187,6 +215,12 @@
             __demo_artifacts_version__ : { get_param: demo_artifacts_version }
             __install_script_version__ : { get_param: install_script_version }
             __cloud_env__ : { get_param: cloud_env }
+            __vpp_source_repo_url__ : { get_param: vpp_source_repo_url }
+            __vpp_source_repo_branch__ : { get_param: vpp_source_repo_branch }
+            __hc2vpp_source_repo_url__ : { get_param: hc2vpp_source_repo_url }
+            __hc2vpp_source_repo_branch__ : { get_param: hc2vpp_source_repo_branch }
+            __vpp_patch_url__ : { get_param: vpp_patch_url }
+            __sdnc_ip__ : { get_param: sdnc_ip }
           template: |
             #!/bin/bash
 
@@ -200,6 +234,12 @@
             echo "__demo_artifacts_version__" > /opt/config/demo_artifacts_version.txt
             echo "__install_script_version__" > /opt/config/install_script_version.txt
             echo "__cloud_env__" > /opt/config/cloud_env.txt
+            echo "__vpp_source_repo_url__" > /opt/config/vpp_source_repo_url.txt
+            echo "__vpp_source_repo_branch__" > /opt/config/vpp_source_repo_branch.txt
+            echo "__hc2vpp_source_repo_url__" > /opt/config/hc2vpp_source_repo_url.txt
+            echo "__hc2vpp_source_repo_branch__" > /opt/config/hc2vpp_source_repo_branch.txt
+            echo "__vpp_patch_url__" > /opt/config/vpp_patch_url.txt
+            echo "__sdnc_ip__" > /opt/config/sdnc_ip.txt
 
             # Download and run install script
             curl -k __repo_url_blob__/org.onap.demo/vnfs/vcpe/__install_script_version__/v_brgemu_install.sh -o /opt/v_brgemu_install.sh
diff --git a/robot/assets/asdc/base_vcpe_vbrgemu/base_vcpe_vbrgemu_rackspace.env b/robot/assets/asdc/base_vcpe_vbrgemu/base_vcpe_vbrgemu_rackspace.env
deleted file mode 100644
index 1951c5e..0000000
--- a/robot/assets/asdc/base_vcpe_vbrgemu/base_vcpe_vbrgemu_rackspace.env
+++ /dev/null
@@ -1,20 +0,0 @@
- parameters:
-  vcpe_image_name: Ubuntu 16.04 LTS (Xenial Xerus) (PVHVM)
-  vcpe_flavor_name: 4 GB General Purpose v1
-  public_net_id: 00000000-0000-0000-0000-000000000000
-  vbrgemu_bng_private_net_id: zdfw1bngin01_private
-  vbrgemu_private_net_id: zdfw1vbrgemu01_private
-  vbrgemu_bng_private_net_cidr: 10.3.0.0/24
-  vbrgemu_private_net_cidr: 192.168.1.0/24
-  vbrgemu_private_ip_0: 10.3.0.2
-  vbrgemu_private_ip_1: 192.168.1.1
-  vbrgemu_name_0: zdcpe1cpe01brgemu01
-  vnf_id: vCPE_Infrastructure_BGREMU_demo_app
-  vf_module_id: vCPE_Customer_BRGEMU
-  repo_url_blob: https://nexus.onap.org/content/sites/raw
-  repo_url_artifacts: https://nexus.onap.org/content/groups/staging
-  demo_artifacts_version: 1.1.0
-  install_script_version: 1.1.0-SNAPSHOT
-  key_name: vbrgemu_key
-  pub_key: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDQXYJYYi3/OUZXUiCYWdtc7K0m5C0dJKVxPG0eI8EWZrEHYdfYe6WoTSDJCww+1qlBSpA5ac/Ba4Wn9vh+lR1vtUKkyIC/nrYb90ReUd385Glkgzrfh5HdR5y5S2cL/Frh86lAn9r6b3iWTJD8wBwXFyoe1S2nMTOIuG4RPNvfmyCTYVh8XTCCE8HPvh3xv2r4egawG1P4Q4UDwk+hDBXThY2KS8M5/8EMyxHV0ImpLbpYCTBA6KYDIRtqmgS6iKyy8v2D1aSY5mc9J0T5t9S2Gv+VZQNWQDDKNFnxqYaAo1uEoq/i1q63XC5AD3ckXb2VT6dp23BQMdDfbHyUWfJN
-  cloud_env: rackspace
diff --git a/robot/assets/asdc/base_vcpe_vgmux/MANIFEST.json b/robot/assets/asdc/base_vcpe_vgmux/MANIFEST.json
index 35603f9..62d1ef9 100644
--- a/robot/assets/asdc/base_vcpe_vgmux/MANIFEST.json
+++ b/robot/assets/asdc/base_vcpe_vgmux/MANIFEST.json
@@ -3,12 +3,12 @@
     "description": "", 
     "data": [
         {
-            "file": "base_vcpe_vgmux_rackspace.yaml", 
+            "file": "base_vcpe_vgmux.yaml", 
             "type": "HEAT", 
             "isBase": "true", 
             "data": [
                 {
-                    "file": "base_vcpe_vgmux_rackspace.env", 
+                    "file": "base_vcpe_vgmux.env", 
                     "type": "HEAT_ENV"
                 }
             ]
diff --git a/robot/assets/asdc/base_vcpe_vgmux/base_vcpe_vgmux.env b/robot/assets/asdc/base_vcpe_vgmux/base_vcpe_vgmux.env
new file mode 100644
index 0000000..e81afa7
--- /dev/null
+++ b/robot/assets/asdc/base_vcpe_vgmux/base_vcpe_vgmux.env
@@ -0,0 +1,35 @@
+ parameters:
+  vcpe_image_name: PUT THE IMAGE NAME HERE (Ubuntu 1604 SUGGESTED)
+  vcpe_flavor_name: PUT THE FLAVOR NAME HERE (MEDIUM FLAVOR SUGGESTED)
+  public_net_id: PUT THE PUBLIC NETWORK ID HERE
+  bng_gmux_private_net_id: zdfw1bngmux01_private
+  bng_gmux_private_subnet_id: zdfw1bngmux01_sub_private
+  mux_gw_private_net_id: zdfw1muxgw01_private
+  mux_gw_private_subnet_id: zdfw1muxgw01_sub_private
+  onap_private_net_id: PUT THE ONAP PRIVATE NETWORK NAME HERE
+  onap_private_subnet_id: PUT THE ONAP PRIVATE SUBNETWORK NAME HERE
+  onap_private_net_cidr: 10.0.0.0/16
+  bng_gmux_private_net_cidr: 10.1.0.0/24
+  mux_gw_private_net_cidr: 10.5.0.0/24
+  vgmux_private_ip_0: 10.1.0.20
+  vgmux_private_ip_1: 10.0.101.20
+  vgmux_private_ip_2: 10.5.0.20
+  vgmux_name_0: zdcpe1cpe01mux01
+  vnf_id: vCPE_Infrastructure_vGMUX_demo_app
+  vf_module_id: vCPE_Intrastructure_Metro_vGMUX
+  dcae_collector_ip: 10.0.4.102
+  dcae_collector_port: 8080
+  repo_url_blob: https://nexus.onap.org/content/sites/raw
+  repo_url_artifacts: https://nexus.onap.org/content/groups/staging
+  demo_artifacts_version: 1.1.0
+  install_script_version: 1.1.0-SNAPSHOT
+  key_name: vgmux_key
+  pub_key: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDQXYJYYi3/OUZXUiCYWdtc7K0m5C0dJKVxPG0eI8EWZrEHYdfYe6WoTSDJCww+1qlBSpA5ac/Ba4Wn9vh+lR1vtUKkyIC/nrYb90ReUd385Glkgzrfh5HdR5y5S2cL/Frh86lAn9r6b3iWTJD8wBwXFyoe1S2nMTOIuG4RPNvfmyCTYVh8XTCCE8HPvh3xv2r4egawG1P4Q4UDwk+hDBXThY2KS8M5/8EMyxHV0ImpLbpYCTBA6KYDIRtqmgS6iKyy8v2D1aSY5mc9J0T5t9S2Gv+VZQNWQDDKNFnxqYaAo1uEoq/i1q63XC5AD3ckXb2VT6dp23BQMdDfbHyUWfJN
+  cloud_env: PUT THE CLOUD PROVIDED HERE (openstack or rackspace)
+  vpp_source_repo_url: https://gerrit.fd.io/r/vpp
+  vpp_source_repo_branch: stable/1704
+  hc2vpp_source_repo_url: https://gerrit.fd.io/r/hc2vpp
+  hc2vpp_source_repo_branch: stable/1704
+  vpp_patch_url: https://git.onap.org/demo/plain/vnfs/vCPE/vpp-ves-agent-for-vgmux/src/patches/Vpp-Add-VES-agent-for-vG-MUX.patch
+  hc2vpp_patch_url: https://git.onap.org/demo/plain/vnfs/vCPE/vpp-ves-agent-for-vgmux/src/patches/Hc2vpp-Add-VES-agent-for-vG-MUX.patch
+  libevel_patch_url: https://git.onap.org/demo/plain/vnfs/vCPE/vpp-ves-agent-for-vgmux/src/patches/vCPE-vG-MUX-libevel-fixup.patch
diff --git a/robot/assets/asdc/base_vcpe_vgmux/base_vcpe_vgmux_rackspace.yaml b/robot/assets/asdc/base_vcpe_vgmux/base_vcpe_vgmux.yaml
similarity index 75%
rename from robot/assets/asdc/base_vcpe_vgmux/base_vcpe_vgmux_rackspace.yaml
rename to robot/assets/asdc/base_vcpe_vgmux/base_vcpe_vgmux.yaml
index b6e212a..ecdb1b1 100644
--- a/robot/assets/asdc/base_vcpe_vgmux/base_vcpe_vgmux_rackspace.yaml
+++ b/robot/assets/asdc/base_vcpe_vgmux/base_vcpe_vgmux.yaml
@@ -24,7 +24,7 @@
 
 heat_template_version: 2013-05-23
 
-description: Heat template to deploy vCPE Infrastructue Metro vGMUX for ONAP
+description: Heat template to deploy vCPE Infrastructue Metro vGMUX
 
 ##############
 #            #
@@ -49,14 +49,22 @@
     type: string
     label: vBNG vGMUX private network name or ID
     description: Private network that connects vBNG to vGMUX
+  bng_gmux_private_subnet_id:
+    type: string
+    label: vBNG vGMUX private sub-network name or ID
+    description: vBNG vGMUX private sub-network name or ID
   bng_gmux_private_net_cidr:
     type: string
     label: vBNG vGMUX private network CIDR
     description: The CIDR of the vBNG-vGMUX private network
   mux_gw_private_net_id:
     type: string
-    label: vCPE Public network name or ID
+    label: vGMUX vGWs network name or ID
     description: Private network that connects vGMUX to vGWs
+  mux_gw_private_subnet_id:
+    type: string
+    label: vGMUX vGWs sub-network name or ID
+    description: vGMUX vGWs sub-network name or ID
   mux_gw_private_net_cidr:
     type: string
     label: vGMUX private network CIDR
@@ -133,6 +141,34 @@
     type: string
     label: Cloud environment
     description: Cloud environment (e.g., openstack, rackspace)
+  vpp_source_repo_url:
+    type: string
+    label: VPP Source Git Repo
+    description: URL for VPP source codes
+  vpp_source_repo_branch:
+    type: string
+    label: VPP Source Git Branch
+    description: Git Branch for the VPP source codes
+  hc2vpp_source_repo_url:
+    type: string
+    label: Honeycomb Source Git Repo
+    description: URL for Honeycomb source codes
+  hc2vpp_source_repo_branch:
+    type: string
+    label: Honeycomb Source Git Branch
+    description: Git Branch for the Honeycomb source codes
+  vpp_patch_url:
+    type: string
+    label: VPP Patch URL
+    description: URL for VPP patch for vG-MUX
+  hc2vpp_patch_url:
+    type: string
+    label: Honeycomb Patch URL
+    description: URL for Honeycomb patch for vG-MUX
+  libevel_patch_url:
+    type: string
+    label: libevel Patch URL
+    description: URL for libevel patch for vG-MUX
 
 #############
 #           #
@@ -159,36 +195,13 @@
       public_key: { get_param: pub_key }
       save_private_key: false
 
-  mux_gw_private_network:
-    type: OS::Neutron::Net
-    properties:
-      name: { get_param: mux_gw_private_net_id }
-
-  mux_gw_private_subnet:
-    type: OS::Neutron::Subnet
-    properties:
-      name: { get_param: mux_gw_private_net_id }
-      network_id: { get_resource: mux_gw_private_network }
-      cidr: { get_param: mux_gw_private_net_cidr }
-      
-  bng_gmux_private_network:
-    type: OS::Neutron::Net
-    properties:
-      name: { get_param: bng_gmux_private_net_id }
-
-  bng_gmux_private_subnet:
-    type: OS::Neutron::Subnet
-    properties:
-      name: { get_param: bng_gmux_private_net_id }
-      network_id: { get_resource: bng_gmux_private_network }
-      cidr: { get_param: bng_gmux_private_net_cidr }
 
   # Virtual GMUX Instantiation
   vgmux_private_0_port:
     type: OS::Neutron::Port
     properties:
-      network: { get_resource: bng_gmux_private_network }
-      fixed_ips: [{"subnet": { get_resource: bng_gmux_private_subnet }, "ip_address": { get_param: vgmux_private_ip_0 }}]
+      network: { get_param: bng_gmux_private_net_id }
+      fixed_ips: [{"subnet": { get_param: bng_gmux_private_subnet_id }, "ip_address": { get_param: vgmux_private_ip_0 }}]
 
   vgmux_private_1_port:
     type: OS::Neutron::Port
@@ -199,8 +212,8 @@
   vgmux_private_2_port:
     type: OS::Neutron::Port
     properties:
-      network: { get_resource: mux_gw_private_network }
-      fixed_ips: [{"subnet": {  get_resource: mux_gw_private_subnet }, "ip_address": { get_param: vgmux_private_ip_2 }}]
+      network: { get_param: mux_gw_private_net_id }
+      fixed_ips: [{"subnet": {  get_param: mux_gw_private_subnet_id }, "ip_address": { get_param: vgmux_private_ip_2 }}]
 
   vgmux_0:
     type: OS::Nova::Server
@@ -230,6 +243,13 @@
             __demo_artifacts_version__ : { get_param: demo_artifacts_version }
             __install_script_version__ : { get_param: install_script_version }
             __cloud_env__ : { get_param: cloud_env }
+            __vpp_source_repo_url__ : { get_param: vpp_source_repo_url }
+            __vpp_source_repo_branch__ : { get_param: vpp_source_repo_branch }
+            __hc2vpp_source_repo_url__ : { get_param: hc2vpp_source_repo_url }
+            __hc2vpp_source_repo_branch__ : { get_param: hc2vpp_source_repo_branch }
+            __vpp_patch_url__ : { get_param: vpp_patch_url }
+            __hc2vpp_patch_url__ : { get_param: hc2vpp_patch_url }
+            __libevel_patch_url__ : { get_param: libevel_patch_url }
           template: |
             #!/bin/bash
 
@@ -246,10 +266,16 @@
             echo "__demo_artifacts_version__" > /opt/config/demo_artifacts_version.txt
             echo "__install_script_version__" > /opt/config/install_script_version.txt
             echo "__cloud_env__" > /opt/config/cloud_env.txt
+            echo "__vpp_source_repo_url__" > /opt/config/vpp_source_repo_url.txt
+            echo "__vpp_source_repo_branch__" > /opt/config/vpp_source_repo_branch.txt
+            echo "__vpp_patch_url__" > /opt/config/vpp_patch_url.txt
+            echo "__hc2vpp_source_repo_url__" > /opt/config/hc2vpp_source_repo_url.txt
+            echo "__hc2vpp_source_repo_branch__" > /opt/config/hc2vpp_source_repo_branch.txt
+            echo "__hc2vpp_patch_url__" > /opt/config/hc2vpp_patch_url.txt
+            echo "__libevel_patch_url__" > /opt/config/libevel_patch_url.txt
 
             # Download and run install script
             curl -k __repo_url_blob__/org.onap.demo/vnfs/vcpe/__install_script_version__/v_gmux_install.sh -o /opt/v_gmux_install.sh
             cd /opt
             chmod +x v_gmux_install.sh
             ./v_gmux_install.sh
-
diff --git a/robot/assets/asdc/base_vcpe_vgmux/base_vcpe_vgmux_rackspace.env b/robot/assets/asdc/base_vcpe_vgmux/base_vcpe_vgmux_rackspace.env
deleted file mode 100644
index c6b20f9..0000000
--- a/robot/assets/asdc/base_vcpe_vgmux/base_vcpe_vgmux_rackspace.env
+++ /dev/null
@@ -1,26 +0,0 @@
- parameters:
-  vcpe_image_name: Ubuntu 16.04 LTS (Xenial Xerus) (PVHVM)
-  vcpe_flavor_name: 4 GB General Purpose v1
-  public_net_id: 00000000-0000-0000-0000-000000000000
-  bng_gmux_private_net_id: zdfw1bngmux01_private
-  mux_gw_private_net_id: zdfw1muxgw01_private
-  onap_private_net_id: <PUT_YOUR_ONAP_NET_ID_HERE>
-  onap_private_subnet_id: <PUT_YOUR_ONAP_NET_ID_HERE>
-  onap_private_net_cidr: 10.0.0.0/16
-  bng_gmux_private_net_cidr: 10.1.0.0/24
-  mux_gw_private_net_cidr: 10.5.0.0/24
-  vgmux_private_ip_0: 10.1.0.20
-  vgmux_private_ip_1: 10.0.101.20
-  vgmux_private_ip_2: 10.5.0.20
-  vgmux_name_0: zdcpe1cpe01mux01
-  vnf_id: vCPE_Infrastructure_vGMUX_demo_app
-  vf_module_id: vCPE_Intrastructure_Metro_vGMUX
-  dcae_collector_ip: 10.0.4.102
-  dcae_collector_port: 8080
-  repo_url_blob: https://nexus.onap.org/content/sites/raw
-  repo_url_artifacts: https://nexus.onap.org/content/groups/staging
-  demo_artifacts_version: 1.1.0
-  install_script_version: 1.1.0-SNAPSHOT
-  key_name: vbng_key
-  pub_key: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDQXYJYYi3/OUZXUiCYWdtc7K0m5C0dJKVxPG0eI8EWZrEHYdfYe6WoTSDJCww+1qlBSpA5ac/Ba4Wn9vh+lR1vtUKkyIC/nrYb90ReUd385Glkgzrfh5HdR5y5S2cL/Frh86lAn9r6b3iWTJD8wBwXFyoe1S2nMTOIuG4RPNvfmyCTYVh8XTCCE8HPvh3xv2r4egawG1P4Q4UDwk+hDBXThY2KS8M5/8EMyxHV0ImpLbpYCTBA6KYDIRtqmgS6iKyy8v2D1aSY5mc9J0T5t9S2Gv+VZQNWQDDKNFnxqYaAo1uEoq/i1q63XC5AD3ckXb2VT6dp23BQMdDfbHyUWfJN
-  cloud_env: rackspace
diff --git a/robot/assets/asdc/base_vcpe_vgw/MANIFEST.json b/robot/assets/asdc/base_vcpe_vgw/MANIFEST.json
index edaface..f99303e 100644
--- a/robot/assets/asdc/base_vcpe_vgw/MANIFEST.json
+++ b/robot/assets/asdc/base_vcpe_vgw/MANIFEST.json
@@ -3,12 +3,12 @@
     "description": "", 
     "data": [
         {
-            "file": "base_vcpe_vgw_rackspace.yaml", 
+            "file": "base_vcpe_vgw.yaml", 
             "type": "HEAT", 
             "isBase": "true", 
             "data": [
                 {
-                    "file": "base_vcpe_vgw_rackspace.env", 
+                    "file": "base_vcpe_vgw.env", 
                     "type": "HEAT_ENV"
                 }
             ]
diff --git a/robot/assets/asdc/base_vcpe_vgw/base_vcpe_vgw_rackspace.env b/robot/assets/asdc/base_vcpe_vgw/base_vcpe_vgw.env
similarity index 60%
rename from robot/assets/asdc/base_vcpe_vgw/base_vcpe_vgw_rackspace.env
rename to robot/assets/asdc/base_vcpe_vgw/base_vcpe_vgw.env
index 93096f2..f1cadb8 100644
--- a/robot/assets/asdc/base_vcpe_vgw/base_vcpe_vgw_rackspace.env
+++ b/robot/assets/asdc/base_vcpe_vgw/base_vcpe_vgw.env
@@ -1,17 +1,19 @@
  parameters:
-  vcpe_image_name: Ubuntu 16.04 LTS (Xenial Xerus) (PVHVM)
-  vcpe_flavor_name: 4 GB General Purpose v1
-  public_net_id: 00000000-0000-0000-0000-000000000000
+  vcpe_image_name: PUT THE IMAGE NAME HERE (Ubuntu 1604 SUGGESTED)
+  vcpe_flavor_name: PUT THE FLAVOR NAME HERE (MEDIUM FLAVOR SUGGESTED)
+  public_net_id: PUT THE PUBLIC NETWORK ID HERE
   mux_gw_private_net_id: zdfw1muxgw01_private
+  mux_gw_private_subnet_id: zdfw1muxgw01_sub_private
   mux_gw_private_net_cidr: 10.5.0.0/24
   cpe_public_net_id: zdfw1cpe01_public
+  cpe_public_subnet_id: zdfw1cpe01_sub_public
   cpe_public_net_cidr: 10.2.0.0/24
-  onap_private_net_id: <PUT_YOUR_ONAP_NET_ID_HERE>
-  onap_private_subnet_id: <PUT_YOUR_ONAP_NET_ID_HERE>
+  onap_private_net_id: PUT THE ONAP PRIVATE NETWORK NAME HERE
+  onap_private_subnet_id: PUT THE ONAP PRIVATE SUBNETWORK NAME HERE
   onap_private_net_cidr: 10.0.0.0/16
   vgw_private_ip_0: 10.5.0.21
   vgw_private_ip_1: 10.0.101.30
-  vgw_private_ip_2: 10.2.0.2
+  vgw_private_ip_2: 10.2.0.3
   vgw_name_0: zdcpe1cpe01gw01
   vnf_id: vCPE_Infrastructure_GW_demo_app
   vf_module_id: vCPE_Customer_GW
@@ -23,4 +25,8 @@
   install_script_version: 1.1.0-SNAPSHOT
   key_name: vgw_key
   pub_key: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDQXYJYYi3/OUZXUiCYWdtc7K0m5C0dJKVxPG0eI8EWZrEHYdfYe6WoTSDJCww+1qlBSpA5ac/Ba4Wn9vh+lR1vtUKkyIC/nrYb90ReUd385Glkgzrfh5HdR5y5S2cL/Frh86lAn9r6b3iWTJD8wBwXFyoe1S2nMTOIuG4RPNvfmyCTYVh8XTCCE8HPvh3xv2r4egawG1P4Q4UDwk+hDBXThY2KS8M5/8EMyxHV0ImpLbpYCTBA6KYDIRtqmgS6iKyy8v2D1aSY5mc9J0T5t9S2Gv+VZQNWQDDKNFnxqYaAo1uEoq/i1q63XC5AD3ckXb2VT6dp23BQMdDfbHyUWfJN
-  cloud_env: rackspace
+  cloud_env: PUT THE CLOUD PROVIDED HERE (openstack or rackspace)
+  vpp_source_repo_url: https://gerrit.fd.io/r/vpp
+  vpp_source_repo_branch: stable/1704
+  hc2vpp_source_repo_url: https://gerrit.fd.io/r/hc2vpp
+  hc2vpp_source_repo_branch: stable/1704
diff --git a/robot/assets/asdc/base_vcpe_vgw/base_vcpe_vgw_rackspace.yaml b/robot/assets/asdc/base_vcpe_vgw/base_vcpe_vgw.yaml
similarity index 82%
rename from robot/assets/asdc/base_vcpe_vgw/base_vcpe_vgw_rackspace.yaml
rename to robot/assets/asdc/base_vcpe_vgw/base_vcpe_vgw.yaml
index 0621556..173ba6d 100644
--- a/robot/assets/asdc/base_vcpe_vgw/base_vcpe_vgw_rackspace.yaml
+++ b/robot/assets/asdc/base_vcpe_vgw/base_vcpe_vgw.yaml
@@ -24,7 +24,7 @@
 
 heat_template_version: 2013-05-23
 
-description: Heat template to deploy vCPE vGateway (vG) for ONAP
+description: Heat template to deploy vCPE vGateway (vG)
 
 ##############
 #            #
@@ -49,6 +49,10 @@
     type: string
     label: vGMUX private network name or ID
     description: Private network that connects vGMUX to vGWs
+  mux_gw_private_subnet_id:
+    type: string
+    label: vGMUX private sub-network name or ID
+    description: vGMUX private sub-network name or ID
   mux_gw_private_net_cidr:
     type: string
     label: vGMUX private network CIDR
@@ -69,6 +73,10 @@
     type: string
     label: vCPE network that emulates internetmanagement name or ID
     description: Private network that connects vGW to emulated internet
+  cpe_public_subnet_id:
+    type: string
+    label: vCPE Public subnet
+    description: vCPE Public subnet
   cpe_public_net_cidr:
     type: string
     label: vCPE public network CIDR
@@ -133,6 +141,22 @@
     type: string
     label: Cloud environment
     description: Cloud environment (e.g., openstack, rackspace)
+  vpp_source_repo_url:
+    type: string
+    label: VPP Source Git Repo
+    description: URL for VPP source codes
+  vpp_source_repo_branch:
+    type: string
+    label: VPP Source Git Branch
+    description: Git Branch for the VPP source codes
+  hc2vpp_source_repo_url:
+    type: string
+    label: Honeycomb Source Git Repo
+    description: URL for Honeycomb source codes
+  hc2vpp_source_repo_branch:
+    type: string
+    label: Honeycomb Source Git Branch
+    description: Git Branch for the Honeycomb source codes
 
 #############
 #           #
@@ -160,13 +184,11 @@
       save_private_key: false
 
   # Virtual GW Instantiation
-  #   mux_gw_private_net created by mux heat template
-  #   cpe_public_net created by infra heat template (vDNS)
   vgw_private_0_port:
     type: OS::Neutron::Port
     properties:
       network: { get_param: mux_gw_private_net_id }
-      fixed_ips: [{"subnet": { get_param: mux_gw_private_net_id }, "ip_address": { get_param: vgw_private_ip_0 }}]
+      fixed_ips: [{"subnet": { get_param: mux_gw_private_subnet_id }, "ip_address": { get_param: vgw_private_ip_0 }}]
 
   vgw_private_1_port:
     type: OS::Neutron::Port
@@ -178,7 +200,7 @@
     type: OS::Neutron::Port
     properties:
       network: { get_param: cpe_public_net_id}
-      fixed_ips: [{"subnet": { get_param: cpe_public_net_id }, "ip_address": { get_param: vgw_private_ip_2 }}]
+      fixed_ips: [{"subnet": { get_param: cpe_public_subnet_id }, "ip_address": { get_param: vgw_private_ip_2 }}]
 
   vgw_0:
     type: OS::Nova::Server
@@ -207,6 +229,10 @@
             __demo_artifacts_version__ : { get_param: demo_artifacts_version }
             __install_script_version__ : { get_param: install_script_version }
             __cloud_env__ : { get_param: cloud_env }
+            __vpp_source_repo_url__ : { get_param: vpp_source_repo_url }
+            __vpp_source_repo_branch__ : { get_param: vpp_source_repo_branch }
+            __hc2vpp_source_repo_url__ : { get_param: hc2vpp_source_repo_url }
+            __hc2vpp_source_repo_branch__ : { get_param: hc2vpp_source_repo_branch }
           template: |
             #!/bin/bash
 
@@ -222,6 +248,10 @@
             echo "__demo_artifacts_version__" > /opt/config/demo_artifacts_version.txt
             echo "__install_script_version__" > /opt/config/install_script_version.txt
             echo "__cloud_env__" > /opt/config/cloud_env.txt
+            echo "__vpp_source_repo_url__" > /opt/config/vpp_source_repo_url.txt
+            echo "__vpp_source_repo_branch__" > /opt/config/vpp_source_repo_branch.txt
+            echo "__hc2vpp_source_repo_url__" > /opt/config/hc2vpp_source_repo_url.txt
+            echo "__hc2vpp_source_repo_branch__" > /opt/config/hc2vpp_source_repo_branch.txt
 
             # Download and run install script
             curl -k __repo_url_blob__/org.onap.demo/vnfs/vcpe/__install_script_version__/v_gw_install.sh -o /opt/v_gw_install.sh
diff --git a/robot/assets/asdc/base_vfw/base_vfw.yaml b/robot/assets/asdc/base_vfw/base_vfw.yaml
index a7df854..a0a2309 100644
--- a/robot/assets/asdc/base_vfw/base_vfw.yaml
+++ b/robot/assets/asdc/base_vfw/base_vfw.yaml
@@ -1,6 +1,16 @@
+##########################################################################
+#
+##########################################################################
+
 heat_template_version: 2013-05-23
 
-description: Heat template to deploy vFirewall demo app for OpenECOMP
+description: Heat template that deploys vFirewall demo app for ONAP
+
+##############
+#            #
+# PARAMETERS #
+#            #
+##############
 
 parameters:
   vfw_image_name:
@@ -23,14 +33,14 @@
     type: string
     label: Protected private network name or ID
     description: Private network that connects vFirewall with vSink
-  ecomp_private_net_id:
+  onap_private_net_id:
     type: string
-    label: ECOMP management network name or ID
-    description: Private network that connects ECOMP component and the VNF
-  ecomp_private_subnet_id:
+    label: ONAP management network name or ID
+    description: Private network that connects ONAP components and the VNF
+  onap_private_subnet_id:
     type: string
-    label: ECOMP management sub-network name or ID
-    description: Private sub-network that connects ECOMP component and the VNF
+    label: ONAP management sub-network name or ID
+    description: Private sub-network that connects ONAP components and the VNF
   unprotected_private_net_cidr:
     type: string
     label: Unprotected private network CIDR
@@ -39,9 +49,9 @@
     type: string
     label: Protected private network CIDR
     description: The CIDR of the protected private network
-  ecomp_private_net_cidr:
+  onap_private_net_cidr:
     type: string
-    label: ECOMP private network CIDR
+    label: ONAP private network CIDR
     description: The CIDR of the protected private network
   vfw_private_ip_0:
     type: string
@@ -53,24 +63,24 @@
     description: Private IP address that is assigned to the vFirewall to communicate with the vSink
   vfw_private_ip_2:
     type: string
-    label: vFirewall private IP address towards the ECOMP management network
-    description: Private IP address that is assigned to the vFirewall to communicate with ECOMP components
+    label: vFirewall private IP address towards the ONAP management network
+    description: Private IP address that is assigned to the vFirewall to communicate with ONAP components
   vpg_private_ip_0:
     type: string
     label: vPacketGenerator private IP address towards the unprotected network
     description: Private IP address that is assigned to the vPacketGenerator to communicate with the vFirewall
   vpg_private_ip_1:
     type: string
-    label: vPacketGenerator private IP address towards the ECOMP management network
-    description: Private IP address that is assigned to the vPacketGenerator to communicate with ECOMP components
+    label: vPacketGenerator private IP address towards the ONAP management network
+    description: Private IP address that is assigned to the vPacketGenerator to communicate with ONAP components
   vsn_private_ip_0:
     type: string
     label: vSink private IP address towards the protected network
     description: Private IP address that is assigned to the vSink to communicate with the vFirewall
   vsn_private_ip_1:
     type: string
-    label: vSink private IP address towards the ECOMP management network
-    description: Private IP address that is assigned to the vSink to communicate with ECOMP components
+    label: vSink private IP address towards the ONAP management network
+    description: Private IP address that is assigned to the vSink to communicate with ONAP components
   vfw_name_0:
     type: string
     label: vFirewall name
@@ -86,11 +96,11 @@
   vnf_id:
     type: string
     label: VNF ID
-    description: The VNF ID is provided by ECOMP
+    description: The VNF ID is provided by ONAP
   vf_module_id:
     type: string
     label: vFirewall module ID
-    description: The vFirewall Module ID is provided by ECOMP
+    description: The vFirewall Module ID is provided by ONAP
   dcae_collector_ip:
     type: string
     label: DCAE collector IP address
@@ -115,13 +125,26 @@
     type: string
     label: Repository URL
     description: URL of the repository that hosts the demo packages
+  install_script_version:
+    type: string
+    label: Installation script version number
+    description: Version number of the scripts that install the vFW demo app
   demo_artifacts_version:
     type: string
     label: Artifacts version used in demo vnfs
     description: Artifacts (jar, tar.gz) version used in demo vnfs
+  cloud_env:
+    type: string
+    label: Cloud environment
+    description: Cloud environment (e.g., openstack, rackspace)
+
+#############
+#           #
+# RESOURCES #
+#           #
+#############
 
 resources:
-  
   random-str:
     type: OS::Heat::RandomString
     properties:
@@ -130,12 +153,12 @@
   my_keypair:
     type: OS::Nova::KeyPair
     properties:
-      name: 
+      name:
         str_replace:
           template: base_rand
           params:
             base: { get_param: key_name }
-            rand: { get_resource: random-str }  
+            rand: { get_resource: random-str }
       public_key: { get_param: pub_key }
       save_private_key: false
 
@@ -161,6 +184,26 @@
       network_id: { get_resource: protected_private_network }
       cidr: { get_param: protected_private_net_cidr }
 
+  # Virtual Firewall instantiation
+  vfw_private_0_port:
+    type: OS::Neutron::Port
+    properties:
+      network: { get_resource: unprotected_private_network }
+      fixed_ips: [{"subnet": { get_resource: unprotected_private_subnet }, "ip_address": { get_param: vfw_private_ip_0 }}]
+
+  vfw_private_1_port:
+    type: OS::Neutron::Port
+    properties:
+      allowed_address_pairs: [{ "ip_address": { get_param: vpg_private_ip_0 }}]
+      network: { get_resource: protected_private_network }
+      fixed_ips: [{"subnet": { get_resource: protected_private_subnet }, "ip_address": { get_param: vfw_private_ip_1 }}]
+
+  vfw_private_2_port:
+    type: OS::Neutron::Port
+    properties:
+      network: { get_param: onap_private_net_id }
+      fixed_ips: [{"subnet": { get_param: onap_private_subnet_id }, "ip_address": { get_param: vfw_private_ip_2 }}]
+
   vfw_0:
     type: OS::Nova::Server
     properties:
@@ -183,87 +226,52 @@
             __repo_url_blob__ : { get_param: repo_url_blob }
             __repo_url_artifacts__ : { get_param: repo_url_artifacts }
             __demo_artifacts_version__ : { get_param: demo_artifacts_version }
+            __install_script_version__ : { get_param: install_script_version }
+            __vfw_private_ip_0__ : { get_param: vfw_private_ip_0 }
+            __vfw_private_ip_1__ : { get_param: vfw_private_ip_1 }
+            __vfw_private_ip_2__ : { get_param: vfw_private_ip_2 }
+            __unprotected_private_net_cidr__ : { get_param: unprotected_private_net_cidr }
+            __protected_private_net_cidr__ : { get_param: protected_private_net_cidr }
+            __onap_private_net_cidr__ : { get_param: onap_private_net_cidr }
+            __cloud_env__ : { get_param: cloud_env }
           template: |
             #!/bin/bash
-
-            DCAE_COLLECTOR_IP=__dcae_collector_ip__
-            DCAE_COLLECTOR_PORT=__dcae_collector_port__
-            REPO_URL_BLOB=__repo_url_blob__
-            REPO_URL_ARTIFACTS=__repo_url_artifacts__
-            DEMO_ARTIFACTS_VERSION=__demo_artifacts_version__
-
-            # Download required dependencies
-            add-apt-repository -y ppa:openjdk-r/ppa
-            apt-get update
-            apt-get install -y make wget openjdk-8-jdk gcc libcurl4-openssl-dev python-pip bridge-utils apt-transport-https ca-certificates
-            apt-get install -y maven
-            pip install jsonschema
-
-            # Download vFirewall code for virtual firewall
-            mkdir /opt/config
-            mkdir /opt/honeycomb
-            cd /opt
-            wget $REPO_URL_BLOB/org.openecomp.demo/vnfs/vfw/$DEMO_ARTIFACTS_VERSION/v_firewall_init.sh
-            wget $REPO_URL_BLOB/org.openecomp.demo/vnfs/vfw/$DEMO_ARTIFACTS_VERSION/vfirewall.sh
-
-            mvn org.apache.maven.plugins:maven-dependency-plugin:2.10:get -DremoteRepositories=$REPO_URL_ARTIFACTS -Dartifact=org.openecomp.demo.vnf:sample-distribution:$DEMO_ARTIFACTS_VERSION:tar.gz:hc -Dtransitive=false -Ddest=.
-            mvn org.apache.maven.plugins:maven-dependency-plugin:2.10:get -DremoteRepositories=$REPO_URL_ARTIFACTS -Dartifact=org.openecomp.demo.vnf.ves:ves:$DEMO_ARTIFACTS_VERSION:tar.gz:demo -Dtransitive=false -Ddest=.
-            mvn org.apache.maven.plugins:maven-dependency-plugin:2.10:get -DremoteRepositories=$REPO_URL_ARTIFACTS -Dartifact=org.openecomp.demo.vnf.ves:ves_vfw_reporting:$DEMO_ARTIFACTS_VERSION:tar.gz:demo -Dtransitive=false -Ddest=.
-
             
-            tar -zxvf ves-$DEMO_ARTIFACTS_VERSION-demo.tar.gz
-            mv ves-$DEMO_ARTIFACTS_VERSION VES
-            tar -zxvf ves_vfw_reporting-$DEMO_ARTIFACTS_VERSION-demo.tar.gz
-            mv ves_vfw_reporting-$DEMO_ARTIFACTS_VERSION VESreporting_vFW
-            tar -zxvf sample-distribution-$DEMO_ARTIFACTS_VERSION-hc.tar.gz
-            mv sample-distribution-$DEMO_ARTIFACTS_VERSION honeycomb
-            sed -i 's/"restconf-binding-address": "127.0.0.1",/"restconf-binding-address": "0.0.0.0",/g' honeycomb/sample-distribution-$DEMO_ARTIFACTS_VERSION/config/honeycomb.json
-            mv VESreporting_vFW /opt/VES/code/evel_training/VESreporting
-            rm *.tar.gz
-            chmod +x v_firewall_init.sh
-            chmod +x vfirewall.sh
-            echo $DCAE_COLLECTOR_IP > config/dcae_collector_ip.txt
-            echo $DCAE_COLLECTOR_PORT > config/dcae_collector_port.txt
-            echo $DEMO_ARTIFACTS_VERSION > config/artifacts_version.txt
-
-            # Install VPP
-            export UBUNTU="trusty"
-            export RELEASE=".stable.1609"
-            rm /etc/apt/sources.list.d/99fd.io.list
-            echo "deb [trusted=yes] https://nexus.fd.io/content/repositories/fd.io$RELEASE.ubuntu.$UBUNTU.main/ ./" | sudo tee -a /etc/apt/sources.list.d/99fd.io.list
-            apt-get update
-            apt-get install -y vpp vpp-dpdk-dkms vpp-lib vpp-dbg vpp-plugins vpp-dev
-            sleep 1
-
-            # Install VES
-            cd /opt/VES/bldjobs/
-            make clean
-            make
-            sleep 1
-
-            # Run instantiation script
+            # Create configuration files
+            mkdir /opt/config
+            echo "__dcae_collector_ip__" > /opt/config/dcae_collector_ip.txt
+            echo "__dcae_collector_port__" > /opt/config/dcae_collector_port.txt
+            echo "__repo_url_blob__" > /opt/config/repo_url_blob.txt
+            echo "__repo_url_artifacts__" > /opt/config/repo_url_artifacts.txt
+            echo "__demo_artifacts_version__" > /opt/config/demo_artifacts_version.txt
+            echo "__install_script_version__" > /opt/config/install_script_version.txt
+            echo "__vfw_private_ip_0__" > /opt/config/vfw_private_ip_0.txt
+            echo "__vfw_private_ip_1__" > /opt/config/vfw_private_ip_1.txt
+            echo "__vfw_private_ip_2__" > /opt/config/vfw_private_ip_2.txt
+            echo "__unprotected_private_net_cidr__" > /opt/config/unprotected_private_net_cidr.txt
+            echo "__protected_private_net_cidr__" > /opt/config/protected_private_net_cidr.txt
+            echo "__onap_private_net_cidr__" > /opt/config/onap_private_net_cidr.txt
+            echo "__cloud_env__" > /opt/config/cloud_env.txt
+            
+            # Download and run install script
+            curl -k __repo_url_blob__/org.onap.demo/vnfs/vfw/__install_script_version__/v_firewall_install.sh -o /opt/v_firewall_install.sh
             cd /opt
-            mv vfirewall.sh /etc/init.d
-            update-rc.d vfirewall.sh defaults
-            ./v_firewall_init.sh
+            chmod +x v_firewall_install.sh
+            ./v_firewall_install.sh
 
-  vfw_private_0_port:
+
+  # Virtual Packet Generator instantiation
+  vpg_private_0_port:
     type: OS::Neutron::Port
     properties:
       network: { get_resource: unprotected_private_network }
-      fixed_ips: [{"subnet": { get_resource: unprotected_private_subnet }, "ip_address": { get_param: vfw_private_ip_0 }}]
+      fixed_ips: [{"subnet": { get_resource: unprotected_private_subnet }, "ip_address": { get_param: vpg_private_ip_0 }}]
 
-  vfw_private_1_port:
+  vpg_private_1_port:
     type: OS::Neutron::Port
     properties:
-      network: { get_resource: protected_private_network }
-      fixed_ips: [{"subnet": { get_resource: protected_private_subnet }, "ip_address": { get_param: vfw_private_ip_1 }}]
-
-  vfw_private_2_port:
-    type: OS::Neutron::Port
-    properties:
-      network: { get_param: ecomp_private_net_id }
-      fixed_ips: [{"subnet": { get_param: ecomp_private_subnet_id }, "ip_address": { get_param: vfw_private_ip_2 }}]
+      network: { get_param: onap_private_net_id }
+      fixed_ips: [{"subnet": { get_param: onap_private_subnet_id }, "ip_address": { get_param: vpg_private_ip_1 }}]
 
   vpg_0:
     type: OS::Nova::Server
@@ -287,75 +295,49 @@
             __repo_url_blob__ : { get_param: repo_url_blob }
             __repo_url_artifacts__ : { get_param: repo_url_artifacts }
             __demo_artifacts_version__ : { get_param: demo_artifacts_version }
+            __install_script_version__ : { get_param: install_script_version }
+            __vpg_private_ip_0__ : { get_param: vpg_private_ip_0 }
+            __vpg_private_ip_1__ : { get_param: vpg_private_ip_1 }
+            __unprotected_private_net_cidr__ : { get_param: unprotected_private_net_cidr }
+            __onap_private_net_cidr__ : { get_param: onap_private_net_cidr }
+            __cloud_env__ : { get_param: cloud_env }
           template: |
             #!/bin/bash
-
-            FW_IPADDR=__fw_ipaddr__
-            PROTECTED_NET_CIDR=__protected_net_cidr__
-            SINK_IPADDR=__sink_ipaddr__
-            REPO_URL_BLOB=__repo_url_blob__
-            REPO_URL_ARTIFACTS=__repo_url_artifacts__
-            DEMO_ARTIFACTS_VERSION=__demo_artifacts_version__
-
-            # Download required dependencies
-            add-apt-repository -y ppa:openjdk-r/ppa
-            apt-get update
-            apt-get install -y make wget openjdk-8-jdk gcc libcurl4-openssl-dev python-pip bridge-utils apt-transport-https ca-certificates
-            apt-get install -y maven
-            pip install jsonschema
-
-            # Download vFirewall demo code for packet generator
+            
+            # Create configuration files
             mkdir /opt/config
-            mkdir /opt/honeycomb
+            echo "__fw_ipaddr__" > /opt/config/fw_ipaddr.txt
+            echo "__protected_net_cidr__" > /opt/config/protected_net_cidr.txt
+            echo "__sink_ipaddr__" > /opt/config/sink_ipaddr.txt
+            echo "__repo_url_blob__" > /opt/config/repo_url_blob.txt
+            echo "__repo_url_artifacts__" > /opt/config/repo_url_artifacts.txt
+            echo "__demo_artifacts_version__" > /opt/config/demo_artifacts_version.txt
+            echo "__install_script_version__" > /opt/config/install_script_version.txt
+            echo "__vpg_private_ip_0__" > /opt/config/vpg_private_ip_0.txt
+            echo "__vpg_private_ip_1__" > /opt/config/vpg_private_ip_1.txt
+            echo "__unprotected_private_net_cidr__" > /opt/config/unprotected_private_net_cidr.txt
+            echo "__onap_private_net_cidr__" > /opt/config/onap_private_net_cidr.txt
+            echo "__cloud_env__" > /opt/config/cloud_env.txt
+            
+            # Download and run install script
+            curl -k __repo_url_blob__/org.onap.demo/vnfs/vfw/__install_script_version__/v_packetgen_install.sh -o /opt/v_packetgen_install.sh
             cd /opt
-
-            wget $REPO_URL_BLOB/org.openecomp.demo/vnfs/vfw/$DEMO_ARTIFACTS_VERSION/v_packetgen_init.sh
-            wget $REPO_URL_BLOB/org.openecomp.demo/vnfs/vfw/$DEMO_ARTIFACTS_VERSION/vpacketgen.sh
-            wget $REPO_URL_BLOB/org.openecomp.demo/vnfs/vfw/$DEMO_ARTIFACTS_VERSION/run_traffic_fw_demo.sh
-
-            mvn org.apache.maven.plugins:maven-dependency-plugin:2.10:get -DremoteRepositories=$REPO_URL_ARTIFACTS -Dartifact=org.openecomp.demo.vnf:sample-distribution:$DEMO_ARTIFACTS_VERSION:tar.gz:hc -Dtransitive=false -Ddest=.
-            mvn org.apache.maven.plugins:maven-dependency-plugin:2.10:get -DremoteRepositories=$REPO_URL_ARTIFACTS -Dartifact=org.openecomp.demo.vnf.vfw:vfw_pg_streams:$DEMO_ARTIFACTS_VERSION:tar.gz:demo -Dtransitive=false -Ddest=.
+            chmod +x v_packetgen_install.sh
+            ./v_packetgen_install.sh
 
 
-            tar -zxvf sample-distribution-$DEMO_ARTIFACTS_VERSION-hc.tar.gz
-            tar -zxvf vfw_pg_streams-$DEMO_ARTIFACTS_VERSION-demo.tar.gz 
-            mv vfw_pg_streams-$DEMO_ARTIFACTS_VERSION pg_streams
-            mv sample-distribution-$DEMO_ARTIFACTS_VERSION honeycomb
-            sed -i 's/"restconf-binding-address": "127.0.0.1",/"restconf-binding-address": "0.0.0.0",/g' honeycomb/sample-distribution-$DEMO_ARTIFACTS_VERSION/config/honeycomb.json
-            rm *.tar.gz
-            chmod +x v_packetgen_init.sh
-            chmod +x vpacketgen.sh
-            echo $FW_IPADDR > config/fw_ipaddr.txt
-            echo $PROTECTED_NET_CIDR > config/protected_net_cidr.txt
-            echo $SINK_IPADDR > config/sink_ipaddr.txt
-            echo $DEMO_ARTIFACTS_VERSION > config/artifacts_version.txt
-
-            # Install VPP
-            export UBUNTU="trusty"
-            export RELEASE=".stable.1609"
-            rm /etc/apt/sources.list.d/99fd.io.list
-            echo "deb [trusted=yes] https://nexus.fd.io/content/repositories/fd.io$RELEASE.ubuntu.$UBUNTU.main/ ./" | sudo tee -a /etc/apt/sources.list.d/99fd.io.list
-            apt-get update
-            apt-get install -y vpp vpp-dpdk-dkms vpp-lib vpp-dbg vpp-plugins vpp-dev
-            sleep 1
-
-            # Run instantiation script
-            cd /opt
-            mv vpacketgen.sh /etc/init.d
-            update-rc.d vpacketgen.sh defaults
-            ./v_packetgen_init.sh
-
-  vpg_private_0_port:
+  # Virtual Sink instantiation
+  vsn_private_0_port:
     type: OS::Neutron::Port
     properties:
-      network: { get_resource: unprotected_private_network }
-      fixed_ips: [{"subnet": { get_resource: unprotected_private_subnet }, "ip_address": { get_param: vpg_private_ip_0 }}]
+      network: { get_resource: protected_private_network }
+      fixed_ips: [{"subnet": { get_resource: protected_private_subnet }, "ip_address": { get_param: vsn_private_ip_0 }}]
 
-  vpg_private_1_port:
+  vsn_private_1_port:
     type: OS::Neutron::Port
     properties:
-      network: { get_param: ecomp_private_net_id }
-      fixed_ips: [{"subnet": { get_param: ecomp_private_subnet_id }, "ip_address": { get_param: vpg_private_ip_1 }}]
+      network: { get_param: onap_private_net_id }
+      fixed_ips: [{"subnet": { get_param: onap_private_subnet_id }, "ip_address": { get_param: vsn_private_ip_1 }}]
 
   vsn_0:
     type: OS::Nova::Server
@@ -377,47 +359,29 @@
             __unprotected_net__: { get_param: unprotected_private_net_cidr }
             __repo_url_blob__ : { get_param: repo_url_blob }
             __repo_url_artifacts__ : { get_param: repo_url_artifacts }
-            __demo_artifacts_version__ : { get_param: demo_artifacts_version }
+            __install_script_version__ : { get_param: install_script_version }
+            __vsn_private_ip_0__ : { get_param: vsn_private_ip_0 }
+            __vsn_private_ip_1__ : { get_param: vsn_private_ip_1 }
+            __protected_private_net_cidr__ : { get_param: protected_private_net_cidr }
+            __onap_private_net_cidr__ : { get_param: onap_private_net_cidr }
+            __cloud_env__ : { get_param: cloud_env }
           template: |
             #!/bin/bash
-
-            PROTECTED_NET_GW=__protected_net_gw__
-            UNPROTECTED_NET=__unprotected_net__
-            UNPROTECTED_NET=$(echo $UNPROTECTED_NET | cut -d'/' -f1)
-            REPO_URL_BLOB=__repo_url_blob__
-            REPO_URL_ARTIFACTS=__repo_url_artifacts__
-            DEMO_ARTIFACTS_VERSION=__demo_artifacts_version__
-
-            # Download required dependencies
-            add-apt-repository -y ppa:openjdk-r/ppa
-            apt-get update
-            apt-get install -y make wget openjdk-8-jdk apt-transport-https ca-certificates darkstat
-
-            # Configure and run darkstat
-            sed -i "s/START_DARKSTAT=.*/START_DARKSTAT=yes/g" /etc/darkstat/init.cfg
-            sed -i "s/INTERFACE=.*/INTERFACE=\"-i eth1\"/g" /etc/darkstat/init.cfg
-            /etc/init.d/darkstat start
-
+            
+            # Create configuration files
             mkdir /opt/config
+            echo "__protected_net_gw__" > /opt/config/protected_net_gw.txt
+            echo "__unprotected_net__" > /opt/config/unprotected_net.txt
+            echo "__repo_url_blob__" > /opt/config/repo_url_blob.txt
+            echo "__install_script_version__" > /opt/config/install_script_version.txt
+            echo "__vsn_private_ip_0__" > /opt/config/vsn_private_ip_0.txt
+            echo "__vsn_private_ip_1__" > /opt/config/vsn_private_ip_1.txt
+            echo "__protected_private_net_cidr__" > /opt/config/protected_private_net_cidr.txt
+            echo "__onap_private_net_cidr__" > /opt/config/onap_private_net_cidr.txt
+            echo "__cloud_env__" > /opt/config/cloud_env.txt
+            
+            # Download and run install script
+            curl -k __repo_url_blob__/org.onap.demo/vnfs/vfw/__install_script_version__/v_sink_install.sh -o /opt/v_sink_install.sh
             cd /opt
-            wget $REPO_URL_BLOB/org.openecomp.demo/vnfs/vfw/$DEMO_ARTIFACTS_VERSION/v_sink_init.sh
-            wget $REPO_URL_BLOB/org.openecomp.demo/vnfs/vfw/$DEMO_ARTIFACTS_VERSION/vsink.sh
-            chmod +x v_sink_init.sh
-            chmod +x vsink.sh
-            echo $PROTECTED_NET_GW > config/protected_net_gw.txt
-            echo $UNPROTECTED_NET > config/unprotected_net.txt
-            mv vsink.sh /etc/init.d
-            update-rc.d vsink.sh defaults
-            ./v_sink_init.sh
-
-  vsn_private_0_port:
-    type: OS::Neutron::Port
-    properties:
-      network: { get_resource: protected_private_network }
-      fixed_ips: [{"subnet": { get_resource: protected_private_subnet }, "ip_address": { get_param: vsn_private_ip_0 }}]
-
-  vsn_private_1_port:
-    type: OS::Neutron::Port
-    properties:
-      network: { get_param: ecomp_private_net_id }
-      fixed_ips: [{"subnet": { get_param: ecomp_private_subnet_id }, "ip_address": { get_param: vsn_private_ip_1 }}]
+            chmod +x v_sink_install.sh
+            ./v_sink_install.sh
\ No newline at end of file
diff --git a/robot/assets/asdc/base_vlb/base_vlb.yaml b/robot/assets/asdc/base_vlb/base_vlb.yaml
index c292f29..cbf0d4d 100644
--- a/robot/assets/asdc/base_vlb/base_vlb.yaml
+++ b/robot/assets/asdc/base_vlb/base_vlb.yaml
@@ -1,6 +1,16 @@
+##########################################################################
+#
+##########################################################################
+
 heat_template_version: 2013-05-23
 
-description: Heat template to deploy vLoadBalancer/vDNS demo app for OpenECOMP
+description: Heat template to deploy vLoadBalancer/vDNS demo app for ONAP
+
+##############
+#            #
+# PARAMETERS #
+#            #
+##############
 
 parameters:
   vlb_image_name:
@@ -19,21 +29,29 @@
     type: string
     label: vLoadBalancer private network name or ID
     description: Private network that connects vLoadBalancer with vDNSs
-  ecomp_private_net_id:
+  pktgen_private_net_id:
+    type: string
+    label: vPacketGen private network name or ID
+    description: Private network that connects vLoadBalancer with vPacketGen
+  onap_private_net_id:
     type: string
     label: ECOMP management network name or ID
-    description: Private network that connects ECOMP component and the VNF
-  ecomp_private_subnet_id:
+    description: Private network that connects ONAP component and the VNF
+  onap_private_subnet_id:
     type: string
     label: ECOMP management sub-network name or ID
-    description: Private sub-network that connects ECOMP component and the VNF
+    description: Private sub-network that connects ONAP component and the VNF
   vlb_private_net_cidr:
     type: string
     label: vLoadBalancer private network CIDR
     description: The CIDR of the vLoadBalancer private network
-  ecomp_private_net_cidr:
+  pktgen_private_net_cidr:
     type: string
-    label: ECOMP private network CIDR
+    label: vPacketGen private network CIDR
+    description: The CIDR of the vPacketGen private network
+  onap_private_net_cidr:
+    type: string
+    label: ONAP private network CIDR
     description: The CIDR of the protected private network
   vlb_private_ip_0:
     type: string
@@ -41,16 +59,40 @@
     description: Private IP address that is assigned to the vLoadBalancer to communicate with the vDNSs
   vlb_private_ip_1:
     type: string
-    label: vLoadBalancer private IP address towards the ECOMP management network
-    description: Private IP address that is assigned to the vLoadBalancer to communicate with ECOMP components
+    label: vLoadBalancer private IP address towards the ONAP management network
+    description: Private IP address that is assigned to the vLoadBalancer to communicate with ONAP components
+  vlb_private_ip_2:
+    type: string
+    label: vLoadBalancer private IP address towards the vPacketGen network
+    description: Private IP address that is assigned to the vLoadBalancer to communicate with vPacketGen
   vdns_private_ip_0:
     type: string
     label: vDNS private IP address towards the private network
     description: Private IP address that is assigned to the vDNS to communicate with the vLoadBalancer
   vdns_private_ip_1:
     type: string
-    label: vDNS private IP address towards the ECOMP management network
-    description: Private IP address that is assigned to the vDNS to communicate with ECOMP components
+    label: vDNS private IP address towards the ONAP management network
+    description: Private IP address that is assigned to the vDNS to communicate with ONAP components
+  vpg_private_ip_0:
+    type: string
+    label: vPacketGen private IP address towards the vPacketGen private network
+    description: Private IP address that is assigned to the vPacketGen to communicate with the vLoadBalancer
+  vpg_private_ip_1:
+    type: string
+    label: vPacketGen private IP address towards the ONAP management network
+    description: Private IP address that is assigned to the vPacketGen to communicate with ONAP components
+  vip:
+    type: string
+    label: Virtual Private IP of the vLoadBalancer
+    description: Virtual Private IP that is assigned to the vLoadBalancer's VPP layer
+  gre_ipaddr:
+    type: string
+    label: IP Address of the GRE tunnel
+    description: IP address assigned to the GRE tunnel on the vLoadBalancer
+  pg_int:
+    type: string
+    label: IP Address of the output vPacketGen interface
+    description: IP address assigned to the output interface of the vPacketGen's VPP layer
   vlb_name_0:
     type: string
     label: vLoadBalancer name
@@ -59,14 +101,18 @@
     type: string
     label: vDNS name
     description: Name of the vDNS
+  vpg_name_0:
+    type: string
+    label: vPKTGEN name
+    description: Name of the vPKTGEN
   vnf_id:
     type: string
     label: VNF ID
-    description: The VNF ID is provided by ECOMP
+    description: The VNF ID is provided by ONAP
   vf_module_id:
     type: string
     label: vFirewall module ID
-    description: The vLoadBalancer Module ID is provided by ECOMP
+    description: The vLoadBalancer Module ID is provided by ONAP
   dcae_collector_ip:
     type: string
     label: DCAE collector IP address
@@ -95,6 +141,20 @@
     type: string
     label: Artifacts version used in demo vnfs
     description: Artifacts (jar, tar.gz) version used in demo vnfs
+  install_script_version:
+    type: string
+    label: Installation script version number
+    description: Version number of the scripts that install the vFW demo app
+  cloud_env:
+    type: string
+    label: Cloud environment
+    description: Cloud environment (e.g., openstack, rackspace)
+
+#############
+#           #
+# RESOURCES #
+#           #
+#############
 
 resources:
 
@@ -102,7 +162,7 @@
     type: OS::Heat::RandomString
     properties:
       length: 4
-  
+
   my_keypair:
     type: OS::Nova::KeyPair
     properties:
@@ -127,6 +187,36 @@
       network_id: { get_resource: vlb_private_network }
       cidr: { get_param: vlb_private_net_cidr }
 
+  pktgen_private_network:
+    type: OS::Neutron::Net
+    properties:
+      name: { get_param: pktgen_private_net_id }
+
+  pktgen_private_subnet:
+    type: OS::Neutron::Subnet
+    properties:
+      name: { get_param: pktgen_private_net_id }
+      network_id: { get_resource: pktgen_private_network }
+      cidr: { get_param: pktgen_private_net_cidr }
+
+  vlb_private_0_port:
+    type: OS::Neutron::Port
+    properties:
+      network: { get_resource: vlb_private_network }
+      fixed_ips: [{"subnet": { get_resource: vlb_private_subnet }, "ip_address": { get_param: vlb_private_ip_0 }}]
+
+  vlb_private_1_port:
+    type: OS::Neutron::Port
+    properties:
+      network: { get_param: onap_private_net_id }
+      fixed_ips: [{"subnet": { get_param: onap_private_subnet_id }, "ip_address": { get_param: vlb_private_ip_1 }}]
+
+  vlb_private_2_port:
+    type: OS::Neutron::Port
+    properties:
+      network: { get_resource: pktgen_private_network }
+      fixed_ips: [{"subnet": { get_resource: pktgen_private_subnet }, "ip_address": { get_param: vlb_private_ip_2 }}]
+
   vlb_0:
     type: OS::Nova::Server
     properties:
@@ -138,6 +228,7 @@
         - network: { get_param: public_net_id }
         - port: { get_resource: vlb_private_0_port }
         - port: { get_resource: vlb_private_1_port }
+        - port: { get_resource: vlb_private_2_port }
       metadata: {vnf_id: { get_param: vnf_id }, vf_module_id: { get_param: vf_module_id }}
       user_data_format: RAW
       user_data:
@@ -145,100 +236,62 @@
           params:
             __dcae_collector_ip__: { get_param: dcae_collector_ip }
             __dcae_collector_port__: { get_param: dcae_collector_port }
-            __local_private_ipaddr__: { get_param: vlb_private_ip_0 }
-            __repo_url_blob__ : { get_param: repo_url_blob }
-            __repo_url_artifacts__ : { get_param: repo_url_artifacts }
-            __demo_artifacts_version__ : { get_param: demo_artifacts_version }
+            __ip_to_dns_net__: { get_param: vlb_private_ip_0 }
+            __ip_to_pktgen_net__: { get_param: vlb_private_ip_2 }
+            __vip__: { get_param: vip }
+            __gre_ipaddr__: { get_param: gre_ipaddr }
+            __pktgen_ipaddr__: { get_param: vpg_private_ip_0 }
+            __oam_private_ipaddr__: { get_param: vlb_private_ip_1 }
+            __repo_url_blob__: { get_param: repo_url_blob }
+            __repo_url_artifacts__: { get_param: repo_url_artifacts }
+            __demo_artifacts_version__: { get_param: demo_artifacts_version }
+            __install_script_version__: { get_param: install_script_version }
+            __vlb_private_net_cidr__: { get_param: vlb_private_net_cidr }
+            __onap_private_net_cidr__: { get_param: onap_private_net_cidr }
+            __pktgen_private_net_cidr__: { get_param: pktgen_private_net_cidr }
+            __pktgen_mac__: { get_attr: [vpg_private_0_port, mac_address] }
+            __cloud_env__: { get_param: cloud_env }
           template: |
             #!/bin/bash
 
-            DCAE_COLLECTOR_IP=__dcae_collector_ip__
-            DCAE_COLLECTOR_PORT=__dcae_collector_port__
-            LOCAL_PRIVATE_IPADDR=__local_private_ipaddr__
-            REPO_URL_BLOB=__repo_url_blob__
-            REPO_URL_ARTIFACTS=__repo_url_artifacts__
-            DEMO_ARTIFACTS_VERSION=__demo_artifacts_version__
-
-            # Download required dependencies
-            add-apt-repository -y ppa:openjdk-r/ppa
-            apt-get update
-            apt-get install -y make gcc wget openjdk-8-jdk bridge-utils libcurl4-openssl-dev apt-transport-https ca-certificates
-            apt-get install -y maven
-            sleep 1
-
-            # Download vLB demo code for load balancer
+            # Create configuration files
             mkdir /opt/config
-            mkdir /opt/FDserver
+            echo "__dcae_collector_ip__" > /opt/config/dcae_collector_ip.txt
+            echo "__dcae_collector_port__" > /opt/config/dcae_collector_port.txt
+            echo "__ip_to_dns_net__" > /opt/config/ip_to_dns_net.txt
+            echo "__ip_to_pktgen_net__" > /opt/config/ip_to_pktgen_net.txt
+            echo "__vip__" > /opt/config/vip.txt
+            echo "__gre_ipaddr__" > /opt/config/gre_ipaddr.txt
+            echo "__pktgen_ipaddr__" > /opt/config/pktgen_ipaddr.txt
+            echo "__oam_private_ipaddr__" > /opt/config/oam_private_ipaddr.txt
+            echo "__repo_url_blob__" > /opt/config/repo_url_blob.txt
+            echo "__repo_url_artifacts__" > /opt/config/repo_url_artifacts.txt
+            echo "__demo_artifacts_version__" > /opt/config/demo_artifacts_version.txt
+            echo "__install_script_version__" > /opt/config/install_script_version.txt
+            echo "__vlb_private_net_cidr__" > /opt/config/vlb_private_net_cidr.txt
+            echo "__pktgen_private_net_cidr__" > /opt/config/pktgen_private_net_cidr.txt
+            echo "__onap_private_net_cidr__" > /opt/config/onap_private_net_cidr.txt
+            echo "__pktgen_mac__" > /opt/config/pktgen_mac.txt
+            echo "__cloud_env__" > /opt/config/cloud_env.txt
+
+            # Download and run install script
+            curl -k __repo_url_blob__/org.onap.demo/vnfs/vlb/__install_script_version__/v_lb_install.sh -o /opt/v_lb_install.sh
             cd /opt
+            chmod +x v_lb_install.sh
+            ./v_lb_install.sh
 
-            wget $REPO_URL_BLOB/org.openecomp.demo/vnfs/vlb/$DEMO_ARTIFACTS_VERSION/v_lb_init.sh
-            wget $REPO_URL_BLOB/org.openecomp.demo/vnfs/vlb/$DEMO_ARTIFACTS_VERSION/vlb.sh
-            wget $REPO_URL_BLOB/org.openecomp.demo/vnfs/vlb/$DEMO_ARTIFACTS_VERSION/dnsmembership.sh
-            wget $REPO_URL_BLOB/org.openecomp.demo/vnfs/vlb/$DEMO_ARTIFACTS_VERSION/add_dns.sh
-            wget $REPO_URL_BLOB/org.openecomp.demo/vnfs/vlb/$DEMO_ARTIFACTS_VERSION/remove_dns.sh
 
-            mvn org.apache.maven.plugins:maven-dependency-plugin:2.10:get -DremoteRepositories=$REPO_URL_ARTIFACTS -Dartifact=org.openecomp.demo.vnf.vlb:dns-manager:$DEMO_ARTIFACTS_VERSION:jar -Dtransitive=false -Ddest=.
-            mvn org.apache.maven.plugins:maven-dependency-plugin:2.10:get -DremoteRepositories=$REPO_URL_ARTIFACTS -Dartifact=org.openecomp.demo.vnf.ves:ves:$DEMO_ARTIFACTS_VERSION:tar.gz:demo -Dtransitive=false -Ddest=.
-            mvn org.apache.maven.plugins:maven-dependency-plugin:2.10:get -DremoteRepositories=$REPO_URL_ARTIFACTS -Dartifact=org.openecomp.demo.vnf.ves:ves_vlb_reporting:$DEMO_ARTIFACTS_VERSION:tar.gz:demo -Dtransitive=false -Ddest=.
-
-            tar -zxvf ves-$DEMO_ARTIFACTS_VERSION-demo.tar.gz
-            mv ves-$DEMO_ARTIFACTS_VERSION VES
-            tar -zxvf ves_vlb_reporting-$DEMO_ARTIFACTS_VERSION-demo.tar.gz
-            mv ves_vlb_reporting-$DEMO_ARTIFACTS_VERSION VESreporting_vLB
-
-            mv VESreporting_vLB /opt/VES/code/evel_training/VESreporting
-            mv dns-manager-$DEMO_ARTIFACTS_VERSION.jar /opt/FDserver/dns-manager-$DEMO_ARTIFACTS_VERSION.jar
-            mv dnsmembership.sh /opt/FDserver/dnsmembership.sh
-            mv add_dns.sh /opt/FDserver/add_dns.sh
-            mv remove_dns.sh /opt/FDserver/remove_dns.sh
-            rm *.tar.gz
-
-            chmod +x v_lb_init.sh
-            chmod +x vlb.sh
-            chmod +x /opt/VES/code/evel_training/VESreporting/go-client.sh
-            chmod +x /opt/FDserver/dnsmembership.sh
-            chmod +x /opt/FDserver/add_dns.sh
-            chmod +x /opt/FDserver/remove_dns.sh
-
-            echo $DCAE_COLLECTOR_IP > config/dcae_collector_ip.txt
-            echo $DCAE_COLLECTOR_PORT > config/dcae_collector_port.txt
-            echo $LOCAL_PRIVATE_IPADDR > config/local_private_ipaddr.txt
-            LOCAL_PUBLIC_IPADDR=$(ifconfig eth0 | grep "inet addr" | tr -s ' ' | cut -d' ' -f3 | cut -d':' -f2)
-            echo $LOCAL_PUBLIC_IPADDR > config/local_public_ipaddr.txt
-            echo $DEMO_ARTIFACTS_VERSION > config/artifacts_version.txt
-
-            # Install VPP
-            export UBUNTU="trusty"
-            export RELEASE=".stable.1609"
-            rm /etc/apt/sources.list.d/99fd.io.list
-            echo "deb [trusted=yes] https://nexus.fd.io/content/repositories/fd.io$RELEASE.ubuntu.$UBUNTU.main/ ./" | sudo tee -a /etc/apt/sources.list.d/99fd.io.list
-            apt-get update
-            apt-get install -y vpp vpp-dpdk-dkms vpp-lib vpp-dbg vpp-plugins vpp-dev
-            sleep 1
-
-            # Install VES
-            cd /opt/VES/bldjobs/
-            make clean
-            make
-            sleep 1
-
-            # Run instantiation script
-            cd /opt            
-            mv vlb.sh /etc/init.d
-            update-rc.d vlb.sh defaults
-            ./v_lb_init.sh
-
-  vlb_private_0_port:
+  vdns_private_0_port:
     type: OS::Neutron::Port
     properties:
       network: { get_resource: vlb_private_network }
-      fixed_ips: [{"subnet": { get_resource: vlb_private_subnet }, "ip_address": { get_param: vlb_private_ip_0 }}]
+      fixed_ips: [{"subnet": { get_resource: vlb_private_subnet }, "ip_address": { get_param: vdns_private_ip_0 }}]
 
-  vlb_private_1_port:
+  vdns_private_1_port:
     type: OS::Neutron::Port
     properties:
-      network: { get_param: ecomp_private_net_id }
-      fixed_ips: [{"subnet": { get_param: ecomp_private_subnet_id }, "ip_address": { get_param: vlb_private_ip_1 }}]
+      network: { get_param: onap_private_net_id }
+      fixed_ips: [{"subnet": { get_param: onap_private_subnet_id }, "ip_address": { get_param: vdns_private_ip_1 }}]
 
   vdns_0:
     type: OS::Nova::Server
@@ -256,84 +309,100 @@
       user_data:
         str_replace:
           params:
-            __lb_oam_int__ : { get_param: vlb_private_ip_1 }
+            __lb_oam_int__: { get_param: vlb_private_ip_1 }
             __lb_private_ipaddr__: { get_param: vlb_private_ip_0 }
             __local_private_ipaddr__: { get_param: vdns_private_ip_0 }
-            __repo_url_blob__ : { get_param: repo_url_blob }
-            __repo_url_artifacts__ : { get_param: repo_url_artifacts }
-            __demo_artifacts_version__ : { get_param: demo_artifacts_version }
+            __oam_private_ipaddr__: { get_param: vdns_private_ip_1 }
+            __repo_url_blob__: { get_param: repo_url_blob }
+            __repo_url_artifacts__: { get_param: repo_url_artifacts }
+            __demo_artifacts_version__: { get_param: demo_artifacts_version }
+            __install_script_version__: { get_param: install_script_version }
+            __vlb_private_net_cidr__: { get_param: vlb_private_net_cidr }
+            __onap_private_net_cidr__: { get_param: onap_private_net_cidr }
+            __cloud_env__: { get_param: cloud_env }
           template: |
             #!/bin/bash
 
-            LB_OAM_INT=__lb_oam_int__
-            LB_PRIVATE_IPADDR=__lb_private_ipaddr__
-            LOCAL_PRIVATE_IPADDR=__local_private_ipaddr__
-            REPO_URL_BLOB=__repo_url_blob__
-            REPO_URL_ARTIFACTS=__repo_url_artifacts__
-            DEMO_ARTIFACTS_VERSION=__demo_artifacts_version__
-
-            # Download required dependencies
-            add-apt-repository -y ppa:openjdk-r/ppa
-            apt-get update
-            apt-get install -y wget openjdk-8-jdk bind9 bind9utils bind9-doc apt-transport-https ca-certificates
-            apt-get install -y maven
-            sleep 1
-
-            # Download vDNS demo code for DNS Server
+            # Create configuration files
             mkdir /opt/config
-            mkdir /opt/FDclient
+            echo "__lb_oam_int__" > /opt/config/lb_oam_int.txt
+            echo "__lb_private_ipaddr__" > /opt/config/lb_private_ipaddr.txt
+            echo "__local_private_ipaddr__" > /opt/config/local_private_ipaddr.txt
+            echo "__oam_private_ipaddr__" > /opt/config/oam_private_ipaddr.txt
+            echo "__repo_url_blob__" > /opt/config/repo_url_blob.txt
+            echo "__repo_url_artifacts__" > /opt/config/repo_url_artifacts.txt
+            echo "__demo_artifacts_version__" > /opt/config/demo_artifacts_version.txt
+            echo "__install_script_version__" > /opt/config/install_script_version.txt
+            echo "__vlb_private_net_cidr__" > /opt/config/vlb_private_net_cidr.txt
+            echo "__onap_private_net_cidr__" > /opt/config/onap_private_net_cidr.txt
+            echo "__cloud_env__" > /opt/config/cloud_env.txt
+
+            # Download and run install script
+            curl -k __repo_url_blob__/org.onap.demo/vnfs/vlb/__install_script_version__/v_dns_install.sh -o /opt/v_dns_install.sh
             cd /opt
-            
-            wget $REPO_URL_BLOB/org.openecomp.demo/vnfs/vlb/$DEMO_ARTIFACTS_VERSION/v_dns_init.sh
-            wget $REPO_URL_BLOB/org.openecomp.demo/vnfs/vlb/$DEMO_ARTIFACTS_VERSION/vdns.sh
-            wget $REPO_URL_BLOB/org.openecomp.demo/vnfs/vlb/$DEMO_ARTIFACTS_VERSION/dnsclient.sh
-            wget $REPO_URL_BLOB/org.openecomp.demo/vnfs/vlb/$DEMO_ARTIFACTS_VERSION/set_gre_tunnel.sh
-            
-            mvn org.apache.maven.plugins:maven-dependency-plugin:2.10:get -DremoteRepositories=$REPO_URL_ARTIFACTS -Dartifact=org.openecomp.demo.vnf.vlb:dns-client:$DEMO_ARTIFACTS_VERSION:jar -Dtransitive=false -Ddest=.
+            chmod +x v_dns_install.sh
+            ./v_dns_install.sh
 
-            mv dns-client-$DEMO_ARTIFACTS_VERSION.jar /opt/FDclient/
-            mv dnsclient.sh /opt/FDclient/
-            mv set_gre_tunnel.sh /opt/FDclient/
 
-            chmod +x v_dns_init.sh
-            chmod +x vdns.sh
-            chmod +x /opt/FDclient/dnsclient.sh
-            chmod +x /opt/FDclient/set_gre_tunnel.sh
-
-            echo $LB_OAM_INT > config/lb_oam_int.txt
-            echo $LB_PRIVATE_IPADDR > config/lb_private_ipaddr.txt
-            echo $LOCAL_PRIVATE_IPADDR > config/local_private_ipaddr.txt
-            echo $DEMO_ARTIFACTS_VERSION > config/artifacts_version.txt
-
-            # Download Bind config files
-            cd /opt/config
-            wget $REPO_URL_BLOB/org.openecomp.demo/vnfs/vlb/$DEMO_ARTIFACTS_VERSION/db_dnsdemo_openecomp_org
-            wget $REPO_URL_BLOB/org.openecomp.demo/vnfs/vlb/$DEMO_ARTIFACTS_VERSION/named.conf.options
-            wget $REPO_URL_BLOB/org.openecomp.demo/vnfs/vlb/$DEMO_ARTIFACTS_VERSION/named.conf.local
-
-            # Configure Bind
-            modprobe ip_gre
-            mkdir /etc/bind/zones
-            sed -i "s/OPTIONS=.*/OPTIONS=\"-4 -u bind\"/g" /etc/default/bind9
-            mv db_dnsdemo_openecomp_org /etc/bind/zones/db.dnsdemo.openecomp.org
-            mv named.conf.options /etc/bind/
-            mv named.conf.local /etc/bind/
-            sleep 1
-
-            # Run instantiation script
-            cd /opt
-            mv vdns.sh /etc/init.d
-            update-rc.d vdns.sh defaults
-            ./v_dns_init.sh
-
-  vdns_private_0_port:
+  vpg_private_0_port:
     type: OS::Neutron::Port
     properties:
-      network: { get_resource: vlb_private_network }
-      fixed_ips: [{"subnet": { get_resource: vlb_private_subnet }, "ip_address": { get_param: vdns_private_ip_0 }}]
+      network: { get_resource: pktgen_private_network }
+      fixed_ips: [{"subnet": { get_resource: pktgen_private_subnet }, "ip_address": { get_param: vpg_private_ip_0 }}]
 
-  vdns_private_1_port:
+  vpg_private_1_port:
     type: OS::Neutron::Port
     properties:
-      network: { get_param: ecomp_private_net_id }
-      fixed_ips: [{"subnet": { get_param: ecomp_private_subnet_id }, "ip_address": { get_param: vdns_private_ip_1 }}]
+      network: { get_param: onap_private_net_id }
+      fixed_ips: [{"subnet": { get_param: onap_private_subnet_id }, "ip_address": { get_param: vpg_private_ip_1 }}]
+
+  vpg_0:
+    type: OS::Nova::Server
+    properties:
+      image: { get_param: vlb_image_name }
+      flavor: { get_param: vlb_flavor_name }
+      name: { get_param: vpg_name_0 }
+      key_name: { get_resource: my_keypair }
+      networks:
+        - network: { get_param: public_net_id }
+        - port: { get_resource: vpg_private_0_port }
+        - port: { get_resource: vpg_private_1_port }
+      user_data_format: RAW
+      user_data:
+        str_replace:
+          params:
+            __repo_url_blob__: { get_param: repo_url_blob }
+            __repo_url_artifacts__: { get_param: repo_url_artifacts }
+            __local_private_ipaddr__: { get_param: vpg_private_ip_0 }
+            __oam_private_ipaddr__: { get_param: vpg_private_ip_1 }
+            __onap_private_net_cidr__: { get_param: onap_private_net_cidr }
+            __pktgen_private_net_cidr__: { get_param: pktgen_private_net_cidr }
+            __vlb_ipaddr__: { get_param: vlb_private_ip_2 }
+            __demo_artifacts_version__: { get_param: demo_artifacts_version }
+            __install_script_version__: { get_param: install_script_version }
+            __pg_int__: { get_param: pg_int }
+            __vlb_mac__: { get_attr: [vlb_private_2_port, mac_address] }
+            __cloud_env__: { get_param: cloud_env }
+          template: |
+            #!/bin/bash
+
+            # Create configuration files
+            mkdir /opt/config
+            echo "__oam_private_ipaddr__" > /opt/config/oam_private_ipaddr.txt
+            echo "__onap_private_net_cidr__" > /opt/config/onap_private_net_cidr.txt
+            echo "__local_private_ipaddr__" > /opt/config/local_private_ipaddr.txt
+            echo "__pktgen_private_net_cidr__" > /opt/config/pktgen_private_net_cidr.txt
+            echo "__vlb_ipaddr__" > /opt/config/vlb_ipaddr.txt
+            echo "__repo_url_blob__" > /opt/config/repo_url_blob.txt
+            echo "__repo_url_artifacts__" > /opt/config/repo_url_artifacts.txt
+            echo "__demo_artifacts_version__" > /opt/config/demo_artifacts_version.txt
+            echo "__install_script_version__" > /opt/config/install_script_version.txt
+            echo "__pg_int__" > /opt/config/pg_int.txt
+            echo "__vlb_mac__" > /opt/config/vlb_mac.txt
+            echo "__cloud_env__" > /opt/config/cloud_env.txt
+
+            # Download and run install script
+            curl -k __repo_url_blob__/org.onap.demo/vnfs/vlb/__install_script_version__/v_packetgen_install.sh -o /opt/v_packetgen_install.sh
+            cd /opt
+            chmod +x v_packetgen_install.sh
+            ./v_packetgen_install.sh
\ No newline at end of file
diff --git a/robot/assets/asdc/base_vlb/dnsscaling.yaml b/robot/assets/asdc/base_vlb/dnsscaling.yaml
index 003deb9..125eb58 100644
--- a/robot/assets/asdc/base_vlb/dnsscaling.yaml
+++ b/robot/assets/asdc/base_vlb/dnsscaling.yaml
@@ -1,6 +1,16 @@
+##########################################################################
+#
+##########################################################################
+
 heat_template_version: 2013-05-23
 
-description: Heat template to deploy a vDNS for OpenECOMP (scaling-up scenario)
+description: Heat template to deploy a vDNS for ONAP (scaling-up scenario)
+
+##############
+#            #
+# PARAMETERS #
+#            #
+##############
 
 parameters:
   vlb_image_name:
@@ -19,30 +29,38 @@
     type: string
     label: vLoadBalancer private network name or ID
     description: Private network that connects vLoadBalancer with vDNSs
-  ecomp_private_net_id:
+  onap_private_net_id:
     type: string
-    label: ECOMP management network name or ID
-    description: Private network that connects ECOMP component and the VNF
-  ecomp_private_subnet_id:
+    label: ONAP management network name or ID
+    description: Private network that connects ONAP component and the VNF
+  onap_private_subnet_id:
     type: string
-    label: ECOMP management sub-network name or ID
-    description: Private sub-network that connects ECOMP component and the VNF
+    label: ONAP management sub-network name or ID
+    description: Private sub-network that connects ONAP component and the VNF
+  vlb_private_net_cidr:
+    type: string
+    label: vLoadBalancer private network CIDR
+    description: The CIDR of the vLoadBalancer private network
+  onap_private_net_cidr:
+    type: string
+    label: ONAP private network CIDR
+    description: The CIDR of the protected private network
   vlb_private_ip_0:
     type: string
     label: vLoadBalancer private IP address towards the private network
     description: Private IP address that is assigned to the vLoadBalancer to communicate with the vDNSs
   vlb_private_ip_1:
     type: string
-    label: vLoadBalancer private IP address towards the ECOMP management network
-    description: Private IP address that is assigned to the vLoadBalancer to communicate with ECOMP components
+    label: vLoadBalancer private IP address towards the ONAP management network
+    description: Private IP address that is assigned to the vLoadBalancer to communicate with ONAP components
   vdns_private_ip_0:
     type: string
     label: vDNS private IP address towards the private network
     description: Private IP address that is assigned to the vDNS to communicate with the vLoadBalancer
   vdns_private_ip_1:
     type: string
-    label: vDNS private IP address towards the ECOMP management network
-    description: Private IP address that is assigned to the vDNS to communicate with ECOMP components
+    label: vDNS private IP address towards the ONAP management network
+    description: Private IP address that is assigned to the vDNS to communicate with ONAP components
   vdns_name_0:
     type: string
     label: vDNS name
@@ -50,11 +68,11 @@
   vnf_id:
     type: string
     label: VNF ID
-    description: The VNF ID is provided by ECOMP
+    description: The VNF ID is provided by ONAP
   vf_module_id:
     type: string
     label: vFirewall module ID
-    description: The vLoadBalancer Module ID is provided by ECOMP
+    description: The vLoadBalancer Module ID is provided by ONAP
   key_name:
     type: string
     label: Key pair name
@@ -71,10 +89,24 @@
     type: string
     label: Repository URL
     description: URL of the repository that hosts the demo packages
+  install_script_version:
+    type: string
+    label: Installation script version number
+    description: Version number of the scripts that install the vFW demo app
   demo_artifacts_version:
     type: string
     label: Artifacts version used in demo vnfs
     description: Artifacts (jar, tar.gz) version used in demo vnfs
+  cloud_env:
+    type: string
+    label: Cloud environment
+    description: Cloud environment (e.g., openstack, rackspace)
+
+#############
+#           #
+# RESOURCES #
+#           #
+#############
 
 resources:
 
@@ -95,7 +127,19 @@
       public_key: { get_param: pub_key }
       save_private_key: false
 
-  vdns_0:
+  vdns_2_private_0_port:
+    type: OS::Neutron::Port
+    properties:
+      network: { get_param: vlb_private_net_id }
+      fixed_ips: [{"subnet": { get_param: vlb_private_net_id }, "ip_address": { get_param: vdns_private_ip_0 }}]
+
+  vdns_2_private_1_port:
+    type: OS::Neutron::Port
+    properties:
+      network: { get_param: onap_private_net_id }
+      fixed_ips: [{"subnet": { get_param: onap_private_subnet_id }, "ip_address": { get_param: vdns_private_ip_1 }}]
+
+  vdns_2:
     type: OS::Nova::Server
     properties:
       image: { get_param: vlb_image_name }
@@ -104,91 +148,43 @@
       key_name: { get_resource: my_keypair }
       networks:
         - network: { get_param: public_net_id }
-        - port: { get_resource: vdns_private_0_port }
-        - port: { get_resource: vdns_private_1_port }
+        - port: { get_resource: vdns_2_private_0_port }
+        - port: { get_resource: vdns_2_private_1_port }
       metadata: {vnf_id: { get_param: vnf_id }, vf_module_id: { get_param: vf_module_id }}
       user_data_format: RAW
       user_data:
         str_replace:
           params:
-            __lb_oam_int__ : { get_param: vlb_private_ip_1 }
+            __lb_oam_int__: { get_param: vlb_private_ip_1 }
             __lb_private_ipaddr__: { get_param: vlb_private_ip_0 }
             __local_private_ipaddr__: { get_param: vdns_private_ip_0 }
-            __repo_url_blob__ : { get_param: repo_url_blob }
-            __repo_url_artifacts__ : { get_param: repo_url_artifacts }
-            __demo_artifacts_version__ : { get_param: demo_artifacts_version }
+            __oam_private_ipaddr__: { get_param: vdns_private_ip_1 }
+            __repo_url_blob__: { get_param: repo_url_blob }
+            __repo_url_artifacts__: { get_param: repo_url_artifacts }
+            __demo_artifacts_version__: { get_param: demo_artifacts_version }
+            __install_script_version__: { get_param: install_script_version }
+            __vlb_private_net_cidr__: { get_param: vlb_private_net_cidr }
+            __onap_private_net_cidr__: { get_param: onap_private_net_cidr }
+            __cloud_env__: { get_param: cloud_env }
           template: |
             #!/bin/bash
 
-            LB_OAM_INT=__lb_oam_int__
-            LB_PRIVATE_IPADDR=__lb_private_ipaddr__
-            LOCAL_PRIVATE_IPADDR=__local_private_ipaddr__
-            REPO_URL_BLOB=__repo_url_blob__
-            REPO_URL_ARTIFACTS=__repo_url_artifacts__
-            DEMO_ARTIFACTS_VERSION=__demo_artifacts_version__
-
-            # Download required dependencies
-            add-apt-repository -y ppa:openjdk-r/ppa
-            apt-get update
-            apt-get install -y wget openjdk-8-jdk bind9 bind9utils bind9-doc apt-transport-https ca-certificates
-            apt-get install -y maven
-            sleep 1
-
-            # Download vDNS demo code for DNS Server
+            # Create configuration files
             mkdir /opt/config
-            mkdir /opt/FDclient
+            echo "__lb_oam_int__" > /opt/config/lb_oam_int.txt
+            echo "__lb_private_ipaddr__" > /opt/config/lb_private_ipaddr.txt
+            echo "__local_private_ipaddr__" > /opt/config/local_private_ipaddr.txt
+            echo "__oam_private_ipaddr__" > /opt/config/oam_private_ipaddr.txt
+            echo "__repo_url_blob__" > /opt/config/repo_url_blob.txt
+            echo "__repo_url_artifacts__" > /opt/config/repo_url_artifacts.txt
+            echo "__demo_artifacts_version__" > /opt/config/demo_artifacts_version.txt
+            echo "__install_script_version__" > /opt/config/install_script_version.txt
+            echo "__vlb_private_net_cidr__" > /opt/config/vlb_private_net_cidr.txt
+            echo "__onap_private_net_cidr__" > /opt/config/onap_private_net_cidr.txt
+            echo "__cloud_env__" > /opt/config/cloud_env.txt
+
+            # Download and run install script
+            curl -k __repo_url_blob__/org.onap.demo/vnfs/vlb/__install_script_version__/v_dns_install.sh -o /opt/v_dns_install.sh
             cd /opt
-
-            wget $REPO_URL_BLOB/org.openecomp.demo/vnfs/vlb/$DEMO_ARTIFACTS_VERSION/v_dns_init.sh
-            wget $REPO_URL_BLOB/org.openecomp.demo/vnfs/vlb/$DEMO_ARTIFACTS_VERSION/vdns.sh
-            wget $REPO_URL_BLOB/org.openecomp.demo/vnfs/vlb/$DEMO_ARTIFACTS_VERSION/dnsclient.sh
-            wget $REPO_URL_BLOB/org.openecomp.demo/vnfs/vlb/$DEMO_ARTIFACTS_VERSION/set_gre_tunnel.sh
-
-            mvn org.apache.maven.plugins:maven-dependency-plugin:2.10:get -DremoteRepositories=$REPO_URL_ARTIFACTS -Dartifact=org.openecomp.demo.vnf.vlb:dns-client:$DEMO_ARTIFACTS_VERSION:jar -Dtransitive=false -Ddest=.
-
-            mv dns-client-$DEMO_ARTIFACTS_VERSION.jar /opt/FDclient/
-            mv dnsclient.sh /opt/FDclient/
-            mv set_gre_tunnel.sh /opt/FDclient/
-
-            chmod +x v_dns_init.sh
-            chmod +x vdns.sh
-            chmod +x /opt/FDclient/dnsclient.sh
-            chmod +x /opt/FDclient/set_gre_tunnel.sh
-
-            echo $LB_OAM_INT > config/lb_oam_int.txt
-            echo $LB_PRIVATE_IPADDR > config/lb_private_ipaddr.txt
-            echo $LOCAL_PRIVATE_IPADDR > config/local_private_ipaddr.txt
-            echo $DEMO_ARTIFACTS_VERSION > config/artifacts_version.txt
-
-            # Download Bind config files
-            cd /opt/config
-            wget $REPO_URL_BLOB/org.openecomp.demo/vnfs/vlb/$DEMO_ARTIFACTS_VERSION/db_dnsdemo_openecomp_org
-            wget $REPO_URL_BLOB/org.openecomp.demo/vnfs/vlb/$DEMO_ARTIFACTS_VERSION/named.conf.options
-            wget $REPO_URL_BLOB/org.openecomp.demo/vnfs/vlb/$DEMO_ARTIFACTS_VERSION/named.conf.local
-
-            # Configure Bind
-            modprobe ip_gre
-            mkdir /etc/bind/zones
-            sed -i "s/OPTIONS=.*/OPTIONS=\"-4 -u bind\"/g" /etc/default/bind9
-            mv db_dnsdemo_openecomp_org /etc/bind/zones/db.dnsdemo.openecomp.org
-            mv named.conf.options /etc/bind/
-            mv named.conf.local /etc/bind/
-            sleep 1
-
-            # Run instantiation script
-            cd /opt
-            mv vdns.sh /etc/init.d
-            update-rc.d vdns.sh defaults
-            ./v_dns_init.sh
-
-  vdns_private_0_port:
-    type: OS::Neutron::Port
-    properties:
-      network: { get_param: vlb_private_net_id }
-      fixed_ips: [{"subnet": { get_param: vlb_private_net_id }, "ip_address": { get_param: vdns_private_ip_0 }}]
-
-  vdns_private_1_port:
-    type: OS::Neutron::Port
-    properties:
-      network: { get_param: ecomp_private_net_id }
-      fixed_ips: [{"subnet": { get_param: ecomp_private_subnet_id }, "ip_address": { get_param: vdns_private_ip_1 }}]
+            chmod +x v_dns_install.sh
+            ./v_dns_install.sh
\ No newline at end of file
diff --git a/robot/assets/keys/onap_dev.ppk b/robot/assets/keys/onap_dev.ppk
new file mode 100644
index 0000000..eb84cbe
--- /dev/null
+++ b/robot/assets/keys/onap_dev.ppk
@@ -0,0 +1,26 @@
+PuTTY-User-Key-File-2: ssh-rsa
+Encryption: none
+Comment: imported-openssh-key
+Public-Lines: 6
+AAAAB3NzaC1yc2EAAAADAQABAAABAQDKXDgoo3+WOqcUG8/5uUbk81+yczgwC4Y8
+ywTmuQqbNxlY1oQ0YxdMUqUnhitSXs5S/yRuAVOYHwGg2mCs20oAINrP+mxBI544
+AMIb9itPjCtgqtE2EWo6MmnFGbHB4Sx3XioE7F4VPsh7japsIwzOjbrQe+Mua1TG
+Q5d4nfEOQaaglXLLPFfuc7WbhbJbK6Q7rHqZfRcOwAMXgDoBqlyqKeiKwnumddo2
+RyNT8ljYmvB6buz7KnMinzo7qB0uktVT05FH9Rg0CTWH5norlG5qXgP2aukL0gk1
+ph8iAt7uYLf1ktp+LJI2gaF6L0/qli9EmVCSLr1uJ38Q8CBflhkh
+Private-Lines: 14
+AAABAQClDekkhI9ZqseCqFjPuKaxsizZMg+faJb6WSHLSxzyk1OSWY6F6FklgLeC
+8HW/fuLNYZyGOYDEsG20lMqL02Wdiy7OutS3oOS5iyzIf9a90HfFJi706el6RIpv
+INETcaXCS0T8tQrcS1RdKqTaBRC6HXJGAPbBcvw3pwQSdskatU6a/Kt2a3x6Dsqq
+inQcgEB/SbrDaJCUX9sbF2HVUwdq7aZK1Lk0ozr1FID9mrhjwWuQ6XC+vjG0Fqty
+XeMpR5iaQ73hex3FXQ8zOjkFbMwuHWSh1DSx70r5yFrrBqwQKnMsBqx4QDRf3fIE
+NUnWviaL+n+gwcXA07af4kaNUFUtAAAAgQD7jTUQBoWZ8mfc4Lp7PTzOep5njFIp
+FeXTzdg020G+/XKX1fu6Quj3kh/3UyhS8+tneqgDNhLDV0L3sH/H4qQVQUT7Eaij
+r/rnqXdNXRzcutiOQfs0Zm3vSm3vhDetKnc78jzPtoVegp7xr9XYq4pkvabuka8Q
+9kZs9XnLZyRPqwAAAIEAzfBRtIR6bJnoQqNyTZF92KnNjQw0GchnZxSoeHyaY9eN
+1MvOldv2+Y9sdvTVDCjww/6AydNtME7PI0Bod0isI70UdboLzmPei3ljNyv4RwFV
+y5r7sodTRKCfjgk0fwOKwntjrdQ//Vdvh3X9C8d/FjLdY6+9F1Vnuk+jwk1f3mMA
+AACBALHlChm+hPNF01VTc4srolW0ArCNGSbkX6jGdiCA0CVPbugJxgMGsorah25B
+rJg0/uB1M9NftSSp58ONkXUqx3VPy2jqJw/kSBqntsfNNEF86gEii3Ql68u0aIha
+ibZHRUMpMyXpgPsTl7xy4CovzFxbFPdDwg9FSSi4/L8KV+/G
+Private-MAC: 0b5005f6dad99d4ef75fe22b572e5497e5b34853
diff --git a/robot/assets/keys/onap_dev.pvt b/robot/assets/keys/onap_dev.pvt
new file mode 100644
index 0000000..81e334a
--- /dev/null
+++ b/robot/assets/keys/onap_dev.pvt
@@ -0,0 +1,27 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIEpQIBAAKCAQEAylw4KKN/ljqnFBvP+blG5PNfsnM4MAuGPMsE5rkKmzcZWNaE
+NGMXTFKlJ4YrUl7OUv8kbgFTmB8BoNpgrNtKACDaz/psQSOeOADCG/YrT4wrYKrR
+NhFqOjJpxRmxweEsd14qBOxeFT7Ie42qbCMMzo260HvjLmtUxkOXeJ3xDkGmoJVy
+yzxX7nO1m4WyWyukO6x6mX0XDsADF4A6AapcqinoisJ7pnXaNkcjU/JY2Jrwem7s
++ypzIp86O6gdLpLVU9ORR/UYNAk1h+Z6K5Rual4D9mrpC9IJNaYfIgLe7mC39ZLa
+fiySNoGhei9P6pYvRJlQki69bid/EPAgX5YZIQIDAQABAoIBAQClDekkhI9ZqseC
+qFjPuKaxsizZMg+faJb6WSHLSxzyk1OSWY6F6FklgLeC8HW/fuLNYZyGOYDEsG20
+lMqL02Wdiy7OutS3oOS5iyzIf9a90HfFJi706el6RIpvINETcaXCS0T8tQrcS1Rd
+KqTaBRC6HXJGAPbBcvw3pwQSdskatU6a/Kt2a3x6DsqqinQcgEB/SbrDaJCUX9sb
+F2HVUwdq7aZK1Lk0ozr1FID9mrhjwWuQ6XC+vjG0FqtyXeMpR5iaQ73hex3FXQ8z
+OjkFbMwuHWSh1DSx70r5yFrrBqwQKnMsBqx4QDRf3fIENUnWviaL+n+gwcXA07af
+4kaNUFUtAoGBAPuNNRAGhZnyZ9zguns9PM56nmeMUikV5dPN2DTbQb79cpfV+7pC
+6PeSH/dTKFLz62d6qAM2EsNXQvewf8fipBVBRPsRqKOv+uepd01dHNy62I5B+zRm
+be9Kbe+EN60qdzvyPM+2hV6CnvGv1dirimS9pu6RrxD2Rmz1ectnJE+rAoGBAM3w
+UbSEemyZ6EKjck2RfdipzY0MNBnIZ2cUqHh8mmPXjdTLzpXb9vmPbHb01Qwo8MP+
+gMnTbTBOzyNAaHdIrCO9FHW6C85j3ot5Yzcr+EcBVcua+7KHU0Sgn44JNH8DisJ7
+Y63UP/1Xb4d1/QvHfxYy3WOvvRdVZ7pPo8JNX95jAoGAIe5CIg8/JizUZa7KeKUh
+9pgDleQPkQsrHQ6/AyIwFBsLwf9THSS5V+uV9D57SfUs46Bf2U8J6N90YQSlt8iS
+aWuManFPVgT+yxDIzt6obf2mCEpOIBtQ6N4ZRh2HhQwdWTCrkzkDdGQaHG+jYL6C
+xGPwiG2ON7OAfGIAM7eN5lECgYEAhoRLWlaOgRGnHKAWsYQvZ67CjTdDcPPuVu6v
+fMQnNMA/7JeTwV+E205L0wfpgZ/cZKmBBlQMJlnUA3q2wfO+PTnse1mjDJU/cGtB
+22/lJLxChlQdxGeQhGtGzUhF+hEeOhrO6WSSx7CtMRZoy6Dr6lwfMFZCdVNcBd6v
+YOOZk3ECgYEAseUKGb6E80XTVVNziyuiVbQCsI0ZJuRfqMZ2IIDQJU9u6AnGAway
+itqHbkGsmDT+4HUz01+1JKnnw42RdSrHdU/LaOonD+RIGqe2x800QXzqASKLdCXr
+y7RoiFqJtkdFQykzJemA+xOXvHLgKi/MXFsU90PCD0VJKLj8vwpX78Y=
+-----END RSA PRIVATE KEY-----
diff --git a/robot/assets/keys/onap_dev_public.pub b/robot/assets/keys/onap_dev_public.pub
new file mode 100644
index 0000000..f5d879e
--- /dev/null
+++ b/robot/assets/keys/onap_dev_public.pub
@@ -0,0 +1,9 @@
+---- BEGIN SSH2 PUBLIC KEY ----
+Comment: "imported-openssh-key"
+AAAAB3NzaC1yc2EAAAADAQABAAABAQDKXDgoo3+WOqcUG8/5uUbk81+yczgwC4Y8
+ywTmuQqbNxlY1oQ0YxdMUqUnhitSXs5S/yRuAVOYHwGg2mCs20oAINrP+mxBI544
+AMIb9itPjCtgqtE2EWo6MmnFGbHB4Sx3XioE7F4VPsh7japsIwzOjbrQe+Mua1TG
+Q5d4nfEOQaaglXLLPFfuc7WbhbJbK6Q7rHqZfRcOwAMXgDoBqlyqKeiKwnumddo2
+RyNT8ljYmvB6buz7KnMinzo7qB0uktVT05FH9Rg0CTWH5norlG5qXgP2aukL0gk1
+ph8iAt7uYLf1ktp+LJI2gaF6L0/qli9EmVCSLr1uJ38Q8CBflhkh
+---- END SSH2 PUBLIC KEY ----
diff --git a/robot/assets/keys/onap_dev_public.txt b/robot/assets/keys/onap_dev_public.txt
new file mode 100644
index 0000000..838287f
--- /dev/null
+++ b/robot/assets/keys/onap_dev_public.txt
@@ -0,0 +1 @@
+ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDKXDgoo3+WOqcUG8/5uUbk81+yczgwC4Y8ywTmuQqbNxlY1oQ0YxdMUqUnhitSXs5S/yRuAVOYHwGg2mCs20oAINrP+mxBI544AMIb9itPjCtgqtE2EWo6MmnFGbHB4Sx3XioE7F4VPsh7japsIwzOjbrQe+Mua1TGQ5d4nfEOQaaglXLLPFfuc7WbhbJbK6Q7rHqZfRcOwAMXgDoBqlyqKeiKwnumddo2RyNT8ljYmvB6buz7KnMinzo7qB0uktVT05FH9Rg0CTWH5norlG5qXgP2aukL0gk1ph8iAt7uYLf1ktp+LJI2gaF6L0/qli9EmVCSLr1uJ38Q8CBflhkh imported-openssh-key
\ No newline at end of file
diff --git a/robot/assets/service_mappings.py b/robot/assets/service_mappings.py
index 563cfe1..5a58bb9 100644
--- a/robot/assets/service_mappings.py
+++ b/robot/assets/service_mappings.py
@@ -1,30 +1,47 @@
 '''
 This metadata identifies the folders to be zipped and uploaded to SDC for model distribution for a given VNF
 '''
-GLOBAL_SERVICE_FOLDER_MAPPING = {"vFW" : ['base_vfw'], \
-                                 "vLB" : ['base_vlb'], \
-                                 "vVG" : ['base_vvg'], \
-                                 "vIMS" : ['base_clearwater'], \
-                                 "vCPE" : ['base_vcpe_infra', 'base_vcpe_vbng', 'base_vcpe_vbrgemu', 'base_vcpe_vgmux', 'base_vcpe_vgw'], \
+GLOBAL_SERVICE_FOLDER_MAPPING = {"vFW" : ['vFW'], \
+                                 "vLB" : ['vLB'], \
+                                 "vVG" : ['vVG'], \
+                                 "vCPE" : ['vCPE/infra', 'vCPE/vbng', 'vCPE/vbrgemu', 'vCPE/vgmux', 'vCPE/vgw'],
+                                 "vFWCL" : ['vFWCL/vFWSNK', 'vFWCL/vPKG'],
+                                 }
+
+'''
+Map the service to the list of VNFs to be orchestrated
+'''
+GLOBAL_SERVICE_VNF_MAPPING = {
+    "vFW"  : ['vFW'],
+    "vLB"  : ['vLB'],
+    "vVG"  : ['vVG'],
+    "vCPE" : ['vCPE'],
+    "vFWCL"  : ['vFWSNK', 'vPKG'],
                                  }
 
 '''
 This metadata identifes the preloads that need to be done for a VNF as there may be more than one (vLB)
-"template" maps to the key value in the preload_paramenters.py  - GLOBAL_PRELOAD_PARAMETERS[<testcase>][<template>] -
-    GLOBAL_PRELOAD_PARAMETERS['Demo'][dnsscaling_preload.template']
-It no longer refers to a template file as all have been collapsed into preload.template
+"template" maps to the parameters in the preload_paramenters.py
+  - GLOBAL_PRELOAD_PARAMETERS[<testcase>][<template>] -
+    i.e. GLOBAL_PRELOAD_PARAMETERS['Demo'][dnsscaling_preload.template']
 '''
-GLOBAL_SERVICE_TEMPLATE_MAPPING = {"vFW" : [{"isBase" : "true", "template" : "vfw_preload.template", "name_pattern": "base_vfw"}], \
-                                 "vLB" : [{"isBase" : "true", "template" : "vlb_preload.template", "name_pattern": "base_vlb"},
-                                          {"isBase" : "false", "template" : "dnsscaling_preload.template", "name_pattern": "dnsscaling", "prefix" : "vDNS_"}],
-                                 "vVG" : [{"isBase" : "true", "template" : "vvg_preload.template", "name_pattern": "base_vvg"}], \
-                                 "vIMS" : [{"isBase" : "true", "template" : "vims_preload.template", "name_pattern": "base_clearwater"}], \
-                                 }
+GLOBAL_SERVICE_TEMPLATE_MAPPING = {
+	"vFW"  : [{"isBase" : "true", "template" : "vfw_preload.template", "name_pattern": "base_vfw"}],
+    "vLB"  : [{"isBase" : "true",   "template" : "vlb_preload.template", "name_pattern": "base_vlb"},
+              {"isBase" : "false",  "template" : "dnsscaling_preload.template", "name_pattern": "dnsscaling", "prefix" : "vDNS_"}],
+    "vVG"  : [{"isBase" : "true",   "template" : "vvg_preload.template", "name_pattern": "base_vvg"}],
+    "vCPE" : [{"isBase" : "true",  "template" : "vcpe_preload.template", "name_pattern": "base_clearwater"}],
+    "vFWSNK" : [{"isBase" : "true",   "template" : "vfwsnk_preload.template", "name_pattern": "base_vfw"}],
+    "vPKG"   : [{"isBase" : "true",  "template" : "vpkg_preload.template", "name_pattern": "base_vpkg"}],
+}
 
 '''
 Used by the Heatbridge Validate Query to A&AI to locate the vserver name
 '''
 GLOBAL_VALIDATE_NAME_MAPPING = {"vFW" : 'vfw_name_0',
                                  "vLB" : 'vlb_name_0',
-                                 "vVG" : ''
+                                 "vVG" : '',
+                                 "vCPE" : '',
+                                 "vFWSNK" : 'vfw_name_0',
+                                 "vPKG" : 'vpg_name_0',
                                  }
diff --git a/robot/assets/templates/aai/add_complex_body.template b/robot/assets/templates/aai/add_complex_body.template
new file mode 100644
index 0000000..136a620
--- /dev/null
+++ b/robot/assets/templates/aai/add_complex_body.template
@@ -0,0 +1,42 @@
+        {
+            "complex-name": "${complex_name}",
+            "physical-location-id": "${physical_location_id}",
+            "data-center-code": "example-data-center-code-val-5556",
+            "identity-url": "example-identity-url-val-56898",
+            "physical-location-type": "example-physical-location-type-val-7608",
+            "street1": "example-street1-val-34205",
+            "street2": "example-street2-val-99210",
+            "city": "example-city-val-27150",
+            "state": "example-state-val-59487",
+            "postal-code": "example-postal-code-val-68871",
+            "country": "example-country-val-94173",
+            "region": "example-region-val-13893",
+            "latitude": "example-latitude-val-89101",
+            "longitude": "example-longitude-val-66229",
+            "elevation": "example-elevation-val-30253",
+            "lata": "example-lata-val-46073",
+            "relationship-list": {
+                "relationship": [
+                    {
+                        "related-to": "cloud-region",
+                        "related-link": "/aai/v11/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne",
+                        "relationship-data": [
+                            {
+                                "relationship-key": "cloud-region.cloud-owner",
+                                "relationship-value": "${cloud_owner}"
+                            },
+                            {
+                                "relationship-key": "cloud-region.cloud-region-id",
+                                "relationship-value": "${region}"
+                            }
+                        ],
+                        "related-to-property": [
+                            {
+                                "property-key": "cloud-region.owner-defined-type",
+                                "property-value": "${owner_defined_type}"
+                            }
+                        ]
+                    }
+                ]
+            }
+        }
diff --git a/robot/assets/templates/aai/add_demo_customer.template b/robot/assets/templates/aai/add_demo_customer.template
index e56577c..a52d65b 100644
--- a/robot/assets/templates/aai/add_demo_customer.template
+++ b/robot/assets/templates/aai/add_demo_customer.template
@@ -41,6 +41,44 @@
 						}
 					]
 				}
+			}, {
+				"service-type" : "${service3}",
+				"relationship-list" : {
+					"relationship" : [{
+							"related-to" : "tenant",
+							"relationship-data" : [{
+									"relationship-key" : "cloud-region.cloud-owner",
+									"relationship-value" : "${cloud_owner}"
+								}, {
+									"relationship-key" : "cloud-region.cloud-region-id",
+									"relationship-value" : "${cloud_region_id}"
+								}, {
+									"relationship-key" : "tenant.tenant-id",
+									"relationship-value" : "${tenant_id}"
+								}
+							]
+						}
+					]
+				}
+			}, {
+				"service-type" : "${service4}",
+				"relationship-list" : {
+					"relationship" : [{
+							"related-to" : "tenant",
+							"relationship-data" : [{
+									"relationship-key" : "cloud-region.cloud-owner",
+									"relationship-value" : "${cloud_owner}"
+								}, {
+									"relationship-key" : "cloud-region.cloud-region-id",
+									"relationship-value" : "${cloud_region_id}"
+								}, {
+									"relationship-key" : "tenant.tenant-id",
+									"relationship-value" : "${tenant_id}"
+								}
+							]
+						}
+					]
+				}
 			}
 		]
 	}
diff --git a/robot/assets/templates/aai/add_zone_body.template b/robot/assets/templates/aai/add_zone_body.template
new file mode 100644
index 0000000..01f99c0
--- /dev/null
+++ b/robot/assets/templates/aai/add_zone_body.template
@@ -0,0 +1,7 @@
+{
+"zone-id":"${zone_id}",
+"zone-name":"${zone_name}",
+"design-type":"${design_type}",
+"zone-context":"${zone_context}",
+"status":"deployed"
+}
\ No newline at end of file
diff --git a/robot/assets/templates/nova_add_server.template b/robot/assets/templates/nova_add_server.template
index 8157839..d40774a 100644
--- a/robot/assets/templates/nova_add_server.template
+++ b/robot/assets/templates/nova_add_server.template
@@ -10,7 +10,7 @@
         },
         "networks": [
             {
-                "uuid": "00000000-0000-0000-0000-000000000000"
+                "uuid": "${public_net_id}"
             }
         ]
     }
diff --git a/robot/assets/templates/sdnc/preload.template b/robot/assets/templates/sdnc/preload.template
index b2f4f08..327d806 100644
--- a/robot/assets/templates/sdnc/preload.template
+++ b/robot/assets/templates/sdnc/preload.template
@@ -1,31 +1,33 @@
 {
-    "input": {
-        "vnf-topology-information": {
-            "vnf-topology-identifier": {
-                "service-type": "${service_type}",
-                "vnf-name": "${vf_module_name}",
-                "vnf-type": "${vf_module_type}",
-                "generic-vnf-name": "${generic_vnf_name}",
-                "generic-vnf-type": "${generic_vnf_type}"
-            },
-            "vnf-assignments": {
-                "availability-zones": [],
-                "vnf-networks": [],
-                "vnf-vms": []
-            },
-             "vnf-parameters": ${vnf_parameters}
-       },
-        "request-information": {
-            "request-id": "robot12",
-            "order-version": "1",
-            "notification-url": "openecomp.org",
-            "order-number": "1",
-            "request-action": "PreloadVNFRequest"
-        },
-        "sdnc-request-header": {
-            "svc-request-id": "robot12",
-            "svc-notification-url": "http:\/\/openecomp.org:8080\/adapters\/rest\/SDNCNotify",
-            "svc-action": "reserve"
-        }
-    }    
-}
\ No newline at end of file
+	"input": {
+		"request-information": {
+			"notification-url": "openecomp.org",
+			"order-number": "1",
+			"order-version": "1",
+			"request-action": "PreloadVNFRequest",
+			"request-id": "robot12"
+		},
+		"sdnc-request-header": {
+			"svc-action": "reserve",
+			"svc-notification-url": "http:\/\/openecomp.org:8080\/adapters\/rest\/SDNCNotify",
+			"svc-request-id": "robot12"
+		},
+		"vnf-topology-information": {
+			"vnf-assignments": {
+				"availability-zones": [],
+				"vnf-networks": [],
+				"vnf-vms": []
+			},
+			"vnf-parameters":
+				${vnf_parameters}
+			,
+			"vnf-topology-identifier": {
+				"generic-vnf-name": "${generic_vnf_name}",
+				"generic-vnf-type": "${generic_vnf_type}",
+				"vnf-name": "${vf_module_name}",
+				"vnf-type": "${vf_module_type}",
+				"service-type": "${service_type}"
+			}
+		}
+	}
+}
diff --git a/robot/assets/templates/web/index.html.template b/robot/assets/templates/web/index.html.template
index 4853fc7..029471c 100644
--- a/robot/assets/templates/web/index.html.template
+++ b/robot/assets/templates/web/index.html.template
@@ -9,7 +9,7 @@
 
     The portal can be found at:<p>
 
-    <a href="http://portal.api.simpledemo.openecomp.org:8989/ECOMPPORTAL/login.htm">Portal</a>
+    <a href="http://portal.api.simpledemo.onap.org:8989/ONAPPORTAL/login.htm">Portal</a>
     <p>
     One requires role based user names and passwords to receive the full portal functionality. In the demo setup we pre provisioned:
     <p>
@@ -25,15 +25,86 @@
     <p>
     the password for all of them is: demo123456!
 
+    <h3>/etc/hosts or C:\Windows\system32\drivers\etc\hosts</h>
+	<pre>
+
+${portal} portal portal.api.simpledemo.onap.org
+${sdc} sdc sdc.api.simpledemo.onap.org
+${vid} vid vid.api.simpledemo.onap.org
+${policy} policy policy.api.simpledemo.onap.org
+${aai1} aai1 aai.api.simpledemo.onap.org
+
+${robot} robot
+${appc} appc
+${mso}  so
+${sdnc} sdnc
+${openo} multi-service
+${dcae_controller} dcae
+${aai2} aai2
+${message_router} message-router
+${clamp} clamp
+
+${portal} ${prefix}-portal
+${sdc} ${prefix}-sdc
+${vid} ${prefix}-vid
+${policy} ${prefix}-policy
+${aai1} ${prefix}-aai1
+${robot} ${prefix}-robot
+${appc} ${prefix}-appc
+${mso}  ${prefix}-so
+${sdnc} ${prefix}-sdnc
+${openo} ${prefix}-multi-service
+${dcae_controller} ${prefix}-dcae
+${aai2} ${prefix}-aai2
+${message_router} ${prefix}-message-router
+${clamp} ${prefix}-clamp
+
+	</pre>
+
     <h1> The Reality </h1>
 
     As everything should go through the portal there are many subsystems which have there own GUI or API which come in very handy when debugging things. Here the most important once.
 
     <h2> Testing </h2>
 
-    <b> Not working. </b> :
+	<h3>Robot Logs</h3>
 
-    <a href="http://${robot}:88/report.html"> Test Report </a>
+    <a href="http://${robot}:88/logs/"> Robot Logs </a>
+
+    <h3>Robot vm_properties.py for local testing</h3>
+    <pre>
+GLOBAL_INJECTED_ARTIFACTS_VERSION = "${GLOBAL_INJECTED_ARTIFACTS_VERSION}"
+GLOBAL_INJECTED_GITLAB_PASSWORD = "password"
+GLOBAL_INJECTED_GITLAB_USERNAME = "username"
+GLOBAL_INJECTED_NETWORK = "${GLOBAL_INJECTED_NETWORK}"
+GLOBAL_INJECTED_NEXUS_DOCKER_REPO = "${GLOBAL_INJECTED_NEXUS_DOCKER_REPO}"
+GLOBAL_INJECTED_NEXUS_PASSWORD = "password"
+GLOBAL_INJECTED_NEXUS_REPO = "${GLOBAL_INJECTED_NEXUS_REPO}"
+GLOBAL_INJECTED_NEXUS_USERNAME = "docker"
+GLOBAL_INJECTED_OPENSTACK_API_KEY = "openstackapikey"
+GLOBAL_INJECTED_OPENSTACK_PASSWORD = "openstackpass"
+GLOBAL_INJECTED_OPENSTACK_USERNAME = "openstackuser"
+GLOBAL_INJECTED_OPENSTACK_TENANT_ID = "${GLOBAL_INJECTED_OPENSTACK_TENANT_ID}"
+GLOBAL_INJECTED_REGION = "${GLOBAL_INJECTED_REGION}"
+GLOBAL_INJECTED_KEYSTONE = "${GLOBAL_INJECTED_KEYSTONE}"
+GLOBAL_INJECTED_AAI1_IP_ADDR = "${aai1}"
+GLOBAL_INJECTED_AAI2_IP_ADDR = "${aai2}"
+GLOBAL_INJECTED_APPC_IP_ADDR = "${appc}"
+GLOBAL_INJECTED_DCAE_IP_ADDR = "${dcae_controller}"
+GLOBAL_INJECTED_SO_IP_ADDR = "${mso}"
+GLOBAL_INJECTED_MR_IP_ADDR = "${message_router}"
+GLOBAL_INJECTED_POLICY_IP_ADDR = "${policy}"
+GLOBAL_INJECTED_PORTAL_IP_ADDR = "${portal}"
+GLOBAL_INJECTED_SDC_IP_ADDR = "${sdc}"
+GLOBAL_INJECTED_SDNC_IP_ADDR = "${sdnc}"
+GLOBAL_INJECTED_VID_IP_ADDR = "${vid}"
+GLOBAL_INJECTED_OPENO_IP_ADDR = "${openo}"
+GLOBAL_INJECTED_CLAMP_IP_ADDR = "${clamp}"
+GLOBAL_INJECTED_VM_FLAVOR = "${GLOBAL_INJECTED_VM_FLAVOR}"
+GLOBAL_INJECTED_VM_IMAGE_NAME = "${GLOBAL_INJECTED_VM_IMAGE_NAME}"
+GLOBAL_INJECTED_PUBLIC_NET_ID = "${GLOBAL_INJECTED_PUBLIC_NET_ID}"
+
+    </pre>
 
     <h2> SDN-C </h2>
 
@@ -99,7 +170,8 @@
 
     The following links will open a shell and ssh to the various running VMs (at least on a Mac). It assumes that the .ssh/config file has been set appropriately and /etc/hosts has been updated to the running instance.<p>
 
-      <a href="ssh://${aai}"> AAI </a><p>
+      <a href="ssh://${aai1}"> AAI1 </a><p>
+      <a href="ssh://${aai2}"> AAI2 </a><p>
       <a href="ssh://${policy}"> Policy </a><p>
       <a href="ssh://${sdc}"> SDC </a><p>
       <a href="ssh://${portal}"> Portal </a><p>
diff --git a/robot/resources/aaf_interface.robot b/robot/resources/aaf_interface.robot
index 57d4aab..c924591 100644
--- a/robot/resources/aaf_interface.robot
+++ b/robot/resources/aaf_interface.robot
@@ -21,6 +21,7 @@
      [Arguments]    ${data_path}
      ${auth}=  Create List  ${GLOBAL_AAF_USERNAME}    ${GLOBAL_AAF_PASSWORD}
      ${session}=    Create Session 	aaf	${GLOBAL_AAF_SERVER}    auth=${auth}
+     ${session_client}=    Add Client Cert    ${session}    cert
      ${uuid}=    Generate UUID
      ${headers}=  Create Dictionary     Accept=application/json    Content-Type=application/json    X-TransactionId=${GLOBAL_APPLICATION_ID}-${uuid}    X-FromAppId=${GLOBAL_APPLICATION_ID}
      ${resp}= 	Get Request 	aaf 	${data_path}     headers=${headers}
diff --git a/robot/resources/aai/aai_interface.robot b/robot/resources/aai/aai_interface.robot
index 790fa66..b72103d 100644
--- a/robot/resources/aai/aai_interface.robot
+++ b/robot/resources/aai/aai_interface.robot
@@ -7,7 +7,7 @@
 
 *** Variables ***
 ${AAI_HEALTH_PATH}  /aai/util/echo?action=long
-${VERSIONED_INDEX_PATH}     /aai/v8
+${VERSIONED_INDEX_PATH}     /aai/v11
 ${AAI_FRONTEND_ENDPOINT}    ${GLOBAL_AAI_SERVER_PROTOCOL}://${GLOBAL_INJECTED_AAI1_IP_ADDR}:${GLOBAL_AAI_SERVER_PORT}
 
 
diff --git a/robot/resources/aai/create_complex.robot b/robot/resources/aai/create_complex.robot
new file mode 100644
index 0000000..e1cc227
--- /dev/null
+++ b/robot/resources/aai/create_complex.robot
@@ -0,0 +1,71 @@
+*** Settings ***
+Documentation	  Create A&AI Customer API.
+...
+...	              Create A&AI Customer API
+
+Resource    ../json_templater.robot
+Resource    aai_interface.robot
+Library    OperatingSystem
+Library    Collections
+
+
+
+*** Variables ***
+${COMPLEX_INDEX_PATH}     /aai/v11
+${ROOT_COMPLEXES_PATH}  /cloud-infrastructure/complexes
+${ROOT_COMPLEX_PATH}  /cloud-infrastructure/complexes/complex
+
+${SYSTEM USER}    robot-ete
+${AAI_ADD_COMPLEX_BODY}=    robot/assets/templates/aai/add_complex_body.template
+
+*** Keywords ***
+Inventory Complex If Not Exists
+    [Documentation]    Creates a service in A&AI if it doesn't exist
+    [Arguments]    ${complex_name}   ${physical_location_id}   ${cloud_owner}   ${region}   ${owner_defined_type}
+    ${get_resp}=    Run A&AI Get Request     ${COMPLEX_INDEX_PATH}${ROOT_COMPLEX_PATH}/${physical_location_id}
+    Return From Keyword If    '${get_resp.status_code}' == '200'
+    Inventory Complex  ${complex_name}   ${physical_location_id}   ${cloud_owner}   ${region}   ${owner_defined_type}
+
+Inventory Complex
+    [Documentation]    Inventorys a COmplex in A&AI
+    [Arguments]    ${complex_name}   ${physical_location_id}   ${cloud_owner}   ${region}   ${owner_defined_type}
+    ${arguments}=    Create Dictionary     complex_name=${complex_name}
+    Set To Dictionary   ${arguments}     physical_location_id=${physical_location_id}
+    Set To Dictionary   ${arguments}     cloud_owner=${cloud_owner}
+    Set To Dictionary   ${arguments}     region=${region}
+    Set To Dictionary   ${arguments}     owner_defined_type=${owner_defined_type}
+    ${data}=	Fill JSON Template File    ${AAI_ADD_COMPLEX_BODY}    ${arguments}
+	${put_resp}=    Run A&AI Put Request     ${COMPLEX_INDEX_PATH}${ROOT_COMPLEX_PATH}/${physical_location_id}     ${data}
+    ${status_string}=    Convert To String    ${put_resp.status_code}
+    Should Match Regexp    ${status_string} 	^(201|200)$
+
+Delete Complex If Exists
+    [Documentation]    Removes a complex
+    [Arguments]    ${physical_location_id}
+    ${get_resp}=    Run A&AI Get Request     ${COMPLEX_INDEX_PATH}${ROOT_COMPLEX_PATH}/${physical_location_id}
+    Run Keyword If    '${get_resp.status_code}' == '200'    Delete Zone Exists    ${physical_location_id}   ${get_resp.json()}
+
+Delete Complex
+    [Arguments]    ${physical_location_id}    ${json}
+    ${resource_version}=   Catenate   ${json['resource-version']}
+    ${put_resp}=    Run A&AI Delete Request    ${COMPLEX_INDEX_PATH}${ROOT_COMPLEX_PATH}/${physical_location_id}    ${resource_version}
+    Should Be Equal As Strings 	${put_resp.status_code} 	204
+
+Get Complex
+    [Documentation]   Return a complex
+    [Arguments]    ${physical_location_id}
+	${resp}=    Run A&AI Get Request     ${COMPLEX_INDEX_PATH}${ROOT_COMPLEX_PATH}/${physical_location_id}
+    Should Be Equal As Strings 	${resp.status_code} 	200
+	[Return]  ${resp.json()}
+
+Get Complexes
+    [Documentation]   Return all complexes
+    [Arguments]
+	${resp}=    Run A&AI Get Request     ${COMPLEX_INDEX_PATH}${ROOT_COMPLEXES_PATH}
+    Should Be Equal As Strings 	${resp.status_code} 	200
+    Log    ${resp.json()}
+	[Return]  ${resp.json()}
+
+
+
+
diff --git a/robot/resources/aai/create_customer.robot b/robot/resources/aai/create_customer.robot
index 7ebda39..fec5884 100644
--- a/robot/resources/aai/create_customer.robot
+++ b/robot/resources/aai/create_customer.robot
@@ -10,32 +10,32 @@
 
 
 *** Variables ***
-${INDEX PATH}     /aai/v8 
+${INDEX PATH}     /aai/v11
 ${ROOT_CUSTOMER_PATH}  /business/customers/customer/
 ${SYSTEM USER}    robot-ete
 ${A&AI ADD CUSTOMER BODY}    robot/assets/templates/aai/add_customer.template
 
-*** Keywords ***    
+*** Keywords ***
 Create Customer
-    [Documentation]    Creates a customer in A&AI	
-    [Arguments]    ${customer_name}  ${customer_id}  ${customer_type}    ${service_type}      ${clouder_owner}    ${cloud_region_id}    ${tenant_id}  
-    ${data_template}=    OperatingSystem.Get File    ${A&AI ADD CUSTOMER BODY}  
-    ${arguments}=    Create Dictionary    subscriber_name=${customer_name}    global_customer_id=${customer_id}    subscriber_type=${customer_type}     cloud_owner1=${clouder_owner}  cloud_region_id1=${cloud_region_id}    tenant_id1=${tenant_id}    service1=${service_type}       
-    ${data}=	Fill JSON Template    ${data_template}    ${arguments}         
+    [Documentation]    Creates a customer in A&AI
+    [Arguments]    ${customer_name}  ${customer_id}  ${customer_type}    ${service_type}      ${clouder_owner}    ${cloud_region_id}    ${tenant_id}
+    ${data_template}=    OperatingSystem.Get File    ${A&AI ADD CUSTOMER BODY}
+    ${arguments}=    Create Dictionary    subscriber_name=${customer_name}    global_customer_id=${customer_id}    subscriber_type=${customer_type}     cloud_owner1=${clouder_owner}  cloud_region_id1=${cloud_region_id}    tenant_id1=${tenant_id}    service1=${service_type}
+    ${data}=	Fill JSON Template    ${data_template}    ${arguments}
 	${put_resp}=    Run A&AI Put Request     ${INDEX PATH}${ROOT_CUSTOMER_PATH}${customer_id}    ${data}
     Should Be Equal As Strings 	${put_resp.status_code} 	201
 	[Return]  ${put_resp.status_code}
 
-*** Keywords ***    
+*** Keywords ***
 Delete Customer
-    [Documentation]    Deletes a customer in A&AI	
+    [Documentation]    Deletes a customer in A&AI
     [Arguments]    ${customer_id}
-    ${get_resp}=    Run A&AI Get Request     ${INDEX PATH}${ROOT_CUSTOMER_PATH}${customer_id}    
+    ${get_resp}=    Run A&AI Get Request     ${INDEX PATH}${ROOT_CUSTOMER_PATH}${customer_id}
 	Run Keyword If    '${get_resp.status_code}' == '200'    Delete Customer Exists    ${customer_id}    ${get_resp.json()['resource-version']}
-	   
-*** Keywords ***    
+
+*** Keywords ***
 Delete Customer Exists
-    [Documentation]    Deletes a customer in A&AI	
-    [Arguments]    ${customer_id}    ${resource_version_id}   
+    [Documentation]    Deletes a customer in A&AI
+    [Arguments]    ${customer_id}    ${resource_version_id}
     ${put_resp}=    Run A&AI Delete Request    ${INDEX PATH}${ROOT_CUSTOMER_PATH}${customer_id}    ${resource_version_id}
-    Should Be Equal As Strings 	${put_resp.status_code} 	204  
+    Should Be Equal As Strings 	${put_resp.status_code} 	204
diff --git a/robot/resources/aai/create_service.robot b/robot/resources/aai/create_service.robot
index 38aef3f..bcf14e3 100644
--- a/robot/resources/aai/create_service.robot
+++ b/robot/resources/aai/create_service.robot
@@ -12,56 +12,56 @@
 
 
 *** Variables ***
-${INDEX PATH}     /aai/v8 
+${INDEX PATH}     /aai/v11
 ${ROOT_SERVICE_PATH}  /service-design-and-creation/services
 
 ${SYSTEM USER}    robot-ete
 ${AAI_ADD_SERVICE_BODY}=    robot/assets/templates/aai/add_service_body.template
 
-*** Keywords ***    
+*** Keywords ***
 Create Service If Not Exists
-    [Documentation]    Creates a service in A&AI if it doesn't exist	
+    [Documentation]    Creates a service in A&AI if it doesn't exist
     [Arguments]    ${service_type}
     ${dict}=    Get Services
-    ${status}    ${value}=    Run Keyword And Ignore Error    Dictionary Should Contain Key    ${dict}    ${service_type} 
+    ${status}    ${value}=    Run Keyword And Ignore Error    Dictionary Should Contain Key    ${dict}    ${service_type}
     Run Keyword If    '${status}' == 'FAIL'    Create Service    ${service_type}
-    
+
 Create Service
-    [Documentation]    Creates a service in A&AI	
+    [Documentation]    Creates a service in A&AI
     [Arguments]    ${service_type}
-    ${uuid}=    Generate UUID 
-    ${data_template}=    OperatingSystem.Get File    ${AAI_ADD_SERVICE_BODY}  
-    ${arguments}=    Create Dictionary    service_type=${service_type}    UUID=${uuid}       
+    ${uuid}=    Generate UUID
+    ${data_template}=    OperatingSystem.Get File    ${AAI_ADD_SERVICE_BODY}
+    ${arguments}=    Create Dictionary    service_type=${service_type}    UUID=${uuid}
     ${data}=	Fill JSON Template    ${data_template}    ${arguments}
     ${fullpath}=    Catenate         ${INDEX PATH}${ROOT_SERVICE_PATH}/service/${uuid}
 	${put_resp}=    Run A&AI Put Request     ${fullpath}    ${data}
     Should Be Equal As Strings 	${put_resp.status_code} 	201
 	[Return]  ${put_resp.status_code}
 
-    
+
 Delete Service If Exists
-    [Documentation]    Deletes a service in A&AI if it exists	
+    [Documentation]    Deletes a service in A&AI if it exists
     [Arguments]    ${service_type}
     ${dict}=    Get Services
-    ${status}    ${value}=    Run Keyword And Ignore Error    Dictionary Should Contain Key    ${dict}    ${service_type} 
+    ${status}    ${value}=    Run Keyword And Ignore Error    Dictionary Should Contain Key    ${dict}    ${service_type}
     Run Keyword If    '${status}' == 'PASS'    Delete Service    ${dict['${service_type}']}
 
 Delete Service
-    [Documentation]    Delete  passed service in A&AI	
+    [Documentation]    Delete  passed service in A&AI
     [Arguments]    ${dict}
-    ${uuid}=    Get From Dictionary    ${dict}     service-id 
+    ${uuid}=    Get From Dictionary    ${dict}     service-id
     ${resource_version}=    Get From Dictionary    ${dict}     resource-version
     ${fullpath}=    Catenate         ${INDEX PATH}${ROOT_SERVICE_PATH}/service/${uuid}
-	${resp}=    Run A&AI Delete Request    ${fullpath}    ${resource_version}    
+	${resp}=    Run A&AI Delete Request    ${fullpath}    ${resource_version}
     Should Be Equal As Strings 	${resp.status_code} 	204
 
-    
+
 Get Services
-    [Documentation]    Creates a service in A&AI	
+    [Documentation]    Creates a service in A&AI
 	${resp}=    Run A&AI Get Request     ${INDEX PATH}${ROOT_SERVICE_PATH}
-	${dict}=    Create Dictionary    
+	${dict}=    Create Dictionary
     ${status}    ${value}=    Run Keyword And Ignore Error    Should Be Equal As Strings 	${resp.status_code} 	200
-    Run Keyword If    '${status}' == 'PASS'    Update Service Dictionary    ${dict}    ${resp.json()}      
+    Run Keyword If    '${status}' == 'PASS'    Update Service Dictionary    ${dict}    ${resp.json()}
 	[Return]  ${dict}
 
 Update Service Dictionary
@@ -69,7 +69,7 @@
     ${list}=    Evaluate    ${json}['service']
     :for   ${map}    in    @{list}
     \    ${status}    ${service_type}=     Run Keyword And Ignore Error    Get From Dictionary    ${map}    service-description
-    \    Run Keyword If    '${status}' == 'PASS'    Set To Dictionary    ${dict}    ${service_type}=${map}    
+    \    Run Keyword If    '${status}' == 'PASS'    Set To Dictionary    ${dict}    ${service_type}=${map}
     Log    ${dict}
 
 
diff --git a/robot/resources/aai/create_tenant.robot b/robot/resources/aai/create_tenant.robot
index 756882e..95f1c25 100644
--- a/robot/resources/aai/create_tenant.robot
+++ b/robot/resources/aai/create_tenant.robot
@@ -11,7 +11,7 @@
 
 
 *** Variables ***
-${INDEX PATH}     /aai/v8
+${INDEX PATH}     /aai/v11
 ${ROOT_TENANT_PATH}  /cloud-infrastructure/cloud-regions/cloud-region/
 
 ${SYSTEM USER}    robot-ete
diff --git a/robot/resources/aai/create_zone.robot b/robot/resources/aai/create_zone.robot
new file mode 100644
index 0000000..09d6ea6
--- /dev/null
+++ b/robot/resources/aai/create_zone.robot
@@ -0,0 +1,59 @@
+*** Settings ***
+Documentation	  Create A&AI Customer API.
+...
+...	              Create A&AI Customer API
+
+Resource    ../json_templater.robot
+Resource    aai_interface.robot
+Library    OperatingSystem
+Library    Collections
+
+
+
+*** Variables ***
+${ZONE_INDEX_PATH}     /aai/v11
+${ROOT_ZONE_PATH}  /network/zones/zone
+
+${SYSTEM USER}    robot-ete
+${AAI_ADD_ZONE_BODY}=    robot/assets/templates/aai/add_zone_body.template
+
+*** Keywords ***
+Inventory Zone If Not Exists
+    [Documentation]    Creates a service in A&AI if it doesn't exist
+    [Arguments]    ${zone_id}=${GLOBAL_AAI_ZONE_ID}  ${zone_name}=${GLOBAL_AAI_ZONE_NAME}  ${design_type}=${GLOBAL_AAI_DESIGN_TYPE}    ${zone_context}=${GLOBAL_AAI_ZONE_CONTEXT}
+    ${get_resp}=    Run A&AI Get Request     ${ZONE_INDEX_PATH}${ROOT_ZONE_PATH}/${zone_id}
+    Return From Keyword If    '${get_resp.status_code}' == '200'
+    Inventory Zone  ${zone_id}  ${zone_name}  ${design_type}    ${zone_context}
+
+Inventory Zone
+    [Documentation]    Inventorys a Tenant in A&AI
+    [Arguments]    ${zone_id}  ${zone_name}  ${design_type}    ${zone_context}
+    ${arguments}=    Create Dictionary     zone_id=${zone_id}  zone_name=${zone_name}  design_type=${design_type}    zone_context=${zone_context}
+    ${data}=	Fill JSON Template File    ${AAI_ADD_ZONE_BODY}    ${arguments}
+	${put_resp}=    Run A&AI Put Request     ${ZONE_INDEX_PATH}${ROOT_ZONE_PATH}/${zone_id}     ${data}
+    ${status_string}=    Convert To String    ${put_resp.status_code}
+    Should Match Regexp    ${status_string} 	^(201|200)$
+
+Delete Zone
+    [Documentation]    Removes both Tenant
+    [Arguments]    ${zone_id}=${GLOBAL_AAI_ZONE_ID}
+    ${get_resp}=    Run A&AI Get Request     ${ZONE_INDEX_PATH}${ROOT_ZONE_PATH}/${zone_id}
+    Run Keyword If    '${get_resp.status_code}' == '200'    Delete Zone Exists    ${zone_id}   ${get_resp.json()}
+
+Delete Zone Exists
+    [Arguments]    ${zone_id}    ${json}
+    ${resource_version}=   Catenate   ${json['resource-version']}
+    ${put_resp}=    Run A&AI Delete Request    ${ZONE_INDEX_PATH}${ROOT_ZONE_PATH}/${zone_id}    ${resource_version}
+    Should Be Equal As Strings 	${put_resp.status_code} 	204
+
+Get Zone
+    [Documentation]   Return zone
+    [Arguments]    ${zone_id}
+	${resp}=    Run A&AI Get Request     ${ZONE_INDEX_PATH}${ROOT_ZONE_PATH}/${zone_id}
+    Should Be Equal As Strings 	${resp.status_code} 	200
+	[Return]  ${resp.json()}
+
+
+
+
+
diff --git a/robot/resources/aai/network.robot b/robot/resources/aai/network.robot
index a42461e..6bda4e2 100644
--- a/robot/resources/aai/network.robot
+++ b/robot/resources/aai/network.robot
@@ -13,30 +13,29 @@
 Resource          ../json_templater.robot
 
 *** Variables ***
-${INDEX PATH}     /aai/v8
+${INDEX PATH}     /aai/v11
 ${GENERIC_QUERY_PATH}  /search/generic-query?
 ${SYSTEM USER}    robot-ete
 ${CUSTOMER SPEC PATH}    /business/customers/customer/
 ${SERVICE SUBSCRIPTIONS}    /service-subscriptions/service-subscription/
 ${SERVICE INSTANCE}    /service-instances?service-instance-name=
-${SERVCE INSTANCE TEMPLATE}    robot/assets/templates/aai/service_subscription.template    
+${SERVCE INSTANCE TEMPLATE}    robot/assets/templates/aai/service_subscription.template
 
-*** Keywords ***    
+*** Keywords ***
 Validate Network
-    [Documentation]    Query and Validates A&AI Service Instance	
-    [Arguments]    ${service_instance_name}    ${service_type}  ${customer_id}   
+    [Documentation]    Query and Validates A&AI Service Instance
+    [Arguments]    ${service_instance_name}    ${service_type}  ${customer_id}
 	${resp}=    Run A&AI Get Request      ${INDEX PATH}${CUSTOMER SPEC PATH}${CUSTOMER ID}${SERVICE SUBSCRIPTIONS}${service_type}${SERVICE INSTANCE}${service_instance_name}
     Dictionary Should Contain Value	${resp.json()['service-instance'][0]}    ${service_instance_name}
-	   
-	
 
-*** Keywords ***    
+
+
+*** Keywords ***
 Create Network
-    [Documentation]    Query and Validates A&AI Service Instance	
-    [Arguments]    ${CUSTOMER ID}    
+    [Documentation]    Query and Validates A&AI Service Instance
+    [Arguments]    ${CUSTOMER ID}
     ${json_string}=    Catenate     { "service-type": "VDNS" , "service-subscriptions":[{"service-instance-id":"instanceid123","service-instance-name":"VDNS"}]}
 	${put_resp}=    Run A&AI Put Request     ${INDEX PATH}${CUSTOMER SPEC PATH}${CUSTOMER ID}${SERVICE SUBSCRIPTIONS}/VDNS    ${json_string}
     Should Be Equal As Strings 	${put_resp.status_code} 	201
-	[Return]  ${put_resp.status_code}	
-	
-	
\ No newline at end of file
+	[Return]  ${put_resp.status_code}
+
diff --git a/robot/resources/aai/service_instance.robot b/robot/resources/aai/service_instance.robot
index f2cf7d8..31a4a61 100644
--- a/robot/resources/aai/service_instance.robot
+++ b/robot/resources/aai/service_instance.robot
@@ -17,7 +17,7 @@
 Resource          ../aai/aai_interface.robot
 
 *** Variables ***
-${INDEX PATH}     /aai/v8
+${INDEX PATH}     /aai/v11
 ${GENERIC_QUERY_PATH}  /search/generic-query?
 ${SYSTEM USER}    robot-ete
 ${CUSTOMER SPEC PATH}    /business/customers/customer/
@@ -50,6 +50,8 @@
     Dictionary Should Contain Value	${generic_vnf.json()}    ${vnf_name}
     ${returned_vnf_type}=    Get From Dictionary    ${generic_vnf.json()}    vnf-type
     Should Contain	${returned_vnf_type}    ${vnf_type}
+    ${vnf_id}=    Get From Dictionary    ${generic_vnf.json()}    vnf-id
+    ${generic_vnf}=    Run A&AI Get Request      ${INDEX PATH}/network/generic-vnfs/generic-vnf/${vnf_id}?depth=all
     [Return]    ${generic_vnf.json()}
 
 VLB Closed Loop Hack
diff --git a/robot/resources/aai/volume_group.robot b/robot/resources/aai/volume_group.robot
index 9582201..40674a5 100644
--- a/robot/resources/aai/volume_group.robot
+++ b/robot/resources/aai/volume_group.robot
@@ -13,19 +13,18 @@
 Resource          ../json_templater.robot
 
 *** Variables ***
-${INDEX PATH}     /aai/v8
+${INDEX PATH}     /aai/v11
 ${GENERIC_QUERY_PATH}  /search/generic-query?
 ${SYSTEM USER}    robot-ete
 ${CUSTOMER SPEC PATH}    /business/customers/customer/
 ${SERVICE SUBSCRIPTIONS}    /service-subscriptions/service-subscription/
 ${SERVICE INSTANCE}    /service-instances?service-instance-name=
-${SERVCE INSTANCE TEMPLATE}    robot/assets/templates/aai/service_subscription.template    
+${SERVCE INSTANCE TEMPLATE}    robot/assets/templates/aai/service_subscription.template
 
-*** Keywords ***    
-Validate Volume Group	
-    [Arguments]    ${service_instance_name}    ${service_type}  ${customer_id}   
+*** Keywords ***
+Validate Volume Group
+    [Arguments]    ${service_instance_name}    ${service_type}  ${customer_id}
 	${resp}=    Run A&AI Get Request      ${INDEX PATH}${CUSTOMER SPEC PATH}${CUSTOMER ID}${SERVICE SUBSCRIPTIONS}${service_type}${SERVICE INSTANCE}${service_instance_name}
     Dictionary Should Contain Value	${resp.json()['service-instance'][0]}    ${service_instance_name}
 
-	
-	
\ No newline at end of file
+
diff --git a/robot/resources/appc_interface.robot b/robot/resources/appc_interface.robot
index 289d1d7..5cebd9a 100644
--- a/robot/resources/appc_interface.robot
+++ b/robot/resources/appc_interface.robot
@@ -1,7 +1,7 @@
 *** Settings ***
 Documentation     The main interface for interacting with APP-C. It handles low level stuff like managing the http request library and APP-C required fields
 Library 	      RequestsLibrary
-Library	          UUID      
+Library	          UUID
 Library           OperatingSystem
 Library           StringTemplater
 Resource          global_properties.robot
@@ -19,7 +19,7 @@
     [Documentation]    Runs an APPC healthcheck
 	${resp}=    Run APPC Post Request     ${APPC_INDEX PATH}${APPC_HEALTHCHECK_OPERATION_PATH}     ${None}
     Should Be Equal As Strings 	${resp.status_code} 	200
-    Should Be Equal As Strings 	${resp.json()['output']['response-code']} 	200   
+    Should Be Equal As Strings 	${resp.json()['output']['response-code']} 	200
 
 Run APPC Post Request
     [Documentation]    Runs an APPC post request
@@ -44,13 +44,13 @@
     ${resp}= 	Put Request 	appc 	${data_path}     data=${data}    headers=${headers}
     Log    Received response from appc ${resp.text}
     [Return]    ${resp}
-    
+
 Create Mount Point In APPC
     [Documentation]     Go tell APPC about the PGN we just spun up...
     [Arguments]    ${nodeid}    ${host}    ${port}=${GLOBAL_PGN_PORT}    ${username}=admin    ${password}=admin
     ${dict}=    Create Dictionary    nodeid=${nodeid}    host=${host}    port=${port}    username=${username}    password=${password}
     ${template}=    OperatingSystem.Get File    ${APPC_MOUNT_XML}
-    ${data}=    Template String    ${template}    ${dict}   
+    ${data}=    Template String    ${template}    ${dict}
     ${resp}=    Run APPC Put Request     ${APPC_INDEX PATH}${APPC_CREATE_MOUNTPOINT_PATH}${nodeid}     ${data}
-    Should Be Equal As Strings 	${resp.status_code} 	200
-    [Return]     ${resp}    
\ No newline at end of file
+    Should Be Equal As Strings 	${resp.status_code} 	201
+    [Return]     ${resp}
\ No newline at end of file
diff --git a/robot/resources/asdc_interface.robot b/robot/resources/asdc_interface.robot
index 5ba0e48..76496cc 100644
--- a/robot/resources/asdc_interface.robot
+++ b/robot/resources/asdc_interface.robot
@@ -53,11 +53,13 @@
     [Arguments]    ${model_zip_path}   ${catalog_service_name}=
     ${catalog_service_id}=    Add ASDC Catalog Service    ${catalog_service_name}
     ${catalog_resource_ids}=    Create List
+    ${catalog_resources}=   Create Dictionary
     : FOR    ${zip}     IN     @{model_zip_path}
     \    ${loop_catalog_resource_id}=    Setup ASDC Catalog Resource    ${zip}
     \    Append To List    ${catalog_resource_ids}   ${loop_catalog_resource_id}
     \    ${loop_catalog_resource_resp}=    Get ASDC Catalog Resource    ${loop_catalog_resource_id}
     \    Add ASDC Resource Instance    ${catalog_service_id}    ${loop_catalog_resource_id}    ${loop_catalog_resource_resp['name']}
+    \    Set To Dictionary    ${catalog_resources}   ${loop_catalog_resource_id}=${loop_catalog_resource_resp}
     ${catalog_service_resp}=    Get ASDC Catalog Service    ${catalog_service_id}
     Checkin ASDC Catalog Service    ${catalog_service_id}
     Request Certify ASDC Catalog Service    ${catalog_service_id}
@@ -68,8 +70,9 @@
 	Distribute ASDC Catalog Service    ${catalog_service_id}
 	${catalog_service_resp}=    Get ASDC Catalog Service    ${catalog_service_id}
 	${vf_module}=    Find Element In Array    ${loop_catalog_resource_resp['groups']}    type    org.openecomp.groups.VfModule
-    [Return]    ${catalog_service_resp['name']}    ${loop_catalog_resource_resp['name']}    ${vf_module}   ${catalog_resource_ids}    ${catalog_service_id}
 	Check Catalog Service Distributed    ${catalog_service_resp['uuid']}
+    [Return]    ${catalog_service_resp['name']}    ${loop_catalog_resource_resp['name']}    ${vf_module}   ${catalog_resource_ids}    ${catalog_service_id}   ${catalog_resources}
+
 Setup ASDC Catalog Resource
     [Documentation]    Creates all the steps a vf needs for an asdc catalog resource and returns the id
     [Arguments]    ${model_zip_path}
@@ -289,13 +292,15 @@
     ${resp}=    Run ASDC Post Request    ${ASDC_CATALOG_RESOURCES_PATH}/${catalog_resource_id}${ASDC_CATALOG_LIFECYCLE_PATH}/certify    ${data}    ${ASDC_TESTER_USER_ID}
     Should Be Equal As Strings 	${resp.status_code} 	200
     [Return]    ${resp.json()['uniqueId']}
+
 Upload ASDC Heat Package
-    [Documentation]    Creates an asdc Software Product and returns its id
-    [Arguments]    ${software_product_id}    ${file_path}   ${version_id}=0.1
-    ${file}=    Get Binary File     ${file_path}
-    ${files}=     Create Dictionary     upload=${file}
-    ${resp}=    Run ASDC Post Files Request    ${ASDC_VENDOR_SOFTWARE_PRODUCT_PATH}/${software_product_id}/versions/${version_id}${ASDC_VENDOR_SOFTWARE_UPLOAD_PATH}     ${files}    ${ASDC_DESIGNER_USER_ID}
-	Should Be Equal As Strings 	${resp.status_code} 	200
+     [Documentation]    Creates an asdc Software Product and returns its id
+     [Arguments]    ${software_product_id}    ${file_path}  ${version_id}=0.1
+     ${files}=     Create Dictionary
+     Create Multi Part     ${files}  upload  ${file_path}    contentType=application/zip
+     ${resp}=    Run ASDC Post Files Request   ${ASDC_VENDOR_SOFTWARE_PRODUCT_PATH}/${software_product_id}/versions/${version_id}${ASDC_VENDOR_SOFTWARE_UPLOAD_PATH}  ${files}    ${ASDC_DESIGNER_USER_ID}
+     Should Be Equal As Strings          ${resp.status_code}       200
+
 Add ASDC Catalog Service
     [Documentation]    Creates an asdc Catalog Service and returns its id
     [Arguments]   ${catalog_service_name}
@@ -431,6 +436,7 @@
     ${resp}= 	Put Request 	asdc 	${data_path}     data=${data}    headers=${headers}
     Log    Received response from asdc ${resp.text}
     [Return]    ${resp}
+
 Run ASDC Post Files Request
     [Documentation]    Runs an ASDC post request
     [Arguments]    ${data_path}    ${files}    ${user}=${ASDC_DESIGNER_USER_ID}
@@ -442,6 +448,7 @@
     ${resp}= 	Post Request 	asdc 	${data_path}     files=${files}    headers=${headers}
     Log    Received response from asdc ${resp.text}
     [Return]    ${resp}
+
 Run ASDC Post Request
     [Documentation]    Runs an ASDC post request
     [Arguments]    ${data_path}    ${data}    ${user}=${ASDC_DESIGNER_USER_ID}
@@ -471,9 +478,17 @@
     ##Setup Browser
     Go To    ${ASDC_FE_ENDPOINT}${PATH}
     Maximize Browser Window
-    Set Selenium Speed    ${GLOBAL_SELENIUM_DELAY}
+
     Set Browser Implicit Wait    ${GLOBAL_SELENIUM_BROWSER_IMPLICIT_WAIT}
     Log    Logging in to ${ASDC_FE_ENDPOINT}${PATH}
     Title Should Be    ASDC
     Wait Until Page Contains Element    xpath=//div/a[text()='SDC']    ${GLOBAL_SELENIUM_BROWSER_WAIT_TIMEOUT}
     Log    Logged in to ${ASDC_FE_ENDPOINT}${PATH}
+
+
+Create Multi Part
+   [Arguments]  ${addTo}  ${partName}  ${filePath}  ${contentType}=${None}
+   ${fileData}=   Get Binary File  ${filePath}
+   ${fileDir}  ${fileName}=  Split Path  ${filePath}
+   ${partData}=  Create List  ${fileName}  ${fileData}  ${contentType}
+   Set To Dictionary  ${addTo}  ${partName}=${partData}
diff --git a/robot/resources/clamp_interface.robot b/robot/resources/clamp_interface.robot
new file mode 100644
index 0000000..85a8c9e
--- /dev/null
+++ b/robot/resources/clamp_interface.robot
@@ -0,0 +1,25 @@
+*** Settings ***
+Documentation     The main interface for interacting with Microservice Bus.
+Library           RequestsLibrary
+
+Resource          global_properties.robot
+
+*** Variables ***
+${CLAMP_HEALTH_CHECK_PATH}        /restservices/clds/v1/clds/healthcheck
+${CLAMP_ENDPOINT}     ${GLOBAL_CLAMP_SERVER_PROTOCOL}://${GLOBAL_INJECTED_CLAMP_IP_ADDR}:${GLOBAL_CLAMP_SERVER_PORT}
+
+
+*** Keywords ***
+Run CLAMP Health Check
+     [Documentation]    Runs CLAMP Health check
+     ${resp}=    Run CLAMP Get Request    ${CLAMP_HEALTH_CHECK_PATH}
+     Should Be Equal As Integers 	${resp.status_code} 	200
+
+Run CLAMP Get Request
+     [Documentation]    Runs CLAMP Get request
+     [Arguments]    ${data_path}
+     ${session}=    Create Session 	session 	${CLAMP_ENDPOINT}
+     ${resp}= 	Get Request 	session 	${data_path}
+     Should Be Equal As Integers 	${resp.status_code} 	200
+     Log    Received response from CLAMP ${resp.text}
+     [Return]    ${resp}
diff --git a/robot/resources/dcae_interface.robot b/robot/resources/dcae_interface.robot
index 392a2b0..fafa57a 100644
--- a/robot/resources/dcae_interface.robot
+++ b/robot/resources/dcae_interface.robot
@@ -7,8 +7,7 @@
 Resource          global_properties.robot
 
 *** Variables ***
-${DCAE_HEALTH_CHECK_BODY}    robot/assets/dcae/dcae_healthcheck.json
-${DCAE_HEALTH_CHECK_PATH}    /gui
+${DCAE_HEALTH_CHECK_PATH}    /healthcheck
 ${DCAE_ENDPOINT}     ${GLOBAL_DCAE_SERVER_PROTOCOL}://${GLOBAL_INJECTED_DCAE_IP_ADDR}:${GLOBAL_DCAE_SERVER_PORT}
 
 *** Keywords ***
@@ -18,9 +17,8 @@
     Log    Creating session ${DCAE_ENDPOINT}
     ${session}=    Create Session 	dcae 	${DCAE_ENDPOINT}    auth=${auth}
     ${uuid}=    Generate UUID
-    ${data}=    OperatingSystem.Get File    ${DCAE_HEALTH_CHECK_BODY}
     ${headers}=  Create Dictionary     X-ECOMP-Client-Version=ONAP-R2   action=getTable    Accept=application/json    Content-Type=application/json    X-TransactionId=${GLOBAL_APPLICATION_ID}-${uuid}    X-FromAppId=${GLOBAL_APPLICATION_ID}
-    ${resp}= 	Put Request 	dcae 	${DCAE_HEALTH_CHECK_PATH}     data=${data}    headers=${headers}
+    ${resp}= 	Get Request 	dcae 	${DCAE_HEALTH_CHECK_PATH}     headers=${headers}
     Log    Received response from dcae ${resp.json()}
     Should Be Equal As Strings 	${resp.status_code} 	200
     Check DCAE Results    ${resp.json()}
@@ -28,53 +26,21 @@
 Check DCAE Results
     [Documentation]    Parse DCAE JSON response and make sure all rows have healthTestStatus=GREEN (except for the exceptions ;-)
     [Arguments]    ${json}
-    @{rows}=    Get From Dictionary    ${json['returns']}    rows
-    @{headers}=    Get From Dictionary    ${json['returns']}    columns
+    # ${service_names} to contain only the names of services that are passing
+    ${service_names}=    Evaluate    map( lambda s: s['ServiceName'], filter(lambda s: s['Status'] == 'passing', ${json} ))
+    Should Contain Match    ${service_names}   cdap
+    Should Contain Match    ${service_names}   cdap_broker
+    Should Contain Match    ${service_names}   config_binding_service
+    Should Contain Match    ${service_names}   deployment_handler
+    Should Contain Match    ${service_names}   inventory
+    Should Contain Match    ${service_names}   service-change-handler
+    # Should Contain Match    ${service_names}   policy_handler
+    Should Contain Match    ${service_names}   platform_dockerhost
+    Should Contain Match    ${service_names}   component_dockerhost
+    Should Contain Match    ${service_names}   cloudify_manager
+    Should Contain Match    ${service_names}   regexp=.*dcaegen2-collectors-ves
+    Should Contain Match    ${service_names}   regexp=.*cdap_app_cdap_app_tca
+    Should Contain Match    ${service_names}   regexp=.*dcae-analytics-holmes-rule-management
+    Should Contain Match    ${service_names}   regexp=.*dcae-analytics-holmes-engine-management
+    [Return]   ${service_names}
 
-    # Retrieve column names from headers
-    ${columns}=    Create List
-    :for    ${header}    in    @{headers}
-    \    ${colName}=    Get From Dictionary    ${header}    colName
-    \    Append To List    ${columns}    ${colName}
-
-    # Process each row making sure status=GREEN
-    :for    ${row}    in    @{rows}
-    \    ${cells}=    Get From Dictionary    ${row}    cells
-    \    ${dict}=    Make A Dictionary    ${cells}    ${columns}
-    \    Is DCAE Status Valid    ${dict}
-
-Is DCAE Status Valid
-    [Arguments]   ${dict}
-    # If it is GREEN we are done.
-    ${status}   ${value}=   Run Keyword And Ignore Error       Dictionary Should Contain Item    ${dict}    healthTestStatus    GREEN
-    Return From Keyword If   '${status}' == 'PASS'
-
-    # Check for Exceptions
-    # Only 1 so far
-    ${status}   ${value}=   Run Keyword And Ignore Error       Check For Exception    ${dict}    vm-controller    UNDEPLOYED   YELLOW
-    Return From Keyword If   '${status}' == 'PASS'
-
-    # Status not GREEN or is not an exception
-    Fail    Health check failed ${dict}
-
-Check for Exception
-    [Arguments]   ${dict}   ${service}    ${status}   ${healthTestStatus}
-    # Test the significant attributes to see if this is a legit exception
-    ${exception}=   Copy Dictionary   ${dict}
-    Set To Dictionary   ${exception}   service=${service}   status=${status}    healthTestStatus=${healthTestStatus}
-    Dictionaries Should Be Equal    ${dict}    ${exception}
-
-
-
-Make A Dictionary
-    [Documentation]    Given a list of column names and a list of dictionaries, map columname=value
-    [Arguments]     ${columns}    ${names}    ${valuename}=value
-    ${dict}=    Create Dictionary
-    ${collength}=    Get Length    ${columns}
-    ${namelength}=    Get Length    ${names}
-    :for    ${index}    in range    0   ${collength}
-    \    ${name}=    Evaluate     ${names}[${index}]
-    \    ${valued}=    Evaluate     ${columns}[${index}]
-    \    ${value}=    Get From Dictionary    ${valued}    ${valueName}
-    \    Set To Dictionary    ${dict}   ${name}    ${value}
-    [Return]     ${dict}
\ No newline at end of file
diff --git a/robot/resources/demo_preload.robot b/robot/resources/demo_preload.robot
index cb41c57..406f8f0 100644
--- a/robot/resources/demo_preload.robot
+++ b/robot/resources/demo_preload.robot
@@ -19,6 +19,8 @@
 ${AAI_INDEX_PATH}     /aai/v8
 ${VF_MODULES_NAME}     _Demo_VFModules.json
 ${FILE_CACHE}    /share/
+${DEMO_PREFIX}   demo
+
 
 *** Keywords ***
 Load Customer And Models
@@ -39,8 +41,10 @@
     [Documentation]   Use openECOMP to Orchestrate a service.
     [Arguments]    ${customer_name}
     Set Test Variable    ${CUSTOMER_NAME}    ${customer_name}
-    ${status}   ${value}=   Run Keyword And Ignore Error   Distribute Model   vFW   demoVFW
-    ${status}   ${value}=   Run Keyword And Ignore Error   Distribute Model   vLB   demoVLB
+    ${status}   ${value}=   Run Keyword And Ignore Error   Distribute Model   vFWCL   ${DEMO_PREFIX}VFWCL
+    ${status}   ${value}=   Run Keyword And Ignore Error   Distribute Model   vLB   ${DEMO_PREFIX}VLB
+    ${status}   ${value}=   Run Keyword And Ignore Error   Distribute Model   vCPE   ${DEMO_PREFIX}VCPE
+    ##${status}   ${value}=   Run Keyword And Ignore Error   Distribute Model   vIMS   ${DEMO_PREFIX}VIMS
 
 Distribute Model
     [Arguments]   ${service}   ${modelName}
@@ -49,15 +53,17 @@
 Create Customer For VNF Demo
     [Documentation]    Create demo customer for the demo
     [Arguments]    ${customer_name}   ${customer_id}   ${customer_type}    ${clouder_owner}    ${cloud_region_id}    ${tenant_id}
+    Create Service If Not Exists    vFWCL
+    Create Service If Not Exists    vLB
+    Create Service If Not Exists    vCPE
+    Create Service If Not Exists    vIMS
     ${data_template}=    OperatingSystem.Get File    ${ADD_DEMO_CUSTOMER_BODY}
     ${arguments}=    Create Dictionary    subscriber_name=${customer_name}    global_customer_id=${customer_id}    subscriber_type=${customer_type}     cloud_owner=${clouder_owner}  cloud_region_id=${cloud_region_id}    tenant_id=${tenant_id}
-    Set To Dictionary   ${arguments}       service1=vFW       service2=vLB
+    Set To Dictionary   ${arguments}       service1=vFWCL       service2=vLB   service3=vCPE   service4=vIMS
     ${data}=	Fill JSON Template    ${data_template}    ${arguments}
     ${put_resp}=    Run A&AI Put Request     ${INDEX PATH}${ROOT_CUSTOMER_PATH}${customer_id}    ${data}
     ${status_string}=    Convert To String    ${put_resp.status_code}
-    Should Match Regexp    ${status_string}    ^(201|412)$
-    Create Service If Not Exists    vFW
-    Create Service If Not Exists    vLB
+    Should Match Regexp    ${status_string}    ^(200|201|412)$
 
 Preload User Model
     [Documentation]   Preload the demo data for the passed VNF with the passed module name
@@ -102,7 +108,7 @@
     [Documentation]    Query and Validates A&AI Service Instance
     [Arguments]    ${service_instance_id}    ${service_type}   ${customer_id}
     ${resp}=    Run A&AI Get Request      ${INDEX PATH}${CUSTOMER SPEC PATH}${customer_id}${SERVICE SUBSCRIPTIONS}${service_type}${SERVICE INSTANCE}${service_instance_id}
-    ${persona_model_id}=   Get From DIctionary   ${resp.json()['service-instance'][0]}    persona-model-id
+    ${persona_model_id}=   Get From DIctionary   ${resp.json()['service-instance'][0]}    model-invariant-id
     [Return]   ${persona_model_id}
 
 APPC Mount Point
diff --git a/robot/resources/global_properties.robot b/robot/resources/global_properties.robot
index 871f992..ac91d24 100644
--- a/robot/resources/global_properties.robot
+++ b/robot/resources/global_properties.robot
@@ -19,9 +19,16 @@
 ${GLOBAL_OPENSTACK_GLANCE_SERVICE_TYPE}    image
 ${GLOBAL_OPENSTACK_KEYSTONE_SERVICE_TYPE}    identity
 ${GLOBAL_OPENSTACK_STACK_DEPLOYMENT_TIMEOUT}    600s
-${GLOBAL_AAI_CLOUD_OWNER}    Rackspace
+${GLOBAL_AAI_CLOUD_OWNER}    CloudOwner
+${GLOBAL_AAI_CLOUD_OWNER_DEFINED_TYPE}    OwnerType
+${GLOBAL_AAI_COMPLEX_NAME}    clli1
+${GLOBAL_AAI_PHYSICAL_LOCATION_ID}    clli1
 ${GLOBAL_BUILD_NUMBER}    0
 ${GLOBAL_VID_UI_TIMEOUT_SHORT}    20s
 ${GLOBAL_VID_UI_TIMEOUT_MEDIUM}    60s
 ${GLOBAL_VID_UI_TIMEOUT_LONG}    120s
-${GLOBAL_VM_PRIVATE_KEY}   ${EXECDIR}/robot/assets/keys/robot_ssh_private_key.pvt
\ No newline at end of file
+${GLOBAL_VM_PRIVATE_KEY}   ${EXECDIR}/robot/assets/keys/robot_ssh_private_key.pvt
+${GLOBAL_AAI_ZONE_ID}    nova1
+${GLOBAL_AAI_ZONE_NAME}    nova
+${GLOBAL_AAI_DESIGN_TYPE}    integration
+${GLOBAL_AAI_ZONE_CONTEXT}    labs
\ No newline at end of file
diff --git a/robot/resources/heatbridge.robot b/robot/resources/heatbridge.robot
index c96ee41..515ae39 100644
--- a/robot/resources/heatbridge.robot
+++ b/robot/resources/heatbridge.robot
@@ -38,7 +38,8 @@
     ${stack_id}=    Get From Dictionary    ${stack_info}    id
     ${tenant_id}=   Get From Dictionary    ${stack_info}    OS::project_id
     ${vnf_id}=    Get From Dictionary    ${stack_info}    vnf_id
-    ${openstack_identity_url}=    Catenate    ${GLOBAL_INJECTED_KEYSTONE}/v2.0
+    ${url}   ${path}=   Get Keystone Url And Path
+    ${openstack_identity_url}=    Catenate    ${url}${path}
     ${region}=   Get Openstack Region
     ${user}   ${pass}=   Get Openstack Credentials
     Init Bridge    ${openstack_identity_url}    ${user}    ${pass}    ${tenant_id}    ${region}   ${GLOBAL_AAI_CLOUD_OWNER}
diff --git a/robot/resources/msb_interface.robot b/robot/resources/msb_interface.robot
new file mode 100644
index 0000000..53b67da
--- /dev/null
+++ b/robot/resources/msb_interface.robot
@@ -0,0 +1,25 @@
+*** Settings ***
+Documentation     The main interface for interacting with Microservice Bus.
+Library           RequestsLibrary
+
+Resource          global_properties.robot
+
+*** Variables ***
+${MSB_HEALTH_CHECK_PATH}        /iui/microservices/default.html
+${MSB_ENDPOINT}     ${GLOBAL_MSB_SERVER_PROTOCOL}://${GLOBAL_INJECTED_OPENO_IP_ADDR}:${GLOBAL_MSB_SERVER_PORT}
+
+
+*** Keywords ***
+Run MSB Health Check
+     [Documentation]    Runs MSB Health check
+     ${resp}=    Run MSB Get Request    ${MSB_HEALTH_CHECK_PATH}
+     Should Be Equal As Integers 	${resp.status_code} 	200
+
+Run MSB Get Request
+     [Documentation]    Runs MSB Get request
+     [Arguments]    ${data_path}
+     ${session}=    Create Session 	msb	${MSB_ENDPOINT}
+     ${resp}= 	Get Request 	msb 	${data_path}
+     Should Be Equal As Integers 	${resp.status_code} 	200
+     Log    Received response from MSB ${resp.text}
+     [Return]    ${resp}
diff --git a/robot/resources/openstack/keystone_interface.robot b/robot/resources/openstack/keystone_interface.robot
index 3c3de90..e51e3db 100644
--- a/robot/resources/openstack/keystone_interface.robot
+++ b/robot/resources/openstack/keystone_interface.robot
@@ -2,6 +2,7 @@
 Documentation     The main interface for interacting with Openstack Keystone API. It handles low level stuff like managing the authtoken and Openstack required fields
 Library           OpenstackLibrary
 Library 	      RequestsLibrary
+Library 	      HTTPUtils
 Library	          UUID
 Library	          Collections
 Library    OperatingSystem
@@ -20,12 +21,13 @@
     [Documentation]    Runs an Openstack Auth Request and returns the token and service catalog. you need to include the token in future request's x-auth-token headers. Service catalog describes what can be called
     [Arguments]    ${alias}    ${username}=    ${password}=
     ${username}    ${password}=   Set Openstack Credentials   ${username}    ${password}
-    ${session}=    Create Session 	keystone 	${GLOBAL_INJECTED_KEYSTONE}    verify=True
+    ${url}   ${path}=   Get Keystone Url And Path
+    ${session}=    Create Session 	keystone 	${url}    verify=True
     ${uuid}=    Generate UUID
     ${data_template}=    OperatingSystem.Get File    ${OPENSTACK_KEYSTONE_AUTH_BODY_FILE}
     ${arguments}=    Create Dictionary    username=${username}    password=${password}   tenantId=${GLOBAL_INJECTED_OPENSTACK_TENANT_ID}
     ${data}=	Fill JSON Template    ${data_template}    ${arguments}
-    ${data_path}=    Catenate    ${OPENSTACK_KEYSTONE_API_VERSION}${OPENSTACK_KEYSTONE_AUTH_PATH}
+    ${data_path}=    Catenate    ${path}${OPENSTACK_KEYSTONE_AUTH_PATH}
     ${headers}=  Create Dictionary     Accept=application/json    Content-Type=application/json    X-TransactionId=${GLOBAL_APPLICATION_ID}-${uuid}    X-FromAppId=${GLOBAL_APPLICATION_ID}
     Log    Sending authenticate post request ${data_path} with headers ${headers} and data ${data}
     ${resp}= 	Post Request 	keystone 	${data_path}     data=${data}    headers=${headers}
@@ -53,3 +55,12 @@
 
 Get Openstack Credentials
     [Return]   ${GLOBAL_INJECTED_OPENSTACK_USERNAME}    ${GLOBAL_INJECTED_OPENSTACK_PASSWORD}
+
+Get Keystone Url And Path
+    [Documentation]    Handle arbitrary keystone identiit url. Add v2.0 if not present.
+    ${pieces}=   URL Parse   ${GLOBAL_INJECTED_KEYSTONE}
+    ${url}=      Catenate   ${pieces.scheme}://${pieces.netloc}
+    ${version}=  Evaluate   ''
+    ${version}=  Set Variable If   '${OPENSTACK_KEYSTONE_API_VERSION}' not in '${pieces.path}'   ${OPENSTACK_KEYSTONE_API_VERSION}   ${version}
+    ${path}=     Catenate   ${pieces.path}${version}
+    [Return]   ${url}   ${path}
\ No newline at end of file
diff --git a/robot/resources/openstack/nova_interface.robot b/robot/resources/openstack/nova_interface.robot
index b36d09f..2c9ec4c 100644
--- a/robot/resources/openstack/nova_interface.robot
+++ b/robot/resources/openstack/nova_interface.robot
@@ -92,14 +92,14 @@
 
 Add Server For Image Name
     [Documentation]    Adds a server for the passed if
-    [Arguments]    ${alias}    ${name}    ${imageName}    ${flavorName}
+    [Arguments]    ${alias}    ${name}    ${imageName}    ${flavorName}   ${public_net_id}
     ${images}=  Get Openstack Images    ${alias}
     ${flavors}=  Get Openstack Flavors    ${alias}
     ${images}=   Get From Dictionary   ${images}   images
     ${flavors}=   Get From Dictionary   ${flavors}   flavors
     ${imageRef}=    Get Id For Name   ${images}    ${imageName}
     ${flavorRef}=   Get Id For Name   ${flavors}    ${flavorName}
-    ${dict}=    Create Dictionary   name=${name}   imageRef=${imageRef}   flavorRef=${flavorRef}
+    ${dict}=    Create Dictionary   name=${name}   imageRef=${imageRef}   flavorRef=${flavorRef}   public_net_id=${public_net_id}
     ${data}=    Fill JSON Template File    ${OPENSTACK_NOVA_SERVER_ADD_BODY_FILE}    ${dict}
     ${resp}=    Internal Post Openstack    ${alias}    ${GLOBAL_OPENSTACK_NOVA_SERVICE_TYPE}    ${OPENSTACK_NOVA_SERVERS_PATH}   data_path=    data=${data}
     ${status_string}=    Convert To String    ${resp.status_code}
diff --git a/robot/resources/portal_interface.robot b/robot/resources/portal_interface.robot
index 2920529..e004934 100644
--- a/robot/resources/portal_interface.robot
+++ b/robot/resources/portal_interface.robot
@@ -7,7 +7,7 @@
 Resource          global_properties.robot
 
 *** Variables ***
-${PORTAL_HEALTH_CHECK_PATH}        /ECOMPPORTAL/portalApi/healthCheck
+${PORTAL_HEALTH_CHECK_PATH}        /ONAPPORTAL/portalApi/healthCheck
 ${PORTAL_ENDPOINT}     ${GLOBAL_PORTAL_SERVER_PROTOCOL}://${GLOBAL_INJECTED_PORTAL_IP_ADDR}:${GLOBAL_PORTAL_SERVER_PORT}
 
 *** Keywords ***
diff --git a/robot/resources/sdngc_interface.robot b/robot/resources/sdngc_interface.robot
index d3606c1..5028644 100644
--- a/robot/resources/sdngc_interface.robot
+++ b/robot/resources/sdngc_interface.robot
@@ -83,7 +83,7 @@
 
 Preload Vnf
     [Arguments]    ${service_type_uuid}    ${generic_vnf_name}    ${generic_vnf_type}     ${vf_module_name}    ${vf_modules}    ${service}   ${uuid}
-    ${base_vf_module_type}=    Catenate    ''
+    ${base_vf_module_type}=    Catenate
     ${closedloop_vf_module}=    Create Dictionary
     ${templates}=    Get From Dictionary    ${GLOBAL_SERVICE_TEMPLATE_MAPPING}    ${service}
     :for    ${vf_module}    in      @{vf_modules}
@@ -118,7 +118,7 @@
     Return From Keyword If    '${filename}' == ''
     ${data_template}=    OperatingSystem.Get File    ${PRELOAD_VNF_TOPOLOGY_OPERATION_BODY}/preload.template
     ${parameters}=    Get Template Parameters    ${filename}   ${uuid}
-    Set To Dictionary   ${parameters}   generic_vnf_name=${generic_vnf_name}     generic_vnf_type=${generic_vnf_type}  service_type=${service_type_uuid}    vf_module_name=${vf_module_name}    vf_module_type=${vf_module_type}    uuid=${uuid}
+    Set To Dictionary   ${parameters}   generic_vnf_name=${generic_vnf_name}     generic_vnf_type=${generic_vnf_type}  service_type=${service_type_uuid}    vf_module_name=${vf_module_name}    vf_module_type=${vf_module_type}
     ${data}=	Fill JSON Template    ${data_template}    ${parameters}
 	${put_resp}=    Run SDNGC Post Request     ${SDNGC_INDEX_PATH}${PRELOAD_VNF_TOPOLOGY_OPERATION_PATH}     ${data}
     Should Be Equal As Strings 	${put_resp.json()['output']['response-code']} 	200
@@ -130,21 +130,44 @@
     ${rest}   ${suite}=    Split String From Right    ${SUITE NAME}   .   1
     ${uuid}=    Catenate    ${uuid}
     ${hostid}=    Get Substring    ${uuid}    -4
-    ${ecompnet}=    Evaluate    ${GLOBAL_BUILD_NUMBER}%255
+    ${ecompnet}=    Evaluate    (${GLOBAL_BUILD_NUMBER}%128)+128
+
+
     # Initialize the value map with the properties generated from the Robot VM /opt/config folder
-    ${valuemap}=   Create Dictionary
+    ${valuemap}=   Copy Dictionary    ${GLOBAL_INJECTED_PROPERTIES}
+
+    # These should be deprecated by the above....
     Set To Dictionary   ${valuemap}   artifacts_version=${GLOBAL_INJECTED_ARTIFACTS_VERSION}
     Set To Dictionary   ${valuemap}   network=${GLOBAL_INJECTED_NETWORK}
+    Set To Dictionary   ${valuemap}   public_net_id=${GLOBAL_INJECTED_PUBLIC_NET_ID}
+    Set To Dictionary   ${valuemap}   cloud_env=${GLOBAL_INJECTED_CLOUD_ENV}
+    Set To Dictionary   ${valuemap}   install_script_version=${GLOBAL_INJECTED_SCRIPT_VERSION}
+    Set To Dictionary   ${valuemap}   vm_image_name=${GLOBAL_INJECTED_VM_IMAGE_NAME}
+    Set To Dictionary   ${valuemap}   vm_flavor_name=${GLOBAL_INJECTED_VM_FLAVOR}
+
+
     # update the value map with unique values.
     Set To Dictionary   ${valuemap}   uuid=${uuid}   hostid=${hostid}    ecompnet=${ecompnet}
-    ${parameters}=    Create Dictionary
-    ${defaults}=    Get From Dictionary    ${GLOBAL_PRELOAD_PARAMETERS}    defaults
-    Resolve Values Into Dictionary   ${valuemap}   ${defaults}    ${parameters}
+
+    #
+    # Mash together the defaults dict with the test case dict to create the set of
+    # preload parameters
+    #
     ${suite_templates}=    Get From Dictionary    ${GLOBAL_PRELOAD_PARAMETERS}    ${suite}
     ${template}=    Get From Dictionary    ${suite_templates}    ${template}
-    ${vnf_parameters}=   Resolve VNF Parameters Into Array   ${valuemap}   ${template}    ${parameters}
+    ${defaults}=    Get From Dictionary    ${GLOBAL_PRELOAD_PARAMETERS}    defaults
+    # add all of the defaults to template...
+    @{keys}=    Get Dictionary Keys    ${defaults}
+    :for   ${key}   in   @{keys}
+    \    ${value}=   Get From Dictionary    ${defaults}    ${key}
+    \    Set To Dictionary    ${template}  ${key}    ${value}
+
+    #
+    # Get the vnf_parameters to preload
+    #
+    ${vnf_parameters}=   Resolve VNF Parameters Into Array   ${valuemap}   ${template}
     ${vnf_parameters_json}=   Evaluate    json.dumps(${vnf_parameters})    json
-    Set To Dictionary   ${parameters}   vnf_parameters=${vnf_parameters_json}
+    ${parameters}=   Create Dictionary   vnf_parameters=${vnf_parameters_json}
     [Return]    ${parameters}
 
 Resolve Values Into Dictionary
@@ -156,7 +179,7 @@
     \    Set To Dictionary    ${to}    ${key}    ${value}
 
 Resolve VNF Parameters Into Array
-    [Arguments]   ${valuemap}    ${from}    ${to}
+    [Arguments]   ${valuemap}    ${from}
     ${vnf_parameters}=   Create List
     ${keys}=    Get Dictionary Keys    ${from}
     :for   ${key}   in  @{keys}
@@ -196,7 +219,7 @@
     ## Setup Browser is now being managed by the test case
     ## Setup Browser
     Go To    ${SDNGC_ADMIN_SIGNUP_URL}
-    Maximize Browser Window
+    ##Maximize Browser Window
     Set Selenium Speed    ${GLOBAL_SELENIUM_DELAY}
     Set Browser Implicit Wait    ${GLOBAL_SELENIUM_BROWSER_IMPLICIT_WAIT}
     Log    Logging in to ${SDNGC_ADMIN_LOGIN_URL}
diff --git a/robot/resources/stack_validation/validate_common.robot b/robot/resources/stack_validation/validate_common.robot
index 24f9fe3..6c97fac 100644
--- a/robot/resources/stack_validation/validate_common.robot
+++ b/robot/resources/stack_validation/validate_common.robot
@@ -32,7 +32,7 @@
     ${server_name}=   Get From Dictionary     ${stack_info}   ${key_name}
     ${server}=    Get From Dictionary    ${server_list}    ${server_name}
     Log    Entering Get Openstack Server Ip
-    ${ip}=    Get Openstack Server Ip    ${server}    network_name=${network_name}
+    ${ip}=    Search Addresses    ${server}    ${network_name}
     Log    Returned Get Openstack Server Ip
     [Return]    ${ip}
 
@@ -45,3 +45,58 @@
     Reboot Server    auth   ${vfw_server_id}
 
 
+Search Addresses
+    [Arguments]   ${server}   ${network_name}
+    ${addresses}   Get From Dictionary   ${server}   addresses
+    ${status}   ${server_ip}=   Run Keyword And Ignore Error   Find Rackspace   ${addresses}   ${network_name}
+    Return From Keyword If   '${status}'=='PASS'   ${server_ip}
+    ${status}   ${server_ip}=   Run Keyword And Ignore Error   Find Openstack   ${addresses}   ${network_name}
+    Return From Keyword If   '${status}'=='PASS'   ${server_ip}
+    ${status}   ${server_ip}=   Run Keyword And Ignore Error   Find Openstack 2   ${addresses}   ${network_name}
+    Return From Keyword If   '${status}'=='PASS'   ${server_ip}
+    Fail  ${server}/${network_name} Not Found
+
+Find Rackspace
+    [Arguments]   ${addresses}   ${network_name}
+    ${ips}   Get From Dictionary   ${addresses}   ${network_name}
+    ${ip}=   Get V4 IP   ${ips}
+    [Return]   ${ip}
+
+Find Openstack
+    [Arguments]   ${addresses}   ${network_name}
+    ${network_name}=   Set Variable If    '${network_name}' == 'public'    external   ${network_name}
+    ${ip}=   Get V4 IP Openstack   ${addresses}   ${network_name}
+    [Return]   ${ip}
+
+Find Openstack 2
+    [Arguments]   ${addresses}   ${network_name}
+    ${network_name}=   Set Variable If    '${network_name}' == 'public'    floating   ${network_name}
+    ${ipmaps}=   Get From Dictionary   ${addresses}   ${GLOBAL_INJECTED_NETWORK}
+    ${ip}=   Get V4 IP Openstack 2  ${ipmaps}   ${network_name}
+    [Return]   ${ip}
+
+Get V4 IP
+    [Arguments]   ${ipmaps}
+    :for   ${ipmap}   in   @{ipmaps}
+    \    ${ip}   Get From Dictionary   ${ipmap}   addr
+    \    ${version}   Get From Dictionary   ${ipmap}   version
+    \    Return from Keyword if   '${version}' == '4'   ${ip}
+    Fail  No Version 4 IP
+
+Get V4 IP Openstack
+    [Arguments]   ${addresses}   ${testtype}
+    ${ipmaps}=   Get From Dictionary   ${addresses}   ${testtype}
+    :for   ${ipmap}   in   @{ipmaps}
+    \    ${ip}   Get From Dictionary   ${ipmap}   addr
+    \    ${version}   Get From Dictionary   ${ipmap}   version
+    \    Return from Keyword if   '${version}'=='4'   ${ip}
+    Fail  No Version 4 IP
+
+Get V4 IP Openstack 2
+    [Arguments]   ${ipmaps}   ${testtype}
+    :for   ${ipmap}   in   @{ipmaps}
+    \    ${type}   Get From Dictionary   ${ipmap}   OS-EXT-IPS:type
+    \    ${ip}   Get From Dictionary   ${ipmap}   addr
+    \    ${version}   Get From Dictionary   ${ipmap}   version
+    \    Return from Keyword if   '${version}'=='4' and '${type}'=='${testtype}'   ${ip}
+    Fail  No Version 4 IP
diff --git a/robot/resources/stack_validation/validate_vfw.robot b/robot/resources/stack_validation/validate_vfw.robot
index b0d591f..e162720 100644
--- a/robot/resources/stack_validation/validate_vfw.robot
+++ b/robot/resources/stack_validation/validate_vfw.robot
@@ -60,18 +60,18 @@
 Wait For Firewall
     [Documentation]     Wait for the defined firewall processes to come up
     [Arguments]    ${ip}
-    Wait for Process on Host    ./vpp_measurement_reporter    ${ip}
+    ##Wait for Process on Host    ./vpp_measurement_reporter    ${ip}
     Wait for Process on Host    vpp -c /etc/vpp/startup.conf    ${ip}
 
 Wait For Packet Generator
     [Documentation]     Wait for the defined packet generator processes to come up
     [Arguments]    ${ip}
     Wait for Process on Host    vpp -c /etc/vpp/startup.conf    ${ip}
-    Wait Until Keyword Succeeds    180s    5s    Tail File on Host Until    ${ip}    Honeycomb    /var/log/honeycomb/honeycomb.log    - Honeycomb initialized   options=-c +0    timeout=120s
+    ##Wait Until Keyword Succeeds    180s    5s    Tail File on Host Until    ${ip}    Honeycomb    /var/log/honeycomb/honeycomb.log    - Honeycomb initialized   options=-c +0    timeout=120s
     Run Keyword And Ignore Error    Wait for Process on Host    run_traffic_fw_demo.sh    ${ip}    timeout=60s
     Pkill Process On Host    "/bin/bash ./run_traffic_fw_demo.sh"    ${ip}
 
 Wait For Packet Sink
     [Documentation]     Wait for the defined packet sink processes to come up
     [Arguments]    ${ip}
-    Log    noting to check on ${ip}
+    Wait for Process on Host    /usr/sbin/darkstat    ${ip}
diff --git a/robot/resources/test_templates/closedloop_test_template.robot b/robot/resources/test_templates/closedloop_test_template.robot
index 6930e56..1a13613 100644
--- a/robot/resources/test_templates/closedloop_test_template.robot
+++ b/robot/resources/test_templates/closedloop_test_template.robot
@@ -192,7 +192,7 @@
 	[Documentation]    VNF Orchestration for vFW
 	Log    VNF Orchestration flow TEST NAME=${TEST NAME}
 	Setup Orchestrate VNF    ${GLOBAL_AAI_CLOUD_OWNER}    SharedNode    OwnerType    v1    CloudZone
-	${stack_name}    ${service}=  Orchestrate VNF   ETE_CLP    vFW      vFW   ${TENANT_NAME}
+	${stack_name}    ${service}=  Orchestrate VNF   ETE_CLP    vFWCL      vFWCL   ${TENANT_NAME}
 	[Return]  ${stack_name}
 
  Orchestrate VNF vDNS closedloop
diff --git a/robot/resources/test_templates/model_test_template.robot b/robot/resources/test_templates/model_test_template.robot
index c27b301..98b3b1c 100644
--- a/robot/resources/test_templates/model_test_template.robot
+++ b/robot/resources/test_templates/model_test_template.robot
@@ -3,6 +3,7 @@
 Library           OperatingSystem
 Library            ArchiveLibrary
 Library           Collections
+Library           String
 Resource          ../asdc_interface.robot
 
 Variables       ../../assets/service_mappings.py
@@ -10,7 +11,7 @@
 *** Variables ***
 ${ASDC_BASE_PATH}    /sdc1
 ${ASDC_DESIGNER_PATH}    /proxy-designer1#/dashboard
-${ASDC_ASSETS_DIRECTORY}    robot/assets/asdc
+${ASDC_ASSETS_DIRECTORY}    ${GLOBAL_HEAT_TEMPLATES_FOLDER}
 ${ASDC_ZIP_DIRECTORY}    ${ASDC_ASSETS_DIRECTORY}/temp
 
 #***************** Test Case Variables *********************
@@ -24,15 +25,17 @@
     ${directory_list}=    Get From Dictionary    ${GLOBAL_SERVICE_FOLDER_MAPPING}    ${service}
     ${ziplist}=    Create List
     :for   ${directory}    in    @{directory_list}
-    \    ${zip}=    Catenate    ${ASDC_ZIP_DIRECTORY}/${directory}.zip
+    \    ${zipname}=   Replace String    ${directory}    /    _
+    \    ${zip}=    Catenate    ${ASDC_ZIP_DIRECTORY}/${zipname}.zip
     \    ${folder}=    Catenate    ${ASDC_ASSETS_DIRECTORY}/${directory}
     \    OperatingSystem.Create Directory    ${ASDC_ASSETS_DIRECTORY}/temp
     \    Create Zip From Files In Directory        ${folder}    ${zip}
     \    Append To List    ${ziplist}    ${zip}
-    ${catalog_service_name}    ${catalog_resource_name}    ${vf_modules}    ${catalog_resource_ids}   ${catalog_service_id}   Distribute Model From ASDC    ${ziplist}    ${catalog_service_name}
+    ${catalog_service_name}    ${catalog_resource_name}    ${vf_modules}    ${catalog_resource_ids}   ${catalog_service_id}   ${catalog_resources}   Distribute Model From ASDC    ${ziplist}    ${catalog_service_name}
     Set Test Variable   ${CATALOG_RESOURCE_IDS}   ${catalog_resource_ids}
     Set Test Variable   ${CATALOG_SERVICE_ID}   ${catalog_service_id}
-    [Return]    ${catalog_service_name}    ${catalog_resource_name}    ${vf_modules}
+    Set Test Variable   ${CATALOG_RESOURCES}   ${catalog_resources}
+    [Return]    ${catalog_service_name}    ${catalog_resource_name}    ${vf_modules}   ${catalog_resources}
 
 
 
diff --git a/robot/resources/test_templates/vnf_orchestration_test_template.robot b/robot/resources/test_templates/vnf_orchestration_test_template.robot
index ed847c2..807647d 100644
--- a/robot/resources/test_templates/vnf_orchestration_test_template.robot
+++ b/robot/resources/test_templates/vnf_orchestration_test_template.robot
@@ -9,7 +9,9 @@
 Resource        ../sdngc_interface.robot
 Resource        model_test_template.robot
 
+Resource        ../aai/create_zone.robot
 Resource        ../aai/create_customer.robot
+Resource        ../aai/create_complex.robot
 Resource        ../aai/create_tenant.robot
 Resource        ../aai/create_service.robot
 Resource        ../openstack/neutron_interface.robot
@@ -31,6 +33,7 @@
 ${REGIONS}
 ${CUSTOMER_NAME}
 ${STACK_NAME}
+${STACK_NAMES}
 ${SERVICE}
 ${VVG_SERVER_ID}
 ${SERVICE_INSTANCE_ID}
@@ -49,37 +52,82 @@
     ${uuid}=    Generate UUID
     Set Test Variable    ${CUSTOMER_NAME}    ${customer_name}_${uuid}
     Set Test Variable    ${SERVICE}    ${service}
-    ${vnf_name}=    Catenate    Vnf_Ete_Name${uuid}
+    ${list}=    Create List
+    Set Test Variable    ${STACK_NAMES}   ${list}
     ${service_name}=    Catenate    Service_Ete_Name${uuid}
     ${service_type}=    Set Variable    ${service}
-    ${vf_module_name}=    Catenate    Vfmodule_Ete_Name${uuid}
-    ${service_model_type}     ${vnf_type}    ${vf_modules} =    Model Distribution For Directory    ${service}
+    ${service_model_type}     ${vnf_type}    ${vf_modules}   ${catalog_resources}=    Model Distribution For Directory    ${service}
     Run Keyword If   '${service}' == 'vVG'    Create VVG Server    ${uuid}
     Create Customer For VNF    ${CUSTOMER_NAME}    ${CUSTOMER_NAME}    INFRA    ${service_type}    ${GLOBAL_AAI_CLOUD_OWNER}
     Setup Browser
     Login To VID GUI
-    ${service_instance_id}=    Create VID Service Instance    ${customer_name}    ${service_model_type}    ${service}     ${service_name}
+    ${service_instance_id}=   Wait Until Keyword Succeeds    300s   5s    Create VID Service Instance    ${customer_name}    ${service_model_type}    ${service}     ${service_name}
     Set Test Variable   ${SERVICE_INSTANCE_ID}   ${service_instance_id}
     Validate Service Instance    ${service_instance_id}    ${service}      ${customer_name}
-    Create VID VNF    ${service_instance_id}    ${vnf_name}    ${product_family}    ${lcp_region}    ${tenant}    ${vnf_type}
-    ${vf_module_type}   ${closedloop_vf_module}=   Preload Vnf    ${service_instance_id}   ${vnf_name}   ${vnf_type}   ${vf_module_name}    ${vf_modules}    ${service}    ${uuid}
-    ${vf_module_id}=   Create VID VNF module    ${service_instance_id}    ${vf_module_name}    ${lcp_region}    ${tenant}     ${vf_module_type}
-    ${generic_vnf}=   Validate Generic VNF    ${vnf_name}    ${vnf_type}    ${service_instance_id}
-    VLB Closed Loop Hack   ${service}   ${generic_vnf}   ${closedloop_vf_module}
-    Set Test Variable    ${STACK_NAME}   ${vf_module_name}
-    Execute Heatbridge    ${vf_module_name}    ${service_instance_id}    ${service}
-    Validate VF Module      ${vf_module_name}    ${service}
+    ${vnflist}=   Get From Dictionary    ${GLOBAL_SERVICE_VNF_MAPPING}    ${service}
+    :for   ${vnf}   in   @{vnflist}
+    \   ${vnf_name}=    Catenate    Ete_${vnf}_${uuid}
+    \   ${vf_module_name}=    Catenate    Vfmodule_Ete_${vnf}_${uuid}
+    \   ${vnf_type}=   Get VNF Type   ${catalog_resources}   ${vnf}
+    \   ${vf_module}=    Get VF Module    ${catalog_resources}   ${vnf}
+    \   Append To List   ${STACK_NAMES}   ${vf_module_name}
+    \   Wait Until Keyword Succeeds    300s   5s    Create VID VNF    ${service_instance_id}    ${vnf_name}    ${product_family}    ${lcp_region}    ${tenant}    ${vnf_type}   ${CUSTOMER_NAME}
+    \   ${vf_module_type}   ${closedloop_vf_module}=   Preload Vnf    ${service_instance_id}   ${vnf_name}   ${vnf_type}   ${vf_module_name}    ${vf_module}    ${vnf}    ${uuid}
+    \   ${vf_module_id}=   Create VID VNF module    ${service_instance_id}    ${vf_module_name}    ${lcp_region}    ${tenant}     ${vf_module_type}   ${CUSTOMER_NAME}   ${vnf_name}
+    \   ${generic_vnf}=   Validate Generic VNF    ${vnf_name}    ${vnf_type}    ${service_instance_id}
+    \   VLB Closed Loop Hack   ${service}   ${generic_vnf}   ${closedloop_vf_module}
+    \   Set Test Variable    ${STACK_NAME}   ${vf_module_name}
+    \   Append To List   ${STACK_NAMES}   ${STACK_NAME}
+    \   Execute Heatbridge    ${vf_module_name}    ${service_instance_id}    ${vnf}
+    \   Validate VF Module      ${vf_module_name}    ${vnf}
     [Return]     ${vf_module_name}    ${service}
 
 
+Get VNF Type
+    [Documentation]    To support services with multiple VNFs, we need to dig the vnf type out of the SDC catalog resources to select in the VID UI
+    [Arguments]   ${resources}   ${vnf}
+    ${cr}=   Get Catalog Resource    ${resources}    ${vnf}
+    ${vnf_type}=   Get From Dictionary   ${cr}   name
+    [Return]   ${vnf_type}
+
+Get VF Module
+    [Documentation]    To support services with multiple VNFs, we need to dig the vnf type out of the SDC catalog resources to select in the VID UI
+    [Arguments]   ${resources}   ${vnf}
+    ${cr}=   Get Catalog Resource    ${resources}    ${vnf}
+    ${vf_module}=    Find Element In Array    ${cr['groups']}    type    org.openecomp.groups.VfModule
+    [Return]  ${vf_module}
+
+Get Catalog Resource
+    [Documentation]    To support services with multiple VNFs, we need to dig the vnf type out of the SDC catalog resources to select in the VID UI
+    [Arguments]   ${resources}   ${vnf}
+
+    ${base_name}=  Get Name Pattern   ${vnf}
+    ${keys}=    Get Dictionary Keys    ${resources}
+
+    :for   ${key}   in    @{keys}
+    \    ${cr}=   Get From Dictionary    ${resources}    ${key}
+    \    Return From Keyword If   '${base_name}' in '${cr['allArtifacts']['heat1']['artifactDisplayName']}'    ${cr}
+    Fail    Unable to find catalog resource for ${vnf} ${base_name}
+
+Get Name Pattern
+    [Documentation]    To support services with multiple VNFs, we need to dig the vnf type out of the SDC catalog resources to select in the VID UI
+    [Arguments]   ${vnf}
+    ${list}=   Get From Dictionary    ${GLOBAL_SERVICE_TEMPLATE_MAPPING}   ${vnf}
+    :for    ${dict}   in   @{list}
+    \   ${base_name}=   Get From Dictionary    ${dict}    name_pattern
+    \   Return From Keyword If   '${dict['isBase']}' == 'true'   ${base_name}
+    Fail  Unable to locate base name pattern
+
+
+
 Create Customer For VNF
     [Documentation]    VNF Orchestration Test setup....
     ...                Create Tenant if not exists, Create Customer, Create Service and related relationships
     [Arguments]    ${customer_name}    ${customer_id}    ${customer_type}    ${service_type}    ${cloud_owner}
     ${cloud_region_id}=   Get Openstack Region
+    Create Service If Not Exists    ${service_type}
     ${resp}=    Create Customer    ${customer_name}    ${customer_id}    ${customer_type}    ${service_type}   ${cloud_owner}  ${cloud_region_id}    ${TENANT_ID}
 	Should Be Equal As Strings 	${resp} 	201
-    Create Service If Not Exists    ${service_type}
 
 Setup Orchestrate VNF
     [Documentation]    Called before each test case to ensure tenant and region data
@@ -89,6 +137,8 @@
     Initialize Regions From Openstack
     :FOR    ${region}    IN    @{REGIONS}
     \    Inventory Tenant If Not Exists    ${cloud_owner}  ${region}  ${cloud_type}    ${owner_defined_type}    ${cloud_region_version}    ${cloud_zone}    ${TENANT_ID}    ${TENANT_NAME}
+    Inventory Zone If Not Exists
+    Inventory Complex If Not Exists    ${GLOBAL_AAI_COMPLEX_NAME}   ${GLOBAL_AAI_PHYSICAL_LOCATION_ID}   ${GLOBAL_AAI_CLOUD_OWNER}   ${GLOBAL_INJECTED_REGION}   ${GLOBAL_AAI_CLOUD_OWNER_DEFINED_TYPE}
     Log   Orchestrate VNF setup complete
 
 Initialize Tenant From Openstack
@@ -111,7 +161,7 @@
     [Arguments]    ${uuid}
     Run Openstack Auth Request    auth
     ${vvg_server_name}=    Catenate   vVG_${uuid}
-    ${server}=   Add Server For Image Name  auth    ${vvg_server_name}   ${GLOBAL_VVGSERVER_IMAGE}   ${GLOBAL_VVGSERVER_FLAVOR}
+    ${server}=   Add Server For Image Name  auth    ${vvg_server_name}   ${GLOBAL_INJECTED_VM_IMAGE_NAME}   ${GLOBAL_INJECTED_VM_FLAVOR}   ${GLOBAL_INJECTED_PUBLIC_NET_ID}
     ${server}=       Get From Dictionary   ${server}   server
     ${server_id}=    Get From Dictionary   ${server}   id
     Set Test Variable    ${VVG_SERVER_ID}   ${server_id}
@@ -131,7 +181,7 @@
     ${lcp_region}=   Get Openstack Region
     Teardown VVG Server
     Teardown VLB Closed Loop Hack
-    Teardown VID   ${SERVICE_INSTANCE_ID}   ${lcp_region}   ${TENANT_ID}
+    Teardown VID   ${SERVICE_INSTANCE_ID}   ${lcp_region}   ${TENANT_NAME}   ${CUSTOMER_NAME}
     Log    VNF Deleted
 
 Teardown VNF
diff --git a/robot/resources/vid/create_service_instance.robot b/robot/resources/vid/create_service_instance.robot
index 6c7f8a0..00fafea 100644
--- a/robot/resources/vid/create_service_instance.robot
+++ b/robot/resources/vid/create_service_instance.robot
@@ -22,11 +22,12 @@
     Wait Until Page Contains Element    xpath=//input[@parameter-name='Instance Name']    ${GLOBAL_VID_UI_TIMEOUT_LONG}
     Wait Until Element Is Visible    xpath=//input[@parameter-name='Instance Name']    ${GLOBAL_VID_UI_TIMEOUT_LONG}
     Xpath Should Match X Times    //input[@parameter-name='Instance Name']    1
-    Input Text When Enabled    //input[@parameter-name='Instance Name']    ${service_name}
-    Select From List When Enabled    //select[@prompt='Select Subscriber Name']    ${customer_name}
+    Wait Until Keyword Succeeds   120s  5s    Input Text When Enabled    //input[@parameter-name='Instance Name']    ${service_name}   timeout=${GLOBAL_VID_UI_TIMEOUT_LONG}
+    Select From List When Enabled    //select[@prompt='Select Subscriber Name']    ${customer_name}   timeout=${GLOBAL_VID_UI_TIMEOUT_LONG}
     Select From List WHen Enabled    //select[@prompt='Select Service Type']     ${service_type}   timeout=${GLOBAL_VID_UI_TIMEOUT_LONG}
     Click On Button When Enabled    //div[@class = 'buttonRow']/button[text() = 'Confirm']
- 	Wait Until Element Contains    xpath=//div[@ng-controller= 'msoCommitController']/pre[@class = 'log ng-binding']    requestId    timeout=${GLOBAL_VID_UI_TIMEOUT_LONG}
+ 	Wait Until Element Contains    xpath=//div[@ng-controller= 'msoCommitController']/pre[@class = 'log ng-binding']    requestState    timeout=${GLOBAL_VID_UI_TIMEOUT_LONG}
+ 	Page Should Contain    "requestState": "COMPLETE"
     ${response text}=    Get Text    xpath=//div[@ng-controller= 'msoCommitController']/pre[@class = 'log ng-binding']
     Click On Button When Enabled    //div[@class = 'buttonRow']/button[text() = 'Close']
     ${request_id}=    Parse Request Id    ${response text}
diff --git a/robot/resources/vid/create_vid_vnf.robot b/robot/resources/vid/create_vid_vnf.robot
index 2db2421..4173762 100644
--- a/robot/resources/vid/create_vid_vnf.robot
+++ b/robot/resources/vid/create_vid_vnf.robot
@@ -14,22 +14,24 @@
 
 Create VID VNF
     [Documentation]    Creates a VNF instance using VID for passed instance id with the passed service instance name
-    [Arguments]    ${service_instance_id}    ${service_instance_name}    ${product_family}    ${lcp_region}    ${tenant}   ${vnf_type}
+    [Arguments]    ${service_instance_id}    ${service_instance_name}    ${product_family}    ${lcp_region}    ${tenant}   ${vnf_type}   ${customer}
     Go To VID HOME
     Click Link       xpath=//div[@heading = 'Search for Existing Service Instances']/a
     Wait Until Page Contains    Please search by    timeout=${GLOBAL_VID_UI_TIMEOUT_MEDIUM}
 
     # If we don't wait for this control to be enabled, the submit results in a 'not found' pop-up (UnexpectedAlertPresentException)
-    Input Text When Enabled    //input[@name='selectedServiceInstance']    ${service_instance_id}
-    Select From List By Label    //select[@ng-model='selectedserviceinstancetype']    Service Instance Id
+    #Input Text When Enabled    //input[@name='selectedServiceInstance']    ${service_instance_id}
+    #Select From List By Label    //select[@ng-model='selectedserviceinstancetype']    Service Instance Id
+    Select From List By Label    //select[@ng-model='selectedCustomer']    ${customer}
     Click Button    button=Submit
     Wait Until Page Contains Element    link=View/Edit    timeout=${GLOBAL_VID_UI_TIMEOUT_MEDIUM}
     Click Element     xpath=//a[contains(text(), 'View/Edit')]
     Wait Until Page Contains    View/Edit Service Instance     timeout=${GLOBAL_VID_UI_TIMEOUT_MEDIUM}
     Click Element    button=Add VNF
-
+    #01681d02-2304-4c91-ab2d 0
     # This is where firefox breaks. Th elink never becomes visible when run with the script.
-    Click Element    link=${vnf_type}
+    ${dataTestsId}=    Catenate   AddVNFOption-${vnf_type}
+    Click Element    xpath=//a[contains(text(), '${vnf_type}')]
     Wait Until Page Contains Element    xpath=//input[@parameter-id='instanceName']    ${GLOBAL_VID_UI_TIMEOUT_SHORT}
     Wait Until Element Is Enabled    xpath=//input[@parameter-id='instanceName']    ${GLOBAL_VID_UI_TIMEOUT_SHORT}
 
@@ -41,7 +43,7 @@
     Select From List By Label    xpath=//select[@parameter-id='lcpRegion']    ${lcp_region}
     Select From List By Label    xpath=//select[@parameter-id='tenant']    ${tenant}
     Click Element    button=Confirm
- 	Wait Until Element Contains    xpath=//div[@ng-controller= 'msoCommitController']/pre[@class = 'log ng-binding']    Status: OK (200)    timeout=${GLOBAL_VID_UI_TIMEOUT_LONG}
+ 	Wait Until Element Contains    xpath=//div[@ng-controller= 'msoCommitController']/pre[@class = 'log ng-binding']    requestState    timeout=${GLOBAL_VID_UI_TIMEOUT_LONG}
     ${response text}=    Get Text    xpath=//div[@ng-controller= 'msoCommitController']/pre[@class = 'log ng-binding']
  	Should Not Contain    ${response text}    FAILED
     Click Element    button=Close
@@ -79,14 +81,15 @@
     Poll MSO Get Request    ${GLOBAL_MSO_STATUS_PATH}${request_id}   COMPLETE
 
 Create VID VNF module
-    [Arguments]    ${service_instance_id}    ${vf_module_name}    ${lcp_region}    ${TENANT}    ${VNF_TYPE}
+    [Arguments]    ${service_instance_id}    ${vf_module_name}    ${lcp_region}    ${TENANT}    ${VNF_TYPE}   ${customer}   ${vnf_name}
     Go To VID HOME
     Click Link       xpath=//div[@heading = 'Search for Existing Service Instances']/a
     Wait Until Page Contains    Please search by    timeout=${GLOBAL_VID_UI_TIMEOUT_MEDIUM}
     Wait Until Page Contains Element    xpath=//div[@class='statusLine aaiHidden']    timeout=${GLOBAL_VID_UI_TIMEOUT_MEDIUM}
 
      # If we don't wait for this control to be enabled, the submit results in a 'not found' pop-up (UnexpectedAlertPresentException)
-    Input Text When Enabled    //input[@name='selectedServiceInstance']    ${service_instance_id}
+    Select From List By Label    //select[@ng-model='selectedCustomer']    ${customer}
+    ###Input Text When Enabled    //input[@name='selectedServiceInstance']    ${service_instance_id}
     Click Button    button=Submit
     Wait Until Page Contains Element    link=View/Edit    timeout=${GLOBAL_VID_UI_TIMEOUT_MEDIUM}
     Click Element     link=View/Edit
@@ -95,7 +98,7 @@
     #Wait Until Page Contains Element    xpath=//div[@class='statusLine']    timeout=120s
     #Wait Until Element Is Not Visible    xpath=//div[@class='statusLine aaiHidden']    timeout=120s
     #Wait Until Element Is Visible    button=Add VF-Module   timeout=120s
-    Click Element    button=Add VF-Module
+    Click Element     xpath=//div[contains(.,'${vnf_name}')]/div/button[contains(.,'Add VF-Module')]
 
     # This is where firefox breaks. Th elink never becomes visible when run with the script.
     Click Element    link=${vnf_type}
@@ -108,6 +111,7 @@
     Input Text 	  xpath=//input[@parameter-id='instanceName']    ${vf_module_name}
     Select From List By Label    xpath=//select[@parameter-id='lcpRegion']    ${lcp_region}
     Select From List By Label    xpath=//select[@parameter-id='tenant']    ${tenant}
+    Select Checkbox    xpath=//input[@parameter-id='sdncPreload']
     Click Element    button=Confirm
  	Wait Until Element Contains    xpath=//div[@ng-controller= 'msoCommitController']/pre[@class = 'log ng-binding']    requestId    timeout=${GLOBAL_VID_UI_TIMEOUT_LONG}
     ${response text}=    Get Text    xpath=//div[@ng-controller= 'msoCommitController']/pre[@class = 'log ng-binding']
diff --git a/robot/resources/vid/teardown_vid.robot b/robot/resources/vid/teardown_vid.robot
index df40b9e..3a0697e 100644
--- a/robot/resources/vid/teardown_vid.robot
+++ b/robot/resources/vid/teardown_vid.robot
@@ -12,24 +12,29 @@
 *** Variables ***
 ${VID_ENV}            /vid
 ${VID_SERVICE_MODELS_SEARCH_URL}  ${GLOBAL_VID_SERVER_PROTOCOL}://${GLOBAL_INJECTED_VID_IP_ADDR}:${GLOBAL_VID_SERVER_PORT}${VID_ENV}/serviceModels.htm#/instances/services
+${TEARDOWN_STATUS}   FAIL
+
 *** Keywords ***
 
 Teardown VID
     [Documentation]   Teardown the VID This assumes that the any runnign stacks have been torn down
-    [Arguments]    ${service_instance_id}    ${lcp_region}    ${tenant}
+    [Arguments]    ${service_instance_id}    ${lcp_region}    ${tenant}   ${customer}
     Return From Keyword If   len('${service_instance_id}') == 0
     # Keep going to the VID service instance until we get the pop-up alert that there is no service instance
-    Wait Until Keyword Succeeds    300s    1s    Delete VID    ${service_instance_id}    ${lcp_region}    ${tenant}
+    Set Test Variable    ${TEARDOWN_STATUS}    FAIL
+    Wait Until Keyword Succeeds    300s    1s    Delete VID    ${service_instance_id}    ${lcp_region}    ${tenant}   ${customer}
+    Return From Keyword If   '${TEARDOWN_STATUS}' == 'PASS'
+    Fail   ${TEARDOWN_STATUS}
 
 
 Delete VID
     [Documentation]    Teardown the next VID entity that has a Remove icon.
-    [Arguments]    ${service_instance_id}    ${lcp_region}    ${tenant}
+    [Arguments]    ${service_instance_id}    ${lcp_region}    ${tenant}   ${customer}
     # For vLB closed loop, we may have 2 vf modules and the vDNS one needs to be removed first.
     ${remove_order}=    Create List    vDNS_Ete   Vfmodule_Ete
 
     # FAIL status is returned in ${vfmodule} because FAIL are ignored during teardown
-    ${status}    ${vfmodule}=   Run Keyword and Ignore Error   Delete Next VID Entity    ${service_instance_id}    ${lcp_region}    ${tenant}   ${remove_order}
+    ${status}    ${vfmodule}=   Run Keyword and Ignore Error   Delete Next VID Entity    ${service_instance_id}    ${lcp_region}    ${tenant}   ${remove_order}   ${customer}
     Return From Keyword If    '${status}' == 'FAIL'
     Return From Keyword If    '${vfmodule}' == 'FAIL'
     # After tearing down a VF module, execute the reverse HB for it to remove the references from A&AI
@@ -38,7 +43,7 @@
 
 Delete Next VID Entity
     [Documentation]    Teardown the next VID entity that has a Remove icon.
-    [Arguments]    ${service_instance_id}    ${lcp_region}    ${tenant}   ${remove_order}
+    [Arguments]    ${service_instance_id}    ${lcp_region}    ${tenant}   ${remove_order}   ${customer}
     ${vfmodule}=    Catenate
     Go To    ${VID_SERVICE_MODELS_SEARCH_URL}
     Wait Until Page Contains    Please search by    timeout=${GLOBAL_VID_UI_TIMEOUT_MEDIUM}
@@ -46,14 +51,17 @@
     Wait Until Element Is Not Visible    xpath=//div[@class='statusLine aaiHidden']    timeout=${GLOBAL_VID_UI_TIMEOUT_MEDIUM}
 
     # If we don't wait for this control to be enabled, the submit results in a 'not found' pop-up (UnexpectedAlertPresentException)
-    Input Text When Enabled    //input[@name='selectedServiceInstance']    ${service_instance_id}
+    Select From List By Label    //select[@ng-model='selectedCustomer']    ${customer}
+    Click Button    button=Submit
 
     # When Handle alert detects a pop-up. it will return FAIL and we are done
     # Return from Keyword is required because FAIL is inored during teardown
+    Set Test Variable   ${TEARDOWN_STATUS}   PASS
     ${status}   ${value}   Run Keyword And Ignore Error    Handle Alert
     Return From Keyword If   '${status}' == 'FAIL'   ${status}
     ${status}   ${value}   Run Keyword And Ignore Error    Wait Until Page Contains Element    link=View/Edit    timeout=${GLOBAL_VID_UI_TIMEOUT_MEDIUM}
     Return From Keyword If   '${status}' == 'FAIL'   ${status}
+    Set Test Variable   ${TEARDOWN_STATUS}   FAIL
 
 
     Click Element     link=View/Edit
diff --git a/robot/testsuites/demo.robot b/robot/testsuites/demo.robot
index 74a78d4..4c99f45 100644
--- a/robot/testsuites/demo.robot
+++ b/robot/testsuites/demo.robot
@@ -2,12 +2,18 @@
 Documentation	  Executes the VNF Orchestration Test cases including setup and teardown
 ...
 Library   Collections
+Library    HTTPUtils
 Resource         ../resources/demo_preload.robot
 *** Variables ***
 
 ${VNF_NAME}       DemoVNF
 ${MODULE_NAME}    DemoModuleName
 
+${HB_STACK}
+${HB_SERVICE_INSTANCE_ID}
+${HB_SERVICE}
+
+
 *** Test Cases ***
 Initialize Customer And Models
     [Tags]   InitDemo
@@ -42,3 +48,9 @@
     Delete VNF
     [Teardown]   Teardown VNF
 
+Run Heatbridge
+    [Documentation]
+    ...    Try to run heatbridge
+    [Tags]   heatbridge
+    Execute Heatbridge   ${HB_STACK}   ${HB_SERVICE_INSTANCE_ID}    ${HB_SERVICE}
+
diff --git a/robot/testsuites/health-check.robot b/robot/testsuites/health-check.robot
index d27c38e..ec0748e 100644
--- a/robot/testsuites/health-check.robot
+++ b/robot/testsuites/health-check.robot
@@ -14,6 +14,8 @@
 Resource          ../resources/portal_interface.robot
 Resource          ../resources/mr_interface.robot
 Resource          ../resources/aaf_interface.robot
+Resource          ../resources/msb_interface.robot
+Resource          ../resources/clamp_interface.robot
 
 *** Test Cases ***   
 Basic DCAE Health Check
@@ -55,3 +57,83 @@
 Basic VID Health Check
     [Tags]    health
 	Run VID Health Check
+
+Basic Microservice Bus Health Check
+    [Tags]    health
+    Run MSB Health Check
+
+Basic CLAMP Health Check
+    [Tags]    health
+    Run CLAMP Health Check
+
+catalog API Health Check
+     [Tags]    health
+     Run MSB Get Request  /api/catalog/v1/swagger.json
+
+emsdriver API Health Check
+     [Tags]    health
+     Run MSB Get Request  /api/emsdriver/v1/swagger.json
+
+gvnfmdriver API Health Check
+     [Tags]    health
+     Run MSB Get Request  /api/gvnfmdriver/v1/swagger.json
+
+huaweivnfmdriver API Health Check
+     [Tags]    health
+     Run MSB Get Request  /api/huaweivnfmdriver/v1/swagger.json
+
+multicloud API Health Check
+     [Tags]    health
+     Run MSB Get Request  /api/multicloud/v0/swagger.json
+
+multicloud-ocata API Health Check
+     [Tags]    health
+     Run MSB Get Request  /api/multicloud-ocata/v0/swagger.json
+
+multicloud-titanium_cloud API Health Check
+     [Tags]    health
+     Run MSB Get Request  /api/multicloud-titanium_cloud/v0/swagger.json
+
+multicloud-vio API Health Check
+     [Tags]    health
+     Run MSB Get Request  /api/multicloud-vio/v0/swagger.json
+
+nokiavnfmdriver API Health Check
+     [Tags]    health
+     Run MSB Get Request  /api/nokiavnfmdriver/v1/swagger.json
+
+nslcm API Health Check
+     [Tags]    health
+     Run MSB Get Request  /api/nslcm/v1/swagger.json
+
+resmgr API Health Check
+     [Tags]    health
+     Run MSB Get Request  /api/resmgr/v1/swagger.json
+
+usecaseui-gui API Health Check
+     [Tags]    health
+     Run MSB Get Request  /iui/usecase-ui/
+
+vnflcm API Health Check
+     [Tags]    health
+     Run MSB Get Request  /api/vnflcm/v1/swagger.json
+
+vnfmgr API Health Check
+     [Tags]    health
+     Run MSB Get Request  /api/vnfmgr/v1/swagger.json
+
+vnfres API Health Check
+     [Tags]    health
+     Run MSB Get Request  /api/vnfres/v1/swagger.json
+
+workflow API Health Check
+     [Tags]    health
+     Run MSB Get Request  /api/workflow/v1/swagger.json
+
+ztesdncdriver API Health Check
+     [Tags]    health
+     Run MSB Get Request  /api/ztesdncdriver/v1/swagger.json
+
+ztevmanagerdriver API Health Check
+     [Tags]    health
+     Run MSB Get Request  /api/ztevmanagerdriver/v1/swagger.json
diff --git a/robot/testsuites/model-distribution.robot b/robot/testsuites/model-distribution.robot
index 5f0c597..ad51202 100644
--- a/robot/testsuites/model-distribution.robot
+++ b/robot/testsuites/model-distribution.robot
@@ -18,7 +18,5 @@
     [Tags]    ete    distribute
 Distribute vVG Model    vVG
     [Tags]    ete    distribute
-Distribute vIMS Model    vIMS
-    [Tags]    ete    distribute
 Distribute vCPE Model    vCPE
     [Tags]    ete    distribute
\ No newline at end of file
diff --git a/robot/testsuites/update_onap_page.robot b/robot/testsuites/update_onap_page.robot
index d4eb616..b7c3b28 100644
--- a/robot/testsuites/update_onap_page.robot
+++ b/robot/testsuites/update_onap_page.robot
@@ -8,12 +8,12 @@
 Resource          ../resources/openstack/nova_interface.robot
 
 
-Test Timeout    1 minutes
+Test Timeout    5 minutes
 
 *** Variables ***
 ${URLS_HTML_TEMPLATE}   robot/assets/templates/web/index.html.template
 
-
+${HOSTS_PREFIX}   vm
 ${WEB_USER}       test
 ${WEB_PASSWORD}
 
@@ -29,19 +29,22 @@
     ${server_map}=    Get Openstack Servers    auth
     ${oam_ip_map}=   Create Dictionary
     Set To Dictionary    ${oam_ip_map}   10.0.0.1=onapdns
-    Set To Dictionary    ${oam_ip_map}   10.0.1.1=aai
-    Set To Dictionary    ${oam_ip_map}   10.0.2.1=appc
-    Set To Dictionary    ${oam_ip_map}   10.0.3.1=sdc
-    Set To Dictionary    ${oam_ip_map}   10.0.4.1=dcae_controller
+    Set To Dictionary    ${oam_ip_map}   ${GLOBAL_INJECTED_AAI1_IP_ADDR}=aai1
+    Set To Dictionary    ${oam_ip_map}   ${GLOBAL_INJECTED_AAI2_IP_ADDR}=aai2
+    Set To Dictionary    ${oam_ip_map}   ${GLOBAL_INJECTED_APPC_IP_ADDR}=appc
+    Set To Dictionary    ${oam_ip_map}   ${GLOBAL_INJECTED_DCAE_IP_ADDR}=dcae_controller
+    Set To Dictionary    ${oam_ip_map}   ${GLOBAL_INJECTED_SO_IP_ADDR}=mso
+    Set To Dictionary    ${oam_ip_map}   ${GLOBAL_INJECTED_MR_IP_ADDR}=message_router
+    Set To Dictionary    ${oam_ip_map}   ${GLOBAL_INJECTED_POLICY_IP_ADDR}=policy
+    Set To Dictionary    ${oam_ip_map}   ${GLOBAL_INJECTED_PORTAL_IP_ADDR}=portal
+    Set To Dictionary    ${oam_ip_map}   ${GLOBAL_INJECTED_SDC_IP_ADDR}=sdc
+    Set To Dictionary    ${oam_ip_map}   ${GLOBAL_INJECTED_SDNC_IP_ADDR}=sdnc
+    Set To Dictionary    ${oam_ip_map}   ${GLOBAL_INJECTED_OPENO_IP_ADDR}=openo
+    Set To Dictionary    ${oam_ip_map}   ${GLOBAL_INJECTED_CLAMP_IP_ADDR}=clamp
+    Set To Dictionary    ${oam_ip_map}   ${GLOBAL_INJECTED_VID_IP_ADDR}=vid
     Set To Dictionary    ${oam_ip_map}   10.0.4.105=dcae_cdap
     Set To Dictionary    ${oam_ip_map}   10.0.4.102=dcae_coll
-    Set To Dictionary    ${oam_ip_map}   10.0.5.1=mso
-    Set To Dictionary    ${oam_ip_map}   10.0.6.1=policy
-    Set To Dictionary    ${oam_ip_map}   10.0.7.1=sdnc
-    Set To Dictionary    ${oam_ip_map}   10.0.8.1=vid
-    Set To Dictionary    ${oam_ip_map}   10.0.9.1=portal
     Set To Dictionary    ${oam_ip_map}   10.0.10.1=robot
-    Set To Dictionary    ${oam_ip_map}   10.0.11.1=message_router
 
     ${values}=   Create Dictionary
     ${keys}=    Get Dictionary Keys    ${oam_ip_map}
@@ -50,6 +53,17 @@
     \    Set Public Ip    ${server_map}    ${oam_ip}   ${value_name}   ${values}
     Log    ${values}
     Run Keyword If   '${WEB_PASSWORD}' != ''   Create File   ${CREDENTIALS_FILE}   ${WEB_USER}:${WEB_PASSWORD}
+    Set To Dictionary    ${values}   GLOBAL_INJECTED_ARTIFACTS_VERSION=${GLOBAL_INJECTED_ARTIFACTS_VERSION}
+    Set To Dictionary    ${values}   GLOBAL_INJECTED_NETWORK=${GLOBAL_INJECTED_NETWORK}
+    Set To Dictionary    ${values}   GLOBAL_INJECTED_NEXUS_DOCKER_REPO=${GLOBAL_INJECTED_NEXUS_DOCKER_REPO}
+    Set To Dictionary    ${values}   GLOBAL_INJECTED_NEXUS_REPO=${GLOBAL_INJECTED_NEXUS_REPO}
+    Set To Dictionary    ${values}   GLOBAL_INJECTED_OPENSTACK_TENANT_ID=${GLOBAL_INJECTED_OPENSTACK_TENANT_ID}
+    Set To Dictionary    ${values}   GLOBAL_INJECTED_REGION=${GLOBAL_INJECTED_REGION}
+    Set To Dictionary    ${values}   GLOBAL_INJECTED_KEYSTONE=${GLOBAL_INJECTED_KEYSTONE}
+    Set To Dictionary    ${values}   GLOBAL_INJECTED_VM_FLAVOR=${GLOBAL_INJECTED_VM_FLAVOR}
+    Set To Dictionary    ${values}   GLOBAL_INJECTED_VM_IMAGE_NAME=${GLOBAL_INJECTED_VM_IMAGE_NAME}
+    Set To Dictionary    ${values}   GLOBAL_INJECTED_PUBLIC_NET_ID=${GLOBAL_INJECTED_PUBLIC_NET_ID}
+    Set To Dictionary    ${values}   prefix=${HOSTS_PREFIX}
     Create File From Template   ${URLS_HTML_TEMPLATE}   ${URLS_HTML}   ${values}
 
 *** Keywords ***
@@ -70,12 +84,22 @@
     ${servers}   Get Dictionary Values    ${server_map}
     :for   ${server}   in   @{servers}
     \    ${status}   ${public_ip}   Run Keyword And Ignore Error   Search Addresses   ${server}   ${oam_ip}
-    \    Return From Keyword If   '${status}' == 'PASS'   ${public_ip}
+    \    Return From Keyword If   '${status}'=='PASS'   ${public_ip}
     Fail  ${oam_ip} Server Not Found
 
 Search Addresses
     [Arguments]   ${server}   ${oam_ip}
     ${addresses}   Get From Dictionary   ${server}   addresses
+    ${status}   ${public_ip}=   Run Keyword And Ignore Error   Find Rackspace   ${addresses}   ${oam_ip}
+    Return From Keyword If   '${status}'=='PASS'   ${public_ip}
+    ${status}   ${public_ip}=   Run Keyword And Ignore Error   Find Openstack   ${addresses}   ${oam_ip}
+    Return From Keyword If   '${status}'=='PASS'   ${public_ip}
+    ${status}   ${public_ip}=   Run Keyword And Ignore Error   Find Openstack 2   ${addresses}   ${oam_ip}
+    Return From Keyword If   '${status}'=='PASS'   ${public_ip}
+    Fail  ${oam_ip} Server Not Found
+
+Find Rackspace
+    [Arguments]   ${addresses}   ${oam_ip}
     ${public_ips}   Get From Dictionary   ${addresses}   public
     ${public_ip}=   Get V4 IP   ${public_ips}
     ${oam_ips}   Get From Dictionary   ${addresses}   ${GLOBAL_INJECTED_NETWORK}
@@ -83,10 +107,43 @@
     Return From Keyword If   '${this_oam_ip}' == '${oam_ip}'   ${public_ip}
     Fail  ${oam_ip} Server Not Found
 
+Find Openstack
+    [Arguments]   ${addresses}   ${oam_ip}
+    ${public_ip}=   Get V4 IP Openstack   ${addresses}   external
+    ${this_oam_ip}=    Get V4 IP Openstack   ${addresses}   ${GLOBAL_INJECTED_NETWORK}
+    Return From Keyword If   '${this_oam_ip}'=='${oam_ip}'   ${public_ip}
+    Fail  ${oam_ip} Server Not Found
+
+Find Openstack 2
+    [Arguments]   ${addresses}   ${oam_ip}
+    ${ipmaps}=   Get From DIctionary   ${addresses}   ${GLOBAL_INJECTED_NETWORK}
+    ${public_ip}=   Get V4 IP Openstack 2  ${ipmaps}   floating
+    ${this_oam_ip}=    Get V4 IP Openstack 2   ${ipmaps}   fixed
+    Return From Keyword If   '${this_oam_ip}'=='${oam_ip}'   ${public_ip}
+    Fail  ${oam_ip} Server Not Found
+
 Get V4 IP
     [Arguments]   ${ipmaps}
     :for   ${ipmap}   in   @{ipmaps}
     \    ${ip}   Get From Dictionary   ${ipmap}   addr
     \    ${version}   Get From Dictionary   ${ipmap}   version
     \    Return from Keyword if   '${version}' == '4'   ${ip}
+    Fail  No Version 4 IP
+
+Get V4 IP Openstack
+    [Arguments]   ${addresses}   ${testtype}
+    ${ipmaps}=   Get From Dictionary   ${addresses}   ${testtype}
+    :for   ${ipmap}   in   @{ipmaps}
+    \    ${ip}   Get From Dictionary   ${ipmap}   addr
+    \    ${version}   Get From Dictionary   ${ipmap}   version
+    \    Return from Keyword if   '${version}'=='4'   ${ip}
+    Fail  No Version 4 IP
+
+Get V4 IP Openstack 2
+    [Arguments]   ${ipmaps}   ${testtype}
+    :for   ${ipmap}   in   @{ipmaps}
+    \    ${type}   Get From Dictionary   ${ipmap}   OS-EXT-IPS:type
+    \    ${ip}   Get From Dictionary   ${ipmap}   addr
+    \    ${version}   Get From Dictionary   ${ipmap}   version
+    \    Return from Keyword if   '${version}'=='4' and '${type}'=='${testtype}'   ${ip}
     Fail  No Version 4 IP
\ No newline at end of file
diff --git a/robot/testsuites/vnf-orchestration.robot b/robot/testsuites/vnf-orchestration.robot
index d7ae16f..2c340a3 100644
--- a/robot/testsuites/vnf-orchestration.robot
+++ b/robot/testsuites/vnf-orchestration.robot
@@ -9,12 +9,13 @@
 Test Teardown         Teardown VNF
 
 *** Test Cases ***              CUSTOMER           SERVICE   PRODUCT_FAMILY  TENANT
-Instantiate Virtual Firewall        ETE_Customer    vFW      vFW             ${TENANT_NAME}
-    [Tags]    ete    instantiate
 Instantiate Virtual DNS             ETE_Customer    vLB      vLB             ${TENANT_NAME}
     [Tags]    ete    instantiate
 Instantiate Virtual Volume Group    ETE_Customer    vVG      vVG             ${TENANT_NAME}
     [Tags]    ete    instantiate
+Instantiate Virtual FirewallCL      ETE_Customer    vFWCL      vFWCL         ${TENANT_NAME}
+    [Tags]    ete    instantiate
+Instantiate Virtual Firewall        ETE_Customer    vFW      vFW             ${TENANT_NAME}
 
 
 
diff --git a/runTags.sh b/runTags.sh
index e8a00b7..08ffe53 100644
--- a/runTags.sh
+++ b/runTags.sh
@@ -86,6 +86,7 @@
 
 cd /var/opt/${INSTALL_NAME}
 python -m robot.run -L ${LOG_LEVEL} -d ${OUTPUT_FOLDER} ${VARIABLEFILES} ${VARIABLES} ${LISTENERS} -P ${ROBOT_LIBS} ${ROBOT_TAGS} $(pwd)
+RET_CODE=$?
 
 # Stop Xvfb we started earlier
 # select it from list of possible Xvfb pids running because
@@ -98,3 +99,5 @@
 		kill -9 $P
 	fi
 done
+
+exit $RET_CODE
diff --git a/version.properties b/version.properties
index 443775f..1673e49 100644
--- a/version.properties
+++ b/version.properties
@@ -3,7 +3,7 @@
 # because they are used in Jenkins, whose plug-in doesn't support
 
 major=1
-minor=1
+minor=2
 patch=0
 
 base_version=${major}.${minor}.${patch}