diff --git a/wally/report.py b/wally/report.py
index e24e7b6..e435a6a 100644
--- a/wally/report.py
+++ b/wally/report.py
@@ -2,6 +2,11 @@
 import bisect
 import logging
 
+try:
+    import matplotlib.pyplot as plt
+except ImportError:
+    plt = None
+
 import wally
 from wally import charts
 from wally.statistic import round_3_digit
@@ -24,6 +29,71 @@
         self.bw_read_max = 0
 
 
+report_funcs = []
+
+
+def report(name, required_fields):
+    def closure(func):
+        report_funcs.append((required_fields.split(","), name, func))
+        return func
+    return closure
+
+
+# def linearity_report(processed_results, path, lab_info):
+#     names = {}
+#     for tp1 in ('rand', 'seq'):
+#         for oper in ('read', 'write'):
+#             for sync in ('sync', 'direct', 'async'):
+#                 sq = (tp1, oper, sync)
+#                 name = "{0} {1} {2}".format(*sq)
+#                 names["".join(word[0] for word in sq)] = name
+
+#     colors = ['red', 'green', 'blue', 'cyan',
+#               'magenta', 'black', 'yellow', 'burlywood']
+#     markers = ['*', '^', 'x', 'o', '+', '.']
+#     color = 0
+#     marker = 0
+
+#     name_pref = 'linearity_test_'
+#     plot_data = []
+
+#     x = []
+#     y = []
+#     e = []
+#     # values to make line
+#     ax = []
+#     ay = []
+
+#     for res in processed_results.values():
+#         if res.name.startswith(name_pref):
+#             res
+
+#     for sz, med, dev in sorted(filtered_data(data)):
+#         iotime_ms = 1000. // med
+#         iotime_max = 1000. // (med - dev * 3)
+
+#         x.append(sz / 1024.0)
+#         y.append(iotime_ms)
+#         e.append(iotime_max - iotime_ms)
+#         if vals is None or sz in vals:
+#             ax.append(sz / 1024.0)
+#             ay.append(iotime_ms)
+
+#     plt.errorbar(x, y, e, linestyle='None', label=names[tp],
+#                  color=colors[color], ecolor="black",
+#                  marker=markers[marker])
+#     ynew = approximate_line(ax, ay, ax, True)
+#     plt.plot(ax, ynew, color=colors[color])
+#     color += 1
+#     marker += 1
+#     plt.legend(loc=2)
+#     plt.title("Linearity test by %i dots" % (len(vals)))
+
+
+# if plt:
+#     linearity_report = report('linearity', 'linearity_test')(linearity_report)
+
+
 def render_hdd_html(dest, info, lab_description):
     very_root_dir = os.path.dirname(os.path.dirname(wally.__file__))
     templ_dir = os.path.join(very_root_dir, 'report_templates')
@@ -200,19 +270,9 @@
     return hdi
 
 
-report_funcs = []
-
-
-def report(name, required_fields):
-    def closure(func):
-        report_funcs.append((required_fields.split(","), name, func))
-        return func
-    return closure
-
-
 @report('HDD', 'hdd_test_rrd4k,hdd_test_rws4k')
 def make_hdd_report(processed_results, path, lab_info):
-    make_plots(processed_results, path)
+    make_hdd_plots(processed_results, path)
     di = get_disk_info(processed_results)
     render_hdd_html(path, di, lab_info)
 
@@ -250,7 +310,7 @@
                 if pos == len(res_fields):
                     break
 
-                if not res_fields[pos + 1].startswith(field):
+                if not res_fields[pos].startswith(field):
                     break
             else:
                 hpath = path.format(name)
