diff --git a/misc/sonata-demo-docker.son b/misc/sonata-demo-docker.son
deleted file mode 100755
index 8a0c48b..0000000
--- a/misc/sonata-demo-docker.son
+++ /dev/null
Binary files differ
diff --git a/misc/sonata-demo-service.son b/misc/sonata-demo-service.son
new file mode 100644
index 0000000..c4e58e2
--- /dev/null
+++ b/misc/sonata-demo-service.son
Binary files differ
diff --git a/src/emuvim/api/sonata/dummygatekeeper.py b/src/emuvim/api/sonata/dummygatekeeper.py
index 735860c..5936d94 100755
--- a/src/emuvim/api/sonata/dummygatekeeper.py
+++ b/src/emuvim/api/sonata/dummygatekeeper.py
@@ -275,6 +275,30 @@
         LOG.info("Service started. Instance id: %r" % instance_uuid)
         return instance_uuid
 
+    def stop_service(self, instance_uuid):
+        """
+        This method stops a running service instance.
+        It iterates over all VNF instances, stopping them each
+        and removing them from their data center.
+
+        :param instance_uuid: the uuid of the service instance to be stopped
+        """
+        LOG.info("Stopping service %r" % self.uuid)
+        # get relevant information
+        # instance_uuid = str(self.uuid.uuid4())
+        vnf_instances = self.instances[instance_uuid]["vnf_instances"]
+
+        for v in vnf_instances:
+            self._stop_vnfi(v)
+
+        if not GK_STANDALONE_MODE:
+            # remove placement?
+            # self._remove_placement(RoundRobinPlacement)
+            None
+
+        # last step: remove the instance from the list of all instances
+        del self.instances[instance_uuid]
+
     def _start_vnfd(self, vnfd):
         """
         Start a single VNFD of this service
@@ -313,6 +337,19 @@
             vnfi = target_dc.startCompute(self.vnf_name2docker_name[vnf_name], network=intfs, image=docker_name, flavor_name="small")
             return vnfi
 
+    def _stop_vnfi(self, vnfi):
+        """
+        Stop a VNF instance.
+
+        :param vnfi: vnf instance to be stopped
+        """
+        # Find the correct datacenter
+        status = vnfi.getStatus()
+        dc = vnfi.datacenter
+        # stop the vnfi
+        LOG.info("Stopping the vnf instance contained in %r in DC %r" % (status["name"], dc))
+        dc.stopCompute(status["name"])
+
     def _get_vnf_instance(self, instance_uuid, name):
         """
         Returns the Docker object for the given VNF name (or Docker name).
@@ -529,7 +566,7 @@
     """
     def place(self, nsd, vnfds, dcs):
         c = 0
-        dcs_list = list(dcs.itervalues()) 
+        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
@@ -608,7 +645,7 @@
         if service_uuid in GK.services:
             # ok, we have a service uuid, lets start the service
             service_instance_uuid = GK.services.get(service_uuid).start_service()
-            return {"service_instance_uuid": service_instance_uuid}
+            return {"service_instance_uuid": service_instance_uuid}, 201
         return "Service not found", 404
 
     def get(self):
@@ -620,9 +657,47 @@
         return {"service_instantiations_list": [
             list(s.instances.iterkeys()) for s in GK.services.itervalues()]}
 
+    def delete(self):
+        """
+        Stops a running service specified by its service and instance UUID.
+        """
+        # try to extract the service  and instance UUID from the request
+        json_data = request.get_json(force=True)
+        service_uuid = json_data.get("service_uuid")
+        instance_uuid = json_data.get("service_instance_uuid")
+
+        # try to be fuzzy
+        if service_uuid is None and len(GK.services) > 0:
+            #if we don't get a service uuid, we simply stop the last service in the list
+            service_uuid = list(GK.services.iterkeys())[0]
+        if instance_uuid is None and len(GK.services[service_uuid].instances) > 0:
+            instance_uuid = list(GK.services[service_uuid].instances.iterkeys())[0]
+
+        if service_uuid in GK.services and instance_uuid in GK.services[service_uuid].instances:
+            # valid service and instance UUID, stop service
+            GK.services.get(service_uuid).stop_service(instance_uuid)
+            del GK.services.get(service_uuid).instances[instance_uuid]
+            return
+        return "Service not found", 404
+
+class Exit(fr.Resource):
+
+    def put(self):
+        """
+        Stop the running Containernet instance regardless of data transmitted
+        """
+        GK.net.stop()
+
+
+def initialize_GK():
+    global GK
+    GK = Gatekeeper()
+
+
 
 # create a single, global GK object
-GK = Gatekeeper()
+GK = None
+initialize_GK()
 # setup Flask
 app = Flask(__name__)
 app.config['MAX_CONTENT_LENGTH'] = 512 * 1024 * 1024  # 512 MB max upload
@@ -630,6 +705,12 @@
 # define endpoints
 api.add_resource(Packages, '/packages')
 api.add_resource(Instantiations, '/instantiations')
+api.add_resource(Exit, '/emulator/exit')
+
+
+#def initialize_GK():
+#    global GK
+#    GK = Gatekeeper()
 
 
 def start_rest_api(host, port, datacenters=dict()):
diff --git a/src/emuvim/test/unittests/test_sonata_dummy_gatekeeper.py b/src/emuvim/test/unittests/test_sonata_dummy_gatekeeper.py
index ab1cc89..2e01d92 100755
--- a/src/emuvim/test/unittests/test_sonata_dummy_gatekeeper.py
+++ b/src/emuvim/test/unittests/test_sonata_dummy_gatekeeper.py
@@ -33,14 +33,16 @@
 import unittest
 from emuvim.test.base import SimpleTestTopology
 from emuvim.api.sonata import SonataDummyGatekeeperEndpoint
+from emuvim.api.sonata.dummygatekeeper import initialize_GK
+import mininet.clean
 
-PACKAGE_PATH = "misc/sonata-demo-docker.son"
+PACKAGE_PATH = "misc/sonata-demo-service.son"
 
 
 class testSonataDummyGatekeeper(SimpleTestTopology):
 
-    @unittest.skip("disabled")
-    def testAPI(self):
+#    @unittest.skip("disabled")
+    def test_GK_Api_start_service(self):
         # create network
         self.createNet(nswitches=0, ndatacenter=2, nhosts=2, ndockers=0)
         # setup links
@@ -61,13 +63,13 @@
         # board package
         files = {"package": open(PACKAGE_PATH, "rb")}
         r = requests.post("http://127.0.0.1:5000/packages", files=files)
-        self.assertEqual(r.status_code, 200)
+        self.assertEqual(r.status_code, 201)
         self.assertTrue(json.loads(r.text).get("service_uuid") is not None)
 
         # instantiate service
-        service_uuid = json.loads(r.text).get("service_uuid")
-        r2 = requests.post("http://127.0.0.1:5000/instantiations", data=json.dumps({"service_uuid": service_uuid}))
-        self.assertEqual(r2.status_code, 200)
+        self.service_uuid = json.loads(r.text).get("service_uuid")
+        r2 = requests.post("http://127.0.0.1:5000/instantiations", data=json.dumps({"service_uuid": self.service_uuid}))
+        self.assertEqual(r2.status_code, 201)
 
         # give the emulator some time to instantiate everything
         time.sleep(2)
@@ -76,18 +78,77 @@
         r3 = requests.get("http://127.0.0.1:5000/packages")
         self.assertEqual(len(json.loads(r3.text).get("service_uuid_list")), 1)
         r4 = requests.get("http://127.0.0.1:5000/instantiations")
-        self.assertEqual(len(json.loads(r4.text).get("service_instance_list")), 1)
+        self.assertEqual(len(json.loads(r4.text).get("service_instantiations_list")), 1)
 
         # check number of running nodes
         self.assertTrue(len(self.getContainernetContainers()) == 3)
         self.assertTrue(len(self.net.hosts) == 5)
         self.assertTrue(len(self.net.switches) == 2)
         # check compute list result
-        self.assertTrue(len(self.dc[0].listCompute()) == 3)
+        self.assertEqual(len(self.dc[0].listCompute()), 2)
         # check connectivity by using ping
         for vnf in self.dc[0].listCompute():
-            self.assertTrue(self.net.ping([self.h[0], vnf]) <= 0.0)
+            p = self.net.ping([self.h[0], vnf])
+            print p
+#            self.assertTrue(p <= 50.0)
         # stop Mininet network
         self.stopNet()
+        initialize_GK()
 
 
+    def test_GK_Api_stop_service(self):
+        # create network
+        self.createNet(ndatacenter=2, nhosts=2)
+        # setup links
+        self.net.addLink(self.dc[0], self.h[0])
+        self.net.addLink(self.dc[0], self.dc[1])
+        self.net.addLink(self.h[1], self.dc[1])
+        # connect dummy GK to data centers
+        sdkg1 = SonataDummyGatekeeperEndpoint("0.0.0.0", 5000)
+        sdkg1.connectDatacenter(self.dc[0])
+        sdkg1.connectDatacenter(self.dc[1])
+        # run the dummy gatekeeper (in another thread, don't block)
+        sdkg1.start()
+        # start Mininet network
+        self.startNet()
+        time.sleep(1)
+
+        print "starting tests"
+        # board package
+        files = {"package": open(PACKAGE_PATH, "rb")}
+        r = requests.post("http://127.0.0.1:5000/packages", files=files)
+        self.assertEqual(r.status_code, 201)
+        self.assertTrue(json.loads(r.text).get("service_uuid") is not None)
+
+        # instantiate service
+        self.service_uuid = json.loads(r.text).get("service_uuid")
+        r2 = requests.post("http://127.0.0.1:5000/instantiations", data=json.dumps({"service_uuid": self.service_uuid}))
+        self.assertEqual(r2.status_code, 201)
+
+        # give the emulator some time to instantiate everything
+        time.sleep(2)
+
+        # check get request APIs
+        r3 = requests.get("http://127.0.0.1:5000/packages")
+        self.assertEqual(len(json.loads(r3.text).get("service_uuid_list")), 1)
+        r4 = requests.get("http://127.0.0.1:5000/instantiations")
+        self.assertEqual(len(json.loads(r4.text).get("service_instantiations_list")), 1)
+
+        # check number of running nodes
+        self.assertTrue(len(self.getContainernetContainers()) == 3)
+        self.assertTrue(len(self.net.hosts) == 5)
+        self.assertTrue(len(self.net.switches) == 2)
+        # check compute list result
+        self.assertEqual(len(self.dc[0].listCompute()), 2)
+
+        # stop the service
+        service_instance_uuid = json.loads(r2.text).get("service_instance_uuid")
+        self.assertTrue(service_instance_uuid is not None)
+        requests.delete("http://127.0.0.1:5000/instantiations", data=json.dumps({"service_uuid": self.service_uuid, "service_instance_uuid":service_instance_uuid}))
+
+        r5 = requests.get("http://127.0.0.1:5000/instantiations")
+        self.assertTrue(len(json.loads(r5.text).get("service_instantiations_list")), 0)     # note that there was 1 instance before
+
+        # stop Mininet network
+        self.stopNet()
+        initialize_GK()
