diff --git a/uffd/__init__.py b/uffd/__init__.py
index bef39eba8c45091e02a8ed8a29651ba0264938aa..30280972254264079a66fbbbca645776340bfb0b 100644
--- a/uffd/__init__.py
+++ b/uffd/__init__.py
@@ -40,10 +40,10 @@ def create_app(test_config=None):
 
 	db.init_app(app)
 	# pylint: disable=C0415
-	from uffd import user, group, selfservice, session, csrf, ldap
+	from uffd import user, selfservice, session, csrf, ldap
 	# pylint: enable=C0415
 
-	for i in user.bp + group.bp + selfservice.bp + session.bp + csrf.bp + ldap.bp:
+	for i in user.bp + selfservice.bp + session.bp + csrf.bp + ldap.bp:
 		app.register_blueprint(i)
 
 	@app.route("/")
diff --git a/uffd/default_config.cfg b/uffd/default_config.cfg
index c1c227a984324040e43915bb959b6c10e20f2ef5..d616cc5fe22da5b23e1bf8fac9eef9695ee792c1 100644
--- a/uffd/default_config.cfg
+++ b/uffd/default_config.cfg
@@ -8,3 +8,4 @@ LDAP_USER_GID=20001
 LDAP_USER_MIN_UID=10000
 LDAP_USER_MAX_UID=18999
 SESSION_LIFETIME_SECONDS=3600
+ACL_LDAP_GROUP_USEREDIT="admins"
diff --git a/uffd/group/__init__.py b/uffd/group/__init__.py
deleted file mode 100644
index 1cb45d0ffb61bed50f81e37e30cb7e5dc8cc1ba9..0000000000000000000000000000000000000000
--- a/uffd/group/__init__.py
+++ /dev/null
@@ -1,3 +0,0 @@
-from .views import bp as ui_bp
-
-bp = [ui_bp]
diff --git a/uffd/group/models.py b/uffd/group/models.py
deleted file mode 100644
index 5006c097a3878e47c8fac2fcef188824f404048a..0000000000000000000000000000000000000000
--- a/uffd/group/models.py
+++ /dev/null
@@ -1,47 +0,0 @@
-from uffd import ldap
-
-class Group():
-	gid = None
-	name = None
-	description = None
-
-	def __init__(self, gid=None, name='', members=None, description=''):
-		self.gid = gid
-		self.name = name
-		if isinstance(members, str):
-			members = [members]
-		self.members_ldap = members
-		self._members = None
-		self.description = description
-
-	@classmethod
-	def from_ldap(cls, ldapobject):
-		return Group(
-				gid=ldapobject['gidNumber'].value,
-				name=ldapobject['cn'].value,
-				members=ldapobject['uniqueMember'],
-				description=ldapobject['description'].value if 'description' in ldapobject else '',
-			)
-
-	@classmethod
-	def from_ldap_dn(cls, dn):
-		conn = ldap.get_conn()
-		conn.search(dn, '(objectClass=groupOfUniqueNames)')
-		if not len(conn.entries) == 1:
-			return None
-		return Group.from_ldap(conn.entries[0])
-
-	def to_ldap(self, new):
-		pass
-
-	def get_members(self):
-		from uffd.user.models import User
-		if self._members:
-			return self._members
-		members = []
-		for i in self.members_ldap:
-			newmember = User.from_ldap_dn(i)
-			if newmember:
-				members.append(newmember)
-		self._members = members
-		return members
diff --git a/uffd/group/views.py b/uffd/group/views.py
deleted file mode 100644
index d14e2ad33b41f41f8494b4dfdd43a0caffc17e89..0000000000000000000000000000000000000000
--- a/uffd/group/views.py
+++ /dev/null
@@ -1,32 +0,0 @@
-from flask import Blueprint, current_app, render_template
-
-from uffd.navbar import register_navbar
-from uffd.ldap import get_conn, escape_filter_chars
-from uffd.session import login_required, is_valid_session
-
-from .models import Group
-
-bp = Blueprint("group", __name__, template_folder='templates', url_prefix='/group/')
-
-@bp.before_request
-@login_required()
-def group_acl():
-	pass
-
-@bp.route("/")
-@register_navbar('Groups', icon='layer-group', blueprint=bp, visible=is_valid_session)
-def group_list():
-	conn = get_conn()
-	conn.search(current_app.config["LDAP_BASE_GROUPS"], '(objectclass=groupOfUniqueNames)')
-	groups = []
-	for i in conn.entries:
-		groups.append(Group.from_ldap(i))
-	return render_template('group_list.html', groups=groups)
-
-@bp.route("/<int:gid>")
-def group_show(gid):
-	conn = get_conn()
-	conn.search(current_app.config["LDAP_BASE_GROUPS"], '(&(objectclass=groupOfUniqueNames)(gidNumber={}))'.format((escape_filter_chars(gid))))
-	assert len(conn.entries) == 1
-	group = Group.from_ldap(conn.entries[0])
-	return render_template('group.html', group=group)
diff --git a/uffd/selfservice/views.py b/uffd/selfservice/views.py
index 360779854ff54e5b6e0bfc731fbe610a9fb61f37..21b01a20aaddb5b24aeacaa029d80972e7211a43 100644
--- a/uffd/selfservice/views.py
+++ b/uffd/selfservice/views.py
@@ -3,8 +3,7 @@ from flask import Blueprint, render_template, request, url_for, redirect, flash,
 from uffd.navbar import register_navbar
 from uffd.csrf import csrf_protect
 
-from uffd.user.models import User
-from uffd.group.models import Group
+from uffd.user.models import User, Group
 from uffd.session import get_current_user, login_required, is_valid_session
 from uffd.ldap import get_conn, escape_filter_chars
 
diff --git a/uffd/user/__init__.py b/uffd/user/__init__.py
index 1cb45d0ffb61bed50f81e37e30cb7e5dc8cc1ba9..fc51d02b877849cd9e815f853c917d5001ab451e 100644
--- a/uffd/user/__init__.py
+++ b/uffd/user/__init__.py
@@ -1,3 +1,3 @@
-from .views import bp as ui_bp
+from .views import bp_user, bp_group
 
-bp = [ui_bp]
+bp = [bp_user, bp_group]
diff --git a/uffd/user/models.py b/uffd/user/models.py
index 4a711b1319cd7b761b74efc33c9dd247435df921..2c8792aec698f84f3691c0e06c3106019303cbde 100644
--- a/uffd/user/models.py
+++ b/uffd/user/models.py
@@ -71,7 +71,6 @@ class User():
 		return result
 
 	def get_groups(self):
-		from uffd.group.models import Group
 		if self._groups:
 			return self._groups
 		groups = []
@@ -108,3 +107,48 @@ class User():
 
 	def set_password(self, value):
 		self.newpassword = value
+
+class Group():
+	gid = None
+	name = None
+	description = None
+
+	def __init__(self, gid=None, name='', members=None, description=''):
+		self.gid = gid
+		self.name = name
+		if isinstance(members, str):
+			members = [members]
+		self.members_ldap = members
+		self._members = None
+		self.description = description
+
+	@classmethod
+	def from_ldap(cls, ldapobject):
+		return Group(
+				gid=ldapobject['gidNumber'].value,
+				name=ldapobject['cn'].value,
+				members=ldapobject['uniqueMember'],
+				description=ldapobject['description'].value if 'description' in ldapobject else '',
+			)
+
+	@classmethod
+	def from_ldap_dn(cls, dn):
+		conn = ldap.get_conn()
+		conn.search(dn, '(objectClass=groupOfUniqueNames)')
+		if not len(conn.entries) == 1:
+			return None
+		return Group.from_ldap(conn.entries[0])
+
+	def to_ldap(self, new):
+		pass
+
+	def get_members(self):
+		if self._members:
+			return self._members
+		members = []
+		for i in self.members_ldap:
+			newmember = User.from_ldap_dn(i)
+			if newmember:
+				members.append(newmember)
+		self._members = members
+		return members
diff --git a/uffd/group/templates/group.html b/uffd/user/templates/group.html
similarity index 100%
rename from uffd/group/templates/group.html
rename to uffd/user/templates/group.html
diff --git a/uffd/group/templates/group_list.html b/uffd/user/templates/group_list.html
similarity index 100%
rename from uffd/group/templates/group_list.html
rename to uffd/user/templates/group_list.html
diff --git a/uffd/user/views.py b/uffd/user/views.py
index b2217d814398e1e8524ac1d21b3dbebf228e7f93..c24ab9facaab06a45e7a079ac6bd13bc363d3d77 100644
--- a/uffd/user/views.py
+++ b/uffd/user/views.py
@@ -5,17 +5,17 @@ from uffd.csrf import csrf_protect
 from uffd.ldap import get_conn, escape_filter_chars
 from uffd.session import login_required, is_valid_session
 
-from .models import User
+from .models import User, Group
 
-bp = Blueprint("user", __name__, template_folder='templates', url_prefix='/user/')
-
-@bp.before_request
-@login_required(group='admins')
+bp_user = Blueprint("user", __name__, template_folder='templates', url_prefix='/user/')
+@bp_user.before_request
+#@login_required(group=current_app.config('ACL_LDAP_GROUP_USEREDIT'))
+@login_required()
 def user_acl():
 	pass
 
-@bp.route("/")
-@register_navbar('Users', icon='users', blueprint=bp, visible=is_valid_session)
+@bp_user.route("/")
+@register_navbar('Users', icon='users', blueprint=bp_user, visible=is_valid_session)
 def user_list():
 	conn = get_conn()
 	conn.search(current_app.config["LDAP_BASE_USER"], '(objectclass=person)')
@@ -24,8 +24,8 @@ def user_list():
 		users.append(User.from_ldap(i))
 	return render_template('user_list.html', users=users)
 
-@bp.route("/<int:uid>")
-@bp.route("/new")
+@bp_user.route("/<int:uid>")
+@bp_user.route("/new")
 def user_show(uid=None):
 	if not uid:
 		user = User()
@@ -38,8 +38,8 @@ def user_show(uid=None):
 		ldif = conn.entries[0].entry_to_ldif()
 	return render_template('user.html', user=user, user_ldif=ldif)
 
-@bp.route("/<int:uid>/update", methods=['POST'])
-@bp.route("/new", methods=['POST'])
+@bp_user.route("/<int:uid>/update", methods=['POST'])
+@bp_user.route("/new", methods=['POST'])
 def user_update(uid=False):
 	conn = get_conn()
 	if uid:
@@ -65,7 +65,7 @@ def user_update(uid=False):
 		flash('Error updating user: {}'.format(conn.result['message']))
 	return redirect(url_for('.user_list'))
 
-@bp.route("/<int:uid>/del")
+@bp_user.route("/<int:uid>/del")
 @csrf_protect
 def user_delete(uid):
 	conn = get_conn()
@@ -76,3 +76,27 @@ def user_delete(uid):
 	else:
 		flash('Could not delete user: {}'.format(conn.result['message']))
 	return redirect(url_for('.user_list'))
+
+bp_group = Blueprint("group", __name__, template_folder='templates', url_prefix='/group/')
+@bp_group.before_request
+@login_required()
+def group_acl():
+	pass
+
+@bp_group.route("/")
+@register_navbar('Groups', icon='layer-group', blueprint=bp_group, visible=is_valid_session)
+def group_list():
+	conn = get_conn()
+	conn.search(current_app.config["LDAP_BASE_GROUPS"], '(objectclass=groupOfUniqueNames)')
+	groups = []
+	for i in conn.entries:
+		groups.append(Group.from_ldap(i))
+	return render_template('group_list.html', groups=groups)
+
+@bp_group.route("/<int:gid>")
+def group_show(gid):
+	conn = get_conn()
+	conn.search(current_app.config["LDAP_BASE_GROUPS"], '(&(objectclass=groupOfUniqueNames)(gidNumber={}))'.format((escape_filter_chars(gid))))
+	assert len(conn.entries) == 1
+	group = Group.from_ldap(conn.entries[0])
+	return render_template('group.html', group=group)