diff --git a/wally/suits/io/fio.py b/wally/suits/io/fio.py
index c32dba2..7b2c3e3 100644
--- a/wally/suits/io/fio.py
+++ b/wally/suits/io/fio.py
@@ -7,9 +7,9 @@
 
 from ...utils import StopTestError, get_os, ssize2b
 from ...node_interfaces import IRPCNode
-from ..itest import ThreadedTest, IterationConfig, NodeTestResults
-from ...result_classes import TimeSerie
-from .fio_task_parser import execution_time, fio_cfg_compile, FioJobSection, FioParams, get_log_files, get_test_summary
+from ..itest import ThreadedTest
+from ...result_classes import TimeSeries, JobMetrics
+from .fio_task_parser import execution_time, fio_cfg_compile, FioJobConfig, FioParams, get_log_files
 from . import rpc_plugin
 from .fio_hist import expected_lat_bins
 
@@ -22,6 +22,7 @@
     retry_time = 30
     configs_dir = os.path.dirname(__file__)  # type: str
     name = 'fio'
+    job_config_cls = FioJobConfig
 
     def __init__(self, *args, **kwargs) -> None:
         super().__init__(*args, **kwargs)
@@ -72,14 +73,13 @@
         else:
             self.file_size = ssize2b(self.load_params['FILESIZE'])
 
-        self.fio_configs = list(fio_cfg_compile(self.load_profile, self.load_profile_path,
+        self.job_configs = list(fio_cfg_compile(self.load_profile, self.load_profile_path,
                                                 cast(FioParams, self.load_params)))
 
-        if len(self.fio_configs) == 0:
+        if len(self.job_configs) == 0:
             logger.error("Empty fio config provided")
             raise StopTestError()
 
-        self.iterations_configs = self.fio_configs  # type: ignore
         self.exec_folder = self.config.remote_dir
 
     def config_node(self, node: IRPCNode) -> None:
@@ -129,15 +129,15 @@
             node.copy_file(fio_path, bz_dest)
             node.run("bzip2 --decompress {} ; chmod a+x {}".format(bz_dest, self.join_remote("fio")))
 
-    def get_expected_runtime(self, iteration_info: IterationConfig) -> int:
-        return execution_time(cast(FioJobSection, iteration_info))
+    def get_expected_runtime(self, job_config: FioJobConfig) -> int:
+        return execution_time(cast(FioJobConfig, job_config))
 
-    def prepare_iteration(self, node: IRPCNode, iter_config: IterationConfig) -> None:
-        node.put_to_file(self.remote_task_file, str(iter_config).encode("utf8"))
+    def prepare_iteration(self, node: IRPCNode, job_config: FioJobConfig) -> None:
+        node.put_to_file(self.remote_task_file, str(job_config).encode("utf8"))
 
     # TODO: get a link to substorage as a parameter
-    def run_iteration(self, node: IRPCNode, iter_config: IterationConfig, stor_prefix: str) -> NodeTestResults:
-        f_iter_config = cast(FioJobSection, iter_config)
+    def run_iteration(self, node: IRPCNode, iter_config: FioJobConfig, job_root: str) -> JobMetrics:
+        f_iter_config = cast(FioJobConfig, iter_config)
         exec_time = execution_time(f_iter_config)
 
         fio_cmd_templ = "cd {exec_folder}; " + \
@@ -152,17 +152,15 @@
         if must_be_empty:
             logger.error("Unexpected fio output: %r", must_be_empty)
 
-        res = NodeTestResults(self.__class__.__name__, node.info.node_id(), get_test_summary(f_iter_config))
+        res = {}  # type: JobMetrics
 
-        res.extra_logs['fio'] = node.get_file_content(self.remote_output_file)
-        self.store_data(res.extra_logs['fio'], "raw", stor_prefix, "fio_raw")
+        # put fio output into storage
+        fio_out = node.get_file_content(self.remote_output_file)
+        self.rstorage.put_extra(job_root, node.info.node_id(), "fio_raw", fio_out)
         node.conn.fs.unlink(self.remote_output_file)
 
         files = [name for name in node.conn.fs.listdir(self.exec_folder)]
 
-        expected_time_delta = 1000  # 1000ms == 1s
-        max_time_diff = 50  # 50ms - 5%
-
         for name, path in get_log_files(f_iter_config):
             log_files = [fname for fname in files if fname.startswith(path)]
             if len(log_files) != 1:
@@ -172,7 +170,6 @@
 
             fname = os.path.join(self.exec_folder, log_files[0])
             raw_result = node.get_file_content(fname)  # type: bytes
-            self.store_data(raw_result, "raw", stor_prefix, "{}_raw".format(name))
             node.conn.fs.unlink(fname)
 
             try:
@@ -182,23 +179,14 @@
                 raise StopTestError()
 
             parsed = array.array('L' if name == 'lat' else 'Q')
-            prev_ts = None
-            load_start_at = None
+            times = array.array('Q')
 
-            # TODO: need to adjust vals for timedelta
             for idx, line in enumerate(log_data):
                 line = line.strip()
                 if line:
                     try:
                         time_ms_s, val_s, _, *rest = line.split(",")
-                        time_ms = int(time_ms_s.strip())
-
-                        if not prev_ts:
-                            prev_ts = time_ms - expected_time_delta
-                            load_start_at = time_ms
-                        elif abs(time_ms - prev_ts - expected_time_delta) > max_time_diff:
-                            logger.warning("Too large gap in {} log at {} - {}ms"
-                                           .format(name, time_ms, time_ms - prev_ts))
+                        times.append(int(time_ms_s.strip()))
 
                         if name == 'lat':
                             vals = [int(i.strip()) for i in rest]
@@ -215,17 +203,12 @@
                         logger.exception("Error during parse %s fio log file in line %s: %r", name, idx, line)
                         raise StopTestError()
 
-                    prev_ts += expected_time_delta
-
-            res.series[name] = TimeSerie(name=name,
-                                         raw=raw_result,
-                                         second_axis_size=expected_lat_bins if name == 'lat' else 1,
-                                         start_at=load_start_at,
-                                         step=expected_time_delta,
-                                         data=parsed)
-
-            self.store_data(parsed, "array", stor_prefix, "{}_data".format(name))
-            self.store_data(res.series[name].meta(), "yaml", stor_prefix, "{}_meta".format(name))
+            ts = TimeSeries(name=name,
+                            raw=raw_result,
+                            second_axis_size=expected_lat_bins if name == 'lat' else 1,
+                            data=parsed,
+                            times=times)
+            res[(node.info.node_id(), 'fio', name)] = ts
 
         return res
 
diff --git a/wally/suits/io/fio_hist.py b/wally/suits/io/fio_hist.py
index eb5d9ee..a2ded70 100644
--- a/wally/suits/io/fio_hist.py
+++ b/wally/suits/io/fio_hist.py
@@ -52,6 +52,6 @@
     return lower + (upper - lower) * edge
 
 
-def get_lat_vals(columns: int = 1216, coarseness: int = 0) -> List[float]:
+def get_lat_vals(columns: int = expected_lat_bins, coarseness: int = 0) -> List[float]:
     return [plat_idx_to_val_coarse(val, coarseness) for val in range(columns)]
 
diff --git a/wally/suits/io/fio_task_parser.py b/wally/suits/io/fio_task_parser.py
index bdcf4a3..6940aaf 100644
--- a/wally/suits/io/fio_task_parser.py
+++ b/wally/suits/io/fio_task_parser.py
@@ -12,7 +12,7 @@
 
 
 from ...result_classes import IStorable
-from ..itest import IterationConfig
+from ...result_classes import TestJobConfig
 from ...utils import sec_to_str, ssize2b
 
 
@@ -38,13 +38,16 @@
                        ("vm_count", int)])
 
 
-class FioJobSection(IterationConfig, IStorable):
+class FioJobConfig(TestJobConfig):
     def __init__(self, name: str) -> None:
-        self.name = name
+        TestJobConfig.__init__(self)
         self.vals = OrderedDict()  # type: Dict[str, Any]
-        self.summary = None
+        self.name = name
 
-    def copy(self) -> 'FioJobSection':
+    def __eq__(self, other: 'FioJobConfig') -> bool:
+        return self.vals == other.vals
+
+    def copy(self) -> 'FioJobConfig':
         return copy.deepcopy(self)
 
     def required_vars(self) -> Iterator[Tuple[str, Var]]:
@@ -56,7 +59,7 @@
         return len(list(self.required_vars())) == 0
 
     def __str__(self) -> str:
-        res = "[{0}]\n".format(self.name)
+        res = "[{0}]\n".format(self.summary)
 
         for name, val in self.vals.items():
             if name.startswith('_') or name == name.upper():
@@ -68,15 +71,18 @@
 
         return res
 
+    def __repr__(self) -> str:
+        return str(self)
+
     def raw(self) -> Dict[str, Any]:
         return {
-            'name': self.name,
-            'vals': list(map(list, self.vals.items())),
-            'summary': self.summary
+            'vals': [[key, val] for key, val in self.vals.items()],
+            'summary': self.summary,
+            'name': self.name
         }
 
     @classmethod
-    def fromraw(cls, data: Dict[str, Any]) -> 'FioJobSection':
+    def fromraw(cls, data: Dict[str, Any]) -> 'FioJobConfig':
         obj = cls(data['name'])
         obj.summary = data['summary']
         obj.vals.update(data['vals'])
@@ -160,7 +166,7 @@
             raise ParseError(str(exc), fname, lineno, oline)
 
 
-def fio_config_parse(lexer_iter: Iterable[CfgLine]) -> Iterator[FioJobSection]:
+def fio_config_parse(lexer_iter: Iterable[CfgLine]) -> Iterator[FioJobConfig]:
     in_globals = False
     curr_section = None
     glob_vals = OrderedDict()  # type: Dict[str, Any]
@@ -188,9 +194,7 @@
                 try:
                     cont = open(new_fname).read()
                 except IOError as err:
-                    msg = "Error while including file {0}: {1}"
-                    raise ParseError(msg.format(new_fname, err),
-                                     fname, lineno, oline)
+                    raise ParseError("Error while including file {}: {}".format(new_fname, err), fname, lineno, oline)
 
                 new_lines.extend(fio_config_lexer(cont, new_fname))
                 one_more = True
@@ -207,13 +211,11 @@
 
             if name == 'global':
                 if sections_count != 0:
-                    raise ParseError("[global] section should" +
-                                     " be only one and first",
-                                     fname, lineno, oline)
+                    raise ParseError("[global] section should be only one and first", fname, lineno, oline)
                 in_globals = True
             else:
                 in_globals = False
-                curr_section = FioJobSection(name)
+                curr_section = FioJobConfig(name)
                 curr_section.vals = glob_vals.copy()
             sections_count += 1
         else:
@@ -221,12 +223,9 @@
             if in_globals:
                 glob_vals[name] = val
             elif name == name.upper():
-                raise ParseError("Param '" + name +
-                                 "' not in [global] section",
-                                 fname, lineno, oline)
+                raise ParseError("Param {!r} not in [global] section".format(name), fname, lineno, oline)
             elif curr_section is None:
-                    raise ParseError("Data outside section",
-                                     fname, lineno, oline)
+                    raise ParseError("Data outside section", fname, lineno, oline)
             else:
                 curr_section.vals[name] = val
 
@@ -234,7 +233,7 @@
         yield curr_section
 
 
-def process_cycles(sec: FioJobSection) -> Iterator[FioJobSection]:
+def process_cycles(sec: FioJobConfig) -> Iterator[FioJobConfig]:
     cycles = OrderedDict()  # type: Dict[str, Any]
 
     for name, val in sec.vals.items():
@@ -270,7 +269,7 @@
 FioParams = Dict[str, FioParamsVal]
 
 
-def apply_params(sec: FioJobSection, params: FioParams) -> FioJobSection:
+def apply_params(sec: FioJobConfig, params: FioParams) -> FioJobConfig:
     processed_vals = OrderedDict()  # type: Dict[str, Any]
     processed_vals.update(params)
     for name, val in sec.vals.items():
@@ -307,7 +306,7 @@
 MAGIC_OFFSET = 0.1885
 
 
-def final_process(sec: FioJobSection, counter: List[int] = [0]) -> FioJobSection:
+def final_process(sec: FioJobConfig, counter: List[int] = [0]) -> FioJobConfig:
     sec = sec.copy()
 
     sec.vals['unified_rw_reporting'] = '1'
@@ -340,7 +339,7 @@
     return sec
 
 
-def get_test_sync_mode(sec: FioJobSection) -> str:
+def get_test_sync_mode(sec: FioJobConfig) -> str:
     if isinstance(sec, dict):
         vals = sec
     else:
@@ -359,7 +358,7 @@
         return 'a'
 
 
-def get_test_summary_tuple(sec: FioJobSection, vm_count: int = None) -> TestSumm:
+def get_test_summary_tuple(sec: FioJobConfig, vm_count: int = None) -> TestSumm:
     if isinstance(sec, dict):
         vals = sec
     else:
@@ -382,7 +381,7 @@
                     vm_count)
 
 
-def get_test_summary(sec: FioJobSection, vm_count: int = None, noiodepth: bool = False) -> str:
+def get_test_summary(sec: FioJobConfig, vm_count: int = None, noiodepth: bool = False) -> str:
     tpl = get_test_summary_tuple(sec, vm_count)
 
     res = "{0.oper}{0.mode}{0.bsize}".format(tpl)
@@ -395,11 +394,11 @@
     return res
 
 
-def execution_time(sec: FioJobSection) -> int:
+def execution_time(sec: FioJobConfig) -> int:
     return sec.vals.get('ramp_time', 0) + sec.vals.get('runtime', 0)
 
 
-def parse_all_in_1(source:str, fname: str = None) -> Iterator[FioJobSection]:
+def parse_all_in_1(source:str, fname: str = None) -> Iterator[FioJobConfig]:
     return fio_config_parse(fio_config_lexer(source, fname))
 
 
@@ -414,7 +413,7 @@
             yield res
 
 
-def get_log_files(sec: FioJobSection) -> List[Tuple[str, str]]:
+def get_log_files(sec: FioJobConfig) -> List[Tuple[str, str]]:
     res = []  # type: List[Tuple[str, str]]
     for key, name in (('write_iops_log', 'iops'), ('write_bw_log', 'bw'), ('write_hist_log', 'lat')):
         log = sec.vals.get(key)
@@ -423,7 +422,7 @@
     return res
 
 
-def fio_cfg_compile(source: str, fname: str, test_params: FioParams) -> Iterator[FioJobSection]:
+def fio_cfg_compile(source: str, fname: str, test_params: FioParams) -> Iterator[FioJobConfig]:
     it = parse_all_in_1(source, fname)
     it = (apply_params(sec, test_params) for sec in it)
     it = flatmap(process_cycles, it)
diff --git a/wally/suits/io/rrd.cfg b/wally/suits/io/rrd.cfg
index 850c9a3..ca3c613 100644
--- a/wally/suits/io/rrd.cfg
+++ b/wally/suits/io/rrd.cfg
@@ -1,7 +1,7 @@
 [global]
 include defaults_qd.cfg
 ramp_time=0
-runtime=600
+runtime=10
 
 [test_{TEST_SUMM}]
 blocksize=60k
diff --git a/wally/suits/itest.py b/wally/suits/itest.py
index 446ad69..bc6b115 100644
--- a/wally/suits/itest.py
+++ b/wally/suits/itest.py
@@ -1,17 +1,19 @@
+import re
 import abc
 import time
+import array
+import struct
 import logging
 import os.path
 import datetime
-from typing import Dict, Any, List, Optional, Callable, cast
+from typing import Any, List, Optional, Callable, cast, Iterator, Tuple, Iterable
 
-from concurrent.futures import ThreadPoolExecutor, wait
+from concurrent.futures import ThreadPoolExecutor, wait, Future
 
-from ..utils import Barrier, StopTestError, sec_to_str
+from ..utils import StopTestError, sec_to_str, get_time_interval_printable_info
 from ..node_interfaces import IRPCNode
 from ..storage import Storage
-from ..result_classes import NodeTestResults, IStorable
-from queue import Queue
+from ..result_classes import TestSuiteConfig, TestJobConfig, JobMetrics, TimeSeries
 
 
 logger = logging.getLogger("wally")
@@ -20,35 +22,125 @@
 __doc__ = "Contains base classes for performance tests"
 
 
-class TestInputConfig:
-    """
-    this class describe test input configuration
+class ResultStorage:
+    ts_header_format = "!IIIcc"
 
-    test_type - test type name
-    params - parameters from yaml file for this test
-    test_uuid - UUID to be used to create file names & Co
-    log_directory - local directory to store results
-    nodes - nodes to run tests on
-    remote_dir - directory on nodes to be used for local files
-    """
-    def __init__(self,
-                 test_type: str,
-                 params: Dict[str, Any],
-                 run_uuid: str,
-                 nodes: List[IRPCNode],
-                 storage: Storage,
-                 remote_dir: str) -> None:
-        self.test_type = test_type
-        self.params = params
-        self.run_uuid = run_uuid
-        self.nodes = nodes
+    def __init__(self, storage: Storage, job_config_cls: type) -> None:
         self.storage = storage
-        self.remote_dir = remote_dir
+        self.job_config_cls = job_config_cls
 
+    def get_suite_root(self, suite_type: str, idx: int) -> str:
+        return "results/{}_{}".format(suite_type, idx)
 
-class IterationConfig(IStorable):
-    name = None  # type: str
-    summary = None  # type: str
+    def get_job_root(self, suite_root: str, summary: str, run_id: int) -> str:
+        return "{}/{}_{}".format(suite_root, summary, run_id)
+
+    # store
+    def put_suite_config(self, config: TestSuiteConfig, root: str) -> None:
+        self.storage.put(config, root, "config.yml")
+
+    def put_job_config(self, config: TestJobConfig, root: str) -> None:
+        self.storage.put(config, root, "config.yml")
+
+    def get_suite_config(self, suite_root: str) -> TestSuiteConfig:
+        return self.storage.load(TestSuiteConfig, suite_root, "config.yml")
+
+    def get_job_node_prefix(self, job_root_path: str, node_id: str) -> str:
+        return "{}/{}".format(job_root_path, node_id)
+
+    def get_ts_path(self, job_root_path: str, node_id: str, dev: str, sensor_name: str) -> str:
+        return "{}_{}.{}".format(self.get_job_node_prefix(job_root_path, node_id), dev, sensor_name)
+
+    def put_ts(self, ts: TimeSeries, job_root_path: str, node_id: str, dev: str, sensor_name: str) -> None:
+        # TODO: check that 'metrics', 'dev' and 'node_id' match required patterns
+        root_path = self.get_ts_path(job_root_path, node_id, dev, sensor_name)
+
+        if len(ts.data) / ts.second_axis_size != len(ts.times):
+            logger.error("Unbalanced time series data. Array size has % elements, while time size has %",
+                         len(ts.data) / ts.second_axis_size, len(ts.times))
+            raise StopTestError()
+
+        with self.storage.get_fd(root_path, "cb") as fd:
+            header = struct.pack(self.ts_header_format,
+                                 ts.second_axis_size,
+                                 len(ts.data),
+                                 len(ts.times),
+                                 cast(array.array, ts.data).typecode.encode("ascii"),
+                                 cast(array.array, ts.times).typecode.encode("ascii"))
+            fd.write(header)
+            cast(array.array, ts.data).tofile(fd)
+            cast(array.array, ts.times).tofile(fd)
+
+        if ts.raw is not None:
+            self.storage.put_raw(ts.raw, root_path + ":raw")
+
+    def put_extra(self, job_root: str, node_id: str, key: str, data: bytes) -> None:
+        self.storage.put_raw(data, job_root, node_id + "_" + key)
+
+    def list_suites(self) -> Iterator[Tuple[TestSuiteConfig, str]]:
+        """iterates over (suite_name, suite_id, suite_root_path)
+        primary this function output should be used as input into list_jobs_in_suite method
+        """
+        ts_re = re.compile(r"[a-zA-Z]+_\d+$")
+        for is_file, name in self.storage.list("results"):
+            if not is_file:
+                rr = ts_re.match(name)
+                if rr:
+                    path = "results/" + name
+                    yield self.get_suite_config(path), path
+
+    def list_jobs_in_suite(self, suite_root_path: str) -> Iterator[Tuple[TestJobConfig, str, int]]:
+        """iterates over (job_summary, job_root_path)
+        primary this function output should be used as input into list_ts_in_job method
+        """
+        ts_re = re.compile(r"(?P<job_summary>[a-zA-Z0-9]+)_(?P<id>\d+)$")
+        for is_file, name in self.storage.list(suite_root_path):
+            if is_file:
+                continue
+            rr = ts_re.match(name)
+            if rr:
+                config_path = "{}/{}/config.yml".format(suite_root_path, name)
+                if config_path in self.storage:
+                    cfg = self.storage.load(self.job_config_cls, config_path)
+                    yield cfg, "{}/{}".format(suite_root_path, name), int(rr.group("id"))
+
+    def list_ts_in_job(self, job_root_path: str) -> Iterator[Tuple[str, str, str]]:
+        """iterates over (node_id, device_name, sensor_name)
+        primary this function output should be used as input into load_ts method
+        """
+        # TODO: check that all TS files available
+        ts_re = re.compile(r"(?P<node_id>\d+\.\d+\.\d+\.\d+:\d+)_(?P<dev>[^.]+)\.(?P<sensor>[a-z_]+)$")
+        already_found = set()
+        for is_file, name in self.storage.list(job_root_path):
+            if not is_file:
+                continue
+            rr = ts_re.match(name)
+            if rr:
+                key = (rr.group("node_id"), rr.group("dev"), rr.group("sensor"))
+                if key not in already_found:
+                    already_found.add(key)
+                    yield key
+
+    def load_ts(self, root_path: str, node_id: str, dev: str, sensor_name: str) -> TimeSeries:
+        path = self.get_ts_path(root_path, node_id, dev, sensor_name)
+
+        with self.storage.get_fd(path, "rb") as fd:
+            header = fd.read(struct.calcsize(self.ts_header_format))
+            second_axis_size, data_sz, time_sz, data_typecode, time_typecode = \
+                struct.unpack(self.ts_header_format, header)
+
+            data = array.array(data_typecode.decode("ascii"))
+            times = array.array(time_typecode.decode("ascii"))
+
+            data.fromfile(fd, data_sz)
+            times.fromfile(fd, time_sz)
+
+            # calculate number of elements
+            return TimeSeries("{}.{}".format(dev, sensor_name),
+                              raw=None,
+                              data=data,
+                              times=times,
+                              second_axis_size=second_axis_size)
 
 
 class PerfTest(metaclass=abc.ABCMeta):
@@ -56,13 +148,16 @@
     name = None  # type: str
     max_retry = 3
     retry_time = 30
+    job_config_cls = None  # type: type
 
-    def __init__(self, config: TestInputConfig, on_idle: Callable[[], None] = None) -> None:
+    def __init__(self, storage: Storage, config: TestSuiteConfig, idx: int, on_idle: Callable[[], None] = None) -> None:
         self.config = config
         self.stop_requested = False
-        self.nodes = self.config.nodes  # type: List[IRPCNode]
-        self.sorted_nodes_ids = sorted(node.info.node_id() for node in self.nodes)
+        self.sorted_nodes_ids = sorted(node.info.node_id() for node in self.config.nodes)
         self.on_idle = on_idle
+        self.storage = storage
+        self.rstorage = ResultStorage(self.storage, self.job_config_cls)
+        self.idx = idx
 
     def request_stop(self) -> None:
         self.stop_requested = True
@@ -90,174 +185,147 @@
 
     def __init__(self, *args, **kwargs) -> None:
         PerfTest.__init__(self, *args, **kwargs)
-        self.iterations_configs = [None]  # type: List[Optional[IterationConfig]]
-        self.storage_q = Queue()  # type: Any
+        self.job_configs = [None]  # type: List[Optional[TestJobConfig]]
+        self.suite_root_path = self.rstorage.get_suite_root(self.config.test_type, self.idx)
 
     @abc.abstractmethod
-    def get_expected_runtime(self, iter_cfg: IterationConfig) -> Optional[int]:
+    def get_expected_runtime(self, iter_cfg: TestJobConfig) -> Optional[int]:
         pass
 
-    def get_not_done_stages(self, storage: Storage) -> Dict[int, IterationConfig]:
-        not_done = {}  # type: Dict[int, IterationConfig]
+    def get_not_done_stages(self) -> Iterable[Tuple[int, TestJobConfig]]:
+        all_jobs = dict(enumerate(self.job_configs))
+        for db_config, path, jid in self.rstorage.list_jobs_in_suite(self.suite_root_path):
+            if jid in all_jobs:
+                job_config = all_jobs[jid]
+                if job_config != db_config:
+                    logger.error("Test info at path '%s/config' is not equal to expected config for iteration %s.%s." +
+                                 " Maybe configuration was changed before test was restarted. " +
+                                 "DB cfg is:\n    %s\nExpected cfg is:\n    %s\nFix DB or rerun test from beginning",
+                                 path, self.name, job_config.summary,
+                                 str(db_config).replace("\n", "\n    "),
+                                 str(job_config).replace("\n", "\n    "))
+                    raise StopTestError()
 
-        for run_id, iteration_config in enumerate(self.iterations_configs):
-            info_path = "result/{}/info".format(run_id)
-            if info_path in storage:
-                info = cast(Dict[str, Any], storage.get(info_path)) # type: Dict[str, Any]
-
-                assert isinstance(info, dict), \
-                    "Broken storage at path {}. Expect test info dict, obtain {!r}".format(info_path, info)
-
-                info = info.copy()
-                del info['begin_time']
-                del info['end_time']
-
-                iter_name = "Unnamed" if iteration_config is None else iteration_config.name
-                expected_config = {
-                    'name': self.name,
-                    'iteration_name': iter_name,
-                    'iteration_config': iteration_config.raw(),
-                    'params': self.config.params,
-                    'nodes': self.sorted_nodes_ids
-                }
-
-                assert info == expected_config, \
-                    ("Test info at path {} is not equal to expected config." +
-                     "Maybe configuration was changed before test was restarted. " +
-                     "Current cfg is {!r}, expected cfg is {!r}").format(info_path, info, expected_config)
-
-                logger.info("Test iteration {} found in storage and will be skipped".format(iter_name))
-            else:
-                not_done[run_id] = iteration_config
-
-        return not_done
+                logger.info("Test iteration %s.%s found in storage and will be skipped",
+                            self.name, job_config.summary)
+                del all_jobs[jid]
+        return all_jobs.items()
 
     def run(self) -> None:
-        not_in_storage = self.get_not_done_stages(self.config.storage)
+        try:
+            cfg = self.rstorage.get_suite_config(self.suite_root_path)
+        except KeyError:
+            cfg = None
+
+        if cfg is not None and cfg != self.config:
+            logger.error("Current suite %s config is not equal to found in storage at %s",
+                         self.config.test_type, self.suite_root_path)
+            raise StopTestError()
+
+        not_in_storage = list(self.get_not_done_stages())
 
         if not not_in_storage:
             logger.info("All test iteration in storage already. Skip test")
             return
 
-        logger.debug("Run test io.{} with profile {!r} on nodes {}.".format(self.name,
-                                                                          self.load_profile_name,
-                                                                          ",".join(self.sorted_nodes_ids)))
+        self.rstorage.put_suite_config(self.config, self.suite_root_path)
+
+        logger.debug("Run test %s with profile %r on nodes %s.", self.name,
+                                                                 self.load_profile_name,
+                                                                 ",".join(self.sorted_nodes_ids))
         logger.debug("Prepare nodes")
 
-        with ThreadPoolExecutor(len(self.nodes)) as pool:
-            list(pool.map(self.config_node, self.nodes))
 
-            # +5% - is a rough estimation for additional operations
-            run_times = [self.get_expected_runtime(iteration_config) for iteration_config in not_in_storage.values()]
+        with ThreadPoolExecutor(len(self.config.nodes)) as pool:
+            # config nodes
+            list(pool.map(self.config_node, self.config.nodes))
+
+            run_times = [self.get_expected_runtime(job_config) for _, job_config in not_in_storage]
+
             if None not in run_times:
+                # +5% - is a rough estimation for additional operations
                 expected_run_time = int(sum(run_times) * 1.05)
-                exec_time_s = sec_to_str(expected_run_time)
-                now_dt = datetime.datetime.now()
-                end_dt = now_dt + datetime.timedelta(0, expected_run_time)
-                logger.info("Entire test should takes aroud: {} and finished at {:%H:%M:%S}"
-                            .format(exec_time_s, end_dt))
 
-            for run_id, iteration_config in sorted(not_in_storage.items()):
-                iter_name = "Unnamed" if iteration_config is None else iteration_config.name
-                logger.info("Run test iteration %s", iter_name)
+                exec_time_s, end_dt_s = get_time_interval_printable_info(expected_run_time)
+                logger.info("Entire test should takes around %s and finished at %s", exec_time_s, end_dt_s)
 
-                current_result_path = "result/{}_{}".format(iteration_config.summary, run_id)
-                results = []  # type: List[NodeTestResults]
+            for run_id, job_config in not_in_storage:
+                job_path = self.rstorage.get_job_root(self.suite_root_path, job_config.summary, run_id)
+
+                jfutures = []  # type: List[Future]
                 for idx in range(self.max_retry):
-                    logger.debug("Prepare iteration %s", iter_name)
+                    logger.debug("Prepare job %s", job_config.summary)
 
                     # prepare nodes for new iterations
-                    futures = [pool.submit(self.prepare_iteration, node, iteration_config) for node in self.nodes]
-                    wait(futures)
+                    wait([pool.submit(self.prepare_iteration, node, job_config) for node in self.config.nodes])
 
-                    # run iteration
-                    logger.debug("Run iteration %s", iter_name)
+                    expected_job_time = self.get_expected_runtime(job_config)
+                    exec_time_s, end_dt_s = get_time_interval_printable_info(expected_job_time)
+                    logger.info("Job should takes around %s and finished at %s", exec_time_s, end_dt_s)
+
                     try:
-                        futures = []
-                        for node in self.nodes:
-                            path = "{}/measurement/{}".format(current_result_path, node.info.node_id())
-                            futures.append(pool.submit(self.run_iteration, node, iteration_config, path))
-
-                        results = [fut.result() for fut in futures]
+                        jfutures = []
+                        for node in self.config.nodes:
+                            future = pool.submit(self.run_iteration, node, job_config, job_path)
+                            jfutures.append(future)
+                        # test completed successfully, stop retrying
                         break
                     except EnvironmentError:
                         if self.max_retry - 1 == idx:
                             logger.exception("Fio failed")
                             raise StopTestError()
                         logger.exception("During fio run")
-                        logger.info("Sleeping %ss and retrying", self.retry_time)
+                        logger.info("Sleeping %ss and retrying job", self.retry_time)
                         time.sleep(self.retry_time)
 
                 start_times = []  # type: List[int]
                 stop_times = []  # type: List[int]
 
-                # TODO: FIX result processing - NodeTestResults
-                for result in results:
-                    for name, serie in result.series.items():
-                        start_times.append(serie.start_at)
-                        stop_times.append(serie.step * len(serie.data))
+                for future in jfutures:
+                    for (node_id, dev, sensor_name), ts in future.result().items():
+                        self.rstorage.put_ts(ts, job_path, node_id=node_id, dev=dev, sensor_name=sensor_name)
 
-                min_start_time = min(start_times)
-                max_start_time = max(start_times)
-                min_stop_time = min(stop_times)
-                max_stop_time = max(stop_times)
+                        if len(ts.times) >= 2:
+                            start_times.append(ts.times[0])
+                            stop_times.append(ts.times[-1])
 
-                max_allowed_time_diff = int((min_stop_time - max_start_time) * self.max_rel_time_diff)
-                max_allowed_time_diff = max(max_allowed_time_diff, self.max_time_diff)
+                if len(start_times) > 0:
+                    min_start_time = min(start_times)
+                    max_start_time = max(start_times)
+                    min_stop_time = min(stop_times)
+                    max_stop_time = max(stop_times)
 
-                if min_start_time + self.max_time_diff < max_allowed_time_diff:
-                    logger.warning("Too large difference in {}:{} start time - {}. Max recommended difference is {}"
-                                   .format(self.name, iter_name, max_start_time - min_start_time, self.max_time_diff))
+                    max_allowed_time_diff = int((min_stop_time - max_start_time) * self.max_rel_time_diff)
+                    max_allowed_time_diff = max(max_allowed_time_diff, self.max_time_diff)
 
-                if min_stop_time + self.max_time_diff < max_allowed_time_diff:
-                    logger.warning("Too large difference in {}:{} stop time - {}. Max recommended difference is {}"
-                                   .format(self.name, iter_name, max_start_time - min_start_time, self.max_time_diff))
+                    if min_start_time + self.max_time_diff < max_allowed_time_diff:
+                        logger.warning("Too large difference in %s:%s start time - %s. " +
+                                       "Max recommended difference is %s",
+                                       self.name, job_config.summary,
+                                       max_start_time - min_start_time, self.max_time_diff)
 
-                test_config = {
-                    'suite': 'io',
-                    'test': self.name,
-                    'profile': self.load_profile_name,
-                    'iteration_name': iter_name,
-                    'iteration_config': iteration_config.raw(),
-                    'params': self.config.params,
-                    'nodes': self.sorted_nodes_ids,
-                    'begin_time': min_start_time,
-                    'end_time': max_stop_time
-                }
+                    if min_stop_time + self.max_time_diff < max_allowed_time_diff:
+                        logger.warning("Too large difference in %s:%s stop time - %s. " +
+                                       "Max recommended difference is %s",
+                                       self.name, job_config.summary,
+                                       max_start_time - min_start_time, self.max_time_diff)
 
-                self.process_storage_queue()
-                self.config.storage.put(test_config, current_result_path, "info")
-                self.config.storage.sync()
+                self.rstorage.put_job_config(job_config, job_path)
+                self.storage.sync()
 
                 if self.on_idle is not None:
                     self.on_idle()
 
-    def store_data(self, val: Any, type: str, prefix: str, *path: str) -> None:
-        self.storage_q.put((val, type, prefix, path))
-
-    def process_storage_queue(self) -> None:
-        while not self.storage_q.empty():
-            value, val_type, subpath, val_path = self.storage_q.get()
-            if val_type == 'raw':
-                self.config.storage.put_raw(value, subpath, *val_path)
-            elif val_type == 'yaml':
-                self.config.storage.put(value, subpath, *val_path)
-            elif val_type == 'array':
-                self.config.storage.put_array(value, subpath, *val_path)
-            else:
-                logger.error("Internal logic error - unknown data stop type {!r}".format(val_path))
-                raise StopTestError()
-
     @abc.abstractmethod
     def config_node(self, node: IRPCNode) -> None:
         pass
 
     @abc.abstractmethod
-    def prepare_iteration(self, node: IRPCNode, iter_config: IterationConfig) -> None:
+    def prepare_iteration(self, node: IRPCNode, iter_config: TestJobConfig) -> None:
         pass
 
     @abc.abstractmethod
-    def run_iteration(self, node: IRPCNode, iter_config: IterationConfig, stor_prefix: str) -> NodeTestResults:
+    def run_iteration(self, node: IRPCNode, iter_config: TestJobConfig, stor_prefix: str) -> JobMetrics:
         pass
 
 
@@ -270,7 +338,7 @@
         self.run_tout = self.config.params.get('run_tout', 3600)
         self.iterations_configs = [None]
 
-    def get_expected_runtime(self, iter_cfg: IterationConfig) -> Optional[int]:
+    def get_expected_runtime(self, iter_cfg: TestJobConfig) -> Optional[int]:
         return None
 
     def config_node(self, node: IRPCNode) -> None:
@@ -281,16 +349,16 @@
         cmd += ' ' + self.config.params.get('prerun_opts', '')
         node.run(cmd, timeout=self.prerun_tout)
 
-    def prepare_iteration(self, node: IRPCNode, iter_config: IterationConfig) -> None:
+    def prepare_iteration(self, node: IRPCNode, iter_config: TestJobConfig) -> None:
         pass
 
-    def run_iteration(self, node: IRPCNode, iter_config: IterationConfig, stor_prefix: str) -> NodeTestResults:
+    def run_iteration(self, node: IRPCNode, iter_config: TestJobConfig, stor_prefix: str) -> JobMetrics:
         # TODO: have to store logs
         cmd = self.join_remote(self.run_script)
         cmd += ' ' + self.config.params.get('run_opts', '')
         return self.parse_results(node.run(cmd, timeout=self.run_tout))
 
     @abc.abstractmethod
-    def parse_results(self, data: str) -> NodeTestResults:
+    def parse_results(self, data: str) -> JobMetrics:
         pass
 
