diff --git a/api/funkwhale_api/users/serializers.py b/api/funkwhale_api/users/serializers.py
index e8adf9edac8e436c8741dbbff9cbff500fd90064..b21aa69355b2ca4acea883b52e9401055382b6b3 100644
--- a/api/funkwhale_api/users/serializers.py
+++ b/api/funkwhale_api/users/serializers.py
@@ -29,7 +29,16 @@ class UserBasicSerializer(serializers.ModelSerializer):
         fields = ['id', 'username', 'name', 'date_joined']
 
 
-class UserSerializer(serializers.ModelSerializer):
+class UserWriteSerializer(serializers.ModelSerializer):
+    class Meta:
+        model = models.User
+        fields = [
+            'name',
+            'privacy_level'
+        ]
+
+
+class UserReadSerializer(serializers.ModelSerializer):
 
     permissions = serializers.SerializerMethodField()
 
@@ -44,6 +53,7 @@ class UserSerializer(serializers.ModelSerializer):
             'is_superuser',
             'permissions',
             'date_joined',
+            'privacy_level'
         ]
 
     def get_permissions(self, o):
diff --git a/api/funkwhale_api/users/views.py b/api/funkwhale_api/users/views.py
index b7c1df28f9dba34739756c7c4b666b8cdca88929..7c58363a3ed7fcbdccdd86138d2081a17b564631 100644
--- a/api/funkwhale_api/users/views.py
+++ b/api/funkwhale_api/users/views.py
@@ -1,4 +1,5 @@
 from rest_framework.response import Response
+from rest_framework import mixins
 from rest_framework import viewsets
 from rest_framework.decorators import list_route
 
@@ -23,12 +24,25 @@ class RegisterView(BaseRegisterView):
         return get_adapter().is_open_for_signup(request)
 
 
-class UserViewSet(viewsets.GenericViewSet):
+class UserViewSet(
+        mixins.UpdateModelMixin,
+        viewsets.GenericViewSet):
     queryset = models.User.objects.all()
-    serializer_class = serializers.UserSerializer
+    serializer_class = serializers.UserWriteSerializer
+    lookup_field = 'username'
 
     @list_route(methods=['get'])
     def me(self, request, *args, **kwargs):
         """Return information about the current user"""
-        serializer = self.serializer_class(request.user)
+        serializer = serializers.UserReadSerializer(request.user)
         return Response(serializer.data)
+
+    def update(self, request, *args, **kwargs):
+        if not self.request.user.username == kwargs.get('username'):
+            return Response(status=403)
+        return super().update(request, *args, **kwargs)
+
+    def partial_update(self, request, *args, **kwargs):
+        if not self.request.user.username == kwargs.get('username'):
+            return Response(status=403)
+        return super().partial_update(request, *args, **kwargs)
diff --git a/api/tests/requests/test_views.py b/api/tests/requests/test_views.py
index 6c34f9ad19fcc8ae7ec10ba6563cb44d45cb3461..3956fb405ca3414c0b58a0fb412863f49353430d 100644
--- a/api/tests/requests/test_views.py
+++ b/api/tests/requests/test_views.py
@@ -7,7 +7,8 @@ def test_request_viewset_requires_auth(db, api_client):
     assert response.status_code == 401
 
 
-def test_user_can_create_request(logged_in_api_client):
+@pytest.mark.parametrize('method', ['put', 'patch'])
+def test_user_can_create_request(method, logged_in_api_client):
     url = reverse('api:v1:requests:import-requests-list')
     user = logged_in_api_client.user
     data = {
diff --git a/api/tests/users/test_views.py b/api/tests/users/test_views.py
index 569acbd15ee5138150dd7de4112cd7ebd2d5523a..02b903bf41ea6bb9169987bd5ed1d147aff2122e 100644
--- a/api/tests/users/test_views.py
+++ b/api/tests/users/test_views.py
@@ -1,4 +1,5 @@
 import json
+import pytest
 
 from django.test import RequestFactory
 from django.urls import reverse
@@ -116,3 +117,37 @@ def test_changing_password_updates_secret_key(logged_in_client):
 
     assert user.secret_key != secret_key
     assert user.password != password
+
+
+def test_user_can_patch_his_own_settings(logged_in_api_client):
+    user = logged_in_api_client.user
+    payload = {
+        'privacy_level': 'me',
+    }
+    url = reverse(
+        'api:v1:users:users-detail',
+        kwargs={'username': user.username})
+
+    response = logged_in_api_client.patch(url, payload)
+
+    assert response.status_code == 200
+    user.refresh_from_db()
+
+    assert user.privacy_level == 'me'
+
+
+@pytest.mark.parametrize('method', ['put', 'patch'])
+def test_user_cannot_patch_another_user(
+        method, logged_in_api_client, factories):
+    user = factories['users.User']()
+    payload = {
+        'privacy_level': 'me',
+    }
+    url = reverse(
+        'api:v1:users:users-detail',
+        kwargs={'username': user.username})
+
+    handler = getattr(logged_in_api_client, method)
+    response = handler(url, payload)
+
+    assert response.status_code == 403