diff --git a/djangocms_blog/cms_menus.py b/djangocms_blog/cms_menus.py
index 2e61642..c85885a 100644
--- a/djangocms_blog/cms_menus.py
+++ b/djangocms_blog/cms_menus.py
@@ -52,6 +52,13 @@ class BlogCategoryMenu(CMSAttachMenu):
                     namespace=self.instance.application_namespace
                 )
             config = self._config[self.instance.application_namespace]
+        if hasattr(self, 'instance') and self.instance:
+            if not getattr(request, 'toolbar', False) or not request.toolbar.edit_mode:
+                if self.instance == self.instance.get_draft_object():
+                    return []
+            else:
+                if self.instance == self.instance.get_public_object():
+                    return []
         if config and config.menu_structure in (MENU_TYPE_COMPLETE, MENU_TYPE_CATEGORIES):
             categories_menu = True
         if config and config.menu_structure in (MENU_TYPE_COMPLETE, MENU_TYPE_POSTS):
@@ -61,21 +68,24 @@ class BlogCategoryMenu(CMSAttachMenu):
             categories = BlogCategory.objects
             if config:
                 categories = categories.namespace(self.instance.application_namespace)
-            categories = categories.active_translations(language).distinct()
+            categories = categories.active_translations(language)
             categories = categories.order_by('parent__id', 'translations__name').\
                 select_related('app_config').prefetch_related('translations')
+            added_categories = []
             for category in categories:
-                node = NavigationNode(
-                    category.name,
-                    category.get_absolute_url(),
-                    '{0}-{1}'.format(category.__class__.__name__, category.pk),
-                    (
-                        '{0}-{1}'.format(
-                            category.__class__.__name__, category.parent_id
-                        ) if category.parent_id else None
+                if category.pk not in added_categories:
+                    node = NavigationNode(
+                        category.name,
+                        category.get_absolute_url(),
+                        '{0}-{1}'.format(category.__class__.__name__, category.pk),
+                        (
+                            '{0}-{1}'.format(
+                                category.__class__.__name__, category.parent_id
+                            ) if category.parent_id else None
+                        )
                     )
-                )
-                nodes.append(node)
+                    nodes.append(node)
+                    added_categories.append(category.pk)
 
         if posts_menu:
             posts = Post.objects
diff --git a/tests/test_menu.py b/tests/test_menu.py
index cb4ad05..f36871c 100644
--- a/tests/test_menu.py
+++ b/tests/test_menu.py
@@ -6,6 +6,7 @@ from django.utils.translation import activate
 from menus.menu_pool import menu_pool
 from parler.utils.context import smart_override, switch_language
 
+from djangocms_blog.models import BlogCategory
 from djangocms_blog.settings import (
     MENU_TYPE_CATEGORIES, MENU_TYPE_COMPLETE, MENU_TYPE_NONE, MENU_TYPE_POSTS,
 )
@@ -46,9 +47,10 @@ class MenuTest(BaseTest):
         for lang in ('en', 'it'):
             with smart_override(lang):
                 self._reset_menus()
-                request = self.get_page_request(pages[1], self.user, pages[1].get_absolute_url(lang))
+                request = self.get_page_request(pages[1], self.user, pages[1].get_absolute_url(lang), edit=True)
                 nodes = menu_pool.get_nodes(request)
-                nodes_url = set([node.url for node in nodes])
+                self.assertTrue(len(nodes), BlogCategory.objects.all().count() + len(pages))
+                nodes_url = set([node.get_absolute_url() for node in nodes])
                 cats_url = set([cat.get_absolute_url() for cat in self.cats if cat.has_translation(lang)])
                 self.assertTrue(cats_url.issubset(nodes_url))
 
@@ -57,9 +59,11 @@ class MenuTest(BaseTest):
         for lang in ('en', 'it'):
             with smart_override(lang):
                 self._reset_menus()
-                request = self.get_page_request(pages[1], self.user, pages[1].get_absolute_url(lang))
+                request = self.get_page_request(pages[1].get_draft_object(), self.user, pages[1].get_draft_object().get_absolute_url(lang))
                 nodes = menu_pool.get_nodes(request)
-                nodes_url = set([node.url for node in nodes])
+                urls = [node.get_absolute_url() for node in nodes]
+                nodes_url = [node.get_absolute_url() for node in nodes]
+                self.assertTrue(len(nodes_url), BlogCategory.objects.all().count() + len(pages))
                 self.assertFalse(posts[0].get_absolute_url(lang) in nodes_url)
                 self.assertTrue(posts[1].get_absolute_url(lang) in nodes_url)
 
@@ -90,7 +94,7 @@ class MenuTest(BaseTest):
             with smart_override(lang):
                 self._reset_menus()
                 nodes = menu_pool.get_nodes(request)
-                nodes_url = set([node.url for node in nodes])
+                nodes_url = set([node.get_absolute_url() for node in nodes])
                 self.assertFalse(cats_url[lang].issubset(nodes_url))
                 self.assertFalse(posts_url[lang].issubset(nodes_url))
 
@@ -103,7 +107,7 @@ class MenuTest(BaseTest):
             with smart_override(lang):
                 self._reset_menus()
                 nodes = menu_pool.get_nodes(request)
-                nodes_url = set([node.url for node in nodes])
+                nodes_url = set([node.get_absolute_url() for node in nodes])
                 self.assertFalse(cats_url[lang].issubset(nodes_url))
                 self.assertTrue(posts_url[lang].issubset(nodes_url))
 
@@ -116,7 +120,7 @@ class MenuTest(BaseTest):
             with smart_override(lang):
                 self._reset_menus()
                 nodes = menu_pool.get_nodes(request)
-                nodes_url = set([node.url for node in nodes])
+                nodes_url = set([node.get_absolute_url() for node in nodes])
                 self.assertTrue(cats_url[lang].issubset(nodes_url))
                 self.assertFalse(posts_url[lang].issubset(nodes_url))
 
@@ -129,7 +133,7 @@ class MenuTest(BaseTest):
             with smart_override(lang):
                 self._reset_menus()
                 nodes = menu_pool.get_nodes(request)
-                nodes_url = set([node.url for node in nodes])
+                nodes_url = set([node.get_absolute_url() for node in nodes])
                 self.assertTrue(cats_url[lang].issubset(nodes_url))
                 self.assertTrue(posts_url[lang].issubset(nodes_url))