diff --git a/uffd/__init__.py b/uffd/__init__.py
index f5190360fa21115e9d33ee3b9c440aff5ebf666e..c6c83c7128389229d8870fc44dbb216eaf02e49c 100644
--- a/uffd/__init__.py
+++ b/uffd/__init__.py
@@ -69,7 +69,10 @@ def create_app(test_config=None): # pylint: disable=too-many-locals,too-many-sta
 	init_config(app, test_config)
 
 	register_template_helper(app)
-	setup_navbar(app)
+
+	# Sort the navbar positions by their blueprint names (from the left)
+	positions = ["selfservice", "services", "rolemod", "invite", "user", "group", "role", "mail"]
+	setup_navbar(app, positions)
 
 	# We never want to fail here, but at a file access that doesn't work.
 	# We might only have read access to app.instance_path
diff --git a/uffd/invite/views.py b/uffd/invite/views.py
index 8f38c7ef7fb79d3e678b6cae237c7e74b6f5df37..c647e5dc626c5200311889004be9e1a0d7a12f2b 100644
--- a/uffd/invite/views.py
+++ b/uffd/invite/views.py
@@ -43,7 +43,7 @@ def reset_acl_filter(user):
 	return Invite.creator == user
 
 @bp.route('/')
-@register_navbar(14, lazy_gettext('Invites'), icon='link', blueprint=bp, visible=invite_acl_check)
+@register_navbar(lazy_gettext('Invites'), icon='link', blueprint=bp, visible=invite_acl_check)
 @login_required(invite_acl_check)
 def index():
 	invites = Invite.query.filter(view_acl_filter(request.user)).all()
diff --git a/uffd/mail/views.py b/uffd/mail/views.py
index 47af1a84d6f65321b9f303f730d1ba6b06d0b01a..8ee57c56ec6eb33eae8fd568d37d1061b270ca61 100644
--- a/uffd/mail/views.py
+++ b/uffd/mail/views.py
@@ -19,7 +19,7 @@ def mail_acl():
 	pass
 
 @bp.route("/")
-@register_navbar(29, lazy_gettext('Forwardings'), icon='envelope', blueprint=bp, visible=mail_acl_check)
+@register_navbar(lazy_gettext('Forwardings'), icon='envelope', blueprint=bp, visible=mail_acl_check)
 def index():
 	return render_template('mail/list.html', mails=Mail.query.all())
 
diff --git a/uffd/navbar.py b/uffd/navbar.py
index e01675971b5b4533e440a932265b43fbbb9c9b67..501d8f864466c72750d42e7319d0e94a9e15053f 100644
--- a/uffd/navbar.py
+++ b/uffd/navbar.py
@@ -1,4 +1,5 @@
-def setup_navbar(app):
+def setup_navbar(app, positions):
+	app.navbarPositions = positions
 	app.navbarList = []
 	app.jinja_env.globals['getnavbar'] = lambda: [n for n in app.navbarList if n['visible']()]
 
@@ -8,7 +9,7 @@ def setup_navbar(app):
 # ( see: http://fontawesome.io/icons/ )
 # visible is a function that returns "True" if this icon should be visible in the calling context
 # pylint: disable=too-many-arguments
-def register_navbar(position, name, iconlib='fa', icon=None, group=None, endpoint=None, blueprint=None, visible=None):
+def register_navbar(name, iconlib='fa', icon=None, group=None, endpoint=None, blueprint=None, visible=None):
 	def wrapper(func):
 		def deferred_call(state):
 			assert blueprint
@@ -19,7 +20,7 @@ def register_navbar(position, name, iconlib='fa', icon=None, group=None, endpoin
 					urlendpoint = "{}.{}".format(blueprint.name, func.__name__)
 				else:
 					urlendpoint = func.__name_
-				# pylint: enable=protected-access
+			# pylint: enable=protected-access
 			item = {}
 			item['iconlib'] = iconlib
 			item['icon'] = icon
@@ -28,7 +29,11 @@ def register_navbar(position, name, iconlib='fa', icon=None, group=None, endpoin
 			item['name'] = name
 			item['blueprint'] = blueprint
 			item['visible'] = visible or (lambda: True)
-			item['position'] = position
+			item['position'] = 99
+			if blueprint.name in state.app.navbarPositions:
+				item['position'] = state.app.navbarPositions.index(blueprint.name)
+			else:
+				item['visible'] = lambda: False
 			state.app.navbarList.append(item)
 			state.app.navbarList.sort(key=lambda item: item['position'])
 		blueprint.record_once(deferred_call)
diff --git a/uffd/role/views.py b/uffd/role/views.py
index 94b15e1701499279b82cbb773dd8fdcc205b06a6..ce99dafcca86bb2832e9b813ae713aeecca31491 100644
--- a/uffd/role/views.py
+++ b/uffd/role/views.py
@@ -45,7 +45,7 @@ def role_acl():
 	pass
 
 @bp.route("/")
-@register_navbar(25, lazy_gettext('Roles'), icon='key', blueprint=bp, visible=role_acl_check)
+@register_navbar(lazy_gettext('Roles'), icon='key', blueprint=bp, visible=role_acl_check)
 def index():
 	return render_template('role/list.html', roles=Role.query.all())
 
diff --git a/uffd/rolemod/views.py b/uffd/rolemod/views.py
index 0a99ac3da186f1cacd5acaf79bf83cbfb1c8f5f2..d1c520b72db617f98b3db1ca0264c9c6ebcec6ba 100644
--- a/uffd/rolemod/views.py
+++ b/uffd/rolemod/views.py
@@ -20,7 +20,7 @@ def acl_check():
 		abort(403)
 
 @bp.route("/")
-@register_navbar(12, lazy_gettext('Moderation'), icon='user-lock', blueprint=bp, visible=user_is_rolemod)
+@register_navbar(lazy_gettext('Moderation'), icon='user-lock', blueprint=bp, visible=user_is_rolemod)
 def index():
 	roles = Role.query.join(Role.moderator_group).join(Group.members).filter(User.id==request.user.id).all()
 	return render_template('rolemod/list.html', roles=roles)
diff --git a/uffd/selfservice/views.py b/uffd/selfservice/views.py
index 3137aabbcb9d0d0e1c5993694d247b4ece7f0975..b194ceca1aeced8b1f637bdbd824d68a12293b67 100644
--- a/uffd/selfservice/views.py
+++ b/uffd/selfservice/views.py
@@ -22,7 +22,7 @@ def selfservice_acl_check():
 	return request.user and request.user.is_in_group(current_app.config['ACL_SELFSERVICE_GROUP'])
 
 @bp.route("/")
-@register_navbar(0, lazy_gettext('Selfservice'), icon='portrait', blueprint=bp, visible=selfservice_acl_check)
+@register_navbar(lazy_gettext('Selfservice'), icon='portrait', blueprint=bp, visible=selfservice_acl_check)
 @login_required(selfservice_acl_check)
 def index():
 	return render_template('selfservice/self.html', user=request.user)
diff --git a/uffd/services/views.py b/uffd/services/views.py
index c533cef34485171ce916de8a2ab4c2795ca17d43..3423eba466fd77843e093ff77fd1d09abb84930f 100644
--- a/uffd/services/views.py
+++ b/uffd/services/views.py
@@ -80,7 +80,7 @@ def services_visible():
 	return len(get_services(request.user)) > 0
 
 @bp.route("/")
-@register_navbar(9, lazy_gettext('Services'), icon='sitemap', blueprint=bp, visible=services_visible)
+@register_navbar(lazy_gettext('Services'), icon='sitemap', blueprint=bp, visible=services_visible)
 def index():
 	services = get_services(request.user)
 	if not current_app.config['SERVICES']:
diff --git a/uffd/user/views_group.py b/uffd/user/views_group.py
index 7bbe310b63dbb5c586f986c39986d0ffb95f8e28..5e1bdf0c3ca5e2bab1ac9a26bce692d29c3f6bb9 100644
--- a/uffd/user/views_group.py
+++ b/uffd/user/views_group.py
@@ -20,7 +20,7 @@ def group_acl():
 	pass
 
 @bp.route("/")
-@register_navbar(23, lazy_gettext('Groups'), icon='layer-group', blueprint=bp, visible=group_acl_check)
+@register_navbar(lazy_gettext('Groups'), icon='layer-group', blueprint=bp, visible=group_acl_check)
 def index():
 	return render_template('group/list.html', groups=Group.query.all())
 
diff --git a/uffd/user/views_user.py b/uffd/user/views_user.py
index 9baf94a1e1c9b1ea7675259391ee7f743d62441c..95f8643e625fa404156fafab9297737e28115587 100644
--- a/uffd/user/views_user.py
+++ b/uffd/user/views_user.py
@@ -27,7 +27,7 @@ def user_acl():
 	pass
 
 @bp.route("/")
-@register_navbar(21, lazy_gettext('Users'), icon='users', blueprint=bp, visible=user_acl_check)
+@register_navbar(lazy_gettext('Users'), icon='users', blueprint=bp, visible=user_acl_check)
 def index():
 	return render_template('user/list.html', users=User.query.all())