diff --git a/cfg_checker/cli/command.py b/cfg_checker/cli/command.py
index 8e715f2..9ac05f3 100644
--- a/cfg_checker/cli/command.py
+++ b/cfg_checker/cli/command.py
@@ -32,7 +32,10 @@
 
 def execute_command(args, command):
     # Validate the commands
-    # check command
+    # check commands
+    if not hasattr(args, 'type') or not args.type:
+        logger_cli.info("\n# Please, type a command listed above")
+        return 0
     _type = args.type.replace("-", "_") if "-" in args.type else args.type
     if command not in commands:
         logger_cli.info("\n# Please, type a command listed above")
diff --git a/cfg_checker/cli/reclass.py b/cfg_checker/cli/reclass.py
index 24eb8e2..f479a72 100644
--- a/cfg_checker/cli/reclass.py
+++ b/cfg_checker/cli/reclass.py
@@ -4,7 +4,7 @@
 def entrypoint():
     cli_command(
         '# Mirantis Cloud Reclass comparer"',
-        'packages'
+        'reclass'
     )
 
 
diff --git a/cfg_checker/modules/network/__init__.py b/cfg_checker/modules/network/__init__.py
index c81b63a..b1664a4 100644
--- a/cfg_checker/modules/network/__init__.py
+++ b/cfg_checker/modules/network/__init__.py
@@ -114,16 +114,14 @@
     # Should generate network map to console or HTML
     logger_cli.info("# Network report")
 
-    _type, _filename = args_utils.get_network_map_type_and_filename(args)
     networkMap = _prepare_map()
-
     networkMap.print_map()
 
     return
 
 
 def do_list(args):
-    # Network Map
+    # Network List
     # Should generate network map to console or HTML
     _map = mapper.NetworkMapper()
     reclass = _map.map_network(_map.RECLASS)
diff --git a/cfg_checker/modules/packages/checker.py b/cfg_checker/modules/packages/checker.py
index bf192f9..83ecc94 100644
--- a/cfg_checker/modules/packages/checker.py
+++ b/cfg_checker/modules/packages/checker.py
@@ -188,9 +188,6 @@
         _total_processed = 0
         # Collect packages from all of the nodes in flat dict
         _all_packages = {}
-        _all_tags = set([])
-        # get env tag's year and major version
-        _tag_major = _mcp[:_mcp.find('.', _mcp.find('.')+1)]
         for node_name, node_value in salt_master.nodes.iteritems():
             _uniq_len = len(_all_packages.keys())
             _progress_index += 1
@@ -205,66 +202,54 @@
             )
             for _name, _value in node_value['packages'].iteritems():
                 _total_processed += 1
-                # Parse versions
+                # Parse versions from nodes
                 _ver_ins = DebianVersion(_value['installed'])
                 _ver_can = DebianVersion(_value['candidate'])
 
-                # All packages list with version and node list
+                # Process package description and release version
+                # at a first sight
                 if _name not in _all_packages:
-                    # get repo versions list,
+                    # get node attributes
                     _linux = salt_master.nodes[node_name]['linux_codename']
                     _arch = salt_master.nodes[node_name]['linux_arch']
-                    if _name == u'qemu-block-extra':
-                        a = 1
-                    # omit tag as target versions might be of different tag
+                    # get versions for this tag and repo headers
+                    # excluding 'nightly' repos
                     _r = self.rm.get_filtered_versions(
                         _name,
                         tag=_mcp,
                         include=[_os, _linux, _arch],
                         exclude=["nightly"]
                     )
-                    # save versions for matching major tags
+                    # repack versions in flat format
                     _vs = {}
                     _sections = {}
                     _apps = {}
-                    # get all versions for this year
                     for s, apps in _r.iteritems():
                         for a, versions in apps.iteritems():
                             for v, repos in versions.iteritems():
                                 for repo in repos:
-                                    t = repo['tag']
-                                    _major = t[:t.find('.', t.find('.')+1)]
-                                    if _tag_major == _major:
-                                        if v not in _vs:
-                                            _vs[v] = []
-                                        _vs[v].append(repo)
-                                        if v not in _sections:
-                                            _sections[v] = []
-                                        _sections[v].append(s)
-                                        if v not in _apps:
-                                            _apps[v] = []
-                                        _apps[v].append(a)
-
-                    # check if we have candidate version among found
+                                    if v not in _vs:
+                                        _vs[v] = []
+                                    _vs[v].append(repo)
+                                    if v not in _sections:
+                                        _sections[v] = []
+                                    _sections[v].append(s)
+                                    if v not in _apps:
+                                        _apps[v] = []
+                                    _apps[v].append(a)
+                    # search for the newest version among filtered
                     _r_desc = []
                     _vs_keys = _vs.keys()
                     if _vs_keys:
                         _newest = _newest = DebianVersion(_vs_keys.pop())
                     else:
                         _newest = DebianVersion('')
-                    # if _ver_ins.version in _vs_keys:
-                    #     # exact match, save it
-                    #     _release = _ver_ins
-                    # else:
-                    # detect newest version among saved
-
                     for v in _vs_keys:
                         _this = DebianVersion(v)
                         if _this > _newest:
                             _newest = _this
-                    # newest version for the YEAR.MAJOR will be the release
                     _release = _newest
-                    # save repos list for this version
+                    # Get best description for the package
                     if _release.version != 'n/a':
                         _r_desc = _vs[_release.version]
                     # preload special description
@@ -272,6 +257,7 @@
                         _pkg_desc = _desc[_name]
                     else:
                         _pkg_desc = _desc.dummy_desc
+                    # Save repos list and desc for this version
                     # Check if we can provide better from the package
                     if _release.version != 'n/a':
                         if not _pkg_desc['section']:
@@ -281,49 +267,7 @@
                             _pkg_desc['app'] = \
                                 "/".join(_apps[_release.version])
 
-                    # get specific set for this OS release if present
-                    # if not, try search in all repos for this tag
-                    # _r_desc = _r[_newest.version]
-                    # if _r:
-                    #     _vs = _r.keys()
-                    #     if len(_vs) > 1:
-                    #         # search best match
-                    #         _release = None
-                    #         for _v in _vs:
-                    #             _deb = DebianVersion(_v)
-                    #             if _ver_can == _deb:
-                    #                 _release = _deb
-                    #                 _r_desc = _r[_v]
-                    #                 break
-                    #         if not _release:
-                    #             _progress.clearline()
-                    #             logger_cli.error(
-                    #                 "# ERROR: No release version found "
-                    #                 "for '{}'".format(_name)
-                    #             )
-                    #             _release = DebianVersion('')
-                    #     else:
-                    #         _release = DebianVersion(_vs[0])
-                    #         _r_desc = _r[_vs[0]]
-                    # else:
-                    #     # not found... 99% that it will not happen
-                    #     _release = DebianVersion('')
-
-                    # Old versions match routine
-                    # ########
-                    # if _os in _vers:
-                    #     _v = _vers[_os]
-                    # elif 'any' in _vers:
-                    #     _v = _vers['any']
-                    # else:
-                    #     _v = {}
-
-                    # Finally, get specific version
-                    # _release = DebianVersion(_v[_mcp] if _mcp in _v else '')
-                    for repo in _r_desc:
-                        _all_tags.add(repo['tag'])
-
-                    # Populate package info
+                    # Populate package info, once for package
                     _m = _r_desc[0]["maintainer"] if _r_desc else 'n/a'
                     _all_packages[_name] = {
                         "desc": _pkg_desc,
@@ -331,18 +275,18 @@
                         "maintainer": _m,
                         "is_mirantis": self.rm.is_mirantis(
                             _name,
-                            tag=_tag_major
+                            tag=_mcp
                         ),
                         "results": {},
                         "r": _release,
                     }
-
+                # Cross-compare versions
                 _cmp = VersionCmpResult(
                     _ver_ins,
                     _ver_can,
                     _all_packages[_name]['r']
                 )
-
+                # Update results structure
                 # shortcut to results
                 _res = _all_packages[_name]['results']
                 # update status
diff --git a/cfg_checker/modules/packages/repos.py b/cfg_checker/modules/packages/repos.py
index e7c4c6a..334cbb5 100644
--- a/cfg_checker/modules/packages/repos.py
+++ b/cfg_checker/modules/packages/repos.py
@@ -821,8 +821,6 @@
             # <10symbols> \t <md5> \t sorted headers with no tag
             # ...
             # section
-            _o = ""
-
             _ss = _p.keys()
             _ss.sort()
             for _s in _ss:
@@ -830,9 +828,8 @@
                 _apps.sort()
                 # app
                 for _a in _apps:
-                    logger_cli.info(
-                        "\n# Package: {}/{}/{}".format(_s, _a, name)
-                    )
+                    _o = ""
+                    _mm = []
                     # get and sort tags
                     _vs = _p[_s][_a].keys()
                     _vs.sort()
@@ -847,18 +844,26 @@
                             _rr = _p[_s][_a][_v][_md5].keys()
                             _rr.sort()
                             for _r in _rr:
-                                _o += " "*24 + _r.replace('_', ' ')
-                                _o += " ({})\n".format(
-                                    _p[_s][_a][_v][_md5][_r]["maintainer"]
-                                )
+                                _o += " "*24 + _r.replace('_', ' ') + '\n'
+                                _m = _p[_s][_a][_v][_md5][_r]["maintainer"]
+                                if _m not in _mm:
+                                    _mm.append(_m)
 
-            logger_cli.info(_o)
+                    logger_cli.info(
+                        "\n# Package: {}/{}/{}\nMaintainers: {}".format(
+                            _s,
+                            _a,
+                            name,
+                            ", ".join(_mm)
+                        )
+                    )
+
+                    logger_cli.info(_o)
 
     @staticmethod
     def get_apps(versions, name):
         _all = True if name == '*' else False
-        _s_max = 0
-        _a_max = 0
+        _s_max = _a_max = _p_max = _v_max = 0
         _rows = []
         for _p in versions.keys():
             _vs = versions[_p]
@@ -867,13 +872,30 @@
                     if _all or name == _info['app']:
                         _s_max = max(len(_info['section']), _s_max)
                         _a_max = max(len(_info['app']), _a_max)
+                        _p_max = max(len(_p), _p_max)
+                        _v_max = max(len(_v), _v_max)
                         _rows.append([
                             _info['section'],
                             _info['app'],
-                            _p
+                            _p,
+                            _v,
+                            _md5,
+                            len(_info['repo'])
                         ])
-        _fmt = "{:"+str(_s_max)+"} {:"+str(_a_max)+"} {}"
-        _rows = [_fmt.format(s, a, p) for s, a, p in _rows]
+        # format columns
+        # section
+        _fmt = "{:"+str(_s_max)+"} "
+        # app
+        _fmt += "{:"+str(_a_max)+"} "
+        # package name
+        _fmt += "{:"+str(_p_max)+"} "
+        # version
+        _fmt += "{:"+str(_v_max)+"} "
+        # md5 and number of repos is fixed
+        _fmt += "{} in {} repos"
+
+        # fill rows
+        _rows = [_fmt.format(s, a, p, v, m, l) for s, a, p, v, m, l in _rows]
         _rows.sort()
         return _rows
 
@@ -881,12 +903,12 @@
         c = 0
         rows = self.get_apps(self._versions_mirantis, name)
         if rows:
-            logger_cli.info("# Mirantis packages for '{}'".format(name))
+            logger_cli.info("\n# Mirantis packages for '{}'".format(name))
             logger_cli.info("\n".join(rows))
             c += 1
         rows = self.get_apps(self._versions_other, name)
         if rows:
-            logger_cli.info("# Other packages for '{}'".format(name))
+            logger_cli.info("\n# Other packages for '{}'".format(name))
             logger_cli.info("\n".join(rows))
             c += 1
         if c == 0:
diff --git a/tests/test_entrypoints.py b/tests/test_entrypoints.py
index 5fd778a..eb463cc 100644
--- a/tests/test_entrypoints.py
+++ b/tests/test_entrypoints.py
@@ -19,11 +19,13 @@
         with self.redirect_output():
             with self.assertRaises(SystemExit) as ep:
                 _m.cfg_check.config_check_entrypoint()
-
+        # empty run should return code 1
         self.assertEqual(
             ep.exception.code,
-            0,
-            "mcp-checker has non-zero exit-code"
+            1,
+            "mcp-checker has unexpected exit code: {}".format(
+                ep.exception.code
+            )
         )
 
     def test_entry_packages(self):
@@ -43,11 +45,11 @@
         with self.redirect_output():
             with self.assertRaises(SystemExit) as ep:
                 _m.cli.packages.entrypoint()
-
+        # empty run should return code 1
         self.assertEqual(
             ep.exception.code,
-            0,
-            "packages has non-zero exit code"
+            1,
+            "packages has unexpected exit code: {}".format(ep.exception.code)
         )
 
     def test_entry_network(self):
@@ -67,11 +69,11 @@
         with self.redirect_output():
             with self.assertRaises(SystemExit) as ep:
                 _m.cli.network.entrypoint()
-
+        # empty run should return code 1
         self.assertEqual(
             ep.exception.code,
-            0,
-            "network has non-zero exit-code"
+            1,
+            "network has unexpected exit code: {}".format(ep.exception.code)
         )
 
     def test_entry_reclass(self):
@@ -91,9 +93,9 @@
         with self.redirect_output():
             with self.assertRaises(SystemExit) as ep:
                 _m.cli.reclass.entrypoint()
-
+        # empty run should return code 1
         self.assertEqual(
             ep.exception.code,
-            0,
-            "reclass has non-zero exit-code"
+            1,
+            "reclass has unexpected exit code: {}".format(ep.exception.code)
         )
