diff --git a/nodes/openstack.py b/nodes/openstack.py
index 7444e46..ed3d8ea 100644
--- a/nodes/openstack.py
+++ b/nodes/openstack.py
@@ -1,33 +1,104 @@
+import logging
 import node
-
+from starts_vms import create_vms_mt
 from novaclient.client import Client
 
 
+logger = logging.getLogger("io-perf-tool")
+
+
 def get_floating_ip(vm):
     addrs = vm.addresses
     for net_name, ifaces in addrs.items():
         for iface in ifaces:
             if iface.get('OS-EXT-IPS:type') == "floating":
                 return iface['addr']
-    raise Exception("No floating ip found for VM %s" % repr(vm))
 
 
-def discover_openstack_vms(conn_details):
+def discover_vms(client, search_opts):
+    auth = search_opts.pop('auth', {})
+    user = auth.get('user')
+    password = auth.get('password')
+    key = auth.get('key_file')
+    servers = client.servers.list(search_opts=search_opts)
+    logger.debug("Found %s openstack vms" % len(servers))
+    return [node.Node(get_floating_ip(server), ["test_vm"], username=user,
+                      password=password, key_path=key)
+            for server in servers if get_floating_ip(server)]
+
+
+def discover_services(client, opts):
+    auth = opts.pop('auth', {})
+    user = auth.get('user')
+    password = auth.get('password')
+    key = auth.get('key_file')
+    services = []
+    if opts['service'] == "all":
+        services = client.services.list()
+    else:
+        if isinstance(opts['service'], basestring):
+            opts['service'] = [opts['service']]
+
+        for s in opts['service']:
+            services.extend(client.services.list(binary=s))
+
+    host_services_mapping = {}
+    for service in services:
+        if host_services_mapping.get(service.host):
+            host_services_mapping[service.host].append(service.binary)
+        else:
+            host_services_mapping[service.host] = [service.binary]
+    logger.debug("Found %s openstack service nodes" %
+                 len(host_services_mapping))
+    return [node.Node(host, services, username=user,
+                      password=password, key_path=key) for host, services in
+            host_services_mapping.items()]
+
+
+def discover_openstack_nodes(conn_details, conf):
     """Discover vms running in openstack
     :param conn_details - dict with openstack connection details -
         auth_url, api_key (password), username
     """
     client = Client(version='1.1', **conn_details)
-    servers = client.servers.list(search_opts={"all_tenant": True})
-    return [node.Node(get_floating_ip(server), ["test_vm"])
-            for server in servers]
+    nodes = []
+    if conf.get('discover'):
+        vms_to_discover = conf['discover'].get('vm')
+        if vms_to_discover:
+            nodes.extend(discover_vms(client, vms_to_discover))
+        services_to_discover = conf['discover'].get('nodes')
+        if services_to_discover:
+            nodes.extend(discover_services(client, services_to_discover))
+    if conf.get('start'):
+        vms = start_test_vms(client, conf['start'])
+        nodes.extend(vms)
+
+    return nodes
 
 
-def discover_openstack_nodes(conn_details):
-    """Discover openstack nodes
-    :param conn_details - dict with openstack connection details -
-        auth_url, api_key (password), username
-    """
-    client = Client(version='1.1', **conn_details)
-    services = client.services.list()
-    return [node.Node(server.ip, ["test_vm"]) for server in services]
+def start_test_vms(client, opts):
+
+    user = opts.pop("user", None)
+    key_file = opts.pop("key_file", None)
+    aff_group = opts.pop("aff_group", None)
+    raw_count = opts.pop('count')
+
+    if raw_count.startswith("x"):
+        logger.debug("Getting amount of compute services")
+        count = len(client.services.list(binary="nova-compute"))
+        count *= int(raw_count[1:])
+    else:
+        count = int(raw_count)
+
+    if aff_group is not None:
+        scheduler_hints = {'group': aff_group}
+    else:
+        scheduler_hints = None
+
+    opts['scheduler_hints'] = scheduler_hints
+
+    logger.debug("Will start {0} vms".format(count))
+
+    nodes = create_vms_mt(client, count, **opts)
+    return [node.Node(get_floating_ip(server), ["test_vm"], username=user,
+                      key_path=key_file) for server in nodes]
