diff --git a/wally/console_report.py b/wally/console_report.py
index 3733de1..ac54965 100644
--- a/wally/console_report.py
+++ b/wally/console_report.py
@@ -1,3 +1,6 @@
+import logging
+
+
 import numpy
 
 from cephlib.common import float2str
@@ -9,6 +12,11 @@
 from .suits.io.fio import FioTest
 from .statistic import calc_norm_stat_props, calc_histo_stat_props
 from .suits.io.fio_hist import get_lat_vals
+from .data_selectors import get_aggregated
+
+
+logger = logging.getLogger("wally")
+
 
 class ConsoleReportStage(Stage):
 
@@ -19,22 +27,26 @@
         for suite in rstorage.iter_suite(FioTest.name):
             table = texttable.Texttable(max_width=200)
 
-            table.header(["Description", "IOPS ~ Dev", "BW, MiBps", 'Skew/Kurt', 'lat med, ms', 'lat 95, ms'])
-            table.set_cols_align(('l', 'r', 'r', 'r', 'r', 'r'))
+            tbl = rstorage.get_txt_report(suite)
+            if tbl is None:
+                table.header(["Description", "IOPS ~ Dev", "BW, MiBps", 'Skew/Kurt', 'lat med, ms', 'lat 95, ms'])
+                table.set_cols_align(('l', 'r', 'r', 'r', 'r', 'r'))
 
-            for job in sorted(rstorage.iter_job(suite), key=lambda job: job.params):
-                bw_ts, = list(rstorage.iter_ts(suite, job, metric='bw'))
-                props = calc_norm_stat_props(bw_ts)
-                avg_iops = props.average // job.params.params['bsize']
-                iops_dev = props.deviation // job.params.params['bsize']
+                for job in sorted(rstorage.iter_job(suite), key=lambda job: job.params):
+                    bw_ts = get_aggregated(rstorage, suite, job, metric='bw')
+                    props = calc_norm_stat_props(bw_ts)
+                    avg_iops = props.average // job.params.params['bsize']
+                    iops_dev = props.deviation // job.params.params['bsize']
 
-                lat_ts, = list(rstorage.iter_ts(suite, job, metric='lat'))
-                bins_edges = numpy.array(get_lat_vals(lat_ts.data.shape[1]), dtype='float32') / 1000  # convert us to ms
-                lat_props = calc_histo_stat_props(lat_ts, bins_edges)
-                table.add_row([job.params.summary,
-                               "{} ~ {}".format(float2str(avg_iops), float2str(iops_dev)),
-                               float2str(props.average / 1024),  # Ki -> Mi
-                               "{}/{}".format(float2str(props.skew), float2str(props.kurt)),
-                               float2str(lat_props.perc_50), float2str(lat_props.perc_95)])
+                    lat_ts = get_aggregated(rstorage, suite, job, metric='lat')
+                    bins_edges = numpy.array(get_lat_vals(lat_ts.data.shape[1]), dtype='float32') / 1000  # convert us to ms
+                    lat_props = calc_histo_stat_props(lat_ts, bins_edges)
+                    table.add_row([job.params.summary,
+                                   "{} ~ {}".format(float2str(avg_iops), float2str(iops_dev)),
+                                   float2str(props.average / 1024),  # Ki -> Mi
+                                   "{}/{}".format(float2str(props.skew), float2str(props.kurt)),
+                                   float2str(lat_props.perc_50), float2str(lat_props.perc_95)])
 
-            print(table.draw())
+                tbl = table.draw()
+                rstorage.put_txt_report(suite, tbl)
+            print(tbl)
