Package versions report updates
diff --git a/cfg_checker/modules/packages/__init__.py b/cfg_checker/modules/packages/__init__.py
index 4f1a809..0e2d956 100644
--- a/cfg_checker/modules/packages/__init__.py
+++ b/cfg_checker/modules/packages/__init__.py
@@ -16,6 +16,6 @@
     # collect data on installed packages
     pChecker.collect_installed_packages()
     # diff installed and candidates
-    # pChecker.collect_packages()
+    pChecker.collect_packages()
     # report it
     pChecker.create_html_report(_filename)
diff --git a/cfg_checker/modules/packages/checker.py b/cfg_checker/modules/packages/checker.py
index 100b329..4956a52 100644
--- a/cfg_checker/modules/packages/checker.py
+++ b/cfg_checker/modules/packages/checker.py
@@ -32,7 +32,7 @@
                     logger_cli.info("... no JSON for '{}'".format(
                         key
                     ))
-                    logger_cli.debug("... {}".format(_text[:_text.find('{')]))
+                    logger_cli.debug("ERROR:\n{}\n".format(_text[:_text.find('{')]))
                     _dict = {}
                 
                 self.nodes[key]['packages'] = _dict
@@ -50,16 +50,31 @@
 
         :return: no return values, all date put to dict in place
         """
-        _all_packages = {}
+        # Collect packages from all of the nodes in flat dict
+        _diff_packages = {}
         for node_name, node_value in self.nodes.iteritems():
-            for package_name in node_value['packages']:
-                if package_name not in _all_packages:
-                    _all_packages[package_name] = {}
-                _all_packages[package_name][node_name] = node_value
+            for _name, _value in node_value['packages'].iteritems():
+                if _name not in _diff_packages:
+                    _diff_packages[_name] = {}
+                    _diff_packages[_name]['df_nodes'] = {}
+                    _diff_packages[_name]['eq_nodes'] = []
+                
+                # compare packages, mark if equal
+                if _value['installed'] != _value['candidate']:
+                    # Saving compare value so we not do str compare again
+                    _value['is_equal'] = False
+                    # add node name to list
+                    _diff_packages[_name]['df_nodes'][node_name] = {
+                        'i': _value['installed'],
+                        'c': _value['candidate'],
+                        'raw': _value['raw']
+                    }
+                else:
+                    # Saving compare value so we not do str compare again
+                    _value['is_equal'] = True
+                    _diff_packages[_name]['eq_nodes'].append(node_name)
 
-        # TODO: process data for per-package basis
-
-        self.all_packages = _all_packages
+        self.diff_packages = _diff_packages
 
     def create_html_report(self, filename):
         """
@@ -74,6 +89,7 @@
         )
         _report({
             "nodes": self.nodes,
-            "diffs": {}
+            "rc_diffs": {},
+            "pkg_diffs": self.diff_packages
         })
         logger_cli.info("-> Done")
diff --git a/cfg_checker/modules/reclass/comparer.py b/cfg_checker/modules/reclass/comparer.py
index eaf1ce8..5ef2ca5 100644
--- a/cfg_checker/modules/reclass/comparer.py
+++ b/cfg_checker/modules/reclass/comparer.py
@@ -135,7 +135,7 @@
             )
         
         # save it as a single data object
-        self.models[name]["all_diffs"] = raw_tree[root_key]
+        self.models[name]["rc_diffs"] = raw_tree[root_key]
         return True
 
     def find_changes(self, dict1, dict2, path=""):
@@ -356,7 +356,7 @@
         # report will have tabs for each of the comparable entities in diffs
         report({
             "nodes": {},
-            "all_diffs": diffs,
+            "rc_diffs": diffs,
         })
         # with open("./gen_tree.json", "w+") as _out:
         #     _out.write(json.dumps(mComparer.generate_model_report_tree))
diff --git a/cfg_checker/reports/reporter.py b/cfg_checker/reports/reporter.py
index 9d2b2eb..e1d6b6f 100644
--- a/cfg_checker/reports/reporter.py
+++ b/cfg_checker/reports/reporter.py
@@ -63,7 +63,8 @@
         # system, nodes, clusters, and the rest in other
         data.update({
             "nodes": payload['nodes'],
-            "all_diffs": payload['diffs'],
+            "rc_diffs": payload['rc_diffs'],
+            "pkg_diffs": payload['pkg_diffs'],
             "tabs": {}
         })
 
@@ -121,18 +122,20 @@
         return _fail_uniq
 
     def _extend_data(self, data):
-        _all_pkg = 0
+        # Count values on per-node basis
         for key, value in data['nodes'].iteritems():
-            # add count of packages for this node to total
-            _all_pkg += len(value.keys())
-
             # count differences
             data['counters'][key] = {}
             data['counters'][key]['packages'] = len(value['packages'].keys())
             data['counters'][key]['package_diff'] = 0
+            data['counters'][key]['package_eq'] = 0
+
+            # Lookup if this fail is uniq for this node
             for pkg_name, pkg_value in value['packages'].iteritems():
-                if pkg_value['installed'] != pkg_value['candidate']:
-                    pkg_value['is_equal'] = False
+                if pkg_value['is_equal']:
+                    pkg_value['fail_uniq'] = False
+                    data['counters'][key]['package_eq'] += 1
+                else:
                     pkg_value['fail_uniq'] = self.is_fail_uniq(
                         pkg_value,
                         pkg_name,
@@ -140,11 +143,15 @@
                         key
                     )
                     data['counters'][key]['package_diff'] += 1
-                else:
-                    pkg_value['is_equal'] = True
-                    pkg_value['fail_uniq'] = False
+       
+        # Count values on all-diffs basis
+        for key, value in data['pkg_diffs'].iteritems():
+            data['counters'][key] = {}
+            data['counters'][key]['df_nodes'] = len(value['df_nodes'].keys())
+            data['counters'][key]['eq_nodes'] = len(value['eq_nodes'])
 
-        data['counters']['total_packages'] = _all_pkg
+        # Save all packages counter
+        data['counters']['total_packages'] = data['pkg_diffs'].keys()
 
 
 # Package versions report
@@ -153,8 +160,8 @@
 
     def _extend_data(self, data):
         # move names into separate place
-        data["names"] = data["all_diffs"].pop("diff_names")
-        data["tabs"] = data.pop("all_diffs")
+        data["names"] = data["rc_diffs"].pop("diff_names")
+        data["tabs"] = data.pop("rc_diffs")
         
         # counters - mdl_diff
         for _tab in data["tabs"].keys():
diff --git a/templates/pkg_versions_tmpl.j2 b/templates/pkg_versions_tmpl.j2
index 3c61745..b03e2ef 100644
--- a/templates/pkg_versions_tmpl.j2
+++ b/templates/pkg_versions_tmpl.j2
@@ -45,7 +45,7 @@
             text-align: left;
             cursor: pointer;
             transition: 0.3s;
-            font-size: 1.3em;
+            font-size: 1.1em;
             width: 100%;
             padding: 1px;
             margin: 1px;
@@ -53,12 +53,12 @@
 
         button > div.node_name {
             float: left;
-            font-size: 1.3em;
+            font-size: 0.8em;
         }
 
         .smallgreytext {
             float: right;
-            font-size: 0.7em;
+            font-size: 0.5em;
             color: gray;
         }
 
@@ -86,6 +86,15 @@
             overflow-x: scroll;
             overflow-wrap: break-word;
         }
+        .collapsable {
+            visibility: collapse;
+            display: none;
+        }
+
+        .collapsable.in {
+            visibility: visible;
+            display: table-row;
+        }
 
         table {
             border: 0 hidden;
@@ -144,6 +153,26 @@
 
     </style>
     <script language="JavaScript">
+        function toggleClassByID(pkg, number) {
+            var elements = document.querySelectorAll("#"+pkg+"_"+number);
+            var ii = elements.length;
+            var button = document.querySelector("#"+pkg+"_button"+number);
+
+            while (ii--) {
+                if( elements[ii].className && elements[ii].className.indexOf("in") > -1 ) {
+                    elements[ii].classList.remove("in");
+                    button.innerHTML = "&uarr;"
+                }
+                else {
+                    elements[ii].classList.add("in");
+                    button.innerHTML = "&darr;"
+                }
+            }
+
+
+        }
+    </script>
+    <script language="JavaScript">
         function init() {
             // Declare all variables
             var i, tabcontent, tablinks;
@@ -187,8 +216,11 @@
 </head>
 <body onload="init()">
 <div class="tab">
+  <button class="tablinks" onclick="openTab(event, 'All Diffs')")>
+      <div class="node_name">All Diffs</div>
+  </button>
 {% for node_name in nodes.keys() | sort %}
-    {% if nodes[node_name] | is_active %}
+    {% if counters[node_name]['package_diff'] %}
   <button class="tablinks" onclick="openTab(event, '{{ node_name | shortname }}')">
     <div class="dot_green">&#9679;</div>
     <div class="node_name">{{ node_name | shortname }}</div>
@@ -197,15 +229,54 @@
     {% endif %}    
 {% endfor %}
 {% for node_name in nodes.keys() | sort %}
-    {% if not nodes[node_name] | is_active %}
+    {% if not counters[node_name]['package_diff'] %}
   <button class="tablinks" onclick="openTab(event, '{{ node_name | shortname }}')">
     <div class="dot_empty">&#9675;</div>
     <div class="node_name">{{ node_name | shortname }}</div>
     <div class="smallgreytext">({{ counters[node_name]['package_diff'] }} / {{ counters[node_name]['packages'] }})</div>
   </button>
-    {% endif %}    
+    {% endif %}
 {% endfor %}
 </div>
+<div id="All Diffs" class="tabcontent">
+    <table class="pkgversions">
+        <tbody>
+        <tr>
+            <td class="Header">Node name</td>
+            <td class="Header">Installed</td>
+            <td class="Header">Candidate</td>
+        </tr>
+        {% for pkg_name in pkg_diffs.keys() | sort %}
+        {% if counters[pkg_name]['df_nodes'] %}
+        {% set pkg_counter = 1 + loop.index0 %}
+        <tr>
+            <td>
+            <a href="#" onclick="toggleClassByID('{{ pkg_name }}', '{{ pkg_counter }}')" id="{{ pkg_name }}_button{{ pkg_counter }}">&uarr;</a>
+            {{ pkg_name }}
+            </td>
+            <td>{{ counters[pkg_name]['df_nodes'] }}</td>
+            <td></td>
+        </tr>
+        <tr><td colspan=3>
+        <table class="nodes"><tbody>
+            {% for node in pkg_diffs[pkg_name]['df_nodes'].keys() | sort %}
+            <tr class="collapsable" id="{{ pkg_name }}_{{ pkg_counter }}">
+                <td class="pkgName">{{ node }}</td>
+                <td class="version differ">
+                    <div class="tooltip">{{ pkg_diffs[pkg_name]['df_nodes'][node]['i'] }}
+                        <pre class="tooltiptext">{{ pkg_diffs[pkg_name]['df_nodes'][node]['raw'] | linebreaks }}</pre>
+                    </div>
+                </td>
+                <td class="version">{{ pkg_diffs[pkg_name]['df_nodes'][node]['c'] }}</td>
+            </tr>
+            {% endfor %}
+        </tbody></table>
+        </td></tr>
+        {% endif%}
+        {% endfor %}
+        </tbody>
+    </table>
+</div>
 {% for node_name in nodes.keys() | sort %}
 <div id="{{ node_name | shortname }}" class="tabcontent">
     <table class="pkgversions">
@@ -247,20 +318,7 @@
             {% endif %}
             {% endif %}
         {% endfor %}
-        <tr><td colspan=3>Packages with same versions: installed vs candidate</td></tr>
-        {% for package_name in nodes[node_name]['packages'] | sort %}
-            {% if nodes[node_name]['packages'][package_name] | is_equal %}
-        <tr>
-            <td class="pkgName">{{ package_name }}</td>
-            <td class="version">
-                <div class="tooltip">{{ nodes[node_name]['packages'][package_name]['installed'] }}
-                    <pre class="tooltiptext">{{ nodes[node_name]['packages'][package_name]['raw'] | linebreaks }}</pre>
-                </div>
-            </td>
-            <td class="version">{{ nodes[node_name]['packages'][package_name]['candidate'] }}</td>
-        </tr>
-            {% endif %}
-        {% endfor %}
+        <tr><td colspan=3>Packages with same versions (installed vs candidate): {{ counters[node_name]['package_eq'] }}</td></tr>
         </tbody>
     </table>
 </div>