diff --git a/cfg_checker/modules/ceph/bench.py b/cfg_checker/modules/ceph/bench.py
index fbb0a13..95e39bf 100644
--- a/cfg_checker/modules/ceph/bench.py
+++ b/cfg_checker/modules/ceph/bench.py
@@ -11,6 +11,7 @@
 from cfg_checker.common.decorators import retry
 from cfg_checker.common.file_utils import write_str_to_file
 from cfg_checker.helpers.console_utils import Progress
+from cfg_checker.helpers.console_utils import cl_typewriter
 from cfg_checker.reports import reporter
 # from cfg_checker.common.exception import InvalidReturnException
 # from cfg_checker.common.exception import ConfigException
@@ -127,7 +128,9 @@
                     "rwmixread": row[1],
                     "bs": row[2],
                     "iodepth": row[3],
-                    "size": row[4]
+                    "size": row[4],
+                    "ramp_time": row[5],
+                    "runtime": row[6]
                 })
         logger_cli.info("-> Loaded {} tasks".format(len(self.tasks)))
 
@@ -279,11 +282,12 @@
             # All is good
             return True
 
-    def get_agents_status(self):
+    def get_agents_status(self, silent=True):
         _status = {}
         _results = self.master.exec_on_labeled_pods_and_ns(
             "app=cfgagent",
-            "curl -s http://localhost:8765/api/fio"
+            "curl -s http://localhost:8765/api/fio",
+            silent=silent
         )
         for _agent, _result in _results.items():
             _j = _parse_json_output(_result)
@@ -353,23 +357,40 @@
         _stats_delay = round((_runtime + _ramptime) / 65)
         _start = self.next_scheduled_time
         _end = datetime.now(timezone.utc) + timedelta(seconds=_timeout)
+        logger_cli.info(" ")
+        tw = cl_typewriter()
         while True:
             # Print status
-            _sts = self.get_agents_status()
+            tw.cl_start(" ")
+            _sts = self.get_agents_status(silent=True)
+            # Use same line
             diff = (_end - datetime.now(timezone.utc)).total_seconds()
-            logger_cli.info("-> {:.2f}s left. Agent status:".format(diff))
-            for _agent, _status in _sts.items():
-                logger_cli.info(
-                    "\t{}: {} ({}%)".format(
-                        _agent,
-                        _status["status"],
-                        _status["progress"]
+            _startin = (_start - datetime.now(timezone.utc)).total_seconds()
+            if _startin > 0:
+                tw.cl_inline("-> starting in {:.2f}s ".format(_startin))
+            else:
+                tw.cl_inline("-> {:.2f}s; ".format(diff))
+                _progress = [_st["progress"] for _st in _sts.values()]
+                tw.cl_inline(
+                    "{}% <-> {}%; ".format(
+                        min(_progress),
+                        max(_progress)
                     )
                 )
+
+                _a_sts = [_t["status"] for _t in _sts.values()]
+                tw.cl_inline(
+                    ", ".join(
+                        ["{} {}".format(_a_sts.count(_s), _s)
+                         for _s in set(_a_sts)]
+                    )
+                )
+
             # Get Ceph status if _start time passed
             _elapsed = (datetime.now(timezone.utc) - _start).total_seconds()
             if _elapsed > _stats_delay:
-                logger_cli.info("-> {:.2f}s elapsed".format(_elapsed))
+                # Use same line output
+                tw.cl_inline(" {:.2f}s elapsed".format(_elapsed))
                 _sec = "{:0.1f}".format(_elapsed)
                 self.results[options["scheduled_to"]]["ceph"][_sec] = \
                     self.ceph_info.get_cluster_status()
@@ -379,16 +400,19 @@
             _fcnt = len(finished)
             _tcnt = len(_sts)
             if _fcnt < _tcnt:
-                logger_cli.info("-> {}/{} finished".format(_fcnt, _tcnt))
+                tw.cl_inline(" {}/{}".format(_fcnt, _tcnt))
             else:
+                tw.cl_flush(newline=True)
                 logger_cli.info("-> All agents finished run")
                 return True
             # recalc how much is left
             diff = (_end - datetime.now(timezone.utc)).total_seconds()
             # In case end_datetime was in past to begin with
             if diff < 0:
+                tw.cl_flush(newline=True)
                 logger_cli.info("-> Timed out waiting for agents to finish")
                 return False
+            tw.cl_flush()
 
     def _do_testrun(self, options):
         self.results[options["scheduled_to"]]["osd_df_before"] = \
@@ -573,8 +597,8 @@
                 if _time not in self.results:
                     # Some older results found
                     # do not process them
-                    logger_cli.info(
-                        "-> Skipped old results for '{}'".format(_time)
+                    logger_cli.debug(
+                        "...skipped old results for '{}'".format(_time)
                     )
                     continue
                 elif _agent not in self.results[_time]["agents"]:
@@ -690,6 +714,11 @@
         return None
 
     def calculate_totals(self):
+        def _savg(vlist):
+            if len(vlist) > 0:
+                return (sum(vlist) / len(vlist)) / 1000
+            else:
+                return 0
         # Calculate totals for Read and Write
         for _time, data in self.results.items():
             if "totals" not in data:
@@ -731,16 +760,12 @@
                         )
 
             _totals["read_bw_bytes"] = _r_bw
-            _totals["read_avg_lat_us"] = \
-                (sum(_r_avglat) / len(_r_avglat)) / 1000
-            _totals["read_95p_clat_us"] = \
-                (sum(_r_95clat) / len(_r_95clat)) / 1000
+            _totals["read_avg_lat_us"] = _savg(_r_avglat)
+            _totals["read_95p_clat_us"] = _savg(_r_95clat)
             _totals["read_iops"] = _r_iops
             _totals["write_bw_bytes"] = _w_bw
-            _totals["write_avg_lat_us"] = \
-                (sum(_w_avglat) / len(_w_avglat)) / 1000
-            _totals["write_95p_clat_us"] = \
-                (sum(_w_95clat) / len(_w_95clat)) / 1000
+            _totals["write_avg_lat_us"] = _savg(_w_avglat)
+            _totals["write_95p_clat_us"] = _savg(_w_95clat)
             _totals["write_iops"] = _w_iops
 
     def calculate_ceph_stats(self):
@@ -830,7 +855,7 @@
         data["osd_summary"]["active"] = {
             "status": "",
             "device_class": "",
-            "pgs": "",
+            "pgs": 0,
             "kb_used": 0,
             "kb_used_data": 0,
             "kb_used_omap": 0,
