diff --git a/formatters.py b/formatters.py
index bbbf8d2..967d8f3 100644
--- a/formatters.py
+++ b/formatters.py
@@ -1,61 +1,8 @@
-import itertools
-from collections import defaultdict
-
 import texttable
 
+from utils import ssize_to_b
 from statistic import med_dev
 
-# [{u'__meta__': {u'raw_cfg': u'[writetest * 2]\ngroup_reporting\nnumjobs=4\nwait_for_previous\nramp_time=5\nblocksize=4k\nfilename={FILENAME}\nrw=randwrite\ndirect=1\nbuffered=0\niodepth=1\nsize=100Mb\nruntime=10\ntime_based\n\n[readtest * 2]\ngroup_reporting\nnumjobs=4\nwait_for_previous\nramp_time=5\nblocksize=4k\nfilename={FILENAME}\nrw=randread\ndirect=1\nbuffered=0\niodepth=1\nsize=100Mb\nruntime=10\ntime_based\n'},
-#   u'res': {u'readtest': {u'action': u'randread',
-#                          u'blocksize': u'4k',
-#                          u'bw_mean': [349.61, 276.54],
-#                          u'clat': [11987.16, 15235.08],
-#                          u'concurence': 4,
-#                          u'direct_io': True,
-#                          u'iops': [316, 251],
-#                          u'jobname': u'readtest',
-#                          u'lat': [11987.52, 15235.46],
-#                          u'slat': [0.0, 0.0],
-#                          u'sync': False,
-#                          u'timings': [u'10', u'5']},
-#            u'writetest': {u'action': u'randwrite',
-#                           u'blocksize': u'4k',
-#                           u'bw_mean': [72.03, 61.84],
-#                           u'clat': [113525.86, 152836.42],
-#                           u'concurence': 4,
-#                           u'direct_io': True,
-#                           u'iops': [35, 23],
-#                           u'jobname': u'writetest',
-#                           u'lat': [113526.31, 152836.89],
-#                           u'slat': [0.0, 0.0],
-#                           u'sync': False,
-#                           u'timings': [u'10', u'5']}}},
-#  {u'__meta__': {u'raw_cfg': u'[writetest * 2]\ngroup_reporting\nnumjobs=4\nwait_for_previous\nramp_time=5\nblocksize=4k\nfilename={FILENAME}\nrw=randwrite\ndirect=1\nbuffered=0\niodepth=1\nsize=100Mb\nruntime=10\ntime_based\n\n[readtest * 2]\ngroup_reporting\nnumjobs=4\nwait_for_previous\nramp_time=5\nblocksize=4k\nfilename={FILENAME}\nrw=randread\ndirect=1\nbuffered=0\niodepth=1\nsize=100Mb\nruntime=10\ntime_based\n'},
-#   u'res': {u'readtest': {u'action': u'randread',
-#                          u'blocksize': u'4k',
-#                          u'bw_mean': [287.62, 280.76],
-#                          u'clat': [15437.57, 14741.65],
-#                          u'concurence': 4,
-#                          u'direct_io': True,
-#                          u'iops': [258, 271],
-#                          u'jobname': u'readtest',
-#                          u'lat': [15437.94, 14742.04],
-#                          u'slat': [0.0, 0.0],
-#                          u'sync': False,
-#                          u'timings': [u'10', u'5']},
-#            u'writetest': {u'action': u'randwrite',
-#                           u'blocksize': u'4k',
-#                           u'bw_mean': [71.18, 61.62],
-#                           u'clat': [116382.95, 153486.81],
-#                           u'concurence': 4,
-#                           u'direct_io': True,
-#                           u'iops': [32, 22],
-#                           u'jobname': u'writetest',
-#                           u'lat': [116383.44, 153487.27],
-#                           u'slat': [0.0, 0.0],
-#                           u'sync': False,
-#                           u'timings': [u'10', u'5']}}}]
-
 
 def get_test_descr(data):
     rw = {"randread": "rr",
@@ -63,26 +10,38 @@
           "read": "sr",
           "write": "sw"}[data["action"]]
 
-    if data["direct_io"]:
-        sync_mode = 'd'
-    elif data["sync"]:
-        sync_mode = 's'
-    else:
-        sync_mode = 'a'
+    return "{0}{1}{2}_th{3}".format(rw,
+                                    data['sync_mode'],
+                                    data['blocksize'],
+                                    data['concurence'])
 
-    th_count = int(data['concurence'])
 
-    return "{0}{1}{2}_th{3}".format(rw, sync_mode,
-                                    data['blocksize'], th_count)
+def key_func(k_data):
+    _, data = k_data
+
+    bsz = ssize_to_b(data['blocksize'])
+    tp = data['action']
+    return tp, data['sync_mode'], bsz, data['concurence']
 
 
 def format_results_for_console(test_set):
     data_for_print = []
     tab = texttable.Texttable()
-    tab.set_deco(tab.HEADER | tab.VLINES | tab.BORDER | tab.HLINES)
+    tab.set_deco(tab.HEADER | tab.VLINES | tab.BORDER)
     tab.set_cols_align(["l", "r", "r", "r", "r"])
 
-    for test_name, data in test_set['res'].items():
+    items = sorted(test_set['res'].items(), key=key_func)
+    prev_k = None
+
+    for test_name, data in items:
+        curr_k = key_func((test_name, data))[:3]
+
+        if prev_k is not None:
+            if prev_k != curr_k:
+                data_for_print.append(["---"] * 5)
+
+        prev_k = curr_k
+
         descr = get_test_descr(data)
 
         iops, _ = med_dev(data['iops'])
@@ -96,33 +55,8 @@
         data_for_print.append(params)
 
     header = ["Description", "IOPS", "BW KBps", "Dev * 3 %", "LAT ms"]
-    tab.add_row(header)
-    tab.header = header
+    tab.header(header)
 
     map(tab.add_row, data_for_print)
 
     return tab.draw()
-
-
-# def format_pgbench_stat(res):
-#     """
-#     Receives results in format:
-#     "<num_clients> <num_transactions>: <tps>
-#      <num_clients> <num_transactions>: <tps>
-#      ....
-#     "
-#     """
-#     if res:
-#         data = {}
-#         grouped_res = itertools.groupby(res, lambda x: x[0])
-#         for key, group in grouped_res:
-#             results = list(group)
-#             sum_res = sum([r[1] for r in results])
-#             mean = sum_res/len(results)
-#             sum_sq = sum([(r[1] - mean) ** 2 for r in results])
-#             if len(results) > 1:
-#                 dev = (sum_sq / (len(results) - 1))
-#             else:
-#                 dev = 0
-#             data[key] = (mean, dev)
-#         return data
