diff --git a/scripts/postprocessing/bottleneck.py b/scripts/postprocessing/bottleneck.py
index 8b94f2f..64156cf 100644
--- a/scripts/postprocessing/bottleneck.py
+++ b/scripts/postprocessing/bottleneck.py
@@ -9,6 +9,13 @@
 
 
 Record = namedtuple("Record", ['name', 'max_value'])
+MetricValue = namedtuple("MetricValue", ['value', 'time'])
+Bottleneck = namedtuple("Bottleneck", ['node', 'value', 'count'])
+
+sortRuleByValue = lambda x: x.value
+sortRuleByMaxValue = lambda x: x.max_value
+sortRuleByCount = lambda x: x.count
+sortRuleByTime = lambda x: x.time
 
 critical_values = [
     Record("io_queue", 1),
@@ -16,25 +23,53 @@
     Record("mem_usage_percent", 0.8)
     ]
 
-def load_results(begin_time, end_time, rfile):
+
+def get_name_from_sourceid(source_id):
+    """ Cut port """
+    pos = source_id.rfind(":")
+    return source_id[:pos]
+
+
+def create_table(header, rows, signs=1):
+    """ Return texttable view """
+    tab = TT.Texttable()
+    tab.set_deco(tab.VLINES)
+    tab.set_precision(signs)
+    tab.add_row(header)
+    tab.header = header
+
+    for row in rows:
+        tab.add_row(row)
+
+    return tab.draw()
+
+
+def load_results(period, rfile):
     """ Read raw results from dir and return
         data from provided period"""
     results = {}
-
+    if period is not None:
+        begin_time, end_time = period
     with open(rfile, "r") as f:
         for line in f:
 
             if len(line) <= 1:
                 continue
-            ttime, _, raw_data = line.partition(" : ")
-            raw_data = raw_data.strip('"\n\r')
-            itime = float(ttime)
-            if itime >= begin_time and itime <= end_time:
-                addr, data = eval(raw_data)
-                sid = data.pop("source_id")
-                data.pop("time")
-                serv = "{0}({1})".format(addr[0], sid)
-                serv_data = results.setdefault(serv, {})
+            if " : " in line:
+                # old format
+                ttime, _, raw_data = line.partition(" : ")
+                raw_data = raw_data.strip('"\n\r')
+                itime = float(ttime)
+            else:
+                # new format without time
+                raw_data = line.strip('"\n\r')
+
+            _, data = eval(raw_data)
+            sid = get_name_from_sourceid(data.pop("source_id"))
+            itime = data.pop("time")
+
+            if period is None or (itime >= begin_time and itime <= end_time):
+                serv_data = results.setdefault(sid, {})
                 for key, value in data.items():
                     # select device and metric names
                     dev, _, metric = key.partition(".")
@@ -42,24 +77,67 @@
                     metric_dict = serv_data.setdefault(metric, {})
                     # set value for metric on dev
                     cur_val = metric_dict.setdefault(dev, [])
-                    cur_val.append(value)
-        print results
+                    cur_val.append(MetricValue(value, itime))
+
+        # sort by time
+        for ms in results.values():
+            for dev in ms.values():
+                for d in dev.keys():
+                    dev[d] = sorted(dev[d], key=sortRuleByTime)
+
         return results
 
 
+def find_time_load_percent(data, params):
+    """ Find avg load of components by time
+        and return sorted table """
 
-def print_bottlenecks(data, params):
+    header = ["Component", "Avg load %"]
+    name_fmt = "{0}.{1}"
+    value_fmt = "{0:.1f}"
+    loads = []
+    for node, metrics in data.items():
+        for metric, max_value in params:
+            if metric in metrics:
+                item = metrics[metric]
+                # count time it was > max_value
+                # count times it was > max_value
+                for dev, vals in item.items():
+                    num_l = 0
+                    times = []
+                    i = 0
+                    while i < len(vals):
+                        if vals[i].value >= max_value:
+                            num_l += 1
+                            b_time = vals[i].time
+                            while i < len(vals) and \
+                                  vals[i].value >= max_value:
+                                i += 1
+                            times.append(vals[i-1].time - b_time)
+                        i += 1
+                    if num_l > 0:
+                        avg_time = sum(times) / float(num_l)
+                        total_time = vals[-1].time - vals[0].time
+                        avg_load = (avg_time / total_time) * 100
+                        loads.append(Record(name_fmt.format(node, dev), avg_load))
+
+    rows = [[name, value_fmt.format(value)]
+            for name, value in sorted(loads, key=sortRuleByMaxValue, reverse=True)]
+    return create_table(header, rows)
+
+
+
+def print_bottlenecks(data, params, max_bottlenecks=3):
     """ Print bottlenecks in table format,
         search in data by fields in params"""
-    tab = TT.Texttable()
-    tab.set_deco(tab.VLINES)
-
-    header = ["Server, device", "Critical value"]
-    tab.add_row(header)
-    tab.header = header
-
+    # all bottlenecks
     rows = []
     val_format = "{0}: {1}, {2} times it was >= {3}"
+
+    # max_bottlenecks most slowests places
+    # Record metric : [Bottleneck nodes (max 3)]
+    max_values = {}
+
     for node, metrics in data.items():
         node_rows = []
         for metric, max_value in params:
@@ -76,6 +154,12 @@
                             if max_v < val:
                                 max_v = val
                     if num_l > 0:
+                        key = Record(metric, max_value)
+                        # add to most slowest
+                        btnk = max_values.setdefault(key, [])
+                        # just add all data at first
+                        btnk.append(Bottleneck(node, max_v, num_l))
+                         #add to common table
                         c_val = val_format.format(metric, max_v,
                                                   num_l, max_value)
                         node_rows.append([dev, c_val])
@@ -83,18 +167,60 @@
             rows.append([node, ""])
             rows.extend(node_rows)
 
+    tab = TT.Texttable()
+    #tab.set_deco(tab.VLINES)
+
+    header = ["Server, device", "Critical value"]
+    tab.add_row(header)
+    tab.header = header
+
     for row in rows:
         tab.add_row(row)
 
-    print tab.draw()
+    most_slowest_header = [metric for metric, max_value in max_values.keys()]
+    most_slowest = []
+    # select most slowest
+    for metric, btnks in max_values.items():
+        m_data = []
+        worst = sorted(btnks, key=sortRuleByValue, reverse=True)[:max_bottlenecks]
+        longest = sorted(btnks, key=sortRuleByCount, reverse=True)[:max_bottlenecks]
+        m_data.append("{0} worst by value: ".format(max_bottlenecks))
+        for btnk in worst:
+            m_data.append(val_format.format(btnk.node, btnk.value,
+                                                  btnk.count,
+                                                  metric.max_value))
+        m_data.append("{0} worst by times it was bad: ".format(max_bottlenecks))
+        for btnk in longest:
+            m_data.append(val_format.format(btnk.node, btnk.value,
+                                                  btnk.count,
+                                                  metric.max_value))
+        most_slowest.append(m_data)
+
+
+    rows2 = zip(*most_slowest)
+    
+    tab2 = TT.Texttable()
+    #tab2.set_deco(tab.VLINES)
+
+    tab2.add_row(most_slowest_header)
+    tab2.header = most_slowest_header
+
+    for row in rows2:
+        tab2.add_row(row)
+    return tab.draw(), tab2.draw()
 
 
 
 def parse_args(args):
     parser = argparse.ArgumentParser()
     parser.add_argument('-t', '--time_period', nargs=2,
-                        type=float,
+                        type=float, default=None,
                         help="Begin and end time for tests")
+    parser.add_argument('-d', '--debug-ver', action='store_true',
+                        help="Full report with original data")
+    parser.add_argument('-u', '--user-ver', action='store_true',
+                        default=True,
+                        help="Avg load report")
     parser.add_argument('sensors_result', type=str,
                         default=None, nargs='?')
     return parser.parse_args(args[1:])
@@ -103,9 +229,18 @@
 def main(argv):
     opts = parse_args(argv)
 
-    results = load_results(opts.time_period[0], opts.time_period[1], opts.sensors_result)
+    results = load_results(opts.time_period, opts.sensors_result)
 
-    print_bottlenecks(results, critical_values)
+    if opts.debug_ver:
+        tab_all, tab_max = print_bottlenecks(results, critical_values)
+        print "Maximum values on provided metrics"
+        print tab_max
+        print "All loaded values"
+        print tab_all
+
+    else:
+        print find_time_load_percent(results, critical_values)
+
 
 if __name__ == "__main__":
     exit(main(sys.argv))
