diff --git a/wally/report.py b/wally/report.py
index 424e1fa..f27491b 100644
--- a/wally/report.py
+++ b/wally/report.py
@@ -332,7 +332,10 @@
     for name, val in data.items():
         if not name.startswith('__'):
             if val is None:
-                data[name] = '-'
+                if name in ('direct_iops_w64_max', 'direct_iops_w_max'):
+                    data[name] = ('-', '-', '-')
+                else:
+                    data[name] = '-'
             elif isinstance(val, (int, float, long)):
                 data[name] = round_3_digit(val)
 
@@ -344,10 +347,17 @@
                             data['bw_write_max'][1],
                             data['bw_write_max'][2])
 
+    # templ_name = 'report_ceph_1.html'
+
+    # import pprint
+    # pprint.pprint(data)
+    # pprint.pprint(info.__dict__)
+
     images.update(data)
-    return get_template(templ_name).format(lab_info=lab_description,
-                                           comment=comment,
-                                           **images)
+    templ = get_template(templ_name)
+    return templ.format(lab_info=lab_description,
+                        comment=comment,
+                        **images)
 
 
 def io_chart(title, concurence,
diff --git a/wally/start_vms.py b/wally/start_vms.py
index 406b24d..0c4ccc7 100644
--- a/wally/start_vms.py
+++ b/wally/start_vms.py
@@ -706,45 +706,56 @@
     clear_all(NOVA_CONNECTION, nodes_ids, None)
 
 
-def clear_all(nova, ids=None, name_templ=None):
+MAX_SERVER_DELETE_TIME = 120
 
-    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
 
-    volumes_to_delete = []
-    cinder = cinder_connect()
-    for vol in cinder.volumes.list():
-        for attachment in vol.attachments:
-            if attachment['server_id'] in ids:
-                volumes_to_delete.append(vol)
+def clear_all(nova, ids=None, name_templ=None,
+              max_server_delete_time=MAX_SERVER_DELETE_TIME):
+    try:
+        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
+
+        volumes_to_delete = []
+        cinder = cinder_connect()
+        for vol in cinder.volumes.list():
+            for attachment in vol.attachments:
+                if attachment['server_id'] in ids:
+                    volumes_to_delete.append(vol)
+                    break
+
+        deleted_srvs = set()
+        for srv in nova.servers.list():
+            if need_delete(srv):
+                logger.debug("Deleting server {0}".format(srv.name))
+                nova.servers.delete(srv)
+                deleted_srvs.add(srv.id)
+
+        count = 0
+        while count < max_server_delete_time:
+            if count % 60 == 0:
+                logger.debug("Waiting till all servers are actually deleted")
+            all_id = set(srv.id for srv in nova.servers.list())
+            if len(all_id.intersection(deleted_srvs)) == 0:
                 break
+            count += 1
+            time.sleep(1)
+        else:
+            logger.warning("Failed to remove servers. " +
+                           "You, probably, need to remove them manually")
+            return
+        logger.debug("Done, deleting volumes")
 
-    deleted_srvs = set()
-    for srv in nova.servers.list():
-        if need_delete(srv):
-            logger.debug("Deleting server {0}".format(srv.name))
-            nova.servers.delete(srv)
-            deleted_srvs.add(srv.id)
+        # wait till vm actually deleted
 
-    count = 0
-    while True:
-        if count % 60 == 0:
-            logger.debug("Waiting till all servers are actually deleted")
-        all_id = set(srv.id for srv in nova.servers.list())
-        if len(all_id.intersection(deleted_srvs)) == 0:
-            break
-        count += 1
-        time.sleep(1)
-    logger.debug("Done, deleting volumes")
+        # logger.warning("Volume deletion commented out")
+        for vol in volumes_to_delete:
+            logger.debug("Deleting volume " + vol.display_name)
+            cinder.volumes.delete(vol)
 
-    # wait till vm actually deleted
-
-    # logger.warning("Volume deletion commented out")
-    for vol in volumes_to_delete:
-        logger.debug("Deleting volume " + vol.display_name)
-        cinder.volumes.delete(vol)
-
-    logger.debug("Clearing done (yet some volumes may still deleting)")
+        logger.debug("Clearing done (yet some volumes may still deleting)")
+    except:
+        logger.exception("During removing servers. " +
+                         "You, probably, need to remove them manually")
diff --git a/wally/suits/io/fio.py b/wally/suits/io/fio.py
index a3f0fe3..7b77461 100644
--- a/wally/suits/io/fio.py
+++ b/wally/suits/io/fio.py
@@ -140,9 +140,9 @@
 
     for key, data in res.items():
         conn_ids = sorted(conn_ids_set)
-        matr = [data[conn_id] for conn_id in conn_ids]
-
-        mm_res[key] = MeasurementMatrix(matr, conn_ids)
+        awail_ids = [conn_id for conn_id in conn_ids if conn_id in data]
+        matr = [data[conn_id] for conn_id in awail_ids]
+        mm_res[key] = MeasurementMatrix(matr, awail_ids)
 
     raw_res = {}
     for conn_id in conn_ids:
