diff --git a/dashboard/README.md b/dashboard/README.md
index db15c9d..70161b7 100755
--- a/dashboard/README.md
+++ b/dashboard/README.md
@@ -1,4 +1 @@
-# son-emu Dashboard
-
-A simple web-based dashboard that polls the REST API and displays running services etc. It does not do much more than son-cli but it looks nicer and improves the visualization of the emulator state for live demos.
-
+dashboard is moved to src/emuvim/dashboard so it can be part of the python-based installation script
diff --git a/dashboard/dashboard b/dashboard/dashboard
new file mode 120000
index 0000000..fa6d186
--- /dev/null
+++ b/dashboard/dashboard
@@ -0,0 +1 @@
+../src/emuvim/dashboard/
\ No newline at end of file
diff --git a/misc/sonata-demo-service.son b/misc/sonata-demo-service.son
old mode 100644
new mode 100755
index 248f88c..bbe46c2
--- a/misc/sonata-demo-service.son
+++ b/misc/sonata-demo-service.son
Binary files differ
diff --git a/setup.py b/setup.py
index ce1c47f..186356c 100755
--- a/setup.py
+++ b/setup.py
@@ -38,7 +38,8 @@
       packages=find_packages('src'),
       include_package_data=True,
       package_data= {
-              'emuvim.api.sonata': ['*.yml']
+              'emuvim.api.sonata': ['*.yml'],
+              'emuvim.dashboard' : ['*.html', 'css/*.css','img/*','js/*.js']
       },
       install_requires=[
           'pyaml',
diff --git a/src/emuvim/api/rest/rest_api_endpoint.py b/src/emuvim/api/rest/rest_api_endpoint.py
index fc48a33..71f87b9 100755
--- a/src/emuvim/api/rest/rest_api_endpoint.py
+++ b/src/emuvim/api/rest/rest_api_endpoint.py
@@ -25,10 +25,12 @@
 acknowledge the contributions of their colleagues of the SONATA
 partner consortium (www.sonata-nfv.eu).
 """
+
 import logging
 import threading
 from flask import Flask
 from flask_restful import Api
+#from gevent.wsgi import WSGIServer
 
 # need to import total module to set its global variable dcs
 import compute
@@ -41,6 +43,9 @@
 import monitor
 from monitor import MonitorInterfaceAction, MonitorFlowAction, MonitorLinkAction, MonitorSkewAction
 
+import pkg_resources
+from os import path
+
 logging.basicConfig(level=logging.INFO)
 
 
@@ -56,7 +61,12 @@
         self.port = port
 
         # setup Flask
-        self.app = Flask(__name__)
+        # find directory of dashboard files
+        dashboard_file = pkg_resources.resource_filename('emuvim.dashboard', "index.html")
+        dashboard_dir = path.dirname(dashboard_file)
+        logging.info("Started emu dashboard: {0}".format(dashboard_dir))
+
+        self.app = Flask(__name__, static_folder=dashboard_dir, static_url_path='/dashboard')
         self.api = Api(self.app)
 
         # setup endpoints
@@ -95,6 +105,7 @@
 
         logging.debug("Created API endpoint %s(%s:%d)" % (self.__class__.__name__, self.ip, self.port))
 
+
     def connectDatacenter(self, dc):
         compute.dcs[dc.label] = dc
         logging.info(
@@ -115,3 +126,6 @@
 
     def _start_flask(self):
         self.app.run(self.ip, self.port, debug=True, use_reloader=False)
+        #this should be a more production-fit http-server
+        #http_server = WSGIServer((self.ip, self.port), self.app)
+        #http_server.serve_forever()
diff --git a/src/emuvim/api/sonata/__init__.py b/src/emuvim/api/sonata/__init__.py
index 434ec1c..613191c 100755
--- a/src/emuvim/api/sonata/__init__.py
+++ b/src/emuvim/api/sonata/__init__.py
@@ -46,11 +46,12 @@
     topology.
     """
 
-    def __init__(self, listenip, port, deploy_sap=False):
+    def __init__(self, listenip, port, deploy_sap=False, docker_management=True):
         self.dcs = {}
         self.ip = listenip
         self.port = port
         dgk.DEPLOY_SAP = deploy_sap
+        dgk.USE_DOCKER_MGMT = docker_management
         logging.debug("Created API endpoint %s" % self)
 
     def __repr__(self):
diff --git a/src/emuvim/api/sonata/dummygatekeeper.py b/src/emuvim/api/sonata/dummygatekeeper.py
index 93d5cda..59960a9 100755
--- a/src/emuvim/api/sonata/dummygatekeeper.py
+++ b/src/emuvim/api/sonata/dummygatekeeper.py
@@ -45,6 +45,8 @@
 from collections import defaultdict
 import pkg_resources
 from subprocess import Popen
+from random import randint
+import ipaddress
 
 logging.basicConfig()
 LOG = logging.getLogger("sonata-dummy-gatekeeper")
@@ -71,6 +73,25 @@
 # flag to indicate if we use bidirectional forwarding rules in the automatic chaining process
 BIDIRECTIONAL_CHAIN = False
 
+# override the management interfaces in the descriptors with default docker0 interfaces in the containers
+USE_DOCKER_MGMT = True
+
+def generate_subnets(prefix, base, subnet_size=50, mask=24):
+    # Generate a list of ipaddress in subnets
+    r = list()
+    for net in range(base, base + subnet_size):
+        subnet = "{0}.{1}.0/{2}".format(prefix, net, mask)
+        r.append(ipaddress.ip_network(unicode(subnet)))
+    return r
+# private subnet definitions for the generated interfaces
+# 10.10.xxx.0/24
+SAP_SUBNETS = generate_subnets('10.10', 0, subnet_size=50, mask=24)
+# 10.20.xxx.0/24
+ELAN_SUBNETS = generate_subnets('10.20', 0, subnet_size=50, mask=24)
+# 10.30.xxx.0/30
+ELINE_SUBNETS = generate_subnets('10.30', 0, subnet_size=50, mask=30)
+
+
 class Gatekeeper(object):
 
     def __init__(self):
@@ -113,14 +134,14 @@
         self.manifest = None
         self.nsd = None
         self.vnfds = dict()
+        self.saps = dict()
+        self.saps_ext = list()
+        self.saps_int = list()
         self.local_docker_files = dict()
         self.remote_docker_image_urls = dict()
         self.instances = dict()
         self.vnf_name2docker_name = dict()
-        self.sap_identifiers = set()
-        # lets generate a set of subnet configurations used for e-line chaining setup
-        self.eline_subnets_src = generate_subnet_strings(50, start=200, subnet_size=24, ip=1)
-        self.eline_subnets_dst = generate_subnet_strings(50, start=200, subnet_size=24, ip=2)
+        self.vnf_id2vnf_name = dict()
 
     def onboard(self):
         """
@@ -135,6 +156,11 @@
         self._load_vnfd()
         if DEPLOY_SAP:
             self._load_saps()
+        # create dict to translate vnf names
+        self.vnf_id2vnf_name = defaultdict(lambda: "NotExistingNode",
+                                           reduce(lambda x, y: dict(x, **y),
+                                                  map(lambda d: {d["vnf_id"]: d["vnf_name"]},
+                                                      self.nsd["network_functions"])))
         # 3. prepare container images (e.g. download or build Dockerfile)
         if BUILD_DOCKERFILE:
             self._load_docker_files()
@@ -160,118 +186,40 @@
         self.instances[instance_uuid] = dict()
         self.instances[instance_uuid]["vnf_instances"] = list()
 
-        # 2. Configure the chaining of the network functions (currently only E-Line and E-LAN links supported)
-        vnf_id2vnf_name = defaultdict(lambda: "NotExistingNode",
-                                      reduce(lambda x, y: dict(x, **y),
-                                             map(lambda d: {d["vnf_id"]: d["vnf_name"]},
-                                                 self.nsd["network_functions"])))
-
-        # 3. compute placement of this service instance (adds DC names to VNFDs)
+        # 2. compute placement of this service instance (adds DC names to VNFDs)
         if not GK_STANDALONE_MODE:
             #self._calculate_placement(FirstDcPlacement)
-            self._calculate_placement(RoundRobinDcPlacement)
-        # iterate over all vnfds that we have to start
+            self._calculate_placement(RoundRobinDcPlacementWithSAPs)
+
+        # 3. start all vnfds that we have in the service (except SAPs)
         for vnfd in self.vnfds.itervalues():
             vnfi = None
             if not GK_STANDALONE_MODE:
                 vnfi = self._start_vnfd(vnfd)
             self.instances[instance_uuid]["vnf_instances"].append(vnfi)
 
+        # 4. start all SAPs in the service
+        for sap in self.saps:
+            self._start_sap(self.saps[sap], instance_uuid)
+
+        # 5. Deploy E-Line and E_LAN links
         if "virtual_links" in self.nsd:
             vlinks = self.nsd["virtual_links"]
-            fwd_links = self.nsd["forwarding_graphs"][0]["constituent_virtual_links"]
-            eline_fwd_links = [l for l in vlinks if (l["id"] in fwd_links) and (l["connectivity_type"] == "E-Line")]
-            elan_fwd_links = [l for l in vlinks if (l["id"] in fwd_links) and (l["connectivity_type"] == "E-LAN")]
+            # constituent virtual links are not checked
+            #fwd_links = self.nsd["forwarding_graphs"][0]["constituent_virtual_links"]
+            eline_fwd_links = [l for l in vlinks if (l["connectivity_type"] == "E-Line")]
+            elan_fwd_links = [l for l in vlinks if (l["connectivity_type"] == "E-LAN")]
 
             GK.net.deployed_elines.extend(eline_fwd_links)
             GK.net.deployed_elans.extend(elan_fwd_links)
 
-            # 4a. deploy E-Line links
-            # cookie is used as identifier for the flowrules installed by the dummygatekeeper
-            # eg. different services get a unique cookie for their flowrules
-            cookie = 1
-            for link in eline_fwd_links:
-                src_id, src_if_name = link["connection_points_reference"][0].split(":")
-                dst_id, dst_if_name = link["connection_points_reference"][1].split(":")
+            # 5a. deploy E-Line links
+            self._connect_elines(eline_fwd_links, instance_uuid)
 
-                # check if there is a SAP in the link
-                if src_id in self.sap_identifiers:
-                    src_docker_name = "{0}_{1}".format(src_id, src_if_name)
-                    src_id = src_docker_name
-                else:
-                    src_docker_name = src_id
+            # 5b. deploy E-LAN links
+            self._connect_elans(elan_fwd_links, instance_uuid)
 
-                if dst_id in self.sap_identifiers:
-                    dst_docker_name = "{0}_{1}".format(dst_id, dst_if_name)
-                    dst_id = dst_docker_name
-                else:
-                    dst_docker_name = dst_id
-
-                src_name = vnf_id2vnf_name[src_id]
-                dst_name = vnf_id2vnf_name[dst_id]
-
-                LOG.debug(
-                    "Setting up E-Line link. %s(%s:%s) -> %s(%s:%s)" % (
-                        src_name, src_id, src_if_name, dst_name, dst_id, dst_if_name))
-
-                if (src_name in self.vnfds) and (dst_name in self.vnfds):
-                    network = self.vnfds[src_name].get("dc").net  # there should be a cleaner way to find the DCNetwork
-                    LOG.debug(src_docker_name)
-                    ret = network.setChain(
-                        src_docker_name, dst_docker_name,
-                        vnf_src_interface=src_if_name, vnf_dst_interface=dst_if_name,
-                        bidirectional=BIDIRECTIONAL_CHAIN, cmd="add-flow", cookie=cookie, priority=10)
-
-                    # re-configure the VNFs IP assignment and ensure that a new subnet is used for each E-Link
-                    src_vnfi = self._get_vnf_instance(instance_uuid, src_name)
-                    if src_vnfi is not None:
-                        self._vnf_reconfigure_network(src_vnfi, src_if_name, self.eline_subnets_src.pop(0))
-                    dst_vnfi = self._get_vnf_instance(instance_uuid, dst_name)
-                    if dst_vnfi is not None:
-                        self._vnf_reconfigure_network(dst_vnfi, dst_if_name, self.eline_subnets_dst.pop(0))
-
-            # 4b. deploy E-LAN links
-            base = 10
-            for link in elan_fwd_links:
-
-                elan_vnf_list=[]
-
-                # generate lan ip address
-                ip = 1
-                for intf in link["connection_points_reference"]:
-                    ip_address = generate_lan_string("10.0", base, subnet_size=24, ip=ip)
-                    vnf_id, intf_name = intf.split(":")
-                    if vnf_id in self.sap_identifiers:
-                        src_docker_name = "{0}_{1}".format(vnf_id, intf_name)
-                        vnf_id = src_docker_name
-                    else:
-                        src_docker_name = vnf_id
-                    vnf_name = vnf_id2vnf_name[vnf_id]
-                    LOG.debug(
-                        "Setting up E-LAN link. %s(%s:%s) -> %s" % (
-                            vnf_name, vnf_id, intf_name, ip_address))
-
-                    if vnf_name in self.vnfds:
-                        # re-configure the VNFs IP assignment and ensure that a new subnet is used for each E-LAN
-                        # E-LAN relies on the learning switch capability of Ryu which has to be turned on in the topology
-                        # (DCNetwork(controller=RemoteController, enable_learning=True)), so no explicit chaining is necessary.
-                        vnfi = self._get_vnf_instance(instance_uuid, vnf_name)
-                        if vnfi is not None:
-                            self._vnf_reconfigure_network(vnfi, intf_name, ip_address)
-                            # increase for the next ip address on this E-LAN
-                            ip += 1
-
-                            # add this vnf and interface to the E-LAN for tagging
-                            network = self.vnfds[vnf_name].get("dc").net  # there should be a cleaner way to find the DCNetwork
-                            elan_vnf_list.append({'name':src_docker_name,'interface':intf_name})
-
-
-                # install the VLAN tags for this E-LAN
-                network.setLAN(elan_vnf_list)
-                # increase the base ip address for the next E-LAN
-                base += 1
-
-        # 5. run the emulator specific entrypoint scripts in the VNFIs of this service instance
+        # 6. run the emulator specific entrypoint scripts in the VNFIs of this service instance
         self._trigger_emulator_start_scripts_in_vnfis(self.instances[instance_uuid]["vnf_instances"])
 
         LOG.info("Service started. Instance id: %r" % instance_uuid)
@@ -345,6 +293,28 @@
             mem_lim = int(mem_limit)
             cpu_period, cpu_quota = self._calculate_cpu_cfs_values(float(cpu_bw))
 
+            vnf_name2id = defaultdict(lambda: "NotExistingNode",
+                                      reduce(lambda x, y: dict(x, **y),
+                                             map(lambda d: {d["vnf_name"]: d["vnf_id"]},
+                                                 self.nsd["network_functions"])))
+
+            # check if we need to deploy the management ports (defined as type:management both on in the vnfd and nsd)
+            intfs = vnfd.get("connection_points", [])
+            mgmt_intf_names = []
+            if USE_DOCKER_MGMT:
+                vnf_id = vnf_name2id[vnf_name]
+                mgmt_intfs = [vnf_id + ':' + intf['id'] for intf in intfs if intf.get('type') == 'management']
+                # check if any of these management interfaces are used in a management-type network in the nsd
+                for nsd_intf_name in mgmt_intfs:
+                    vlinks = [ l["connection_points_reference"] for l in self.nsd.get("virtual_links", [])]
+                    for link in vlinks:
+                        if nsd_intf_name in link and self.check_mgmt_interface(link):
+                            # this is indeed a management interface and can be skipped
+                            vnf_id, vnf_interface, vnf_sap_docker_name = parse_interface(nsd_intf_name)
+                            found_interfaces = [intf for intf in intfs if intf.get('id') == vnf_interface]
+                            intfs.remove(found_interfaces[0])
+                            mgmt_intf_names.append(vnf_interface)
+
             # 4. generate the volume paths for the docker container
             volumes=list()
             # a volume to extract log files
@@ -359,17 +329,11 @@
 
             # 5. do the dc.startCompute(name="foobar") call to run the container
             # TODO consider flavors, and other annotations
-            intfs = vnfd.get("connection_points")
-
             # TODO: get all vnf id's from the nsd for this vnfd and use those as dockername
             # use the vnf_id in the nsd as docker name
             # so deployed containers can be easily mapped back to the nsd
-            vnf_name2id = defaultdict(lambda: "NotExistingNode",
-                                          reduce(lambda x, y: dict(x, **y),
-                                                 map(lambda d: {d["vnf_name"]: d["vnf_id"]},
-                                                     self.nsd["network_functions"])))
+
             self.vnf_name2docker_name[vnf_name] = vnf_name2id[vnf_name]
-            # self.vnf_name2docker_name[vnf_name] = GK.get_next_vnf_name()
 
             LOG.info("Starting %r as %r in DC %r" % (vnf_name, self.vnf_name2docker_name[vnf_name], vnfd.get("dc")))
             LOG.debug("Interfaces for %r: %r" % (vnf_name, intfs))
@@ -383,6 +347,12 @@
                     cpuset=cpu_list,
                     mem_limit=mem_lim,
                     volumes=volumes)
+
+            # rename the docker0 interfaces (eth0) to the management port name defined in the VNFD
+            if USE_DOCKER_MGMT:
+                for intf_name in mgmt_intf_names:
+                    self._vnf_reconfigure_network(vnfi, 'eth0', new_name=intf_name)
+
             return vnfi
 
     def _stop_vnfi(self, vnfi):
@@ -412,25 +382,35 @@
         for vnfi in self.instances[instance_uuid]["vnf_instances"]:
             if vnfi.name == dn:
                 return vnfi
-        LOG.warning("No container with name: %r found.")
+        LOG.warning("No container with name: {0} found.".format(dn))
         return None
 
     @staticmethod
-    def _vnf_reconfigure_network(vnfi, if_name, net_str):
+    def _vnf_reconfigure_network(vnfi, if_name, net_str=None, new_name=None):
         """
         Reconfigure the network configuration of a specific interface
         of a running container.
-        :param vnfi: container instacne
+        :param vnfi: container instance
         :param if_name: interface name
         :param net_str: network configuration string, e.g., 1.2.3.4/24
         :return:
         """
-        intf = vnfi.intf(intf=if_name)
-        if intf is not None:
-            intf.setIP(net_str)
-            LOG.debug("Reconfigured network of %s:%s to %r" % (vnfi.name, if_name, net_str))
-        else:
-            LOG.warning("Interface not found: %s:%s. Network reconfiguration skipped." % (vnfi.name, if_name))
+
+        # assign new ip address
+        if net_str is not None:
+            intf = vnfi.intf(intf=if_name)
+            if intf is not None:
+                intf.setIP(net_str)
+                LOG.debug("Reconfigured network of %s:%s to %r" % (vnfi.name, if_name, net_str))
+            else:
+                LOG.warning("Interface not found: %s:%s. Network reconfiguration skipped." % (vnfi.name, if_name))
+
+        if new_name is not None:
+            vnfi.cmd('ip link set', if_name, 'down')
+            vnfi.cmd('ip link set', if_name, 'name', new_name)
+            vnfi.cmd('ip link set', new_name, 'up')
+            LOG.debug("Reconfigured interface name of %s:%s to %s" % (vnfi.name, if_name, new_name))
+
 
 
     def _trigger_emulator_start_scripts_in_vnfis(self, vnfi_list):
@@ -476,6 +456,7 @@
                 make_relative_path(self.manifest.get("entry_service_template")))
             self.nsd = load_yaml(nsd_path)
             GK.net.deployed_nsds.append(self.nsd)
+
             LOG.debug("Loaded NSD: %r" % self.nsd.get("name"))
 
     def _load_vnfd(self):
@@ -494,26 +475,209 @@
                     LOG.debug("Loaded VNFD: %r" % vnfd.get("name"))
 
     def _load_saps(self):
-        # Each Service Access Point (connection_point) in the nsd is getting its own container
-        SAPs = [p["id"] for p in self.nsd["connection_points"] if p["type"] == "interface"]
+        # create list of all SAPs
+        # check if we need to deploy management ports
+        if USE_DOCKER_MGMT:
+            LOG.debug("nsd: {0}".format(self.nsd))
+            SAPs = [p for p in self.nsd["connection_points"] if 'management' not in p.get('type')]
+        else:
+            SAPs = [p for p in self.nsd["connection_points"]]
+
         for sap in SAPs:
-            # endpoints needed in this service
-            sap_vnf_id, sap_vnf_interface = sap.split(':')
-            # set of the connection_point ids found in the nsd (in the examples this is 'ns')
-            self.sap_identifiers.add(sap_vnf_id)
+            # endpoint needed in this service
+            sap_id, sap_interface, sap_docker_name = parse_interface(sap['id'])
+            # make sure SAP has type set (default internal)
+            sap["type"] = sap.get("type", 'internal')
 
-            sap_docker_name = "%s_%s" % (sap_vnf_id, sap_vnf_interface)
+            # Each Service Access Point (connection_point) in the nsd is an IP address on the host
+            if sap["type"] == "external":
+                # add to vnfds to calculate placement later on
+                sap_net = SAP_SUBNETS.pop(0)
+                self.saps[sap_docker_name] = {"name": sap_docker_name , "type": "external", "net": sap_net}
+                # add SAP vnf to list in the NSD so it is deployed later on
+                # each SAP get a unique VNFD and vnf_id in the NSD and custom type (only defined in the dummygatekeeper)
+                self.nsd["network_functions"].append(
+                    {"vnf_id": sap_docker_name, "vnf_name": sap_docker_name, "vnf_type": "sap_ext"})
 
-            # add SAP to self.vnfds
-            sapfile = pkg_resources.resource_filename(__name__, "sap_vnfd.yml")
-            sap_vnfd = load_yaml(sapfile)
-            sap_vnfd["connection_points"][0]["id"] = sap_vnf_interface
-            sap_vnfd["name"] = sap_docker_name
-            self.vnfds[sap_docker_name] = sap_vnfd
-            # add SAP vnf to list in the NSD so it is deployed later on
-            # each SAP get a unique VNFD and vnf_id in the NSD
-            self.nsd["network_functions"].append({"vnf_id": sap_docker_name, "vnf_name": sap_docker_name})
-            LOG.debug("Loaded SAP: %r" % sap_vnfd.get("name"))
+            # Each Service Access Point (connection_point) in the nsd is getting its own container (default)
+            elif sap["type"] == "internal" or sap["type"] == "management":
+                # add SAP to self.vnfds
+                sapfile = pkg_resources.resource_filename(__name__, "sap_vnfd.yml")
+                sap_vnfd = load_yaml(sapfile)
+                sap_vnfd["connection_points"][0]["id"] = sap_interface
+                sap_vnfd["name"] = sap_docker_name
+                sap_vnfd["type"] = "internal"
+                # add to vnfds to calculate placement later on and deploy
+                self.saps[sap_docker_name] = sap_vnfd
+                # add SAP vnf to list in the NSD so it is deployed later on
+                # each SAP get a unique VNFD and vnf_id in the NSD
+                self.nsd["network_functions"].append(
+                    {"vnf_id": sap_docker_name, "vnf_name": sap_docker_name, "vnf_type": "sap_int"})
+
+            LOG.debug("Loaded SAP: name: {0}, type: {1}".format(sap_docker_name, sap['type']))
+
+        # create sap lists
+        self.saps_ext = [self.saps[sap]['name'] for sap in self.saps if self.saps[sap]["type"] == "external"]
+        self.saps_int = [self.saps[sap]['name'] for sap in self.saps if self.saps[sap]["type"] == "internal"]
+
+    def _start_sap(self, sap, instance_uuid):
+        if not DEPLOY_SAP:
+            return
+
+        LOG.info('start SAP: {0} ,type: {1}'.format(sap['name'],sap['type']))
+        if sap["type"] == "internal":
+            vnfi = None
+            if not GK_STANDALONE_MODE:
+                vnfi = self._start_vnfd(sap)
+            self.instances[instance_uuid]["vnf_instances"].append(vnfi)
+
+        elif sap["type"] == "external":
+            target_dc = sap.get("dc")
+            # add interface to dc switch
+            target_dc.attachExternalSAP(sap['name'], str(sap['net']))
+
+    def _connect_elines(self, eline_fwd_links, instance_uuid):
+        """
+        Connect all E-LINE links in the NSD
+        :param eline_fwd_links: list of E-LINE links in the NSD
+        :param: instance_uuid of the service
+        :return:
+        """
+        # cookie is used as identifier for the flowrules installed by the dummygatekeeper
+        # eg. different services get a unique cookie for their flowrules
+        cookie = 1
+        for link in eline_fwd_links:
+            # check if we need to deploy this link when its a management link:
+            if USE_DOCKER_MGMT:
+                if self.check_mgmt_interface(link["connection_points_reference"]):
+                    continue
+
+            src_id, src_if_name, src_sap_id = parse_interface(link["connection_points_reference"][0])
+            dst_id, dst_if_name, dst_sap_id = parse_interface(link["connection_points_reference"][1])
+
+            setChaining = False
+            # check if there is a SAP in the link and chain everything together
+            if src_sap_id in self.saps and dst_sap_id in self.saps:
+                LOG.info('2 SAPs cannot be chained together : {0} - {1}'.format(src_sap_id, dst_sap_id))
+                continue
+
+            elif src_sap_id in self.saps_ext:
+                src_id = src_sap_id
+                src_if_name = src_sap_id
+                src_name = self.vnf_id2vnf_name[src_id]
+                dst_name = self.vnf_id2vnf_name[dst_id]
+                dst_vnfi = self._get_vnf_instance(instance_uuid, dst_name)
+                if dst_vnfi is not None:
+                    # choose first ip address in sap subnet
+                    sap_net = self.saps[src_sap_id]['net']
+                    sap_ip = "{0}/{1}".format(str(sap_net[1]), sap_net.prefixlen)
+                    self._vnf_reconfigure_network(dst_vnfi, dst_if_name, sap_ip)
+                    setChaining = True
+
+            elif dst_sap_id in self.saps_ext:
+                dst_id = dst_sap_id
+                dst_if_name = dst_sap_id
+                src_name = self.vnf_id2vnf_name[src_id]
+                dst_name = self.vnf_id2vnf_name[dst_id]
+                src_vnfi = self._get_vnf_instance(instance_uuid, src_name)
+                if src_vnfi is not None:
+                    sap_net = self.saps[dst_sap_id]['net']
+                    sap_ip = "{0}/{1}".format(str(sap_net[1]), sap_net.prefixlen)
+                    self._vnf_reconfigure_network(src_vnfi, src_if_name, sap_ip)
+                    setChaining = True
+
+            # Link between 2 VNFs
+            else:
+                # make sure we use the correct sap vnf name
+                if src_sap_id in self.saps_int:
+                    src_id = src_sap_id
+                if dst_sap_id in self.saps_int:
+                    dst_id = dst_sap_id
+                src_name = self.vnf_id2vnf_name[src_id]
+                dst_name = self.vnf_id2vnf_name[dst_id]
+                # re-configure the VNFs IP assignment and ensure that a new subnet is used for each E-Link
+                src_vnfi = self._get_vnf_instance(instance_uuid, src_name)
+                dst_vnfi = self._get_vnf_instance(instance_uuid, dst_name)
+                if src_vnfi is not None and dst_vnfi is not None:
+                    eline_net = ELINE_SUBNETS.pop(0)
+                    ip1 = "{0}/{1}".format(str(eline_net[1]), eline_net.prefixlen)
+                    ip2 = "{0}/{1}".format(str(eline_net[2]), eline_net.prefixlen)
+                    self._vnf_reconfigure_network(src_vnfi, src_if_name, ip1)
+                    self._vnf_reconfigure_network(dst_vnfi, dst_if_name, ip2)
+                    setChaining = True
+
+            # Set the chaining
+            if setChaining:
+                ret = GK.net.setChain(
+                    src_id, dst_id,
+                    vnf_src_interface=src_if_name, vnf_dst_interface=dst_if_name,
+                    bidirectional=BIDIRECTIONAL_CHAIN, cmd="add-flow", cookie=cookie, priority=10)
+                LOG.debug(
+                    "Setting up E-Line link. %s(%s:%s) -> %s(%s:%s)" % (
+                        src_name, src_id, src_if_name, dst_name, dst_id, dst_if_name))
+
+
+    def _connect_elans(self, elan_fwd_links, instance_uuid):
+        """
+        Connect all E-LAN links in the NSD
+        :param elan_fwd_links: list of E-LAN links in the NSD
+        :param: instance_uuid of the service
+        :return:
+        """
+        for link in elan_fwd_links:
+            # check if we need to deploy this link when its a management link:
+            if USE_DOCKER_MGMT:
+                if self.check_mgmt_interface(link["connection_points_reference"]):
+                    continue
+
+            elan_vnf_list = []
+            # check if an external SAP is in the E-LAN (then a subnet is already defined)
+            intfs_elan = [intf for intf in link["connection_points_reference"]]
+            lan_sap = self.check_ext_saps(intfs_elan)
+            if lan_sap:
+                lan_net = self.saps[lan_sap]['net']
+                lan_hosts = list(lan_net.hosts())
+                sap_ip = str(lan_hosts.pop(0))
+            else:
+                lan_net = ELAN_SUBNETS.pop(0)
+                lan_hosts = list(lan_net.hosts())
+
+            # generate lan ip address for all interfaces except external SAPs
+            for intf in link["connection_points_reference"]:
+
+                # skip external SAPs, they already have an ip
+                vnf_id, vnf_interface, vnf_sap_docker_name = parse_interface(intf)
+                if vnf_sap_docker_name in self.saps_ext:
+                    elan_vnf_list.append({'name': vnf_sap_docker_name, 'interface': vnf_interface})
+                    continue
+
+                ip_address = "{0}/{1}".format(str(lan_hosts.pop(0)), lan_net.prefixlen)
+                vnf_id, intf_name, vnf_sap_id = parse_interface(intf)
+
+                # make sure we use the correct sap vnf name
+                src_docker_name = vnf_id
+                if vnf_sap_id in self.saps_int:
+                    src_docker_name = vnf_sap_id
+                    vnf_id = vnf_sap_id
+
+                vnf_name = self.vnf_id2vnf_name[vnf_id]
+                LOG.debug(
+                    "Setting up E-LAN interface. %s(%s:%s) -> %s" % (
+                        vnf_name, vnf_id, intf_name, ip_address))
+
+                if vnf_name in self.vnfds:
+                    # re-configure the VNFs IP assignment and ensure that a new subnet is used for each E-LAN
+                    # E-LAN relies on the learning switch capability of Ryu which has to be turned on in the topology
+                    # (DCNetwork(controller=RemoteController, enable_learning=True)), so no explicit chaining is necessary.
+                    vnfi = self._get_vnf_instance(instance_uuid, vnf_name)
+                    if vnfi is not None:
+                        self._vnf_reconfigure_network(vnfi, intf_name, ip_address)
+                        # add this vnf and interface to the E-LAN for tagging
+                        elan_vnf_list.append({'name': src_docker_name, 'interface': intf_name})
+
+            # install the VLAN tags for this E-LAN
+            GK.net.setLAN(elan_vnf_list)
+
 
     def _load_docker_files(self):
         """
@@ -535,8 +699,12 @@
         Get all URLs to pre-build docker images in some repo.
         :return:
         """
-        for k, v in self.vnfds.iteritems():
-            for vu in v.get("virtual_deployment_units"):
+        # also merge sap dicts, because internal saps also need a docker container
+        all_vnfs = self.vnfds.copy()
+        all_vnfs.update(self.saps)
+
+        for k, v in all_vnfs.iteritems():
+            for vu in v.get("virtual_deployment_units", {}):
                 if vu.get("vm_image_format") == "docker":
                     url = vu.get("vm_image")
                     if url is not None:
@@ -599,11 +767,15 @@
         assert(len(GK.dcs) > 0)
         # instantiate algorithm an place
         p = algorithm()
-        p.place(self.nsd, self.vnfds, GK.dcs)
+        p.place(self.nsd, self.vnfds, self.saps, GK.dcs)
         LOG.info("Using placement algorithm: %r" % p.__class__.__name__)
         # lets print the placement result
         for name, vnfd in self.vnfds.iteritems():
             LOG.info("Placed VNF %r on DC %r" % (name, str(vnfd.get("dc"))))
+        for sap in self.saps:
+            sap_dict = self.saps[sap]
+            LOG.info("Placed SAP %r on DC %r" % (sap, str(sap_dict.get("dc"))))
+
 
     def _calculate_cpu_cfs_values(self, cpu_time_percentage):
         """
@@ -628,6 +800,19 @@
         LOG.debug("Calculated: cpu_period=%f / cpu_quota=%f" % (cpu_period, cpu_quota))
         return int(cpu_period), int(cpu_quota)
 
+    def check_ext_saps(self, intf_list):
+        # check if the list of interfacs contains an externl SAP
+        saps_ext = [self.saps[sap]['name'] for sap in self.saps if self.saps[sap]["type"] == "external"]
+        for intf_name in intf_list:
+            vnf_id, vnf_interface, vnf_sap_docker_name = parse_interface(intf_name)
+            if vnf_sap_docker_name in saps_ext:
+                return vnf_sap_docker_name
+
+    def check_mgmt_interface(self, intf_list):
+        SAPs_mgmt = [p.get('id') for p in self.nsd["connection_points"] if 'management' in p.get('type')]
+        for intf_name in intf_list:
+            if intf_name in SAPs_mgmt:
+                return True
 
 """
 Some (simple) placement algorithms
@@ -638,7 +823,7 @@
     """
     Placement: Always use one and the same data center from the GK.dcs dict.
     """
-    def place(self, nsd, vnfds, dcs):
+    def place(self, nsd, vnfds, saps, dcs):
         for name, vnfd in vnfds.iteritems():
             vnfd["dc"] = list(dcs.itervalues())[0]
 
@@ -647,13 +832,65 @@
     """
     Placement: Distribute VNFs across all available DCs in a round robin fashion.
     """
-    def place(self, nsd, vnfds, dcs):
+    def place(self, nsd, vnfds, saps, dcs):
         c = 0
         dcs_list = list(dcs.itervalues())
         for name, vnfd in vnfds.iteritems():
             vnfd["dc"] = dcs_list[c % len(dcs_list)]
             c += 1  # inc. c to use next DC
 
+class RoundRobinDcPlacementWithSAPs(object):
+    """
+    Placement: Distribute VNFs across all available DCs in a round robin fashion,
+    every SAP is instantiated on the same DC as the connected VNF.
+    """
+    def place(self, nsd, vnfds, saps, dcs):
+
+        # place vnfs
+        c = 0
+        dcs_list = list(dcs.itervalues())
+        for name, vnfd in vnfds.iteritems():
+            vnfd["dc"] = dcs_list[c % len(dcs_list)]
+            c += 1  # inc. c to use next DC
+
+        # place SAPs
+        vlinks = nsd.get("virtual_links", [])
+        eline_fwd_links = [l for l in vlinks if (l["connectivity_type"] == "E-Line")]
+        elan_fwd_links = [l for l in vlinks if  (l["connectivity_type"] == "E-LAN")]
+
+        vnf_id2vnf_name = defaultdict(lambda: "NotExistingNode",
+                                      reduce(lambda x, y: dict(x, **y),
+                                             map(lambda d: {d["vnf_id"]: d["vnf_name"]},
+                                                 nsd["network_functions"])))
+
+        # SAPs on E-Line links are placed on the same DC as the VNF on the E-Line
+        for link in eline_fwd_links:
+            src_id, src_if_name, src_sap_id = parse_interface(link["connection_points_reference"][0])
+            dst_id, dst_if_name, dst_sap_id = parse_interface(link["connection_points_reference"][1])
+
+            # check if there is a SAP in the link
+            if src_sap_id in saps:
+                dst_vnf_name = vnf_id2vnf_name[dst_id]
+                # get dc where connected vnf is mapped to
+                dc = vnfds[dst_vnf_name]['dc']
+                saps[src_sap_id]['dc'] = dc
+
+            if dst_sap_id in saps:
+                src_vnf_name = vnf_id2vnf_name[src_id]
+                # get dc where connected vnf is mapped to
+                dc = vnfds[src_vnf_name]['dc']
+                saps[dst_sap_id]['dc'] = dc
+
+        # SAPs on E-LANs are placed on a random DC
+        dcs_list = list(dcs.itervalues())
+        dc_len = len(dcs_list)
+        for link in elan_fwd_links:
+            for intf in link["connection_points_reference"]:
+                # find SAP interfaces
+                intf_id, intf_name, intf_sap_id = parse_interface(intf)
+                if intf_sap_id in saps:
+                    dc = dcs_list[randint(0, dc_len-1)]
+                    saps[intf_sap_id]['dc'] = dc
 
 
 
@@ -796,10 +1033,6 @@
 api.add_resource(Exit, '/emulator/exit')
 
 
-#def initialize_GK():
-#    global GK
-#    GK = Gatekeeper()
-
 
 def start_rest_api(host, port, datacenters=dict()):
     GK.dcs = datacenters
@@ -835,23 +1068,6 @@
     return path
 
 
-def generate_lan_string(prefix, base, subnet_size=24, ip=0):
-    """
-    Helper to generate different network configuration strings.
-    """
-    r = "%s.%d.%d/%d" % (prefix, base, ip, subnet_size)
-    return r
-
-
-def generate_subnet_strings(n, start=1, subnet_size=24, ip=0):
-    """
-    Helper to generate different network configuration strings.
-    """
-    r = list()
-    for i in range(start, start + n):
-        r.append("%d.0.0.%d/%d" % (i, ip, subnet_size))
-    return r
-
 def get_dc_network():
     """
     retrieve the DCnetwork where this dummygatekeeper (GK) connects to.
@@ -861,6 +1077,24 @@
     assert (len(GK.dcs) > 0)
     return GK.dcs.values()[0].net
 
+
+def parse_interface(interface_name):
+    """
+    convert the interface name in the nsd to the according vnf_id, vnf_interface names
+    :param interface_name:
+    :return:
+    """
+
+    if ':' in interface_name:
+        vnf_id, vnf_interface = interface_name.split(':')
+        vnf_sap_docker_name = interface_name.replace(':', '_')
+    else:
+        vnf_id = interface_name
+        vnf_interface = interface_name
+        vnf_sap_docker_name = interface_name
+
+    return vnf_id, vnf_interface, vnf_sap_docker_name
+
 if __name__ == '__main__':
     """
     Lets allow to run the API in standalone mode.
diff --git a/src/emuvim/dashboard/README.md b/src/emuvim/dashboard/README.md
new file mode 100755
index 0000000..db15c9d
--- /dev/null
+++ b/src/emuvim/dashboard/README.md
@@ -0,0 +1,4 @@
+# son-emu Dashboard
+
+A simple web-based dashboard that polls the REST API and displays running services etc. It does not do much more than son-cli but it looks nicer and improves the visualization of the emulator state for live demos.
+
diff --git a/src/emuvim/dashboard/__init__.py b/src/emuvim/dashboard/__init__.py
new file mode 100755
index 0000000..45ad698
--- /dev/null
+++ b/src/emuvim/dashboard/__init__.py
@@ -0,0 +1,27 @@
+"""
+Copyright (c) 2017 SONATA-NFV
+ALL RIGHTS RESERVED.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+Neither the name of the SONATA-NFV [, ANY ADDITIONAL AFFILIATION]
+nor the names of its contributors may be used to endorse or promote
+products derived from this software without specific prior written
+permission.
+
+This work has been performed in the framework of the SONATA project,
+funded by the European Commission under Grant number 671517 through
+the Horizon 2020 and 5G-PPP programmes. The authors would like to
+acknowledge the contributions of their colleagues of the SONATA
+partner consortium (www.sonata-nfv.eu).
+"""
\ No newline at end of file
diff --git a/dashboard/css/main.css b/src/emuvim/dashboard/css/main.css
similarity index 100%
rename from dashboard/css/main.css
rename to src/emuvim/dashboard/css/main.css
diff --git a/dashboard/img/SONATA_new.png b/src/emuvim/dashboard/img/SONATA_new.png
similarity index 100%
rename from dashboard/img/SONATA_new.png
rename to src/emuvim/dashboard/img/SONATA_new.png
Binary files differ
diff --git a/dashboard/index.html b/src/emuvim/dashboard/index.html
similarity index 97%
rename from dashboard/index.html
rename to src/emuvim/dashboard/index.html
index 3c31bec..6f77d08 100755
--- a/dashboard/index.html
+++ b/src/emuvim/dashboard/index.html
@@ -58,7 +58,7 @@
       <form class="navbar-form navbar-right">
 	<div class="input-group">
           <span class="input-group-addon">http://</span>
-	  <input type="text" class="form-control" placeholder="api-url.or.ip" value="sonata-emulator.cs.upb.de:5001" id="text_api_host" data-provide="typeahead" size="30">
+	  <input type="text" class="form-control" placeholder="api-url.or.ip" value="localhost:5001" id="text_api_host" data-provide="typeahead" size="30">
 	</div>
 	<button type="button" class="btn btn-success" id="btn_connect">Connect &nbsp;<span class="glyphicon glyphicon-play-circle"></span></button>
 	<button type="button" class="btn btn-danger disabled" id="btn_disconnect">Disconnect &nbsp;<span class="glyphicon glyphicon-off"></span></button>
diff --git a/dashboard/js/main.js b/src/emuvim/dashboard/js/main.js
similarity index 100%
rename from dashboard/js/main.js
rename to src/emuvim/dashboard/js/main.js
diff --git a/dashboard/son-emu-dashboard-screenshot.png b/src/emuvim/dashboard/son-emu-dashboard-screenshot.png
similarity index 100%
rename from dashboard/son-emu-dashboard-screenshot.png
rename to src/emuvim/dashboard/son-emu-dashboard-screenshot.png
Binary files differ
diff --git a/src/emuvim/dcemulator/monitoring.py b/src/emuvim/dcemulator/monitoring.py
index 269a7e0..ce24a40 100755
--- a/src/emuvim/dcemulator/monitoring.py
+++ b/src/emuvim/dcemulator/monitoring.py
@@ -34,7 +34,7 @@
 from prometheus_client import start_http_server, Summary, Histogram, Gauge, Counter, REGISTRY, CollectorRegistry, \
     pushadd_to_gateway, push_to_gateway, delete_from_gateway
 import threading
-from subprocess import Popen
+from subprocess import Popen, check_call
 import os
 import docker
 import json
@@ -535,8 +535,15 @@
 
     def _stop_container(self, name):
 
-        container = self.dockercli.containers.get(name)
-        container.remove(force=True)
+        #container = self.dockercli.containers.get(name)
+        #container.stop()
+        #container.remove(force=True)
+
+        # the only robust way to stop these containers is via Popen, it seems
+        time.sleep(1)
+        cmd = ['docker', 'rm', '-f', name]
+        Popen(cmd)
+
 
     def update_skewmon(self, vnf_name, resource_name, action):
 
diff --git a/src/emuvim/dcemulator/node.py b/src/emuvim/dcemulator/node.py
index c5ac9b3..5cfc9ef 100755
--- a/src/emuvim/dcemulator/node.py
+++ b/src/emuvim/dcemulator/node.py
@@ -91,8 +91,10 @@
         status["state"] = self.dcli.inspect_container(self.dc)["State"]
         status["id"] = self.dcli.inspect_container(self.dc)["Id"]
         status["short_id"] = self.dcli.inspect_container(self.dc)["Id"][:12]
+        status["hostname"] = self.dcli.inspect_container(self.dc)["Config"]['Hostname']
         status["datacenter"] = (None if self.datacenter is None
                                 else self.datacenter.label)
+
         return status
 
 
@@ -246,6 +248,24 @@
 
         return True
 
+    def attachExternalSAP(self, sap_name, sap_ip):
+        # create SAP as OVS internal interface
+        sap_intf = self.switch.attachInternalIntf(sap_name, sap_ip)
+
+        # add this as a link to the DCnetwork graph, so it is available for routing
+        attr_dict2 = {'src_port_id': sap_name, 'src_port_nr': None,
+                      'src_port_name': sap_name,
+                      'dst_port_id': self.switch.ports[sap_intf], 'dst_port_nr': self.switch.ports[sap_intf],
+                      'dst_port_name': sap_intf.name}
+        self.net.DCNetwork_graph.add_edge(sap_name, self.switch.name, attr_dict=attr_dict2)
+
+        attr_dict2 = {'dst_port_id': sap_name, 'dst_port_nr': None,
+                      'dst_port_name': sap_name,
+                      'src_port_id': self.switch.ports[sap_intf], 'src_port_nr': self.switch.ports[sap_intf],
+                      'src_port_name': sap_intf.name}
+        self.net.DCNetwork_graph.add_edge(self.switch.name, sap_name, attr_dict=attr_dict2)
+
+
     def listCompute(self):
         """
         Return a list of all running containers assigned to this
