diff --git a/start_vms.py b/start_vms.py
index 7317fd0..821c299 100644
--- a/start_vms.py
+++ b/start_vms.py
@@ -9,8 +9,7 @@
 from cinderclient.v1.client import Client as c_client
 
 from nodes.node import Node
-from nodes.openstack import get_floating_ip
-from utils import parse_creds
+
 
 logger = logging.getLogger("io-perf-tool")
 
@@ -25,9 +24,23 @@
     return name, passwd, tenant, auth_url
 
 
-def nova_connect():
-    return n_client('1.1', *ostack_get_creds()
-                    )
+NOVA_CONNECTION = None
+
+
+def nova_connect(name=None, passwd=None, tenant=None, auth_url=None):
+    global NOVA_CONNECTION
+    if NOVA_CONNECTION is None:
+        if name is None:
+            name, passwd, tenant, auth_url = ostack_get_creds()
+        NOVA_CONNECTION = n_client('1.1', name, passwd, tenant, auth_url)
+    return NOVA_CONNECTION
+
+
+def nova_disconnect():
+    global NOVA_CONNECTION
+    if NOVA_CONNECTION is not None:
+        NOVA_CONNECTION.close()
+        NOVA_CONNECTION = None
 
 
 def create_keypair(nova, name, key_path):
@@ -87,26 +100,21 @@
 
 
 def launch_vms(config):
-    creds = config['vm_params']['creds']
-
-    # if creds != 'ENV':
-    #     raise ValueError("Only 'ENV' creds are supported")
-
     logger.debug("Starting new nodes on openstack")
-    conn = nova_connect()
     params = config['vm_params'].copy()
     count = params.pop('count')
 
     if isinstance(count, basestring):
         assert count.startswith("x")
-        lst = conn.services.list(binary='nova-compute')
+        lst = NOVA_CONNECTION.services.list(binary='nova-compute')
         srv_count = len([srv for srv in lst if srv.status == 'enabled'])
         count = srv_count * int(count[1:])
 
-    creds = params.pop('creds')
+    # vm_creds = config['vm_params']['creds'] ?????
+    vm_creds = params.pop('creds')
 
-    for ip, _ in create_vms_mt(conn, count, **params):
-        yield Node(creds.format(ip), [])
+    for ip, os_node in create_vms_mt(NOVA_CONNECTION, count, **params):
+        yield Node(vm_creds.format(ip), []), os_node.id
 
 
 def create_vms_mt(nova, amount, keypair_name, img_name,
@@ -201,15 +209,21 @@
     return flt_ip.ip, nova.servers.get(srv.id)
 
 
-def clear_nodes():
-    nova = nova_connect()
-    clear_all(nova)
+def clear_nodes(nodes_ids):
+    clear_all(NOVA_CONNECTION, nodes_ids, None)
 
 
-def clear_all(nova, name_templ="ceph-test-{0}"):
+def clear_all(nova, ids=None, name_templ="ceph-test-{0}"):
+
+    def need_delete(srv):
+        if name_templ is not None:
+            return re.match(name_templ.format("\\d+"), srv.name) is not None
+        else:
+            return srv.id in ids
+
     deleted_srvs = set()
     for srv in nova.servers.list():
-        if re.match(name_templ.format("\\d+"), srv.name):
+        if need_delete(srv):
             logger.debug("Deleting server {0}".format(srv.name))
             nova.servers.delete(srv)
             deleted_srvs.add(srv.id)
@@ -224,13 +238,14 @@
 
     # wait till vm actually deleted
 
-    cinder = c_client(*ostack_get_creds())
-    for vol in cinder.volumes.list():
-        if isinstance(vol.display_name, basestring):
-            if re.match(name_templ.format("\\d+"), vol.display_name):
-                if vol.status in ('available', 'error'):
-                    logger.debug("Deleting volume " + vol.display_name)
-                    cinder.volumes.delete(vol)
+    if name_templ is not None:
+        cinder = c_client(*ostack_get_creds())
+        for vol in cinder.volumes.list():
+            if isinstance(vol.display_name, basestring):
+                if re.match(name_templ.format("\\d+"), vol.display_name):
+                    if vol.status in ('available', 'error'):
+                        logger.debug("Deleting volume " + vol.display_name)
+                        cinder.volumes.delete(vol)
 
     logger.debug("Clearing done (yet some volumes may still deleting)")
 
