diff --git a/.gitattributes b/.gitattributes
index 2244894dcc56019add4c4be65ad674158dccf045..3e6943e574d902da76f56b877fd762e1a2de7d6c 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -6,5 +6,4 @@ scripts/*  text eol=lf
 # Denote all files that are truly binary and should not be modified.
 *.png binary
 *.jpg binary
-*.build-config/
-*.pytest_cache/
\ No newline at end of file
+*.build-config/
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
index 202e176d1cc542edb15197415fce2f08e0655f65..ea3a04278779b8f93a8d4b68fe054db04d21b027 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,10 +5,11 @@
 *egg-info*
 *git-commit-ref*
 *_version.py*
+*reporc
 ubuntu-xenial-16.04-cloudimg-console.log
 .idea/
 *.egg
 *.pyc
-.pytest_cache
 .tox
 *$py.class
+**/.pytest_cache/
\ No newline at end of file
diff --git a/Vagrantfile b/Vagrantfile
index 47524d810802f3645e4d3c754121685030dcf66c..c1953901f073417b6d31c7eabd5ac70cfc543560 100644
--- a/Vagrantfile
+++ b/Vagrantfile
@@ -97,7 +97,8 @@ Vagrant.configure("2") do |config|
           instance_config.vm.provision :shell, :path => "clmctest/services/#{host["service_name"]}/install.sh", env: {"REPO_ROOT" => "/vagrant"}
     
           # CLMC agent install
-          instance_config.vm.provision :shell, :path => "scripts/clmc-agent/install.sh"
+          instance_config.vm.provision "file", source: "reporc", destination: "/vagrant/reporc"
+          instance_config.vm.provision :shell, :path => "scripts/clmc-agent/install.sh", env: {"REPO_ROOT" => "/vagrant"}
 
           # CLMC agent service specific input configuration
           instance_config.vm.provision :shell, inline: <<-SHELL
@@ -113,7 +114,7 @@ Vagrant.configure("2") do |config|
           # CLMC agent general and output configuration
           #instance_config.vm.provision :shell, :path => "scripts/clmc-agent/configure_template.sh"
 
-          instance_config.vm.provision :shell, :path => "scripts/clmc-agent/configure.sh", :args => "#{host["location"]} #{host["sfc_id"]} #{host["sfc_id_instance"]} #{host["sf_id"]} #{host["sf_id_instance"]} #{host["ipendpoint_id"]} #{host["influxdb_url"]} #{host["database_name"]}"  
+          instance_config.vm.provision :shell, :path => "scripts/clmc-agent/configure.sh", :args => "#{host["location"]} #{host["sfc_id"]} #{host["sfc_id_instance"]} #{host["sf_id"]} #{host["sf_id_instance"]} #{host["ipendpoint_id"]} #{host["sr_id"]} #{host["influxdb_url"]} #{host["database_name"]}"
 
           # CLMC start agent
           instance_config.vm.provision :shell, inline: "service telegraf restart"            
diff --git a/clmctest/e2e_response_time/rspec.yml b/clmctest/e2e_response_time/rspec.yml
new file mode 100644
index 0000000000000000000000000000000000000000..4fe3767ddb075e033c3b10acd81a885d73cdc18a
--- /dev/null
+++ b/clmctest/e2e_response_time/rspec.yml
@@ -0,0 +1,56 @@
+## (c) University of Southampton IT Innovation Centre, 2018
+##
+## Copyright in this software belongs to University of Southampton
+## IT Innovation Centre of Gamma House, Enterprise Road, 
+## Chilworth Science Park, Southampton, SO16 7NS, UK.
+##
+## This software may not be used, sold, licensed, transferred, copied
+## or reproduced in whole or in part in any manner or form or in or
+## on any media by any person other than in accordance with the terms
+## of the Licence Agreement supplied with the software, or otherwise
+## without the prior written consent of the copyright owners.
+##
+## This software is distributed WITHOUT ANY WARRANTY, without even the
+## implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+## PURPOSE, except where stated in the Licence Agreement supplied with
+## the software.
+##
+##      Created By :            Michael Boniface
+##      Created Date :          02-02-2018
+##      Created for Project :   FLAME
+
+hosts:
+  - name: clmc-service
+    cpus: 1
+    memory: 2048
+    disk: "10GB"
+    forward_ports:
+      - guest: 8086
+        host: 8086
+      - guest: 8888
+        host: 8888
+      - guest: 9092
+        host: 9092
+    ip_address: "172.40.231.51"
+  - name: minio
+    service_name: "minio"
+    cpus: 1
+    memory: 2048
+    disk: "10GB"
+    forward_ports:
+      - guest: 9000
+        host: 9000
+    ip_address: "172.40.231.155"
+    location: "DC1"
+    sfc_id: "MS_Template_1"
+    sfc_id_instance: "MS_I1"
+    sf_id: "adaptive_streaming"
+    sf_id_instance: "adaptive_streaming_I1"
+    ipendpoint_id: "adaptive_streaming_I1_minio"
+    influxdb_url: "http://172.40.231.51:8086"
+    database_name: "CLMCMetrics"
+  - name: test-runner
+    cpus: 1
+    memory: 2048
+    disk: "10GB"
+    ip_address: "172.40.231.200"
diff --git a/clmctest/inputs/rspec.yml b/clmctest/inputs/rspec.yml
index 7d90398a9413d17918b5b6e3318fac078a1a3173..5084b29ebdb308e7c116f9db5827f0c15ff289d0 100644
--- a/clmctest/inputs/rspec.yml
+++ b/clmctest/inputs/rspec.yml
@@ -47,6 +47,7 @@ hosts:
     sf_id: "adaptive_streaming"
     sf_id_instance: "adaptive_streaming_I1"
     ipendpoint_id: "adaptive_streaming_I1_apache1"
+    sr_id: "service_router"
     influxdb_url: "http://172.40.231.51:8086"
     database_name: "CLMCMetrics"
   - name: nginx
@@ -64,6 +65,7 @@ hosts:
     sf_id: "adaptive_streaming"
     sf_id_instance: "adaptive_streaming_nginx_I1"
     ipendpoint_id: "adaptive_streaming_nginx_I1_apache1"
+    sr_id: "service_router"    
     influxdb_url: "http://172.40.231.51:8086"
     database_name: "CLMCMetrics"
   - name: mongo
@@ -81,6 +83,7 @@ hosts:
     sf_id: "metadata_database"
     sf_id_instance: "metadata_database_I1"
     ipendpoint_id: "metadata_database_I1_apache1"
+    sr_id: "service_router"
     influxdb_url: "http://172.40.231.51:8086"
     database_name: "CLMCMetrics" 
   - name: ffmpeg
@@ -98,6 +101,7 @@ hosts:
     sf_id: "metadata_database"
     sf_id_instance: "metadata_database_I1"
     ipendpoint_id: "metadata_database_I1_apache1"
+    sr_id: "service_router"
     influxdb_url: "http://172.40.231.51:8086"
     database_name: "CLMCMetrics" 
   - name: host
@@ -115,11 +119,12 @@ hosts:
     sf_id: "adaptive_streaming"
     sf_id_instance: "adaptive_streaming_I1"
     ipendpoint_id: "adaptive_streaming_I1_apache1"
+    sr_id: "service_router"
     influxdb_url: "http://172.40.231.51:8086"
     database_name: "CLMCMetrics"
   - name: test-runner
-    cpus: 1
-    memory: 2048
+    cpus: 2
+    memory: 4096
     disk: "10GB"
     ip_address: "172.40.231.200"
   - name: minio
@@ -137,5 +142,6 @@ hosts:
     sf_id: "adaptive_streaming"
     sf_id_instance: "adaptive_streaming_I1"
     ipendpoint_id: "adaptive_streaming_I1_minio"
+    sr_id: "service_router"
     influxdb_url: "http://172.40.231.51:8086"
     database_name: "CLMCMetrics"
\ No newline at end of file
diff --git a/clmctest/inputs/test_config_collector.py b/clmctest/inputs/test_config_collector.py
new file mode 100644
index 0000000000000000000000000000000000000000..ce320b9a7562d2aad1445973724fb59e01de4abe
--- /dev/null
+++ b/clmctest/inputs/test_config_collector.py
@@ -0,0 +1,163 @@
+#!/usr/bin/python3
+"""
+## © University of Southampton IT Innovation Centre, 2018
+##
+## Copyright in this software belongs to University of Southampton
+## IT Innovation Centre of Gamma House, Enterprise Road, 
+## Chilworth Science Park, Southampton, SO16 7NS, UK.
+##
+## This software may not be used, sold, licensed, transferred, copied
+## or reproduced in whole or in part in any manner or form or in or
+## on any media by any person other than in accordance with the terms
+## of the Licence Agreement supplied with the software, or otherwise
+## without the prior written consent of the copyright owners.
+##
+## This software is distributed WITHOUT ANY WARRANTY, without even the
+## implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+## PURPOSE, except where stated in the Licence Agreement supplied with
+## the software.
+##
+##      Created By :            Michael Boniface
+##      Created Date :          29-04-2018
+##      Created for Project :   FLAME
+"""
+
+import pytest
+import time
+import random
+import logging
+import sys
+
+from config_collector import ConfigCollector
+
+STATE_INDEX = 0
+TIME_INDEX = 1
+ 
+samples = [[['active', 0], ['active', 2]], 
+        [['active', 0], ['active', 2], ['active', 4]],
+        [['active', 0], ['failed', 2]],
+        [['active', 0], ['active', 2], ['inactive', 4], ['active', 6], ['failed', 8], ['inactive', 10]],
+        [['active', 0], ['inactive', 2], ['failed', 4], ['active', 6], ['inactive', 8], ['failed', 10]]]
+
+def get_sample_test():
+    global sample_set
+    global current_index
+ 
+    sample = (samples[sample_set][current_index][STATE_INDEX], time.time())    
+    sample_count = len(samples[sample_set])
+    if current_index < sample_count-1:
+        current_index +=1
+    else:
+        current_index = 0
+    return sample
+
+def write_output(measurement):
+    print("Writing measurement output {0}".format(measurement))
+
+sample_set = 0
+current_index = 0
+
+def test_agg():
+    t = ConfigCollector(get_sample_test, write_output, "resource")    
+    measurement = t.create_measurement(samples[0], 10, 12)
+    assert measurement[0]['fields']['current_state'] == 'active'
+    assert measurement[0]['fields']['current_state_time'] == 12
+    assert measurement[0]['fields']['active_sum'] == 12
+    assert measurement[0]['fields']['active_count'] == 1
+    assert measurement[0]['time'] == 12000000000    
+
+    t = ConfigCollector(get_sample_test, write_output, "resource")
+    measurement = t.create_measurement(samples[1], 10, 14)
+    assert measurement[0]['fields']['current_state'] == 'active'
+    assert measurement[0]['fields']['current_state_time'] == 14
+    assert measurement[0]['fields']['active_sum'] == 14
+    assert measurement[0]['fields']['active_count'] == 1
+    assert measurement[0]['time'] == 14000000000    
+
+    t = ConfigCollector(get_sample_test, write_output, "resource")
+    measurement = t.create_measurement(samples[2], 8, 10)
+    assert measurement[0]['fields']['current_state'] == 'failed'
+    assert measurement[0]['fields']['current_state_time'] == 0
+    assert measurement[0]['fields']['active_sum'] == 2
+    assert measurement[0]['fields']['active_count'] == 1
+    assert measurement[0]['fields']['failed_sum'] == 0
+    assert measurement[0]['fields']['failed_count'] == 1
+    assert measurement[0]['time'] == 10000000000    
+
+    t = ConfigCollector(get_sample_test, write_output, "resource")
+    measurement = t.create_measurement(samples[3], 2, 12)
+    assert measurement[0]['fields']['current_state'] == 'inactive'
+    assert measurement[0]['fields']['current_state_time'] == 0
+    assert measurement[0]['fields']['active_sum'] == 6
+    assert measurement[0]['fields']['active_count'] == 2
+    assert measurement[0]['fields']['inactive_sum'] == 2
+    assert measurement[0]['fields']['inactive_count'] == 2
+    assert measurement[0]['fields']['failed_sum'] == 2
+    assert measurement[0]['fields']['failed_count'] == 1
+    assert measurement[0]['time'] == 12000000000       
+    
+    t = ConfigCollector(get_sample_test, write_output, "resource")    
+    measurement = t.create_measurement(samples[4], 4, 14)
+    assert measurement[0]['fields']['current_state'] == 'failed'
+    assert measurement[0]['fields']['current_state_time'] == 0
+    assert measurement[0]['fields']['active_sum'] == 4
+    assert measurement[0]['fields']['active_count'] == 2
+    assert measurement[0]['fields']['inactive_sum'] == 4
+    assert measurement[0]['fields']['inactive_count'] == 2
+    assert measurement[0]['fields']['failed_sum'] == 2
+    assert measurement[0]['fields']['failed_count'] == 2
+    assert measurement[0]['time'] == 14000000000   
+
+def test_one_period_collection():
+    global sample_set
+    global current_index
+
+    # one measurementing period
+    sample_set = 1
+    current_index = 0
+    t = ConfigCollector(get_sample_test, write_output, "resource", 2, 6)
+    t.start()
+    time.sleep(8)
+    t.stop()
+    print("Current measurement: {0}".format(str(t.current_measurement)))
+    assert t.current_measurement[0]['fields']['current_state'] == 'active'
+    assert int(round(t.current_measurement[0]['fields']['current_state_time'])) == 6
+    assert int(round(t.current_measurement[0]['fields']['active_sum'])) == 6
+    assert int(round(t.current_measurement[0]['fields']['active_count'])) == 1
+
+def test_multi_period_single_state_collection():
+    global sample_set
+    global current_index
+    # two measurementing periods
+    sample_set = 1
+    current_index = 0
+    t = ConfigCollector(get_sample_test, write_output, "resource", 1, 3)
+    t.start()
+    time.sleep(7)
+    t.stop()
+    print("Current measurement: {0}".format(str(t.current_measurement)))
+    assert t.current_measurement[0]['fields']['current_state'] == 'active'
+    assert int(round(t.current_measurement[0]['fields']['current_state_time'])) == 6
+    assert int(round(t.current_measurement[0]['fields']['active_sum'])) == 6
+    assert int(round(t.current_measurement[0]['fields']['active_count'])) == 1
+
+# [['active', 0], ['inactive', 2], ['failed', 4], ['active', 6], ['inactive', 8], ['failed', 10]]
+def test_multi_period_multi_state_collection():
+    global sample_set
+    global current_index
+    # 6 samples and 2 measurementing periods
+    sample_set = 4
+    current_index = 0
+    t = ConfigCollector(get_sample_test, write_output, "resource", 2, 10)
+    t.start()
+    time.sleep(13)
+    t.stop()
+    print("Current measurement: {0}".format(str(t.current_measurement)))
+    assert t.current_measurement[0]['fields']['current_state'] == 'failed'
+    assert int(round(t.current_measurement[0]['fields']['current_state_time'])) == 0
+    assert int(round(t.current_measurement[0]['fields']['active_sum'])) == 4
+    assert int(round(t.current_measurement[0]['fields']['active_count'])) == 2
+    assert int(round(t.current_measurement[0]['fields']['inactive_sum'])) == 4
+    assert int(round(t.current_measurement[0]['fields']['inactive_count'])) == 2
+    assert int(round(t.current_measurement[0]['fields']['failed_sum'])) == 2
+    assert int(round(t.current_measurement[0]['fields']['failed_count'])) == 2
\ No newline at end of file
diff --git a/clmctest/inputs/test_systemctl_mon.py b/clmctest/inputs/test_systemctl_mon.py
new file mode 100644
index 0000000000000000000000000000000000000000..d57f69e69e9dd68358b5d6ca370f2b15885cca5b
--- /dev/null
+++ b/clmctest/inputs/test_systemctl_mon.py
@@ -0,0 +1,64 @@
+#!/usr/bin/python3
+"""
+## © University of Southampton IT Innovation Centre, 2018
+##
+## Copyright in this software belongs to University of Southampton
+## IT Innovation Centre of Gamma House, Enterprise Road, 
+## Chilworth Science Park, Southampton, SO16 7NS, UK.
+##
+## This software may not be used, sold, licensed, transferred, copied
+## or reproduced in whole or in part in any manner or form or in or
+## on any media by any person other than in accordance with the terms
+## of the Licence Agreement supplied with the software, or otherwise
+## without the prior written consent of the copyright owners.
+##
+## This software is distributed WITHOUT ANY WARRANTY, without even the
+## implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+## PURPOSE, except where stated in the Licence Agreement supplied with
+## the software.
+##
+##      Created By :            Michael Boniface
+##      Created Date :          29-04-2018
+##      Created for Project :   FLAME
+"""
+
+import pytest
+import time
+import random
+import logging
+import sys
+
+from systemctl_monitor import SystemctlMonitor
+
+URL = "localhost"
+PORT = "8186"
+DATABASE = "CLMCMetrics"
+
+@pytest.mark.parametrize("service_name", [('nginx')])
+def test_create_measurement(telegraf_agent_config, service_name):
+
+    service = 'unknown'
+    for s in telegraf_agent_config['hosts']:
+        if s['name'] == service_name:
+            service = s
+            continue
+    assert service != 'unknown', "{0} not in list of hosts".format(service_name)   
+
+    mon = SystemctlMonitor(service_name, 2, 10, service['ip_address'], 8186, service['database_name'])
+    report = {'time': 1526042434.1773288, 'fields': {'loaded.active.running_sum': 231.85903143882751, 'current_state_time': 231.85903143882751, 'current_state': 'loaded.active.running', 'loaded.active.running_count': 1}}
+    measurement = mon.create_measurement(report)
+    assert measurement[0]['tags']['resource_name'] == service_name
+    assert measurement[0]['fields']['current_state'] == report['fields']['current_state']
+ 
+def test_get_systemctl_status(telegraf_agent_config):
+    mon = SystemctlMonitor('nginx', 2, 10, URL, PORT, DATABASE)
+    state = mon.get_systemctl_status('nginx')
+    assert state == 'loaded.active.running'
+
+def test_monitor(telegraf_agent_config):
+    mon = SystemctlMonitor('nginx', 2, 10, URL, PORT, DATABASE)
+    mon.start()
+    time.sleep(21)
+    mon.stop()
+    measurement = mon.get_current_measurement()
+    print("Current measurement: {0}".format(str(measurement)))
\ No newline at end of file
diff --git a/clmctest/monitoring/StreamingSim.py b/clmctest/monitoring/StreamingSim.py
index 290cadec1a7b0a3b0e59929478f5f8c920c087de..1ff23c165242c7d673b025b73cdfb0c9c9095cd9 100644
--- a/clmctest/monitoring/StreamingSim.py
+++ b/clmctest/monitoring/StreamingSim.py
@@ -392,19 +392,41 @@ class Sim(object):
         Calculates the network delay. Declared as static method since it doesn't need access to any instance variables.
 
         :param distance: distance metres
-        :param bandwidth: bandwidth Mbps
+        :param bandwidth: bandwidth Mb/s
         :param packet_size: packet size bytes
-        :param tx_video_bit_rate: bp/sec
+        :param tx_video_bit_rate: Mb/s
         :return: the calculated network delay
         """
 
         # propogation delay = distance/speed () (e.g 2000 metres * 2*10^8 for optical fibre)
+        # This is how long it takes to get a signal from one end to the other
+        # We are using 2E8 here rather than the speed of light (3E8) presumably because in optical fibre there are other delays with the repeaters etc?
+        # Isn't propogation_delay the same as "latency"?
+        # http://www.m2optics.com/blog/bid/70587/Calculating-Optical-Fiber-Latency suggests optical fibre is 5 microseconds / km
+        # 5 microseconds / km is 1/5  km / microsecond =  1000/5 m / microsecond = 1000000000/5 m/s = 2 * 100000000
+        # In reality we would measure the latency of a link.
         propogation_delay = distance / (2 * 100000000)
+
         # packetisation delay = ip packet size (bits)/tx rate (e.g. 100Mbp with  0% packet loss)
+        # This is how long it takes a whole data packet to pass a point in the wire
         packetisation_delay = (packet_size * 8) / (bandwidth * 1000000)
+
         # total number of packets to be sent
+        # This claims to be number of packets, but is actually is some sort of rate: the units are per second.
+        # If the tx_video_bit_rate was actually the size of the data to be sent then the formula is correct.
         packets = (tx_video_bit_rate * 1000000) / (packet_size * 8)
 
+        # This should be time for a data point to get from one end to the other (propogation_delay) +
+        #   time delay from the start of the data passing a point until the end of the data passes the point
+        # = propogation_delay + (total data size / bandwidth)
+        #
+        # A packet on the network comprises a data payload and a header. The header size is constant for a particular protocol 
+        # and the total packet size can be configured (e.g. 1500 bytes).
+        # packet_size = packet_header_size + packet_payload_size
+
+        # The total data size ideally would be (data size / (packet size - header size)) * packet size
+        # response_delay = propogation_delay + {[(data size / (packet size - header size)) * packet size] / bandwidth}
+        # response_delay = latency + {[(data_size / (packet_size - packet_header_size)) * packet_size] / bandwidth}
         response_delay = packets * (propogation_delay + packetisation_delay)
 
         return response_delay
diff --git a/clmctest/monitoring/rspec.yml b/clmctest/monitoring/rspec.yml
index e01647081c9d52ec6b7f81f1b4df972aecd38580..43fd381b410f406dfd4f323218f26aaad230d2fa 100644
--- a/clmctest/monitoring/rspec.yml
+++ b/clmctest/monitoring/rspec.yml
@@ -47,6 +47,7 @@ hosts:
     sf_id: "test-sf-clmc-agent-build"
     sf_id_instance: "ms-A.ict-flame.eu"
     ipendpoint_id: "endpoint1.ms-A.ict-flame.eu"
+    sr_id: "service_router"
     influxdb_url: "http://172.40.231.51:8086"
     database_name: "CLMCMetrics"
   - name: ipendpoint2
@@ -64,6 +65,7 @@ hosts:
     sf_id: "test-sf-clmc-agent-build"
     sf_id_instance: "ms-A.ict-flame.eu"
     ipendpoint_id: "endpoint2.ms-A.ict-flame.eu"
+    sr_id: "service_router"
     influxdb_url: "http://172.40.231.51:8086"
     database_name: "CLMCMetrics"      
   - name: test-runner
diff --git a/clmctest/scripts/.pytest_cache/v/cache/lastfailed b/clmctest/scripts/.pytest_cache/v/cache/lastfailed
deleted file mode 100644
index a120e0d9a98eab3d93b1e1878f1ea7a5aa9de13f..0000000000000000000000000000000000000000
--- a/clmctest/scripts/.pytest_cache/v/cache/lastfailed
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-  "test_config_telegraf.py::test_write_telegraf_conf": true
-}
\ No newline at end of file
diff --git a/clmctest/services/nginx/install.sh b/clmctest/services/nginx/install.sh
index d8baa4697ca7c3089e2cf14436440f26c7e578c3..7080fe826162a59914e787d5a779579b57f5ffea 100755
--- a/clmctest/services/nginx/install.sh
+++ b/clmctest/services/nginx/install.sh
@@ -49,4 +49,33 @@ if [ ! -f "$NGINX_CONF_TARGET" ]; then
 fi
 
 nginx -s reload
-systemctl start nginx
\ No newline at end of file
+systemctl start nginx
+
+## install a configuration monitoring service, this needs to be in a venv with the rest of the CLMC
+sudo apt-get install python3 python3-pip -y
+sudo pip3 install pyaml influxdb
+
+svc="nginxmon"
+
+echo "install systemctl monitoring service"
+svc_file="${svc}.service"
+echo "[Unit]" > $svc_file
+echo "Description=nginxmon" >> $svc_file
+echo "After=network-online.target" >> $svc_file
+echo "" >> $svc_file
+echo "[Service]" >> $svc_file
+echo "WorkingDirectory=${inst}/${dir}" >> $svc_file
+echo "ExecStart=/usr/bin/python3 ${REPO_ROOT}/src/monitoring/systemctl_monitor.py -service nginx -rate 2 -agg 10 -host localhost -port 8186 -db CLMCMetrics" >> $svc_file
+echo "ExecStop=/usr/bin/bash ${REPO_ROOT}/src/monitoring/stop_systemctl_monitor.sh" >> $svc_file
+echo "" >> $svc_file
+echo "[Install]" >> $svc_file
+echo "WantedBy=network-online.target" >> $svc_file
+sudo cp $svc_file /lib/systemd/system
+rm $svc_file
+
+echo "enable"
+sudo systemctl daemon-reload
+sudo systemctl enable ${svc}
+
+echo "start"
+sudo systemctl start ${svc}
\ No newline at end of file
diff --git a/clmctest/services/nginx/telegraf_nginx.conf b/clmctest/services/nginx/telegraf_nginx.conf
index d6588d5599fb3951f105b2b1d2f056a76c8381c0..6bc3b8785bec84b0241a64801decaad6daf8fd8e 100644
--- a/clmctest/services/nginx/telegraf_nginx.conf
+++ b/clmctest/services/nginx/telegraf_nginx.conf
@@ -25,4 +25,9 @@
   urls = ["http://localhost:80/nginx_status"]
 
   ## HTTP response timeout (default: 5s)
-#  response_timeout = "5s"
\ No newline at end of file
+#  response_timeout = "5s"
+
+# # Influx HTTP write listener
+[[inputs.http_listener]]
+  ## Address and port to host HTTP listener on
+  service_address = ":8186"
\ No newline at end of file
diff --git a/clmctest/streaming/rspec.yml b/clmctest/streaming/rspec.yml
index 18dce36072d1c5d9c47f2ce5831bb8a607c2407e..5a0c594c066c59a3066a138ef4c968d989f02613 100644
--- a/clmctest/streaming/rspec.yml
+++ b/clmctest/streaming/rspec.yml
@@ -47,6 +47,7 @@ hosts:
     sf_id: "adaptive_streaming"
     sf_id_instance: "adaptive_streaming_I1"
     ipendpoint_id: "adaptive_streaming_I1_nginx1"
+    sr_id: "service_router"
     influxdb_url: "http://192.168.50.10:8086"
     database_name: "CLMCMetrics"
   - name: nginx2
@@ -64,6 +65,7 @@ hosts:
     sf_id: "adaptive_streaming"
     sf_id_instance: "adaptive_streaming_I1"
     ipendpoint_id: "adaptive_streaming_I1_nginx2"
+    sr_id: "service_router"    
     influxdb_url: "http://192.168.50.10:8086"
     database_name: "CLMCMetrics"  
   - name: loadtest-streaming
@@ -81,5 +83,6 @@ hosts:
     sf_id: "adaptive_streaming_client"
     sf_id_instance: "adaptive_streaming_I1"
     ipendpoint_id: "adaptive_streaming_I1_client1"
+    sr_id: "service_router"
     influxdb_url: "http://192.168.50.10:8086"
     database_name: "CLMCMetrics"    
diff --git a/docs/figures/e2eFigures.graphml b/docs/figures/e2eFigures.graphml
new file mode 100644
index 0000000000000000000000000000000000000000..7e150e6312fdfa0d3b14f03d04423e8faceb54ec
--- /dev/null
+++ b/docs/figures/e2eFigures.graphml
@@ -0,0 +1,880 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:java="http://www.yworks.com/xml/yfiles-common/1.0/java" xmlns:sys="http://www.yworks.com/xml/yfiles-common/markup/primitives/2.0" xmlns:x="http://www.yworks.com/xml/yfiles-common/markup/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:y="http://www.yworks.com/xml/graphml" xmlns:yed="http://www.yworks.com/xml/yed/3" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://www.yworks.com/xml/schema/graphml/1.1/ygraphml.xsd">
+  <!--Created by yEd 3.17.2-->
+  <key attr.name="Description" attr.type="string" for="graph" id="d0"/>
+  <key for="port" id="d1" yfiles.type="portgraphics"/>
+  <key for="port" id="d2" yfiles.type="portgeometry"/>
+  <key for="port" id="d3" yfiles.type="portuserdata"/>
+  <key attr.name="url" attr.type="string" for="node" id="d4"/>
+  <key attr.name="description" attr.type="string" for="node" id="d5"/>
+  <key for="node" id="d6" yfiles.type="nodegraphics"/>
+  <key for="graphml" id="d7" yfiles.type="resources"/>
+  <key attr.name="url" attr.type="string" for="edge" id="d8"/>
+  <key attr.name="description" attr.type="string" for="edge" id="d9"/>
+  <key for="edge" id="d10" yfiles.type="edgegraphics"/>
+  <graph edgedefault="directed" id="G">
+    <data key="d0"/>
+    <node id="n0">
+      <data key="d5"/>
+      <data key="d6">
+        <y:ShapeNode>
+          <y:Geometry height="152.4000000000001" width="350.79999999999984" x="222.89999999999998" y="986.8"/>
+          <y:Fill hasColor="false" transparent="false"/>
+          <y:BorderStyle color="#000000" raised="false" type="dotted" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="9" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="15.02587890625" horizontalTextPosition="center" iconTextGap="4" modelName="sides" modelPosition="s" textColor="#000000" verticalTextPosition="bottom" visible="true" width="68.01953125" x="141.39023437499998" y="156.4000000000001">FLAME network</y:NodeLabel>
+          <y:Shape type="rectangle"/>
+        </y:ShapeNode>
+      </data>
+    </node>
+    <node id="n1">
+      <data key="d5"/>
+      <data key="d6">
+        <y:ShapeNode>
+          <y:Geometry height="152.4000000000001" width="350.79999999999984" x="222.89999999999998" y="663.4"/>
+          <y:Fill hasColor="false" transparent="false"/>
+          <y:BorderStyle color="#000000" raised="false" type="dotted" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="9" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="15.02587890625" horizontalTextPosition="center" iconTextGap="4" modelName="sides" modelPosition="s" textColor="#000000" verticalTextPosition="bottom" visible="true" width="68.01953125" x="141.39023437499992" y="156.4000000000001">FLAME network</y:NodeLabel>
+          <y:Shape type="rectangle"/>
+        </y:ShapeNode>
+      </data>
+    </node>
+    <node id="n2" yfiles.foldertype="group">
+      <data key="d4"/>
+      <data key="d6">
+        <y:ProxyAutoBoundsNode>
+          <y:Realizers active="0">
+            <y:GroupNode>
+              <y:Geometry height="511.0354454457677" width="480.9759773254389" x="1009.4572265625002" y="101.66553111673232"/>
+              <y:Fill color="#F5F5F5" transparent="false"/>
+              <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
+              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="22.37646484375" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="480.9759773254389" x="0.0" y="0.0">E2E complex chain</y:NodeLabel>
+              <y:Shape type="roundrectangle"/>
+              <y:State closed="false" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
+              <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+              <y:BorderInsets bottom="26" bottomF="25.725000000000023" left="0" leftF="5.6843418860808015E-14" right="0" rightF="0.0" top="0" topF="0.0"/>
+            </y:GroupNode>
+            <y:GroupNode>
+              <y:Geometry height="50.0" width="50.0" x="0.0" y="60.0"/>
+              <y:Fill color="#F5F5F5" transparent="false"/>
+              <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
+              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="22.37646484375" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="59.02685546875" x="-4.513427734375" y="0.0">Folder 1</y:NodeLabel>
+              <y:Shape type="roundrectangle"/>
+              <y:State closed="true" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
+              <y:Insets bottom="5" bottomF="5.0" left="5" leftF="5.0" right="5" rightF="5.0" top="5" topF="5.0"/>
+              <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
+            </y:GroupNode>
+          </y:Realizers>
+        </y:ProxyAutoBoundsNode>
+      </data>
+      <graph edgedefault="directed" id="n2:">
+        <node id="n2::n0">
+          <data key="d6">
+            <y:SVGNode>
+              <y:Geometry height="35.32593311666594" width="30.960157775878884" x="1229.7199211120605" y="139.04199596048232"/>
+              <y:Fill color="#CCCCFF" transparent="false"/>
+              <y:BorderStyle color="#000000" type="line" width="1.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="16.2509765625" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="37.90625" x="-3.4730461120605014" y="39.325933116665965">Client 1<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="-0.5" nodeRatioX="0.0" nodeRatioY="0.5" offsetX="0.0" offsetY="4.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
+              <y:SVGNodeProperties usingVisualBounds="true"/>
+              <y:SVGModel svgBoundsPolicy="0">
+                <y:SVGContent refid="1"/>
+              </y:SVGModel>
+            </y:SVGNode>
+          </data>
+        </node>
+        <node id="n2::n1">
+          <data key="d6">
+            <y:ShapeNode>
+              <y:Geometry height="42.5" width="42.5" x="1223.9499999999998" y="241.2500000000001"/>
+              <y:Fill color="#FFFFFF" transparent="false"/>
+              <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="16.2509765625" horizontalTextPosition="center" iconTextGap="4" modelName="sides" modelPosition="w" textColor="#000000" verticalTextPosition="bottom" visible="true" width="77.8427734375" x="-81.8427734375" y="13.12451171875">service router 'A'</y:NodeLabel>
+              <y:Shape type="ellipse"/>
+            </y:ShapeNode>
+          </data>
+        </node>
+        <node id="n2::n2">
+          <data key="d6">
+            <y:ShapeNode>
+              <y:Geometry height="42.5" width="42.5" x="1106.3000000000002" y="445.225"/>
+              <y:Fill color="#FFFFFF" transparent="false"/>
+              <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="16.2509765625" horizontalTextPosition="center" iconTextGap="4" modelName="sides" modelPosition="w" textColor="#000000" verticalTextPosition="bottom" visible="true" width="77.8427734375" x="-81.8427734375" y="13.12451171875">service router 'B'</y:NodeLabel>
+              <y:Shape type="ellipse"/>
+            </y:ShapeNode>
+          </data>
+        </node>
+        <node id="n2::n3">
+          <data key="d6">
+            <y:ShapeNode>
+              <y:Geometry height="42.5" width="42.5" x="1343.1999999999998" y="445.225"/>
+              <y:Fill color="#FFFFFF" transparent="false"/>
+              <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="16.2509765625" horizontalTextPosition="center" iconTextGap="4" modelName="sides" modelPosition="e" textColor="#000000" verticalTextPosition="bottom" visible="true" width="78.39453125" x="46.5" y="13.12451171875">service router 'C'</y:NodeLabel>
+              <y:Shape type="ellipse"/>
+            </y:ShapeNode>
+          </data>
+        </node>
+        <node id="n2::n4">
+          <data key="d6">
+            <y:ShapeNode>
+              <y:Geometry height="30.0" width="30.0" x="1217.475" y="375.2500000000001"/>
+              <y:Fill hasColor="false" transparent="false"/>
+              <y:BorderStyle hasColor="false" raised="false" type="line" width="1.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="72.677734375" x="-6.3388671875" y="12.849414062499932">FLAME SDN<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.4170861618798992" nodeRatioX="0.5" nodeRatioY="0.5" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
+              <y:Shape type="ellipse"/>
+            </y:ShapeNode>
+          </data>
+        </node>
+        <node id="n2::n5">
+          <data key="d6">
+            <y:SVGNode>
+              <y:Geometry height="35.32593311666594" width="30.960157775878884" x="1392.5" y="348.48399192096474"/>
+              <y:Fill color="#CCCCFF" transparent="false"/>
+              <y:BorderStyle color="#000000" type="line" width="1.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="16.2509765625" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="37.90625" x="-3.4730461120605014" y="39.325933116665965">Client 2<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="-0.5" nodeRatioX="0.0" nodeRatioY="0.5" offsetX="0.0" offsetY="4.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
+              <y:SVGNodeProperties usingVisualBounds="true"/>
+              <y:SVGModel svgBoundsPolicy="0">
+                <y:SVGContent refid="1"/>
+              </y:SVGModel>
+            </y:SVGNode>
+          </data>
+        </node>
+        <node id="n2::n6">
+          <data key="d6">
+            <y:SVGNode>
+              <y:Geometry height="35.32593311666594" width="30.960157775878884" x="1440.9999999999995" y="348.48399192096474"/>
+              <y:Fill color="#CCCCFF" transparent="false"/>
+              <y:BorderStyle color="#000000" type="line" width="1.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="16.2509765625" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="37.90625" x="-3.4730461120605014" y="39.325933116665965">Client 3<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="-0.5" nodeRatioX="0.0" nodeRatioY="0.5" offsetX="0.0" offsetY="4.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
+              <y:SVGNodeProperties usingVisualBounds="true"/>
+              <y:SVGModel svgBoundsPolicy="0">
+                <y:SVGContent refid="1"/>
+              </y:SVGModel>
+            </y:SVGNode>
+          </data>
+        </node>
+        <node id="n2::n7">
+          <data key="d6">
+            <y:ShapeNode>
+              <y:Geometry height="30.0" width="30.0" x="1112.5500000000002" y="521.725"/>
+              <y:Fill color="#FFFFFF" transparent="false"/>
+              <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="16.2509765625" horizontalTextPosition="center" iconTextGap="4" modelName="sides" modelPosition="s" textColor="#000000" verticalTextPosition="bottom" visible="true" width="80.611328125" x="-25.3056640625" y="34.0">Processor 'A' MC</y:NodeLabel>
+              <y:Shape type="rectangle"/>
+            </y:ShapeNode>
+          </data>
+        </node>
+        <node id="n2::n8">
+          <data key="d6">
+            <y:ShapeNode>
+              <y:Geometry height="30.0" width="30.0" x="1313.1999999999998" y="521.725"/>
+              <y:Fill color="#FFFFFF" transparent="false"/>
+              <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="16.2509765625" horizontalTextPosition="center" iconTextGap="4" modelName="sides" modelPosition="s" textColor="#000000" verticalTextPosition="bottom" visible="true" width="80.611328125" x="-25.3056640625" y="34.0">Processor 'B' MC</y:NodeLabel>
+              <y:Shape type="rectangle"/>
+            </y:ShapeNode>
+          </data>
+        </node>
+        <node id="n2::n9">
+          <data key="d6">
+            <y:ShapeNode>
+              <y:Geometry height="30.0" width="30.0" x="1392.9800788879395" y="521.725"/>
+              <y:Fill color="#FFFFFF" transparent="false"/>
+              <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="16.2509765625" horizontalTextPosition="center" iconTextGap="4" modelName="sides" modelPosition="s" textColor="#000000" verticalTextPosition="bottom" visible="true" width="57.3544921875" x="-13.67724609375" y="34.0">Storage MC</y:NodeLabel>
+              <y:Shape type="rectangle"/>
+            </y:ShapeNode>
+          </data>
+        </node>
+      </graph>
+    </node>
+    <node id="n3" yfiles.foldertype="group">
+      <data key="d4"/>
+      <data key="d6">
+        <y:ProxyAutoBoundsNode>
+          <y:Realizers active="0">
+            <y:GroupNode>
+              <y:Geometry height="511.0354454457677" width="499.31093826293886" x="36.58222656250018" y="92.70182647705082"/>
+              <y:Fill color="#F5F5F5" transparent="false"/>
+              <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
+              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="22.37646484375" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="499.31093826293886" x="0.0" y="0.0">E2E simple chain</y:NodeLabel>
+              <y:Shape type="roundrectangle"/>
+              <y:State closed="false" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
+              <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+              <y:BorderInsets bottom="26" bottomF="25.725000000000023" left="0" leftF="0.0" right="26" rightF="25.673633575439226" top="0" topF="0.0"/>
+            </y:GroupNode>
+            <y:GroupNode>
+              <y:Geometry height="50.0" width="50.0" x="0.0" y="60.0"/>
+              <y:Fill color="#F5F5F5" transparent="false"/>
+              <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
+              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="22.37646484375" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="59.02685546875" x="-4.513427734375" y="0.0">Folder 1</y:NodeLabel>
+              <y:Shape type="roundrectangle"/>
+              <y:State closed="true" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
+              <y:Insets bottom="5" bottomF="5.0" left="5" leftF="5.0" right="5" rightF="5.0" top="5" topF="5.0"/>
+              <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
+            </y:GroupNode>
+          </y:Realizers>
+        </y:ProxyAutoBoundsNode>
+      </data>
+      <graph edgedefault="directed" id="n3:">
+        <node id="n3::n0">
+          <data key="d6">
+            <y:SVGNode>
+              <y:Geometry height="35.32593311666594" width="30.960157775878884" x="256.84492111206055" y="130.07829132080082"/>
+              <y:Fill color="#CCCCFF" transparent="false"/>
+              <y:BorderStyle color="#000000" type="line" width="1.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="16.2509765625" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="37.90625" x="-3.4730461120605582" y="39.325933116665965">Client 1<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="-0.5" nodeRatioX="0.0" nodeRatioY="0.5" offsetX="0.0" offsetY="4.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
+              <y:SVGNodeProperties usingVisualBounds="true"/>
+              <y:SVGModel svgBoundsPolicy="0">
+                <y:SVGContent refid="1"/>
+              </y:SVGModel>
+            </y:SVGNode>
+          </data>
+        </node>
+        <node id="n3::n1">
+          <data key="d6">
+            <y:ShapeNode>
+              <y:Geometry height="42.5" width="42.5" x="251.07499999999982" y="232.2862953603186"/>
+              <y:Fill color="#FFFFFF" transparent="false"/>
+              <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="16.2509765625" horizontalTextPosition="center" iconTextGap="4" modelName="sides" modelPosition="w" textColor="#000000" verticalTextPosition="bottom" visible="true" width="77.8427734375" x="-81.8427734375" y="13.12451171875">service router 'A'</y:NodeLabel>
+              <y:Shape type="ellipse"/>
+            </y:ShapeNode>
+          </data>
+        </node>
+        <node id="n3::n2">
+          <data key="d6">
+            <y:ShapeNode>
+              <y:Geometry height="42.5" width="42.5" x="133.42500000000018" y="436.2612953603185"/>
+              <y:Fill color="#FFFFFF" transparent="false"/>
+              <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="16.2509765625" horizontalTextPosition="center" iconTextGap="4" modelName="sides" modelPosition="w" textColor="#000000" verticalTextPosition="bottom" visible="true" width="77.8427734375" x="-81.8427734375" y="13.12451171875">service router 'B'</y:NodeLabel>
+              <y:Shape type="ellipse"/>
+            </y:ShapeNode>
+          </data>
+        </node>
+        <node id="n3::n3">
+          <data key="d6">
+            <y:ShapeNode>
+              <y:Geometry height="42.5" width="42.5" x="370.3249999999998" y="436.2612953603185"/>
+              <y:Fill color="#FFFFFF" transparent="false"/>
+              <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="16.2509765625" horizontalTextPosition="center" iconTextGap="4" modelName="sides" modelPosition="e" textColor="#000000" verticalTextPosition="bottom" visible="true" width="78.39453125" x="46.5" y="13.12451171875">service router 'C'</y:NodeLabel>
+              <y:Shape type="ellipse"/>
+            </y:ShapeNode>
+          </data>
+        </node>
+        <node id="n3::n4">
+          <data key="d6">
+            <y:ShapeNode>
+              <y:Geometry height="30.0" width="30.0" x="244.5999999999999" y="366.2862953603186"/>
+              <y:Fill hasColor="false" transparent="false"/>
+              <y:BorderStyle hasColor="false" raised="false" type="line" width="1.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="72.677734375" x="-6.3388671875" y="12.849414062499932">FLAME SDN<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.4170861618798992" nodeRatioX="0.5" nodeRatioY="0.5" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
+              <y:Shape type="ellipse"/>
+            </y:ShapeNode>
+          </data>
+        </node>
+        <node id="n3::n5">
+          <data key="d6">
+            <y:SVGNode>
+              <y:Geometry height="35.32593311666594" width="30.960157775878884" x="419.625" y="339.52028728128323"/>
+              <y:Fill color="#CCCCFF" transparent="false"/>
+              <y:BorderStyle color="#000000" type="line" width="1.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="16.2509765625" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="37.90625" x="-3.4730461120605582" y="39.325933116665965">Client 2<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="-0.5" nodeRatioX="0.0" nodeRatioY="0.5" offsetX="0.0" offsetY="4.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
+              <y:SVGNodeProperties usingVisualBounds="true"/>
+              <y:SVGModel svgBoundsPolicy="0">
+                <y:SVGContent refid="1"/>
+              </y:SVGModel>
+            </y:SVGNode>
+          </data>
+        </node>
+        <node id="n3::n6">
+          <data key="d6">
+            <y:ShapeNode>
+              <y:Geometry height="30.0" width="30.0" x="420.1050788879395" y="512.7612953603185"/>
+              <y:Fill color="#FFFFFF" transparent="false"/>
+              <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="16.2509765625" horizontalTextPosition="center" iconTextGap="4" modelName="sides" modelPosition="s" textColor="#000000" verticalTextPosition="bottom" visible="true" width="57.3544921875" x="-13.67724609375" y="34.0">Storage MC</y:NodeLabel>
+              <y:Shape type="rectangle"/>
+            </y:ShapeNode>
+          </data>
+        </node>
+      </graph>
+    </node>
+    <node id="n4">
+      <data key="d6">
+        <y:SVGNode>
+          <y:Geometry height="35.32593311666594" width="30.960157775878884" x="67.64492111206054" y="726.3883582041351"/>
+          <y:Fill color="#CCCCFF" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="16.2509765625" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="37.90625" x="-3.4730461120605582" y="39.325933116665965">Client 1<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="-0.5" nodeRatioX="0.0" nodeRatioY="0.5" offsetX="0.0" offsetY="4.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:SVGNodeProperties usingVisualBounds="true"/>
+          <y:SVGModel svgBoundsPolicy="0">
+            <y:SVGContent refid="1"/>
+          </y:SVGModel>
+        </y:SVGNode>
+      </data>
+    </node>
+    <node id="n5">
+      <data key="d6">
+        <y:ShapeNode>
+          <y:Geometry height="42.5" width="42.5" x="201.47499999999985" y="722.8013247624681"/>
+          <y:Fill color="#FFFFFF" transparent="false"/>
+          <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="16.2509765625" horizontalTextPosition="center" iconTextGap="4" modelName="sides" modelPosition="s" textColor="#000000" verticalTextPosition="bottom" visible="true" width="77.8427734375" x="-17.67138671875" y="46.5">service router 'A'</y:NodeLabel>
+          <y:Shape type="ellipse"/>
+        </y:ShapeNode>
+      </data>
+    </node>
+    <node id="n6">
+      <data key="d6">
+        <y:ShapeNode>
+          <y:Geometry height="42.5" width="42.5" x="346.84492111206026" y="722.8013247624681"/>
+          <y:Fill color="#FFFFFF" transparent="false"/>
+          <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="16.2509765625" horizontalTextPosition="center" iconTextGap="4" modelName="sides" modelPosition="s" textColor="#000000" verticalTextPosition="bottom" visible="true" width="78.39453125" x="-17.947265625" y="46.5">service router 'C'</y:NodeLabel>
+          <y:Shape type="ellipse"/>
+        </y:ShapeNode>
+      </data>
+    </node>
+    <node id="n7">
+      <data key="d6">
+        <y:ShapeNode>
+          <y:Geometry height="30.0" width="30.0" x="509.81484222412064" y="729.0513247624681"/>
+          <y:Fill color="#FFFFFF" transparent="false"/>
+          <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="16.2509765625" horizontalTextPosition="center" iconTextGap="4" modelName="sides" modelPosition="s" textColor="#000000" verticalTextPosition="bottom" visible="true" width="57.3544921875" x="-13.67724609375" y="34.0">Storage MC</y:NodeLabel>
+          <y:Shape type="rectangle"/>
+        </y:ShapeNode>
+      </data>
+    </node>
+    <node id="n8">
+      <data key="d6">
+        <y:SVGNode>
+          <y:Geometry height="35.32593311666594" width="30.960157775878884" x="67.64492111206062" y="1052.188358204135"/>
+          <y:Fill color="#CCCCFF" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="16.2509765625" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="37.90625" x="-3.4730461120605582" y="39.325933116665965">Client 1<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="-0.5" nodeRatioX="0.0" nodeRatioY="0.5" offsetX="0.0" offsetY="4.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:SVGNodeProperties usingVisualBounds="true"/>
+          <y:SVGModel svgBoundsPolicy="0">
+            <y:SVGContent refid="1"/>
+          </y:SVGModel>
+        </y:SVGNode>
+      </data>
+    </node>
+    <node id="n9">
+      <data key="d6">
+        <y:ShapeNode>
+          <y:Geometry height="42.5" width="42.5" x="201.4749999999999" y="1048.6013247624683"/>
+          <y:Fill color="#FFFFFF" transparent="false"/>
+          <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="16.2509765625" horizontalTextPosition="center" iconTextGap="4" modelName="sides" modelPosition="s" textColor="#000000" verticalTextPosition="bottom" visible="true" width="77.8427734375" x="-17.67138671875" y="46.5">service router 'A'</y:NodeLabel>
+          <y:Shape type="ellipse"/>
+        </y:ShapeNode>
+      </data>
+    </node>
+    <node id="n10">
+      <data key="d6">
+        <y:ShapeNode>
+          <y:Geometry height="42.5" width="42.5" x="346.8449211120603" y="1048.6013247624683"/>
+          <y:Fill color="#FFFFFF" transparent="false"/>
+          <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="16.2509765625" horizontalTextPosition="center" iconTextGap="4" modelName="sides" modelPosition="s" textColor="#000000" verticalTextPosition="bottom" visible="true" width="78.39453125" x="-17.947265625" y="46.5">service router 'C'</y:NodeLabel>
+          <y:Shape type="ellipse"/>
+        </y:ShapeNode>
+      </data>
+    </node>
+    <node id="n11">
+      <data key="d6">
+        <y:ShapeNode>
+          <y:Geometry height="30.0" width="30.0" x="509.81484222412064" y="1054.8513247624683"/>
+          <y:Fill color="#FFFFFF" transparent="false"/>
+          <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="16.2509765625" horizontalTextPosition="center" iconTextGap="4" modelName="sides" modelPosition="s" textColor="#000000" verticalTextPosition="bottom" visible="true" width="57.3544921875" x="-13.67724609375" y="34.0">Storage MC</y:NodeLabel>
+          <y:Shape type="rectangle"/>
+        </y:ShapeNode>
+      </data>
+    </node>
+    <node id="n12">
+      <data key="d6">
+        <y:ShapeNode>
+          <y:Geometry height="30.0" width="30.0" x="373.42968444824123" y="892.3026495249364"/>
+          <y:Fill color="#FFFFFF" transparent="false"/>
+          <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="16.2509765625" horizontalTextPosition="center" iconTextGap="4" modelName="sides" modelPosition="s" textColor="#000000" verticalTextPosition="bottom" visible="true" width="57.3544921875" x="-13.67724609375" y="34.0">Storage MC</y:NodeLabel>
+          <y:Shape type="rectangle"/>
+        </y:ShapeNode>
+      </data>
+    </node>
+    <edge id="n2::e0" source="n2::n1" target="n2::n3">
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="standard" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n2::e1" source="n2::n3" target="n2::n2">
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="standard" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n2::e2" source="n2::n1" target="n2::n2">
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="standard" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n2::e3" source="n2::n0" target="n2::n1">
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="short"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n2::e4" source="n2::n5" target="n2::n3">
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="short"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n2::e5" source="n2::n6" target="n2::n3">
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="short"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n2::e6" source="n2::n2" target="n2::n7">
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="standard" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n2::e7" source="n2::n3" target="n2::n8">
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="standard" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n2::e8" source="n2::n3" target="n2::n9">
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="standard" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n3::e0" source="n3::n1" target="n3::n3">
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="standard" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n3::e1" source="n3::n3" target="n3::n2">
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="standard" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n3::e2" source="n3::n1" target="n3::n2">
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="standard" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n3::e3" source="n3::n0" target="n3::n1">
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="short"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n3::e4" source="n3::n5" target="n3::n3">
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="short"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n3::e5" source="n3::n3" target="n3::n6">
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="standard" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e0" source="n4" target="n5">
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="dashed" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="9" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="15.02587890625" horizontalTextPosition="center" iconTextGap="4" modelName="two_pos" modelPosition="head" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="61.02783203125" x="28.528175735473553" y="-17.025884710188166">request transit<y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e1" source="n5" target="n5">
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
+            <y:Point x="222.72499999999985" y="691.5513247624681"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="9" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="26.0517578125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="76.54052734375" x="-27.658209228515773" y="-49.023382268781916">handle request
+route specification<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="right" ratio="0.5" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e2" source="n5" target="n6">
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="9" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="15.02587890625" horizontalTextPosition="center" iconTextGap="4" modelName="two_pos" modelPosition="head" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="61.02783203125" x="20.921038436889432" y="-17.025884710188166">request transit<y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e3" source="n6" target="n7">
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="9" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="15.02587890625" horizontalTextPosition="center" iconTextGap="4" modelName="two_pos" modelPosition="head" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="61.02783203125" x="29.72105598449673" y="-17.025884710188166">request transit<y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e4" source="n6" target="n6">
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
+            <y:Point x="368.09492111206026" y="691.5513247624681"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="9" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="15.02587890625" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="63.5458984375" x="-21.160877227783487" y="-41.954351507063166">handle request<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="right" ratio="0.5" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e5" source="n8" target="n9">
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="dashed" width="1.0"/>
+          <y:Arrows source="standard" target="none"/>
+          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="9" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="15.02587890625" horizontalTextPosition="center" iconTextGap="4" modelName="two_pos" modelPosition="head" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="68.03271484375" x="25.02573432922361" y="-17.02587250315696">response transit<y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e6" source="n9" target="n9">
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
+            <y:Point x="222.7249999999999" y="1017.3513247624682"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="standard" target="none"/>
+          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="9" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="15.02587890625" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="70.55078125" x="-24.663336181640716" y="-41.954339300031734">handle response<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="right" ratio="0.5" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e7" source="n9" target="n10">
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="standard" target="none"/>
+          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="9" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="15.02587890625" horizontalTextPosition="center" iconTextGap="4" modelName="two_pos" modelPosition="head" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="68.03271484375" x="17.41859703063949" y="-17.025872503156734">response transit<y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e8" source="n10" target="n11">
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="standard" target="none"/>
+          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="9" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="15.02587890625" horizontalTextPosition="center" iconTextGap="4" modelName="two_pos" modelPosition="head" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="68.03271484375" x="26.21861457824673" y="-17.025872503156734">response transit<y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e9" source="n10" target="n10">
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
+            <y:Point x="368.0949211120603" y="1017.3513247624682"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="standard" target="none"/>
+          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="9" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="26.0517578125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="76.54052734375" x="-27.65819168090843" y="-49.023309026594234">handle response
+route specification<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="right" ratio="0.5" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e10" source="n12" target="n12">
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
+            <y:Point x="388.42968444824123" y="867.3026495249364"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="standard" target="none"/>
+          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="9" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="15.02587890625" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="68.03271484375" x="-19.017062377930642" y="-34.36452576803231">process request<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="right" ratio="0.5" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+  </graph>
+  <data key="d7">
+    <y:Resources>
+      <y:Resource id="1">&lt;?xml version="1.0" encoding="utf-8"?&gt;
+&lt;svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 width="57px" height="65px" viewBox="0 0 57 65" enable-background="new 0 0 57 65" xml:space="preserve"&gt;
+&lt;g&gt;
+	
+		&lt;linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="26.3398" y1="3115.7266" x2="27.5807" y2="3145.5239" gradientTransform="matrix(1 0 0 1 0.3203 -3091.7656)"&gt;
+		&lt;stop  offset="0.2711" style="stop-color:#FFAB4F"/&gt;
+		&lt;stop  offset="1" style="stop-color:#FFD28F"/&gt;
+	&lt;/linearGradient&gt;
+	&lt;path fill="url(#SVGID_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M49.529,51.225c-4.396-4.396-10.951-5.884-12.063-6.109
+		V37.8H19.278c0,0,0.038,6.903,0,6.868c0,0-6.874,0.997-12.308,6.432C1.378,56.691,0.5,62.77,0.5,62.77
+		c0,1.938,1.575,3.492,3.523,3.492h48.51c1.947,0,3.521-1.558,3.521-3.492C56.055,62.768,54.211,55.906,49.529,51.225z"/&gt;
+	&lt;path id="body_18_" fill="#ECECEC" stroke="#9B9B9B" stroke-miterlimit="10" d="M0.5,62.768c0,1.938,1.575,3.494,3.523,3.494h48.51
+		c1.947,0,3.521-1.559,3.521-3.494c0,0-1.844-6.861-6.525-11.543c-4.815-4.813-11.244-6.146-11.244-6.146
+		c-1.771,1.655-5.61,3.802-10.063,3.802c-4.453,0-8.292-2.146-10.063-3.802c0,0-5.755,0.586-11.189,6.021
+		C1.378,56.689,0.5,62.768,0.5,62.768z"/&gt;
+	
+		&lt;radialGradient id="SVGID_2_" cx="22.6621" cy="21.707" r="17.7954" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"&gt;
+		&lt;stop  offset="0" style="stop-color:#FCB57A"/&gt;
+		&lt;stop  offset="1" style="stop-color:#FF8C36"/&gt;
+	&lt;/radialGradient&gt;
+	&lt;path fill="url(#SVGID_2_)" stroke="#E55E03" d="M28.106,33.486c-8.112,0-12.688,4.313-12.688,10.438
+		c0,7.422,12.688,10.438,12.688,10.438s14.688-3.016,14.688-10.438C42.793,38.75,36.215,33.486,28.106,33.486z M26.288,53.051
+		c0,0-7.135-2.093-8.805-7.201c-0.222-0.682,0.147-1.156,0.795-1.521V37.8h20.188v6.663c0.235,0.352,1.109,0.737,1.229,1.387
+		C40.445,49.917,26.288,53.051,26.288,53.051z"/&gt;
+	
+		&lt;radialGradient id="SVGID_3_" cx="15.2056" cy="831.1875" r="32.3071" gradientTransform="matrix(1 0 0 1 0.0801 -773.6914)" gradientUnits="userSpaceOnUse"&gt;
+		&lt;stop  offset="0" style="stop-color:#FCB57A"/&gt;
+		&lt;stop  offset="1" style="stop-color:#FF8C36"/&gt;
+	&lt;/radialGradient&gt;
+	&lt;path fill="url(#SVGID_3_)" stroke="#E55E03" d="M49.529,51.225c-2.239-2.24-5.041-3.724-7.396-4.67
+		c-2.854,5.51-14.021,7.807-14.021,7.807s-10.472-2.483-12.387-8.514c-2.439,0.771-5.787,2.287-8.749,5.25
+		c-5.592,5.592-6.47,11.67-6.47,11.67c0,1.938,1.575,3.492,3.523,3.492h48.51c1.946,0,3.521-1.558,3.521-3.492
+		C56.055,62.768,54.211,55.906,49.529,51.225z"/&gt;
+	
+		&lt;radialGradient id="SVGID_4_" cx="17.0723" cy="18.4907" r="11.8931" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"&gt;
+		&lt;stop  offset="0" style="stop-color:#FCB57A"/&gt;
+		&lt;stop  offset="1" style="stop-color:#FF8C36"/&gt;
+	&lt;/radialGradient&gt;
+	&lt;path fill="url(#SVGID_4_)" stroke="#E55E03" d="M13.404,44.173c1.15-1.81,2.039-3.832,3.332-5.397
+		c-0.514,1.027-1.669,4.084-1.669,5.148c0,5.186,10.366,9.079,14.688,10.438c-3.472,1.627-9.134-1.498-11.334-2.359
+		c-3.601-1.419-4.071-3.063-5.89-4.854C12.523,47.135,12.878,45,13.404,44.173z"/&gt;
+	
+		&lt;radialGradient id="SVGID_5_" cx="31.8184" cy="19.3525" r="14.63" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"&gt;
+		&lt;stop  offset="0" style="stop-color:#FCB57A"/&gt;
+		&lt;stop  offset="1" style="stop-color:#FF8C36"/&gt;
+	&lt;/radialGradient&gt;
+	&lt;path fill="url(#SVGID_5_)" stroke="#E55E03" d="M45.777,43.924c-1.317-1.568-5.11-9.424-6.604-6.617
+		c0.516,1.025,3.617,3.693,3.617,6.617c0,5.186-10.271,8.576-16.699,9.145c1.429,4.938,11.373,1.293,13.805-0.313
+		c3.563-2.354,4.563-5.133,7.854-3.705C47.754,49.045,48.006,46.574,45.777,43.924z"/&gt;
+	
+		&lt;radialGradient id="SVGID_6_" cx="30.4893" cy="4.8721" r="5.2028" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"&gt;
+		&lt;stop  offset="0" style="stop-color:#FCB57A"/&gt;
+		&lt;stop  offset="1" style="stop-color:#FF8C36"/&gt;
+	&lt;/radialGradient&gt;
+	&lt;path fill="url(#SVGID_6_)" stroke="#E55E03" d="M30.777,54.167c0.357,0.836-0.153,1.983-0.352,2.813
+		c-0.256,1.084-0.072,2.104,0.102,3.186c0.164,1.02,0.156,2.107,0.25,3.167c0.082,0.916,0.482,1.849,0.357,2.75"/&gt;
+	
+		&lt;radialGradient id="SVGID_7_" cx="23.2871" cy="5.3008" r="5.5143" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"&gt;
+		&lt;stop  offset="0" style="stop-color:#FCB57A"/&gt;
+		&lt;stop  offset="1" style="stop-color:#FF8C36"/&gt;
+	&lt;/radialGradient&gt;
+	&lt;path fill="url(#SVGID_7_)" stroke="#E55E03" d="M23.695,53.417c-0.508,0.584-0.476,2.209-0.398,3
+		c0.116,1.183,0.456,2.099,0.333,3.333c-0.192,1.943,0.154,4.479-0.436,6.333"/&gt;
+	
+		&lt;radialGradient id="face_x5F_white_1_" cx="27.5835" cy="3117.4922" r="23.425" fx="23.0139" fy="3115.0024" gradientTransform="matrix(1 0 0 1 0.3203 -3091.7656)" gradientUnits="userSpaceOnUse"&gt;
+		&lt;stop  offset="0" style="stop-color:#FFD28F"/&gt;
+		&lt;stop  offset="1" style="stop-color:#FFAB4F"/&gt;
+	&lt;/radialGradient&gt;
+	&lt;path id="face_x5F_white_3_" fill="url(#face_x5F_white_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M43.676,23.357
+		c0.086,10.2-6.738,18.52-15.25,18.586c-8.5,0.068-15.464-8.146-15.55-18.344C12.794,13.4,19.618,5.079,28.123,5.012
+		C36.627,4.945,43.59,13.158,43.676,23.357z"/&gt;
+	
+		&lt;linearGradient id="face_highlight_1_" gradientUnits="userSpaceOnUse" x1="6468.501" y1="-12291.5195" x2="6492.1304" y2="-12384.9688" gradientTransform="matrix(0.275 0 0 -0.2733 -1752.8849 -3351.7349)"&gt;
+		&lt;stop  offset="0" style="stop-color:#FFFFFF;stop-opacity:0.24"/&gt;
+		&lt;stop  offset="1" style="stop-color:#FFFFFF;stop-opacity:0.16"/&gt;
+	&lt;/linearGradient&gt;
+	&lt;path id="face_highlight_3_" fill="url(#face_highlight_1_)" d="M28.415,5.625c-6.035,0.047-10.747,4.493-12.787,10.386
+		c-0.664,1.919-0.294,4.043,0.98,5.629c2.73,3.398,5.729,6.283,9.461,8.088c3.137,1.518,7.535,2.385,11.893,1.247
+		c2.274-0.592,3.988-2.459,4.375-4.766c0.187-1.094,0.293-2.289,0.283-3.553C42.54,13.244,36.729,5.56,28.415,5.625z"/&gt;
+	&lt;path id="Hair_Young_Black_1_" fill="#5C5C5C" stroke="#353535" stroke-linecap="round" stroke-linejoin="round" d="M20.278,13.25
+		c3.417,4.333,9.333,6.917,9.333,6.917l-1.417-3.5c0,0,7.094,4.691,8.083,4.333c0.968-0.2-1.082-3.807-1.082-3.807
+		s3.138,1.795,4.854,3.969c1.803,2.28,4.285,3.504,4.285,3.504S47.027,2.719,27.289,2.744C8.278,2.709,12.058,27.678,12.058,27.678
+		L14.695,17c0,0,0.914,5.757,1.399,4.875C17.861,15.211,18.861,11.5,20.278,13.25z"/&gt;
+&lt;/g&gt;
+&lt;/svg&gt;
+</y:Resource>
+    </y:Resources>
+  </data>
+</graphml>
diff --git a/docs/image/e2e-simple-chain-mc-processing.png b/docs/image/e2e-simple-chain-mc-processing.png
new file mode 100644
index 0000000000000000000000000000000000000000..16c80c3f6b942e6ae554206b5f41d4c6b8b24729
Binary files /dev/null and b/docs/image/e2e-simple-chain-mc-processing.png differ
diff --git a/docs/image/e2e-simple-chain-network.png b/docs/image/e2e-simple-chain-network.png
new file mode 100644
index 0000000000000000000000000000000000000000..8c054d0719314f2a5bcde4b17813f3d8043aeb70
Binary files /dev/null and b/docs/image/e2e-simple-chain-network.png differ
diff --git a/docs/image/e2e-simple-chain-request-steps.png b/docs/image/e2e-simple-chain-request-steps.png
new file mode 100644
index 0000000000000000000000000000000000000000..9c82d58aa0e5faeb3f3ff9be38d12d75d0fe6d0a
Binary files /dev/null and b/docs/image/e2e-simple-chain-request-steps.png differ
diff --git a/docs/image/e2e-simple-chain-response-steps.png b/docs/image/e2e-simple-chain-response-steps.png
new file mode 100644
index 0000000000000000000000000000000000000000..7401e2692bf4916979846f390039b7827c6aaecf
Binary files /dev/null and b/docs/image/e2e-simple-chain-response-steps.png differ
diff --git a/docs/total-service-request-delay.md b/docs/total-service-request-delay.md
new file mode 100644
index 0000000000000000000000000000000000000000..774c3616b10d852140934c67dc84fce568ca78e4
--- /dev/null
+++ b/docs/total-service-request-delay.md
@@ -0,0 +1,82 @@
+# Round Trip Time of a Service Request
+
+The Round Trip Time (RTT) of a network is the time taken from sending a packet to receiving the acknowlegement. We are also interested in factoring in the size of the data being sent over the network and the delay caused by the service processing the request.
+
+```
+total_delay = forward_network_delay + service_delay + reverse_network_delay
+```
+
+## Network delay
+
+Time to send complete payload over network
+
+network_delay = time delay from first byte leaving source to final byte arriving at destination
+
+If we ignore the OSI L6 protocol (e.g. HTTP, FTP, Tsunami) then we are modelling a chunk of data moving along a wire. The network delay is then:
+
+```
+network_delay = latency + (time difference from start of the data to the end of the data)
+```
+
+### Latency
+
+The latency (or propagation delay) of the network path is the time taken for a particular bit of data to get from one end to the other. If we are just modelling one wire (with no switches) then this can be modelled using:
+
+latency = distance / speed
+
+For optical fibre (or even an eletric wire), the speed naively would be the speed of light. In fact, the speed is slower than this (in optical fibre this is because of the internal refraction that occurs, which is different for different wavelengths). According to http://www.m2optics.com/blog/bid/70587/Calculating-Optical-Fiber-Latency the delay (1/speed) is approximately 5 microseconds / km
+
+```
+if 
+    distance is in m
+    delay is in s/m
+    latency is in s
+then
+    latency = distance * 5 / 1E9
+```
+
+(this matches MJB's "propogation_delay" formula)
+
+Normally we would just measure the latency of a link. Most real-life connections comprise many network links and many switches, each of which introduces some latency.
+
+### Data delay
+
+The time difference from start of the data to the end of the data (or "data delay" for want of a better term) is dependent on the bandwidth of the network and the amount of data.
+
+```
+if
+    data_size is in Bytes
+    bandwidth is in Mb/s
+    data_delay is in s
+then 
+    data_delay = data_size * 8 / bandwidth * 1E6
+```
+
+The data_size naively is the size of the data you want to send over the network (call this the "file_size"). However, the data is split into packets and each packet has a header on it so the amount of data going over the network is actually more than the amount sent.
+
+```
+let 
+    packet_size = packet_header_size + packet_payload_size
+then
+    data_size = (packet_size / packet_payload_size) * file_size
+or
+    data_size = (packet_size / packet_size - packet_header_size) * file_size
+```
+
+### Total delay
+
+```
+delay = latency + data_delay
+    = (distance * 5 / 1E9) + {[(packet_size / packet_size - packet_header_size) * file_size] * 8 / bandwidth * 1E6}
+```
+
+### Effect of Protocol
+
+The choice of protocol has a large effect in networks with a high bandwidth-delay product.
+
+In data communications, bandwidth-delay product is the product of a data link's capacity (in bits per second) and its round-trip delay time (in seconds). The result, an amount of data measured in bits (or bytes), is equivalent to the maximum amount of data on the network circuit at any given time, i.e., data that has been transmitted but not yet acknowledged.
+
+TCP for instance expects acknowledgement of every packet sent and if the sender has not received an acknowledgement within a specified time period then the packet will be retransmitted. Furthermore, TCP uses a flow-control method whereby the receiver specifies how much data it is willing to buffer and the sending host must pause sending and wait for acknowledgement once that amount of data is sent.
+
+## Service Delay
+
diff --git a/docs/understanding-E2E-performance.md b/docs/understanding-E2E-performance.md
new file mode 100644
index 0000000000000000000000000000000000000000..342752a0fe4ad26247e6986763d9fa7c70eadba5
--- /dev/null
+++ b/docs/understanding-E2E-performance.md
@@ -0,0 +1,75 @@
+# Understanding end-to-end media service performance in the FLAME platform
+
+© University of Southampton IT Innovation Centre, 2018
+
+This document describe the FLAME model of end-to-end (E2E) media service performance as it is observed and measured using the CLMC on the FLAME platform.
+
+#### **Authors**
+
+|Authors|Organisation|                    
+|-|-|
+|[Simon Crowle](mailto:sgc@it-innovation.soton.ac.uk)|[University of Southampton, IT Innovation Centre](http://www.it-innovation.soton.ac.uk)|
+
+## Introduction
+
+Readers of this document are assumed to have at least read the [CLMC information model](clmc-information-model.md). Here we explore the requirements which inform the definition of metrics that determine *'end-to-end'* media service performance. Before continuing, some terms are defined:
+
+| term | definition |
+| --- | --- |
+| *client* | an end-user of a FLAME media service - typically somebody accessing the service via an mobile computing device connected to an _service router_ |
+| *endpoint* | an endpoint (EP) is a virtual machine (VM) connected to the FLAME network |
+| *service router* | an EP that allows other EPs to communicate with one another using fully qualified domain names (FQDN), rather than IP addresses |
+| *network node* | an _EP_, _service router_ or other hardware that receives and sends network traffic along network connections attached to it |
+| *media component* | a media component (MC) is a process that in part or wholly realizes the functionality of a media service |
+| *E2E path* | the directed, acyclic traversal of FLAME network nodes, beginning with a source _EP_ and moving to a target _EP_ via network nodes in the FLAME network |
+| *E2E response time* | the total time taken for a service request to i) traverse an _E2E path_, ii) be processed at the _MC_, iii) be returned as a response via an _E2E path_
+
+In the sections that follow we set out some basic properties of a potential media service and then explore these in more detail with a concrete example. Following on from this analysis we provide a test-based approach to the specification of E2E media service performance measures.
+
+## E2E SFC chains
+
+Let us begin by identifying some simple, generic interactions within a media service function chain (SFC):
+
+```
+// simple chain
+Client --> data storage MC
+
+// sequential chain
+Client --> data processor MC --> data storage MC
+
+// complex chain
+Client --> data processor MC_A --> data processor MC_B
+                               |-> data storage MC <-|
+```
+
+The first example above imagines a client requesting data be stored in (or retrieved from) a database managed by the MC responsible for persistence. In the second case, the client requests some processing of some data held in the data store, the results of which are also stored. Finally, the third case outlines a more complex scenario in which the client requests some processing of data which in turn generates further requests for additional data processing in other MCs which also may depend on storage I/O functionality. Here additional data processing by related MCs could include job scheduling or task decomposition and distribution to worker nodes. An advanced media service, such as a game server, is a useful example of such a service in which graphics rendering; game state modelling; artificial intelligence and network communications are handled in parallel using varying problem decomposition methods.
+
+## E2E simple chain
+
+Next we will define a simple network into which we will place a data processing EP and a data storage EP - we assert the clients could connect to any of _service routers_ that link these MC together.
+
+![E2E network](image/e2e-simple-chain-network.png)
+
+Our simple network consists of three _service routers_ that connect clients with MC data and storage functionality; each demand from client 1 for the storage function could be routed in one network hop from router 'A' to router 'C' or in two from routers 'A' -> 'B' -> 'C'. A demand for storage function from _client 2_ would include zero network hops.
+
+### E2E simple chain metrics
+
+A principal metric we use to understand _E2E response time_: the average time taken between a request or response being transmitted and received _within the FLAME network_. Scoping the E2E response time to within the FLAME network is an important qualification since it is only within this network that all necessary measurements can reliably be taken.
+
+An out-going simple E2E request chain looks like this:
+
+![E2E request steps](image/e2e-simple-chain-request-steps.png)
+
+the delay associated with the processing of the service request is isolated to within the storage MC:
+
+![E2E MC processing](image/e2e-simple-chain-mc-processing.png)
+
+whilst for the response E2E delay, we see this:
+
+![E2E response steps](image/e2e-simple-chain-response-steps.png)
+
+Above we denote the time required for an service router to handle (or pass on) an in-coming message as _handle request_ or _handle response_. When a message is first encountered by a service router, an optimized path through the FLAME network must also be determined; this is labelled above as _route specification_. The _e2e response time_ is the sum of the request, service processing and response delays.
+
+> __Side note:__
+> To understand _delay_ more robustly, we may also consider the rate at which requests or responses arrive (_arrival rate_) at each node in the network since message management (queuing, for example) will have an effect at scale. Similarly, the _payload size_ of the messages being handled could also be observed since the quantity of data traversing the SFC will also impact delay in similar, large scale scenarios.
+>
\ No newline at end of file
diff --git a/scripts/clmc-agent/build-telegraf.sh b/scripts/clmc-agent/build-telegraf.sh
new file mode 100644
index 0000000000000000000000000000000000000000..4e071c6d6d9e78e7b07bcc6be9c6b74586dc473f
--- /dev/null
+++ b/scripts/clmc-agent/build-telegraf.sh
@@ -0,0 +1,41 @@
+#!/bin/bash
+
+# install build prequisites
+apt-get install ruby ruby-dev rubygems build-essential rpm -y
+gem install --no-ri --no-rdoc fpm 
+
+# install go
+wget https://dl.google.com/go/go1.10.2.linux-amd64.tar.gz -O go1.10.2.linux-amd64.tar.gz
+tar -C /usr/local -xzf go1.10.2.linux-amd64.tar.gz
+
+GORC=~/gorc
+GOPATH=~/go
+# set the environment variables
+echo 'PATH=$PATH:/usr/local/go/bin' > ${GORC}
+echo 'GOPATH=${GOPATH}' >> ${GORC}
+source ${GORC}
+
+mkdir $GOPATH
+
+# get telegraf from influx repo
+cd $GOPATH
+go get -d github.com/influxdata/telegraf
+
+# rebase to it-innovation repo
+cd $GOPATH/src/github.com/influxdata/telegraf
+git remote add it-innovation https://github.com/it-innovation/telegraf.git
+git pull --rebase it-innovation master
+
+# build telegraf
+make
+
+# build the packages
+# chmod 755 ./scripts/*.sh
+# make package
+
+# git push it-innovation
+
+
+
+
+
diff --git a/scripts/clmc-agent/configure.sh b/scripts/clmc-agent/configure.sh
index 9ce2c1c36b71ab2c2d910bc78f66ea304234a934..41e91f5607c47e4be1ee0287a4a46cdea4e22501 100755
--- a/scripts/clmc-agent/configure.sh
+++ b/scripts/clmc-agent/configure.sh
@@ -30,10 +30,10 @@ set -euo pipefail
 echo "Configuring Telegraf agent general and output configuration"
 
 # Get command line parameters
-if [ "$#" -ne 8 ]; then
+if [ "$#" -ne 9 ]; then
     echo "Error: illegal number of arguments: "$#
-      echo "Usage: configure.sh LOCATION SFC_ID SFC_ID_INSTANCE SF_ID SF_ID_INSTANCE IP_ENDPOINT_ID INFLUXDB_URL DATABASE_NAME"
-      exit 1 
+    echo "Usage: configure.sh LOCATION SFC_ID SFC_ID_INSTANCE SF_ID SF_ID_INSTANCE IP_ENDPOINT_ID SR_ID INFLUXDB_URL DATABASE_NAME"
+    exit 1 
 fi
 
 LOCATION=$1
@@ -42,14 +42,17 @@ SFC_ID_INSTANCE=$3
 SF_ID=$4
 SF_ID_INSTANCE=$5
 IP_ENDPOINT_ID=$6
-INFLUXDB_URL=$7
-DATABASE_NAME=$8
+SR_ID=$7
+INFLUXDB_URL=$8
+DATABASE_NAME=$9
 
 TELEGRAF_CONF_DIR="/etc/telegraf"
 TELEGRAF_CONF_FILE=$TELEGRAF_CONF_DIR"/telegraf.conf"
 TELEGRAF_INCLUDE_CONF_DIR=$TELEGRAF_CONF_DIR"/telegraf.d"
 TELEGRAF_OUTPUT_CONF_FILE=$TELEGRAF_INCLUDE_CONF_DIR"/telegraf_output.conf"
 
+cat TELEGRAF_OUTPUT_CONF_FILE
+
 # Replace template parameters on general configuration
 sed -i 's/$LOCATION/'$LOCATION'/g' $TELEGRAF_CONF_FILE
 sed -i 's/$SFC_ID/'$SFC_ID'/g' $TELEGRAF_CONF_FILE
@@ -57,6 +60,7 @@ sed -i 's/$SFC_ID_INSTANCE/'$SFC_ID_INSTANCE'/g' $TELEGRAF_CONF_FILE
 sed -i 's/$SF_ID/'$SF_ID'/g' /etc/telegraf/telegraf.conf
 sed -i 's/$SF_ID_INSTANCE}}/'$SF_ID_INSTANCE'/g' $TELEGRAF_CONF_FILE
 sed -i 's/$IP_ENDPOINT_ID/'$IP_ENDPOINT_ID'/g' $TELEGRAF_CONF_FILE
+sed -i 's/$SR_ID/'$SR_ID'/g' $TELEGRAF_CONF_FILE
 
 # Replace parameters in output configuration file
 sed -i 's|$INFLUXDB_URL|'$INFLUXDB_URL'|g' $TELEGRAF_OUTPUT_CONF_FILE
diff --git a/scripts/clmc-agent/configure_template.sh b/scripts/clmc-agent/configure_template.sh
index 2df916b132f6bf760921a2f566e518c44fa82cbb..136a266f7d7116671c51ff362e7645eaa9c59aaf 100644
--- a/scripts/clmc-agent/configure_template.sh
+++ b/scripts/clmc-agent/configure_template.sh
@@ -53,6 +53,7 @@ echo "Telegraf general config file: " $TELEGRAF_CONF_FILE
   sf="$SF_ID"
   sf_i="$SF_ID_INSTANCE"
   ipendpoint="$IP_ENDPOINT_ID"
+  sr="$SR_ID"
 [agent]
   interval = "10s"
   round_interval = true
diff --git a/scripts/clmc-agent/install.sh b/scripts/clmc-agent/install.sh
index 21d46b1d0918836ec3c94c20d76fdf9bf3407408..d0a0de1ee9dc44bff96dda3696967db13521bfcd 100755
--- a/scripts/clmc-agent/install.sh
+++ b/scripts/clmc-agent/install.sh
@@ -27,14 +27,28 @@
 # Force fail on command fail
 set -euo pipefail
 
-echo "Configuring Telegraf agent"
+echo "Installing Telegraf agent"
+
+TELEGRAF_VERSION=1.7.0~5618bb0-0
+TELEGRAF_CHECKSUM=dc24932fa1aef9392582880c077dd2493b9f2c66babd7733a0654540bbb5003b
 
 # Install telegraf
-wget https://dl.influxdata.com/telegraf/releases/telegraf_1.3.2-1_amd64.deb
-sha1sum telegraf_1.3.2-1_amd64.deb | grep '73794cc2986fef7c81cfff8bc638cd84d6629da8' &> /dev/null
-if [ $? == 1 ]; then
-	echo "telegraf download failed sha1sum check"
-	exit
+## wget https://dl.influxdata.com/telegraf/releases/telegraf_${TELEGRAF_VERSION}_amd64.deb 2> /dev/null
+
+# load the runtime configuration for the artefact repository
+if [ ! -f ${REPO_ROOT}/reporc ]; then
+    echo "Cannot download FLIPS binaries as reporc file containing artefact repository credentials does not exist within user's home folder"
+    exit 1
 fi
-dpkg -i telegraf_1.3.2-1_amd64.deb
+source ${REPO_ROOT}/reporc
+
+wget --user ${REPO_USER} --password ${REPO_PASS} https://flame-nexus.it-innovation.soton.ac.uk/repository/flame-general/it-innovation/telegraf/${TELEGRAF_VERSION}/telegraf-${TELEGRAF_VERSION}.deb -O telegraf-${TELEGRAF_VERSION}.deb
+
+
+#sha256sum telegraf_${TELEGRAF_VERSION}_amd64.deb | grep $TELEGRAF_CHECKSUM > /dev/null
+#if [ $? == 1 ]; then
+#	echo "Telegraf download failed checksum"
+#	exit 1
+#fi
+dpkg -i telegraf-${TELEGRAF_VERSION}.deb
 
diff --git a/scripts/clmc-agent/telegraf.conf b/scripts/clmc-agent/telegraf.conf
index 180094022dd874009b38e8255dea94393974f75e..6c5aed64e2cd00cfc227434bf25eca387d5fa6ae 100644
--- a/scripts/clmc-agent/telegraf.conf
+++ b/scripts/clmc-agent/telegraf.conf
@@ -44,6 +44,8 @@
   sf_i="$SF_ID_INSTANCE"
   # ipendpoint id aka surrogate instance
   ipendpoint="$IP_ENDPOINT_ID"
+  # the service router providing access to the network
+  sr="$SR_ID"
 
 # Configuration for telegraf agent
 [agent]
diff --git a/scripts/clmc-service/install.sh b/scripts/clmc-service/install.sh
index bf262be5034371268ebbb483f1cc8710fe581289..900c9433aed8c55c1d936b2b5f8c2e146ce3f918 100755
--- a/scripts/clmc-service/install.sh
+++ b/scripts/clmc-service/install.sh
@@ -27,37 +27,46 @@
 # Force fail on command fail
 set -euo pipefail
 
+# Define tickstack software versions
+INFLUX_VERSION=1.5.2
+INFLUX_CHECKSUM=42fede7b497bdf30d4eb5138db218d1add986fca4fce4a8bcd9c7d6dabaf572a
+
+KAPACITOR_VERSION=1.4.1
+KAPACITOR_CHECKSUM=eea9b215f241906570eafe3857e1d4c5
+
+CHRONOGRAF_VERSION=1.4.4.2
+CHRONOGRAF_CHECKSUM=eea6915aa6db8f134fcd3b095e863b773bfb3a16a26e346dd65904a07df97963
 
 # install python for the simulator
 apt-get update
 apt-get -y install python
 
 # install influx
-wget https://dl.influxdata.com/influxdb/releases/influxdb_1.2.4_amd64.deb
-sha1sum influxdb_1.2.4_amd64.deb | grep 'e77522b65a582787b0d61b90d355284bb2683258' &> /dev/null
+wget https://dl.influxdata.com/influxdb/releases/influxdb_${INFLUX_VERSION}_amd64.deb 2> /dev/null
+sha256sum influxdb_${INFLUX_VERSION}_amd64.deb | grep $INFLUX_CHECKSUM > /dev/null
 if [ $? == 1 ]; then
-	echo "influx download failed sha1sum check"
-	exit
+	echo "influx download failed checksum"
+	exit 1
 fi
-dpkg -i influxdb_1.2.4_amd64.deb
+dpkg -i influxdb_${INFLUX_VERSION}_amd64.deb
 
 # install kapacitor
-wget https://dl.influxdata.com/kapacitor/releases/kapacitor_1.3.1_amd64.deb
-sha1sum kapacitor_1.3.1_amd64.deb | grep '5ae1ead9904ea651e72b181848c2e84338eb88b4' &> /dev/null
+wget https://dl.influxdata.com/kapacitor/releases/kapacitor_${KAPACITOR_VERSION}_amd64.deb 2> /dev/null
+md5sum kapacitor_${KAPACITOR_VERSION}_amd64.deb | grep $KAPACITOR_CHECKSUM > /dev/null
 if [ $? == 1 ]; then
-	echo "Kapacitor download failed sha1sum check"
-	exit
+	echo "Kapacitor download failed checksum"
+	exit 1
 fi
-dpkg -i kapacitor_1.3.1_amd64.deb
+dpkg -i kapacitor_${KAPACITOR_VERSION}_amd64.deb
 
 # install Chronograf
-wget https://dl.influxdata.com/chronograf/releases/chronograf_1.3.3.0_amd64.deb
-sha1sum chronograf_1.3.3.0_amd64.deb | grep '9b567598c078ba1ad73dd587d7f32163e0886471' &> /dev/null
+wget https://dl.influxdata.com/chronograf/releases/chronograf_${CHRONOGRAF_VERSION}_amd64.deb 2> /dev/null
+sha256sum chronograf_${CHRONOGRAF_VERSION}_amd64.deb | grep $CHRONOGRAF_CHECKSUM > /dev/null
 if [ $? == 1 ]; then
-	echo "Chronograf download failed sha1sum check"
-	exit
+	echo "Chronograf download failed checksum"
+	exit 1
 fi
-dpkg -i chronograf_1.3.3.0_amd64.deb
+dpkg -i chronograf_${CHRONOGRAF_VERSION}_amd64.deb
 
 systemctl start influxdb
 systemctl start kapacitor
diff --git a/setup.py b/setup.py
index 300ceb07896049b3145baf04d374468b05392e1e..ae4a06e7ffad5b567d01142d90acd0f55248109a 100644
--- a/setup.py
+++ b/setup.py
@@ -41,18 +41,18 @@ def get_version(fname):
 
 
 setup(
-    name = "clmctest",
+    name = "clmc",
     version = get_version("clmctest/_version.py"),
     author = "Michael Boniface",
     author_email = "mjb@it-innovation.soton.ac.uk",
     description = "FLAME CLMC Test Module",
     license = "https://gitlab.it-innovation.soton.ac.uk/FLAME/flame-clmc/blob/integration/LICENSE",
-    keywords = "FLAME CLMC tests",
+    keywords = "FLAME CLMC",
     url='https://gitlab.it-innovation.soton.ac.uk/FLAME/flame-clmc',
     packages=find_packages(exclude=["services"]),
     include_package_data=True,
-    package_data={'': ['_version.py', '*.yml', '*.sh', '*.json', '*.conf']},
-    long_description="FLAME CLMC tests",
+    package_data={'': ['_version.py', '*.yml', '*.sh', '*.json', '*.conf']},        
+    long_description="FLAME CLMC",
     classifiers=[
         "Development Status :: Alpha",
         "Topic :: FLAME Tests",
diff --git a/src/clmcagent/__init__.py b/src/clmcagent/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..44f772595799f5fe338534918c95e23e08e80464
--- /dev/null
+++ b/src/clmcagent/__init__.py
@@ -0,0 +1 @@
+#!/usr/bin/python3
\ No newline at end of file
diff --git a/src/clmcagent/config_collector.py b/src/clmcagent/config_collector.py
new file mode 100644
index 0000000000000000000000000000000000000000..6ebed75071e2d9f804d1f9e4c3b5136c0926a3b8
--- /dev/null
+++ b/src/clmcagent/config_collector.py
@@ -0,0 +1,225 @@
+#!/usr/bin/python3
+import threading
+import time
+import random
+import logging
+from influxdb import InfluxDBClient
+
+logging.basicConfig(level=logging.DEBUG)
+logger = logging.getLogger()
+
+class ConfigCollector(threading.Thread):
+    STATE_NAME = 0
+    STATE_TIME = 1
+    
+    def __init__(self, sample_func, write_func, resource_name, sample_rate=2, agg_period=10):
+        threading.Thread.__init__(self)
+        self._start_event = threading.Event()
+        self.sample_func = sample_func
+        self.write_func = write_func
+        self.resource_name = resource_name
+        self.sample_rate = sample_rate
+        self.agg_period = agg_period       
+        self.agg_states = {}
+        self.current_measurement = {}
+        return
+
+    def run(self):
+        # if thread running then return
+        if(self._start_event.is_set()):
+            return
+        self._start_event.set()
+
+        # set start period to current time
+        start_period = time.time()
+        logger.debug("start time = {0}".format(start_period))
+        # set end period to the aggregation period
+        end_period = start_period + self.agg_period
+        logger.debug("end time = {0}".format(end_period))
+        # initialise the time in the current state
+        current_state_time = 0
+        samples = [] 
+        while(self._start_event.is_set()):
+            # get sample using sampler function
+            (sample_state, sample_time) = self.sample_func()
+            # add sample to list of samples
+            samples.append((sample_state, sample_time))
+            logger.debug("Sample state {0}".format(sample_state))
+            logger.debug("Sample count: {0}".format(len(samples)))
+            # if last sample was at the end of the aggregation period then process         
+            if sample_time >= end_period:
+                # aggregate samples into single measurement
+                self.current_measurement = self.create_measurement(samples, current_state_time, sample_time)
+                # write output
+                write_thread = WriteThread(self.write_func, self.current_measurement)
+                write_thread.start()      
+                # set time in current state
+                current_state_time = self.current_measurement[0]['fields']['current_state_time']
+                # remove all processed samples    
+                samples.clear()
+                # add last sample as 1st sample of the next period
+                samples.append((sample_state, sample_time))
+                # set new end period
+                end_period = sample_time + self.agg_period
+                logger.debug("Number of samples after agg: {0}".format(len(samples)))
+                logger.debug("Next end time {0}".format(end_period))       
+
+            # calc how long it took to process samples
+            processing_time = time.time() - sample_time
+            logger.debug("Processing time {0}".format(processing_time))
+            # calc the remaining time to wait until next sample             
+            sleep_time = self.sample_rate - processing_time
+            logger.debug("Sleep time {0}".format(sleep_time))
+            # if processing took longer than the sample rate we have a problemm 
+            # and we will need to put processing into a worker thread
+            if(sleep_time < 0):
+                logger.warn("Aggregation processing took longer that sample rate")
+                sleep_time = 0
+            logger.debug("Sleeping for sample {0}".format(sleep_time))
+            # wait for the next sample
+            time.sleep(sleep_time)
+        logger.debug("Finished collection thread")
+        return
+
+    def stop(self):
+        logger.debug("Stopping thread")
+        self._start_event.clear()
+        
+    def create_measurement(self, samples, initial_state_time, current_time):
+        logger.debug("Samples: {0}".format(str(samples)))
+
+        # aggregate samples into states
+        states = self.aggregate_samples(samples) 
+        logger.debug("States: {0}".format(str(states)))  
+        
+        # aggregate the states into a measurement
+        fields = self.aggregate_states(states, initial_state_time)
+        measurement_time = int(current_time*1000000000)
+        measurement = [{"measurement": "service_config_state",
+               "tags": {
+                   "resource_name": self.resource_name
+               },
+               "time": measurement_time
+               }]
+        measurement[0]['fields'] = fields['fields']
+        logger.debug("Report: {0}".format(str(measurement)))
+
+        return measurement
+
+    def aggregate_samples(self, samples):
+        states = []
+        
+        sample_count = len(samples)
+        logger.debug("Sample count {0}".format(sample_count))
+        # error if no samples to aggregate
+        if sample_count == 0:
+            raise ValueError('No samples in the samples list') 
+
+        # no aggregation needed if only one sample
+        if sample_count == 1:
+            return samples[0]
+
+        # aggregate samples
+        last_index = sample_count-1 
+        for index, sample in enumerate(samples):
+            # for the 1st sample we set the current state and state_start_time
+            if index == 0:
+                current_state = sample[self.STATE_NAME]
+                state_start_time = sample[self.STATE_TIME]
+                logger.debug("Start time : {0}".format(state_start_time))            
+            else:
+                # add state duration for previous state after transition
+                if current_state != sample[self.STATE_NAME]:
+                    # calc time in current state
+                    state_time = sample[self.STATE_TIME] - state_start_time
+                    states.append([current_state,state_time])
+                    # set the state to the next state
+                    current_state = sample[self.STATE_NAME]
+                    # set the start time of the next state
+                    state_start_time = state_start_time + state_time
+                # deal with the final sample
+                if index == last_index:
+                    # calc state duration if last sample is the same as previous state
+                    if current_state == sample[self.STATE_NAME]:
+                        state_time = sample[self.STATE_TIME] - state_start_time
+                        states.append([current_state,state_time])
+                    # add transition in final sample with zero duration
+                    elif current_state != sample[self.STATE_NAME]:
+                        states.append([current_state,0])
+        return states        
+
+    def aggregate_states(self, states, initial_state_time):
+        # set initial state to the 1st sample
+        initial_state = states[0][self.STATE_NAME]
+        logger.debug("Initial state : {0}".format(initial_state))            
+        logger.debug("Initial state time : {0}".format(initial_state_time))
+        # set the current state as the last state sampled
+        current_state = states[-1][self.STATE_NAME]
+        # if no change in state  take the initial state time and add current state time
+        if initial_state == current_state and len(states) == 1:
+            current_state_time = initial_state_time + states[-1][self.STATE_TIME]
+            state_sum_key = current_state + "_sum"
+            state_count_key = current_state + "_count"
+            # initialise the number of transitions if it's the 1st time
+            if state_sum_key not in self.agg_states:                     
+                self.agg_states[state_count_key] = 1
+            self.agg_states[state_sum_key] = current_state_time       
+        else:
+            # current state time is the last state time
+            current_state_time = states[-1][self.STATE_TIME]
+            # calc the total duration and number of transitions in each state.
+            for state in states:
+                # if first occurance of state add with initial duration and a single transition   
+                state_sum_key = state[self.STATE_NAME] + "_sum"
+                state_count_key = state[self.STATE_NAME] + "_count"
+                if state_sum_key not in self.agg_states:
+                    logger.debug("Adding state: {0}".format(state[self.STATE_NAME]))
+                    self.agg_states[state_sum_key] = state[self.STATE_TIME]              
+                    self.agg_states[state_count_key] = 1
+                else:
+                    logger.debug("Aggregating state: {0}".format(state[self.STATE_NAME]))                     
+                    # increment number of times in the state                    
+                    self.agg_states[state_count_key] += 1           
+                    logger.debug("increment number of times in the state")                     
+                    # add state time to aggregate total
+                    self.agg_states[state_sum_key] += state[self.STATE_TIME]
+                    logger.debug("Duration: {0}".format(self.agg_states[state_sum_key]))
+
+        # Create report
+        measurement = {}
+        measurement['fields'] = self.agg_states
+        measurement['fields']['current_state'] = current_state            
+        measurement['fields']['current_state_time'] = current_state_time
+        return measurement
+
+class WriteThread(threading.Thread):
+    def __init__(self, write_func, measurement):
+        threading.Thread.__init__(self)
+        self._start_event = threading.Event()
+        self.write_func = write_func
+        self.measurement = measurement
+        return
+
+    def run(self):
+        # if thread running then return
+        if(self._start_event.is_set()):
+            return
+        self._start_event.set()  
+        self.write_func(self.measurement)
+    
+    def stop(self):
+        self._start_event.clear() 
+
+class InfluxWriter():
+    def __init__(self, hostname, port, database):
+        self.db_client = InfluxDBClient(host=hostname, port=port, database=database, timeout=10) 
+        return
+
+    def write(self, measurement):
+        # if thread running then return 
+        try:  
+            points = []                             
+            points.append(measurement)           
+            self.db_client.write_points(points)
+        except Exception as e: 
+            print(e)      
diff --git a/src/clmcagent/stop_systemctl_monitor.sh b/src/clmcagent/stop_systemctl_monitor.sh
new file mode 100644
index 0000000000000000000000000000000000000000..5cd1d4df8515b992af631f14f4fe04d0e703e166
--- /dev/null
+++ b/src/clmcagent/stop_systemctl_monitor.sh
@@ -0,0 +1,3 @@
+#!/bin/bash
+
+pid=`ps aux | egrep "[s]ystemctl_monitor.py" | awk '{ print $2 }'` && kill $pid
\ No newline at end of file
diff --git a/src/clmcagent/systemctl_monitor.py b/src/clmcagent/systemctl_monitor.py
new file mode 100644
index 0000000000000000000000000000000000000000..db2cefcdce4d4ceee828bac26646aaf757b2d525
--- /dev/null
+++ b/src/clmcagent/systemctl_monitor.py
@@ -0,0 +1,86 @@
+#!/usr/bin/python3
+import argparse
+import subprocess
+import logging
+import time
+import urllib.parse
+from config_collector import ConfigCollector, InfluxWriter
+from influxdb import InfluxDBClient
+
+logging.basicConfig(level=logging.INFO)
+logger = logging.getLogger()
+
+class SystemctlMonitor:
+    ACTIVE_STATE_KEY='ActiveState'
+    SUBSTATE_KEY='SubState'  
+    LOAD_STATE_KEY='LoadState'
+
+    def __init__(self, service_name, sample_rate, agg_period, hostname, port, database):
+        self.service_name = service_name
+        self.writer = InfluxWriter(hostname, port, database)
+        self.collection_thread = ConfigCollector(self.get_systemctl_sample, self.writer.write_func, self.service_name, sample_rate, agg_period)                     
+
+    def start(self):
+        self.collection_thread.start()
+
+    def stop(self):
+        self.collection_thread.stop()
+
+    def get_current_measurement(self):
+        return self.collection_thread.current_measurement
+
+    def get_systemctl_sample(self):
+        return (self.get_systemctl_status(self.service_name), time.time())           
+
+    def get_systemctl_status(self, service_name):
+        load_state = 'unknown'
+        active_state = 'unknown'
+        sub_state = 'unknown'
+
+        cmd = "systemctl show {0}".format(service_name)
+        proc = subprocess.Popen([cmd], stdout=subprocess.PIPE, shell=True)
+        out, err = proc.communicate()
+        if out: out = out.decode('ascii')
+        if err: err = err.decode('ascii') 
+        logger.debug("Return code = {0}".format(proc.returncode))
+        if proc.returncode != 0:
+            logger.error("Could not get status for service {0}, {1}".format(service_name, err))
+            raise Exception("Could not get status for service {0}, {1}".format(service_name, err))
+       
+        for line in iter(out.splitlines()):
+            parts = line.split('=')
+            if parts[0] == SystemctlMonitor.LOAD_STATE_KEY:
+                load_state = parts[1]
+            elif parts[0] == SystemctlMonitor.ACTIVE_STATE_KEY:
+                active_state = parts[1]            
+            elif parts[0] == SystemctlMonitor.SUBSTATE_KEY:
+                sub_state = parts[1]
+        return load_state + "." + active_state + "." + sub_state
+
+
+def main():
+
+    parser = argparse.ArgumentParser(description='systemctrl state monitor')
+    parser.add_argument('-service', help='service name', required=True)
+    parser.add_argument('-rate', help='sample rate', required=True)
+    parser.add_argument('-agg', help='aggregation period', required=True)
+    parser.add_argument('-host', help='telegraf hostname', required=True)
+    parser.add_argument('-port', help='telegraf port', required=True)           
+    parser.add_argument('-db', help='database name', required=True)    
+    parser.add_argument('-debug', '--debug', action='store_true')
+    args = parser.parse_args()
+    print("Starting SystemctlMonitor : {0}, {1}, {2}, {3}, {4}, {5}".format(args.service, args.rate, args.agg, args.host, args.port, args.db))
+
+    if args.debug == True:
+        print("Setting logging level to to DEBUG")
+        logger.setLevel(logging.DEBUG)
+    else:
+        logger.setLevel(logging.INFO)
+
+    mon = SystemctlMonitor(args.service, int(args.rate), int(args.agg), args.host, int(args.port), args.db)
+    mon.start()
+  
+if __name__== "__main__":
+  main()
+
+