diff --git a/web/app/admin/forms.py b/web/app/admin/forms.py
index fd41d01646e4904b556e610ea54dcb1dc4e03c16..90a9f6409899262f677fdae45b89d63b1381f78c 100644
--- a/web/app/admin/forms.py
+++ b/web/app/admin/forms.py
@@ -1,3 +1,4 @@
+from flask import current_app
 from flask_wtf import FlaskForm
 from wtforms import (BooleanField, SelectField, StringField, SubmitField,
                      ValidationError)
@@ -6,31 +7,38 @@ from ..models import Role, User
 
 
 class EditUserForm(FlaskForm):
-    email = StringField('Email',
-                        validators=[DataRequired(), Length(1, 64), Email()])
-    username = StringField('Username',
-                           validators=[DataRequired(), Length(1, 64),
-                                       Regexp('^[A-Za-z][A-Za-z0-9_.]*$', 0,
-                                              'Usernames must have only '
-                                              'letters, numbers, dots or '
-                                              'underscores')])
+    email = StringField('Email', validators=[DataRequired(), Email()])
+    username = StringField(
+        'Username',
+        validators=[DataRequired(),
+                    Length(1, 64),
+                    Regexp(current_app.config['ALLOWED_USERNAME_REGEX'],
+                           message='Usernames must have only letters, numbers,'
+                                   ' dots or underscores')]
+    )
     confirmed = BooleanField('Confirmed')
-    role = SelectField('Role', coerce=int)
-    name = StringField('Real name', validators=[Length(0, 64)])
+    role = SelectField(
+        'Role',
+        choices = [(role.id, role.name)
+                   for role in Role.query.order_by(Role.name).all()],
+        coerce=int
+    )
     submit = SubmitField('Update Profile')
 
     def __init__(self, user, *args, **kwargs):
-        super(EditUserForm, self).__init__(*args, **kwargs)
-        self.role.choices = [(role.id, role.name)
-                             for role in Role.query.order_by(Role.name).all()]
+        super().__init__(*args, **kwargs)
         self.user = user
+        self.email.data = self.email.data or user.email
+        self.username.data = self.username.data or user.username
+        self.confirmed.data = self.confirmed.data or user.confirmed
+        self.role.data = self.role.data or user.role_id
 
     def validate_email(self, field):
-        if field.data != self.user.email and \
-                User.query.filter_by(email=field.data).first():
+        if (field.data != self.user.email
+                and User.query.filter_by(email=field.data).first()):
             raise ValidationError('Email already registered.')
 
     def validate_username(self, field):
-        if field.data != self.user.username and \
-                User.query.filter_by(username=field.data).first():
+        if (field.data != self.user.username
+                and User.query.filter_by(username=field.data).first()):
             raise ValidationError('Username already in use.')
diff --git a/web/app/admin/views.py b/web/app/admin/views.py
index 3046a63ccae9a776b47a9fe17f71c2f308f2b6f9..03083879f85599f64ef7dc1caa8d62c5f2545695 100644
--- a/web/app/admin/views.py
+++ b/web/app/admin/views.py
@@ -5,7 +5,7 @@ from .forms import EditUserForm
 from .. import db
 from ..decorators import admin_required
 from ..models import Role, User
-from ..profile import tasks as profile_tasks
+from ..settings import tasks as settings_tasks
 
 
 @admin.route('/users')
@@ -34,7 +34,7 @@ def user(user_id):
 @login_required
 @admin_required
 def delete_user(user_id):
-    profile_tasks.delete_user(user_id)
+    settings_tasks.delete_user(user_id)
     flash('User has been deleted!')
     return redirect(url_for('admin.index'))
 
@@ -54,10 +54,6 @@ def edit_user(user_id):
         db.session.commit()
         flash('The profile has been updated.')
         return redirect(url_for('admin.edit_user', user_id=user.id))
-    edit_user_form.email.data = user.email
-    edit_user_form.username.data = user.username
-    edit_user_form.confirmed.data = user.confirmed
-    edit_user_form.role.data = user.role_id
     return render_template('admin/edit_user.html.j2',
                            edit_user_form=edit_user_form,
                            title='Edit user',
diff --git a/web/app/settings/tasks.py b/web/app/settings/tasks.py
new file mode 100644
index 0000000000000000000000000000000000000000..61f737c564770c608860b136c79d8639dbe4defc
--- /dev/null
+++ b/web/app/settings/tasks.py
@@ -0,0 +1,13 @@
+from .. import db
+from ..decorators import background
+from ..models import User
+
+
+@background
+def delete_user(user_id, *args, **kwargs):
+    with kwargs['app'].app_context():
+        user = User.query.get(user_id)
+        if user is None:
+            raise Exception('User {} not found'.format(user_id))
+        user.delete()
+        db.session.commit()
diff --git a/web/app/settings/views.py b/web/app/settings/views.py
index a90d8ab22293ce6798caf6904fd6fff9ff037a78..4eecaa64b97dbc437b4110e4b1cfd0c76035a57e 100644
--- a/web/app/settings/views.py
+++ b/web/app/settings/views.py
@@ -1,6 +1,6 @@
 from flask import current_app, flash, redirect, render_template, url_for
 from flask_login import current_user, login_required
-from . import settings
+from . import settings, tasks
 from .forms import (ChangePasswordForm, EditGeneralSettingsForm,
                     EditNotificationSettingsForm)
 from .. import db