diff --git a/app/static/js/Requests/users/settings.js b/app/static/js/Requests/users/settings.js
new file mode 100644
index 0000000000000000000000000000000000000000..0a92a09cc5091d16756ba3fb6751df068e431dc6
--- /dev/null
+++ b/app/static/js/Requests/users/settings.js
@@ -0,0 +1,16 @@
+/*****************************************************************************
+* Settings                                                                   *
+* Fetch requests for /users/<entity>/settings routes                         *
+*****************************************************************************/
+Requests.users.entity.settings = {};
+
+Requests.users.entity.settings.profilePrivacy = {};
+
+Requests.users.entity.settings.profilePrivacy.update = (userId, profilePrivacySetting, enabled) => {
+  let input = `/users/${userId}/settings/profile-privacy/${profilePrivacySetting}`;
+  let init = {
+    method: 'PUT',
+    body: JSON.stringify(enabled)
+  };
+  return Requests.JSONfetch(input, init);
+}
diff --git a/app/static/js/Requests/users/users.js b/app/static/js/Requests/users/users.js
index 9ed77cb0e12a45b6641d1bad0bb2a888feee56ef..053fd687089fd118720d1c65667205e0ffdd0e4c 100644
--- a/app/static/js/Requests/users/users.js
+++ b/app/static/js/Requests/users/users.js
@@ -14,25 +14,12 @@ Requests.users.entity.delete = (userId) => {
   return Requests.JSONfetch(input, init);
 };
 
-Requests.users.entity.settings = {};
+Requests.users.entity.avatar = {};
 
-Requests.users.entity.settings.avatar = {};
-
-Requests.users.entity.settings.avatar.delete = (userId) => {
-  let input = `/users/${userId}/settings/avatar`;
+Requests.users.entity.avatar.delete = (userId) => {
+  let input = `/users/${userId}/avatar`;
   let init = {
     method: 'DELETE'
   };
   return Requests.JSONfetch(input, init);
 }
-
-Requests.users.entity.settings.profilePrivacy = {};
-
-Requests.users.entity.settings.profilePrivacy.update = (userId, profilePrivacySetting, enabled) => {
-  let input = `/users/${userId}/settings/profile-privacy/${profilePrivacySetting}`;
-  let init = {
-    method: 'PUT',
-    body: JSON.stringify(enabled)
-  };
-  return Requests.JSONfetch(input, init);
-}
diff --git a/app/templates/_scripts.html.j2 b/app/templates/_scripts.html.j2
index dbc2647070f73336342d23c0b75b771335c0673d..9dd8193317edb5115ca3d9b065203f83c4779d0c 100644
--- a/app/templates/_scripts.html.j2
+++ b/app/templates/_scripts.html.j2
@@ -66,7 +66,8 @@
   'js/Requests/corpora/files.js',
   'js/Requests/corpora/followers.js',
   'js/Requests/jobs/jobs.js',
-  'js/Requests/users/users.js'
+  'js/Requests/users/users.js',
+  'js/Requests/users/settings.js'
 %}
 <script src="{{ ASSET_URL }}"></script>
 {%- endassets %}
diff --git a/app/templates/users/settings/settings.html.j2 b/app/templates/users/settings/settings.html.j2
index 91b2864d729694b91efcf48b3d6aded2f4c83d58..f862840dfe3f311dcfbe22c9895393f1624753cd 100644
--- a/app/templates/users/settings/settings.html.j2
+++ b/app/templates/users/settings/settings.html.j2
@@ -213,7 +213,7 @@ avatarUploadElement.addEventListener('change', () => {
 });
 
 document.querySelector('#delete-avatar').addEventListener('click', () => {
-  Requests.users.entity.settings.avatar.delete({{ user.hashid|tojson }})
+  Requests.users.entity.avatar.delete({{ user.hashid|tojson }})
     .then(
       (response) => {
         avatarPreviewElement.src = {{ url_for('static', filename='images/user_avatar.png')|tojson }};
diff --git a/app/users/__init__.py b/app/users/__init__.py
index 11a38f257c3b73bf376373726cdadf1c1a84f5d8..a1ed4f2e70f800ff516712358e3ce55356b857f5 100644
--- a/app/users/__init__.py
+++ b/app/users/__init__.py
@@ -2,5 +2,5 @@ from flask import Blueprint
 
 
 bp = Blueprint('users', __name__)
-from . import events, routes
+from . import events, json_routes, routes
 from . import settings
diff --git a/app/users/json_routes.py b/app/users/json_routes.py
index d228f8f3c2207f4ac1fef9cc41cfc8a9afde5065..571fa78c1c033c0b21e0909bb535cc0c27919fcb 100644
--- a/app/users/json_routes.py
+++ b/app/users/json_routes.py
@@ -3,7 +3,7 @@ from flask_login import current_user, login_required, logout_user
 from threading import Thread
 from app import db
 from app.decorators import content_negotiation
-from app.models import User
+from app.models import Avatar, User
 from . import bp
 
 
@@ -22,7 +22,7 @@ def delete_user(user_id):
         abort(403)
     thread = Thread(
         target=_delete_user,
-        args=(current_app._get_current_object(), user_id)
+        args=(current_app._get_current_object(), user.id)
     )
     if user == current_user:
         logout_user()
@@ -31,3 +31,28 @@ def delete_user(user_id):
         'message': f'User "{user.username}" marked for deletion'
     }
     return response_data, 202
+
+
+@bp.route('/<hashid:user_id>/avatar', methods=['DELETE'])
+@content_negotiation(produces='application/json')
+def delete_user_avatar(user_id):
+    def _delete_avatar(app, avatar_id):
+        with app.app_context():
+            avatar = Avatar.query.get(avatar_id)
+            avatar.delete()
+            db.session.commit()
+
+    user = User.query.get_or_404(user_id)
+    if user.avatar is None:
+        abort(404)
+    if not (user == current_user or current_user.is_administrator()):
+        abort(403)
+    thread = Thread(
+        target=_delete_avatar,
+        args=(current_app._get_current_object(), user.avatar.id)
+    )
+    thread.start()
+    response_data = {
+        'message': f'Avatar marked for deletion'
+    }
+    return response_data, 202
diff --git a/app/users/settings/json_routes.py b/app/users/settings/json_routes.py
index 7fdfa7fc1a4daf7fcaf93d12f088bb75524c47b7..1d0c4d9e9cfbd098370a14658cf908869f80b5b5 100644
--- a/app/users/settings/json_routes.py
+++ b/app/users/settings/json_routes.py
@@ -1,38 +1,11 @@
-from flask import abort, current_app, request
+from flask import abort, request
 from flask_login import current_user, login_required
-from threading import Thread
-import os
 from app import db
 from app.decorators import content_negotiation
-from app.models import Avatar, User, ProfilePrivacySettings
+from app.models import User, ProfilePrivacySettings
 from . import bp
 
 
-@bp.route('/<hashid:user_id>/settings/avatar', methods=['DELETE'])
-@content_negotiation(produces='application/json')
-def delete_user_avatar(user_id):
-    def _delete_avatar(app, avatar_id):
-        with app.app_context():
-            avatar = Avatar.query.get(avatar_id)
-            avatar.delete()
-            db.session.commit()
-
-    user = User.query.get_or_404(user_id)
-    if user.avatar is None:
-        abort(404)
-    if not (user == current_user or current_user.is_administrator()):
-        abort(403)
-    thread = Thread(
-        target=_delete_avatar,
-        args=(current_app._get_current_object(), user.avatar.id)
-    )
-    thread.start()
-    response_data = {
-        'message': f'Avatar marked for deletion'
-    }
-    return response_data, 202
-
-
 @bp.route('/<hashid:user_id>/settings/profile-privacy/is-public', methods=['PUT'])
 @login_required
 @content_negotiation(consumes='application/json', produces='application/json')