diff --git a/src/emuvim/api/osm/__init__.py b/src/emuvim/api/osm/__init__.py
new file mode 100644
index 0000000..97bc953
--- /dev/null
+++ b/src/emuvim/api/osm/__init__.py
@@ -0,0 +1,15 @@
+#!/usr/bin/env python2
+# Copyright (c) 2019 Erik Schilling
+# ALL RIGHTS RESERVED.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#    http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
diff --git a/src/emuvim/api/osm/kafka.py b/src/emuvim/api/osm/kafka.py
new file mode 100644
index 0000000..4443621
--- /dev/null
+++ b/src/emuvim/api/osm/kafka.py
@@ -0,0 +1,34 @@
+#!/usr/bin/env python2
+# Copyright (c) 2019 Erik Schilling
+# ALL RIGHTS RESERVED.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#    http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from emuvim.api.osm.osm_component_base import OSMComponentBase
+from emuvim.api.util.process_utils import wait_until
+
+
+class Kafka(OSMComponentBase):
+    def __init__(self, net, ip, zookeeper_ip, version='latest', name_prefix=''):
+        OSMComponentBase.__init__(self)
+        self.instance = net.addDocker(
+            '{}kafka'.format(name_prefix), ip=ip, dimage='wurstmeister/kafka:%s' % version,
+            environment={'KAFKA_ADVERTISED_HOST_NAME': ip,
+                         'KAFKA_ADVERTISED_PORT': '9092',
+                         'KAFKA_ZOOKEEPER_CONNECT': '%s:2181' % zookeeper_ip,
+                         'KAFKA_CREATE_TOPICS': 'admin:1:1,ns:1:1,vim_account:1:1,wim_account:1:1,sdn:1:1,nsi:1:1'
+                         })
+
+    def start(self):
+        OSMComponentBase.start(self)
+        wait_until('nc -z %s 9092' % self.instance.dcinfo['NetworkSettings']['IPAddress'])
diff --git a/src/emuvim/api/osm/lcm.py b/src/emuvim/api/osm/lcm.py
new file mode 100644
index 0000000..dd5f6e5
--- /dev/null
+++ b/src/emuvim/api/osm/lcm.py
@@ -0,0 +1,45 @@
+#!/usr/bin/env python2
+# Copyright (c) 2019 Erik Schilling
+# ALL RIGHTS RESERVED.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#    http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import os
+
+import time
+
+from emuvim.api.osm.osm_component_base import OSMComponentBase
+from emuvim.api.util.docker_utils import wrap_debian_like
+
+
+class LCM(OSMComponentBase):
+    def __init__(self, net, ip, ro_ip, mongo_ip, kafka_ip,
+                 vca_host=os.environ.get('VCA_HOST'),
+                 vca_secret=os.environ.get('VCA_SECRET'),
+                 version='latest',
+                 name_prefix=''):
+        OSMComponentBase.__init__(self)
+        self.instance = net.addDocker(
+            '{}lcm'.format(name_prefix), ip=ip, dimage=wrap_debian_like('opensourcemano/lcm:%s' % version),
+            volumes=['osm_packages:/app/storage'],
+            environment={
+                'OSMLCM_RO_HOST': ro_ip,
+                'OSMLCM_VCA_HOST': vca_host,
+                'OSMLCM_VCA_SECRET': vca_secret,
+                'OSMLCM_DATABASE_URI': 'mongodb://%s:27017' % mongo_ip,
+                'OSMLCM_MESSAGE_HOST': kafka_ip,
+            })
+
+    def start(self):
+        OSMComponentBase.start(self)
+        time.sleep(3)
diff --git a/src/emuvim/api/osm/mongo.py b/src/emuvim/api/osm/mongo.py
new file mode 100644
index 0000000..7e10683
--- /dev/null
+++ b/src/emuvim/api/osm/mongo.py
@@ -0,0 +1,24 @@
+#!/usr/bin/env python2
+# Copyright (c) 2019 Erik Schilling
+# ALL RIGHTS RESERVED.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#    http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from emuvim.api.osm.osm_component_base import OSMComponentBase
+from emuvim.api.util.docker_utils import wrap_debian_like
+
+
+class Mongo(OSMComponentBase):
+    def __init__(self, net, ip, version='latest', name_prefix=''):
+        OSMComponentBase.__init__(self)
+        self.instance = net.addDocker('{}mongo'.format(name_prefix), ip=ip, dimage=wrap_debian_like('mongo:%s' % version))
diff --git a/src/emuvim/api/osm/mysql.py b/src/emuvim/api/osm/mysql.py
new file mode 100644
index 0000000..80f187a
--- /dev/null
+++ b/src/emuvim/api/osm/mysql.py
@@ -0,0 +1,26 @@
+#!/usr/bin/env python2
+# Copyright (c) 2019 Erik Schilling
+# ALL RIGHTS RESERVED.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#    http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from emuvim.api.osm.osm_component_base import OSMComponentBase
+from emuvim.api.util.docker_utils import wrap_debian_like
+
+
+class Mysql(OSMComponentBase):
+    def __init__(self, net, ip, version='5', name_prefix=''):
+        OSMComponentBase.__init__(self)
+        self.instance = net.addDocker(
+            '{}ro-db'.format(name_prefix), ip=ip, dimage=wrap_debian_like('mysql:%s' % version),
+            environment={'MYSQL_ROOT_PASSWORD': 'TEST'})
diff --git a/src/emuvim/api/osm/nbi.py b/src/emuvim/api/osm/nbi.py
new file mode 100644
index 0000000..0c5c914
--- /dev/null
+++ b/src/emuvim/api/osm/nbi.py
@@ -0,0 +1,189 @@
+#!/usr/bin/env python2
+# Copyright (c) 2019 Erik Schilling
+# ALL RIGHTS RESERVED.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#    http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import logging
+import os
+import subprocess
+
+import requests
+import time
+from pipes import quote
+from tempfile import NamedTemporaryFile
+
+import urllib3
+import yaml
+
+from emuvim.api.osm.osm_component_base import OSMComponentBase
+from emuvim.api.util.docker_utils import wrap_debian_like, DOCKER_HOST_IP
+from emuvim.api.util.path_utils import get_absolute_path
+from emuvim.api.util.process_utils import wait_until
+from mininet.log import debug
+
+# disables warnings about verify=False for TLS
+# since NBI runs with self-signed certificates this otherwise spams the log
+urllib3.disable_warnings()
+
+LOG = logging.getLogger(__name__)
+
+
+class NBI(OSMComponentBase):
+
+    def __init__(self, net, ip, mongo_ip, kafka_ip, version='latest', name_prefix=''):
+        OSMComponentBase.__init__(self)
+        self.instance = net.addDocker(
+            '{}nbi'.format(name_prefix), ip=ip, dimage=wrap_debian_like('opensourcemano/nbi:%s' % version),
+            volumes=['osm_packages:/app/storage'],
+            environment={'OSMNBI_DATABASE_URI': 'mongodb://%s:27017' % mongo_ip,
+                         'OSMNBI_MESSAGE_HOST': kafka_ip})
+        self._ip = self.instance.dcinfo['NetworkSettings']['IPAddress']
+
+    def start(self):
+        OSMComponentBase.start(self)
+        wait_until('nc -z %s 9999' % self._ip)
+
+    def _osm(self, command):
+        prefixed_command = 'osm %s' % command
+        debug('executing command: %s\n' % prefixed_command)
+        output = subprocess.check_output(prefixed_command, env={'OSM_HOSTNAME': self._ip}, shell=True)
+        debug('output: \n%s\n' % output)
+        return output
+
+    @staticmethod
+    def _create_archive(folder, tmp_file):
+        folder = get_absolute_path(folder)
+        parent_folder = os.path.dirname(folder)
+        basename = os.path.basename(folder)
+        subprocess.call('tar czf %s %s' % (quote(tmp_file.name), quote(basename)), cwd=parent_folder, shell=True)
+
+    def onboard_vnfd(self, folder):
+        try:
+            with NamedTemporaryFile() as tmp_archive:
+                self._create_archive(folder, tmp_archive)
+                return self._osm('vnfd-create %s' % quote(tmp_archive.name)).strip()
+        except subprocess.CalledProcessError as e:
+            raise RuntimeError('creating vnfd failed: %s' % e.output)
+
+    def onboard_nsd(self, folder):
+        try:
+            with NamedTemporaryFile() as tmp_archive:
+                self._create_archive(folder, tmp_archive)
+                return self._osm('nsd-create %s' % quote(tmp_archive.name)).strip()
+        except subprocess.CalledProcessError as e:
+            raise RuntimeError('creating nsd failed: %s' % e.output)
+
+    def _get_api_token(self):
+        token_request = requests.post('https://%s:9999/osm/admin/v1/tokens' % self._ip,
+                                      data={'username': 'admin', 'password': 'admin'}, verify=False)
+        if not token_request.ok:
+            raise RuntimeError('getting token failed with: %s' % token_request.text)
+        token = yaml.safe_load(token_request.text)
+        return token['id']
+
+    def _api_request_args(self):
+        return {'headers': {'Authorization': 'Bearer %s' % self._get_api_token()}, 'verify': False}
+
+    def _api_post_request(self, endpoint, data):
+        r = requests.post('https://%s:9999/%s' % (self._ip, endpoint),
+                          json=data,
+                          **self._api_request_args())
+        if not r.ok:
+            raise RuntimeError('POST request failed with: %s' % r.text)
+        result = yaml.safe_load(r.text)
+        return result
+
+    def _api_get_request(self, endpoint):
+        r = requests.get('https://%s:9999/%s' % (self._ip, endpoint),
+                         **self._api_request_args())
+        if not r.ok:
+            raise RuntimeError('GET request failed with: %s' % r.text)
+        result = yaml.safe_load(r.text)
+        return result
+
+    def _api_delete_request(self, endpoint):
+        r = requests.delete('https://%s:9999/%s' % (self._ip, endpoint),
+                            **self._api_request_args())
+        if not r.ok:
+            raise RuntimeError('DELETE request failed with: %s' % r.text)
+
+    def register_emulated_api(self, name, api):
+        output = self._osm('vim-create --name %s '
+                           '--user username '
+                           '--password password '
+                           '--auth_url http://%s:%d/v2.0 '
+                           '--tenant tenantName '
+                           '--account_type openstack' % (
+                               quote(name),
+                               quote(DOCKER_HOST_IP),
+                               api.port
+                           ))
+        vim_id = output.strip()
+        while self._api_get_request('osm/admin/v1/vim_accounts/%s' % vim_id)['_admin']['detailed-status'] != 'Done':
+            time.sleep(1)
+        return vim_id
+
+    def ns_create(self, ns_name, nsd_id, vim_id):
+        result = self._api_post_request('osm/nslcm/v1/ns_instances_content', {
+            'nsdId': nsd_id,
+            'nsName': ns_name,
+            # dummy text since this cannot be empty
+            'nsDescription': 'created by vim-emu',
+            'vimAccountId': vim_id,
+        })
+        return result['id']
+
+    def ns_get(self, ns_id):
+        return self._api_get_request('osm/nslcm/v1/ns_instances_content/%s' % ns_id)
+
+    def ns_action(self, ns_id, vnf_member_index, action, args=None):
+        if args is None:
+            args = {}
+        result = self._api_post_request('osm/nslcm/v1/ns_instances/%s/action' % ns_id, {
+            'vnf_member_index': str(vnf_member_index),
+            'primitive': action,
+            'primitive_params': args,
+        })
+        return result['id']
+
+    def ns_delete(self, ns_id):
+        self._api_delete_request('osm/nslcm/v1/ns_instances_content/%s' % ns_id)
+
+    def ns_list(self):
+        return self._api_get_request('osm/nslcm/v1/ns_instances_content')
+
+    @staticmethod
+    def _count_all_in_operational_status(ns_list, status):
+        return len(filter(lambda x: x['operational-status'] == status, ns_list))
+
+    def ns_wait_until_all_in_status(self, *statuses):
+        """Waits for all NSs to be in one of the specified stati.
+        Returns a tuple with the counts of the NSs in the invididual
+        stati in the same order as the specified stati"""
+
+        LOG.debug('Waiting for all NS to be in status {}'.format(statuses))
+        while True:
+            ns_list = self.ns_list()
+            state = ()
+            for status in statuses:
+                state += (self._count_all_in_operational_status(ns_list, status),)
+            number_correct = sum(state)
+            missing = len(ns_list) - number_correct
+            if missing == 0:
+                break
+            logging.debug('waiting for the status of %s services to change to %s' % (missing, statuses))
+            time.sleep(1)
+
+        logging.debug('all %d NSs in status %s' % (len(ns_list), statuses))
+        return state
diff --git a/src/emuvim/api/osm/osm.py b/src/emuvim/api/osm/osm.py
new file mode 100644
index 0000000..f4de8b9
--- /dev/null
+++ b/src/emuvim/api/osm/osm.py
@@ -0,0 +1,99 @@
+#!/usr/bin/env python2
+# Copyright (c) 2019 Erik Schilling
+# ALL RIGHTS RESERVED.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#    http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import os
+
+from emuvim.api.openstack.resources.net import Net
+from emuvim.api.osm.kafka import Kafka
+from emuvim.api.osm.lcm import LCM
+from emuvim.api.osm.mongo import Mongo
+from emuvim.api.osm.mysql import Mysql
+from emuvim.api.osm.nbi import NBI
+from emuvim.api.osm.ro import RO
+from emuvim.api.osm.zookeeper import Zookeeper
+
+
+class OSM:
+    def __init__(self, net,
+                 switch,
+                 name='osm',
+                 vca_host=os.environ.get('VCA_HOST'),
+                 vca_secret=os.environ.get('VCA_SECRET'),
+                 osm_version='releasefive-daily',
+                 ip_start='10.0.0.100'):
+        ip_int = Net.ip_2_int(ip_start)
+        zookeeper_ip = ip_start
+        kafka_ip = Net.int_2_ip(ip_int + 1)
+        mongo_ip = Net.int_2_ip(ip_int + 2)
+        nbi_ip = Net.int_2_ip(ip_int + 3)
+        ro_db_ip = Net.int_2_ip(ip_int + 4)
+        ro_ip = Net.int_2_ip(ip_int + 5)
+        lcm_ip = Net.int_2_ip(ip_int + 6)
+
+        name_prefix = '%s-' % name
+        self.zookeeper = Zookeeper(net, '%s/16' % zookeeper_ip, name_prefix=name_prefix)
+        self.kafka = Kafka(net, '%s/16' % kafka_ip, zookeeper_ip, name_prefix=name_prefix)
+        self.mongo = Mongo(net, '%s/16' % mongo_ip, name_prefix=name_prefix)
+        self.nbi = NBI(net, '%s/16' % nbi_ip, mongo_ip, kafka_ip, version=osm_version, name_prefix=name_prefix)
+        self.ro_db = Mysql(net, '%s/16' % ro_db_ip, name_prefix=name_prefix)
+        self.ro = RO(net, '%s/16' % ro_ip, ro_db_ip, version=osm_version, name_prefix=name_prefix)
+        self.lcm = LCM(net, '%s/16' % lcm_ip, ro_ip, mongo_ip, kafka_ip,
+                       vca_host, vca_secret, version=osm_version, name_prefix=name_prefix)
+
+        net.addLink(self.zookeeper.instance, switch)
+        net.addLink(self.kafka.instance, switch)
+        net.addLink(self.mongo.instance, switch)
+        net.addLink(self.nbi.instance, switch)
+        net.addLink(self.ro_db.instance, switch)
+        net.addLink(self.ro.instance, switch)
+        net.addLink(self.lcm.instance, switch)
+
+    def start(self):
+        self.zookeeper.start()
+        self.kafka.start()
+        self.mongo.start()
+        self.nbi.start()
+        self.ro_db.start()
+        self.ro.start()
+        self.lcm.start()
+
+    # forward api related calls
+    def onboard_vnfd(self, *args, **kwargs):
+        return self.nbi.onboard_vnfd(*args, **kwargs)
+
+    def onboard_nsd(self, *args, **kwargs):
+        return self.nbi.onboard_nsd(*args, **kwargs)
+
+    def register_emulated_api(self, *args, **kwargs):
+        return self.nbi.register_emulated_api(*args, **kwargs)
+
+    def ns_list(self):
+        return self.nbi.ns_list()
+
+    def ns_create(self, *args, **kwargs):
+        return self.nbi.ns_create(*args, **kwargs)
+
+    def ns_delete(self, *args, **kwargs):
+        return self.nbi.ns_delete(*args, **kwargs)
+
+    def ns_get(self, *args, **kwargs):
+        return self.nbi.ns_get(*args, **kwargs)
+
+    def ns_action(self, *args, **kwargs):
+        return self.nbi.ns_action(*args, **kwargs)
+
+    def ns_wait_until_all_in_status(self, *args, **kwargs):
+        return self.nbi.ns_wait_until_all_in_status(*args, **kwargs)
diff --git a/src/emuvim/api/osm/osm_component_base.py b/src/emuvim/api/osm/osm_component_base.py
new file mode 100644
index 0000000..a334c8e
--- /dev/null
+++ b/src/emuvim/api/osm/osm_component_base.py
@@ -0,0 +1,23 @@
+#!/usr/bin/env python2
+# Copyright (c) 2019 Erik Schilling
+# ALL RIGHTS RESERVED.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#    http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+class OSMComponentBase:
+    def __init__(self):
+        self.instance = None
+
+    def start(self):
+        self.instance.start()
diff --git a/src/emuvim/api/osm/pre_configured_osm.py b/src/emuvim/api/osm/pre_configured_osm.py
new file mode 100644
index 0000000..492deb9
--- /dev/null
+++ b/src/emuvim/api/osm/pre_configured_osm.py
@@ -0,0 +1,79 @@
+#!/usr/bin/env python2
+# Copyright (c) 2019 Erik Schilling
+# ALL RIGHTS RESERVED.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#    http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import os
+
+from emuvim.api.openstack.openstack_api_endpoint import OpenstackApiEndpoint
+from emuvim.api.osm.osm import OSM
+from emuvim.dcemulator.net import DCNetwork
+
+
+class PreConfiguredOSM:
+    def __init__(self,
+                 vca_host=os.environ.get('VCA_HOST'),
+                 vca_secret=os.environ.get('VCA_SECRET'),
+                 osm_version='releasefive-daily'):
+        self.net = DCNetwork(monitor=False, enable_learning=True)
+        dc1 = self.net.addDatacenter("dc1")
+        self.api = OpenstackApiEndpoint("0.0.0.0", 6001)
+        self.api.connect_datacenter(dc1)
+        self.api.connect_dc_network(self.net)
+
+        s1 = self.net.addSwitch('s1')
+        self.osm = OSM(self.net, s1, vca_host=vca_host, vca_secret=vca_secret, osm_version=osm_version)
+        self.vim_emu_id = None
+
+    def __enter__(self):
+        self.start()
+        return self
+
+    def __exit__(self, exc_type, exc_val, exc_tb):
+        self.stop()
+
+    def start(self):
+        self.net.start()
+        self.api.start()
+        self.osm.start()
+        self.vim_emu_id = self.osm.register_emulated_api('emu-vim1', self.api)
+
+    def stop(self):
+        self.api.stop()
+        self.net.stop()
+
+    def ns_create(self, ns_name, nsd_id):
+        return self.osm.ns_create(ns_name, nsd_id, self.vim_emu_id)
+
+    # forward api related calls
+    def onboard_vnfd(self, *args, **kwargs):
+        return self.osm.onboard_vnfd(*args, **kwargs)
+
+    def onboard_nsd(self, *args, **kwargs):
+        return self.osm.onboard_nsd(*args, **kwargs)
+
+    def ns_list(self):
+        return self.osm.ns_list()
+
+    def ns_delete(self, *args, **kwargs):
+        return self.osm.ns_delete(*args, **kwargs)
+
+    def ns_get(self, *args, **kwargs):
+        return self.osm.ns_get(*args, **kwargs)
+
+    def ns_action(self, *args, **kwargs):
+        return self.osm.ns_action(*args, **kwargs)
+
+    def ns_wait_until_all_in_status(self, *args, **kwargs):
+        return self.osm.ns_wait_until_all_in_status(*args, **kwargs)
diff --git a/src/emuvim/api/osm/ro.py b/src/emuvim/api/osm/ro.py
new file mode 100644
index 0000000..88a632f
--- /dev/null
+++ b/src/emuvim/api/osm/ro.py
@@ -0,0 +1,31 @@
+#!/usr/bin/env python2
+# Copyright (c) 2019 Erik Schilling
+# ALL RIGHTS RESERVED.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#    http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from emuvim.api.osm.osm_component_base import OSMComponentBase
+from emuvim.api.util.docker_utils import wrap_debian_like
+from emuvim.api.util.process_utils import wait_until
+
+
+class RO(OSMComponentBase):
+    def __init__(self, net, ip, db_ip, version='latest', name_prefix=''):
+        OSMComponentBase.__init__(self)
+        self.instance = net.addDocker(
+            '{}ro'.format(name_prefix), ip=ip, dimage=wrap_debian_like('opensourcemano/ro:%s' % version),
+            environment={'RO_DB_HOST': db_ip, 'RO_DB_ROOT_PASSWORD': 'TEST'})
+
+    def start(self):
+        OSMComponentBase.start(self)
+        wait_until('nc -z %s 9090' % self.instance.dcinfo['NetworkSettings']['IPAddress'])
diff --git a/src/emuvim/api/osm/zookeeper.py b/src/emuvim/api/osm/zookeeper.py
new file mode 100644
index 0000000..1f51b4d
--- /dev/null
+++ b/src/emuvim/api/osm/zookeeper.py
@@ -0,0 +1,26 @@
+#!/usr/bin/env python2
+# Copyright (c) 2019 Erik Schilling
+# ALL RIGHTS RESERVED.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#    http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from emuvim.api.osm.osm_component_base import OSMComponentBase
+
+
+class Zookeeper(OSMComponentBase):
+    def __init__(self, net, ip, version='latest', name_prefix=''):
+        OSMComponentBase.__init__(self)
+        self.instance = net.addDocker(
+            '{}zk'.format(name_prefix),
+            ip=ip,
+            dimage='wurstmeister/zookeeper:%s' % version)
diff --git a/src/emuvim/api/util/__init__.py b/src/emuvim/api/util/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/emuvim/api/util/__init__.py
diff --git a/src/emuvim/api/util/docker_utils.py b/src/emuvim/api/util/docker_utils.py
new file mode 100644
index 0000000..39d8a2b
--- /dev/null
+++ b/src/emuvim/api/util/docker_utils.py
@@ -0,0 +1,40 @@
+import logging
+from io import BytesIO
+
+import docker
+
+from emuvim.api.util.path_utils import get_absolute_path
+
+
+def build_dockerfile_dir(folder, tag):
+    dcli = docker.from_env().api
+    folder = get_absolute_path(folder)
+    build_stream = dcli.build(folder, tag=tag)
+    logging.info('Docker build result:')
+    for line in build_stream:
+        logging.info(line)
+
+
+def suffix_tag_name(tag, suffix):
+    if ":" in tag:
+        return "%s_%s" % (tag, suffix)
+    return "%s:latest_%s" % (tag, suffix)
+
+
+def wrap_debian_like(image):
+    dcli = docker.from_env().api
+    dockerfile = '''
+    FROM %s
+    RUN apt update -y && apt install -y net-tools iputils-ping iproute
+    ''' % image
+    f = BytesIO(dockerfile.encode('utf-8'))
+    wrapper_name = suffix_tag_name(image, 'containernet_compatible')
+    logging.info('wrapping image: %s->%s' % (image, wrapper_name))
+    build_stream = dcli.build(fileobj=f, tag=wrapper_name)
+    build_result = [line for line in build_stream]
+    logging.debug('Docker build result:' + '\n'.join(build_result))
+    return wrapper_name
+
+
+# 172.17.0.1 is the ip of the docker0 interface on the host
+DOCKER_HOST_IP = '172.17.0.1'
diff --git a/src/emuvim/api/util/path_utils.py b/src/emuvim/api/util/path_utils.py
new file mode 100644
index 0000000..592492a
--- /dev/null
+++ b/src/emuvim/api/util/path_utils.py
@@ -0,0 +1,8 @@
+import os
+import sys
+
+
+def get_absolute_path(absolute_or_relative_to_main_path):
+    if os.path.isabs(absolute_or_relative_to_main_path):
+        return absolute_or_relative_to_main_path
+    return os.path.join(sys.path[0], absolute_or_relative_to_main_path)
diff --git a/src/emuvim/api/util/process_utils.py b/src/emuvim/api/util/process_utils.py
new file mode 100644
index 0000000..1f90716
--- /dev/null
+++ b/src/emuvim/api/util/process_utils.py
@@ -0,0 +1,9 @@
+import logging
+import subprocess
+import time
+
+
+def wait_until(cmd):
+    logging.debug('waiting for %s\n' % cmd)
+    while subprocess.call(cmd, shell=True) != 0:
+        time.sleep(1)
