diff --git a/cfg_checker/helpers/errors.py b/cfg_checker/helpers/errors.py
index b124315..ca8a8da 100644
--- a/cfg_checker/helpers/errors.py
+++ b/cfg_checker/helpers/errors.py
@@ -1,8 +1,21 @@
-from cfg_checker.common import logger
+import os
+
+from cfg_checker.common import file_utils as fu
+from cfg_checker.common import logger, logger_cli
+from cfg_checker.common.config_file import ConfigFile
 from cfg_checker.common.exception import ErrorMappingException
+from cfg_checker.common.settings import pkg_dir
 
 
 class ErrorIndex(object):
+    # logs folder filenames
+    _error_logs_folder_name = ".cfgerrors"
+    _conf_filename = "conf"
+    # config file object
+    conf = None
+    # iteration counter
+    _iteration = 0
+    # local vars for codes
     _area_code = ""
     _delimiter = ""
     _index = 0
@@ -16,6 +29,62 @@
         self._delimiter = delimiter
         self._index += 1
 
+        # init the error log storage folder
+        _folder = os.path.join(pkg_dir, self._error_logs_folder_name)
+        self._conf_filename = os.path.join(
+            _folder,
+            self._conf_filename
+        )
+
+        if not os.path.exists(_folder):
+            # it is not exists, create it
+            os.mkdir(_folder)
+            logger_cli.debug(
+                "... error logs folder '{}' created".format(_folder)
+            )
+        else:
+            logger_cli.debug(
+                "... error logs folder is at '{}'".format(_folder)
+            )
+        if not os.path.exists(self._conf_filename):
+            # put file with init values
+            self.conf = ConfigFile(self._area_code.lower())
+            self.conf.set_value('iteration', self._iteration)
+            self.conf.save_config(filepath=self._conf_filename)
+            logger_cli.debug(
+                "... create new config file '{}'".format(
+                    self._conf_filename
+                )
+            )
+        else:
+            # it exists, try to load latest run
+            self.conf = ConfigFile(
+                self._area_code.lower(),
+                filepath=self._conf_filename
+            )
+            # it is loaded, update iteration from file
+            self._iteration = self.conf.get_value('iteration', value_type=int)
+            self._iteration += 1
+        logger_cli.debug(" ... starting iteration {}".format(self._iteration))
+
+    def save_iteration_data(self):
+        # save error log
+        _filename = "-".join([self._area_code.lower(), "errors"])
+        _filename += "." + str(self._iteration)
+        _log_filename = os.path.join(
+            pkg_dir,
+            self._error_logs_folder_name,
+            _filename
+        )
+        fu.write_lines_to_file(_log_filename, self.get_errors(as_list=True))
+        fu.append_line_to_file(_log_filename, "")
+        fu.append_lines_to_file(_log_filename, self.get_summary(as_list=True))
+        logger_cli.debug("... saved errors to '{}'".format(_log_filename))
+
+        # save last iteration number
+        self.conf.set_value('iteration', self._iteration)
+        self.conf.save_config()
+
     def _format_error_code(self, index):
         _t = "{:02d}".format(self._errors[index]['type'])
         _i = "{:04d}".format(index)
@@ -27,9 +96,9 @@
         _code = self._format_error_code(index)
         # prepare data as string list
         _d = self._errors[index]['data']
-        _data = ["{}: {}".format(_k, _v) for _k, _v in _d.iteritems()]
+        _data = ["    {}: {}".format(_k, _v) for _k, _v in _d.iteritems()]
         # format message
-        _msg = "### {}: {}\n{}".format(
+        _msg = "### {}:\n    Description: {}\n{}".format(
             _code,
             self._get_error_type_text(self._errors[index]['type']),
             "\n".join(_data)
@@ -89,9 +158,14 @@
         else:
             return "Unknown error index of {}".format(index)
 
-    def get_summary(self, print_zeros=True):
+    def get_summary(self, print_zeros=True, as_list=False):
         # create summary with counts per error type
-        _list = []
+        _list = "\n{:=^8s}\n{:^8s}\n{:=^8s}".format(
+            "=",
+            "Totals",
+            "="
+        ).splitlines()
+
         for _type in self._types.keys():
             _len = len(
                 filter(
@@ -112,12 +186,27 @@
                 )
             )
 
-        return "\n".join(_list)
+        _total_errors = self.get_errors_total()
 
-    def get_errors_as_list(self):
-        # create list of strings with error messages
-        _list = []
-        for _idx in range(0, self._index - 1):
-            _list.append("{}".format(self.get_error(_idx)))
+        _list.append('-'*20)
+        _list.append("{:5d} total errors found\n".format(_total_errors))
+        if as_list:
+            return _list
+        else:
+            return "\n".join(_list)
 
-        return _list
+    def get_errors(self, as_list=False):
+        _list = ["# Errors"]
+        # Detailed errors
+        if self.get_errors_total() > 0:
+            # create list of strings with error messages
+            for _idx in range(1, self._index - 1):
+                _list.append(self._format_error(_idx))
+                _list.append("\n")
+        else:
+            _list.append("-> No errors")
+
+        if as_list:
+            return _list
+        else:
+            return "\n".join(_list)
