diff --git a/capsule-prototype/js/MosaicPanelWidget.js b/capsule-prototype/js/MosaicPanelWidget.js
index 4aad30181d852b11329625443d9bbb6da54340d4..eabe84260f4076b7d907f0f52195a926707a377b 100644
--- a/capsule-prototype/js/MosaicPanelWidget.js
+++ b/capsule-prototype/js/MosaicPanelWidget.js
@@ -1,5 +1,7 @@
 ((app) => {
         function MosaicPanelWidget() {
+            const filterByCategory = 0;
+            const filterByLabel = 1;
             const defaultOptions = {
                 getTagGradientColor: function (tag) {
                     let isOpera = !!window.opera || navigator.userAgent.indexOf(' OPR/') >= 0;  // Opera 8.0+ (UA detection to detect Blink/v8-powered Opera)
@@ -33,9 +35,9 @@
                     return app.rekall.Rekall('rekall');
                 },
                 filters_type_to_hide: [],
-                filter_label_to_show: [],
+                filter_label_to_hide: [],
                 _followedItems: [],
-                _filter_type: 0,
+                _filter_type: filterByCategory,
             };
 
             const localOptions = $.extend({}, defaultOptions);
@@ -46,7 +48,7 @@
                     .removeClass('mosaic_filter_disabled');
                 $('.mosaic_label_filter_enabled').click();
                 localOptions.filters_type_to_hide = [];
-                localOptions.filter_label_to_show = [];
+                localOptions.filter_label_to_hide = [];
                 $('.mosaic_category').show();
             }
 
@@ -66,7 +68,7 @@
             }
 
             function toggleLabelToShow(filterName) {
-                let filters = localOptions.filter_label_to_show;
+                let filters = localOptions.filter_label_to_hide;
                 if (filters.includes(filterName)) {
                     filters.splice(filters.indexOf(filterName), 1);
                 } else {
@@ -122,17 +124,8 @@
                 return selectDiv;
             }
 
-            const setDivVisibilityForTag = function (div, tag) {
-                if (!localOptions.filter_label_to_show.length) {
-                    div.show()
-                    return;
-                }
-
-                if (tag.getLabels().filter(value => localOptions.filter_label_to_show.includes(value.toLowerCase())).length) {
-                    div.show();
-                } else {
-                    div.hide()
-                }
+            function rgbToHex(r, g, b) {
+                return "#" + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1);
             }
 
             const createHtmlElementForTagOrDoc = function (tagOrDoc) {
@@ -158,19 +151,15 @@
                     tag: tagOrDoc
                 };
                 divUpdater.update = function (tag) {
-                    setDivVisibilityForTag(div, tag);
+                    // setDivVisibilityForTag(div, tag);
                 }
                 divUpdater.remove = function () {
                     tagOrDoc.removeObserver(divUpdater);
                 }
-                divUpdater.computeVisibility = function () {
-                    setDivVisibilityForTag(divUpdater.div, divUpdater.tag);
-                }
+
                 tagOrDoc.addObserver(divUpdater);
                 localOptions._followedItems.push(divUpdater);
 
-                setDivVisibilityForTag(div, tagOrDoc);
-
                 return div;
             }
 
@@ -184,7 +173,6 @@
 
 
                 if (isToggled) {
-                    result.toggle();
                     result.toggleClass('mosaic_filter_disabled');
                 }
 
@@ -196,30 +184,9 @@
                 localOptions._destroyFollowedElements();
             }
 
-            const fillPanel = function () {
-                let resetfilterdiv = $('<div/>').addClass('mosaic_filter');
-                let typefilterdiv = $('<div/>').addClass('mosaic_filter');
-                let labelsfilterdiv = $('<div/>').addClass('mosaic_filter');
-                resetfilterdiv.append(getFilterElement(
-                    'Reset filters',
-                    'rgb(100,100,100)',
-                    localOptions._resetFilters,
-                    'mosaic_filter_item_all',
-                    false
-                ));
-                localOptions.htmlElement().append(createFilterTypeSelector());
-                localOptions.htmlElement().append(resetfilterdiv);
-
-                if (localOptions._filter_type === 0) {
-                    localOptions.htmlElement().append(typefilterdiv);
-                }
-                if (localOptions._filter_type === 1){
-                    localOptions.htmlElement().append(labelsfilterdiv);
-                }
-                // eslint-disable-next-line no-undef
-                let labels = new Set();
+            function createViewByCategory(typefilterdiv) {
                 for (let [k, v] of Object.entries(localOptions.rekall().sortings.colors.categories)) {
-                    let categoryName = localOptions.rekall().sortings.colors.getCategoryName(k)
+                    let categoryName = localOptions.rekall().sortings.colors.getCategoryName(k);
                     let category = $('<div/>').addClass('mosaic_category').css('background', localOptions.getTagGradientColor(v));
 
                     let grid = $('<div/>').addClass('mosaic_category_grid');
@@ -232,42 +199,105 @@
                         v.color, function () {
                             category.toggle();
                             $(this).toggleClass('mosaic_filter_disabled');
-                            localOptions.toggle_filterType(categoryName)
+                            toggleFilterType(categoryName)
                         },
                         '',
                         localOptions.filters_type_to_hide.includes(categoryName)
                     ));
 
+                    localOptions.htmlElement().append(category);
+                    if(localOptions.filters_type_to_hide.includes(categoryName)){
+                        category.toggle();
+                    }
+
                     for (let i in v.tags) {
                         grid.append(createHtmlElementForTagOrDoc(v.tags[i]));
-                        v.tags[i].getLabels().forEach(l => labels.add(l));
                     }
-                    localOptions.htmlElement().append(category);
                 }
+            }
 
-                Array.from(labels)
-                    .sort(function (a, b) {
-                        return a.toLowerCase().localeCompare(b.toLowerCase());
-                    })
-                    .forEach(l => {
-                        let button = $('<div/>').html(l);
-                        button.addClass('mosaic_filter_item mosaic_button mosaic_label_filter');
-                        if (
-                            localOptions.filter_label_to_show.length
-                            && localOptions.filter_label_to_show.includes(l.toLowerCase())
-                        ) {
-                            button.toggleClass('mosaic_label_filter_enabled');
+            function createViewByLabel(typefilterdiv) {
+                // retrieve labels with its tags
+                const groupTagsByLabels = function()
+                {
+                    let labelsWithTag = {};
+                    for (let [k, v] of Object.entries(localOptions.rekall().sortings.colors.categories)) {
+                        for (let i in v.tags) {
+                            v.tags[i].getLabels().forEach(l => {
+                                if (!labelsWithTag[l]) {
+                                    labelsWithTag[l] = [];
+                                }
+                                labelsWithTag[l].push(v.tags[i]);
+                            });
                         }
+                    }
 
-                        button.click(ev => {
-                            toggleLabelToShow(l.toLowerCase());
-                            $(ev.target).toggleClass('mosaic_label_filter_enabled');
-                            ev.target.my_state = !ev.target.my_state;
-                            console.debug('filters: ', localOptions.filter_label_to_show);
-                            localOptions._followedItems.forEach(value => value.computeVisibility())
-                        })
-                        labelsfilterdiv.append(button);
-                    });
+                    return labelsWithTag;
+                };
+                function createViewHtmlFromLabels(labelsWithTag) {
+                    for (let [label, v] of Object.entries(labelsWithTag)) {
+                        let categoryName = label;
+                        let category = $('<div/>').addClass('mosaic_category').css('background', rgbToHex(85, 146, 153));
+
+
+                        let grid = $('<div/>').addClass('mosaic_category_grid');
+
+                        category.append($('<h2/>').text(categoryName));
+                        category.append(grid);
+
+                        typefilterdiv.append(getFilterElement(
+                            categoryName,
+                            rgbToHex(85, 146, 153),
+                            function () {
+                                category.toggle();
+                                $(this).toggleClass('mosaic_filter_disabled');
+                                toggleLabelToShow(categoryName)
+                            },
+                            '',
+                            localOptions.filter_label_to_hide.includes(categoryName)
+                        ));
+
+                        for (let i in v) {
+                            grid.append(createHtmlElementForTagOrDoc(v[i]));
+                        }
+
+                        localOptions.htmlElement().append(category);
+
+                        if (localOptions.filter_label_to_hide.includes(categoryName)){
+                            category.toggle();
+                        }
+                    }
+                };
+                createViewHtmlFromLabels(groupTagsByLabels());
+            }
+
+            const fillPanel = function () {
+                let resetfilterdiv = $('<div/>').addClass('mosaic_filter');
+                let typefilterdiv = $('<div/>').addClass('mosaic_filter');
+                let labelsfilterdiv = $('<div/>').addClass('mosaic_filter');
+                resetfilterdiv.append(getFilterElement(
+                    'Reset filters',
+                    'rgb(100,100,100)',
+                    localOptions._resetFilters,
+                    'mosaic_filter_item_all',
+                    false
+                ));
+                localOptions.htmlElement().append(createFilterTypeSelector());
+                localOptions.htmlElement().append(resetfilterdiv);
+
+                if (localOptions._filter_type === 0) {
+                    localOptions.htmlElement().append(typefilterdiv);
+                }
+                if (localOptions._filter_type === 1){
+                    localOptions.htmlElement().append(labelsfilterdiv);
+                }
+                // eslint-disable-next-line no-undef
+                if (filterByCategory === localOptions._filter_type){
+                    createViewByCategory(typefilterdiv);
+                }
+                if (filterByLabel === localOptions._filter_type){
+                    createViewByLabel(labelsfilterdiv);
+                }
             }
 
             localOptions.toggle_filterType = toggleFilterType;