diff --git a/nomad/processing/data.py b/nomad/processing/data.py
index bf46e6b6091b3e59e50afd0ced643e2509bc186f..8d10a9f8b8d3ba14da1a6d6bddbee7267e00b98e 100644
--- a/nomad/processing/data.py
+++ b/nomad/processing/data.py
@@ -586,6 +586,10 @@ class Calc(Proc):
             if definition is None and self.upload.from_oasis:
                 definition = _oasis_metadata.get(key, None)
 
+            if key == 'uploader':
+                if datamodel.User.get(self.upload.user_id).is_admin:
+                    definition = datamodel.EntryMetadata.uploader
+
             if definition is None:
                 logger.warn('Users cannot set metadata', quantity=key)
                 continue
diff --git a/tests/conftest.py b/tests/conftest.py
index 16fecf41197891435dc6240532d48bc665663efc..288c741498f7c5d78d14237171e3dd125fdff2f8 100644
--- a/tests/conftest.py
+++ b/tests/conftest.py
@@ -297,6 +297,7 @@ def keycloak(monkeypatch):
 @pytest.fixture(scope='function')
 def proc_infra(worker, elastic, mongo, raw_files):
     ''' Combines all fixtures necessary for processing (elastic, worker, files, mongo) '''
+    processing.Upload.metadata_file_cached.cache_clear()
     return dict(elastic=elastic)
 
 
diff --git a/tests/data/proc/examples_with_adminmetadata.zip b/tests/data/proc/examples_with_adminmetadata.zip
new file mode 100644
index 0000000000000000000000000000000000000000..de6f4503aaa28cad845af6765aa66d4ffdeef977
Binary files /dev/null and b/tests/data/proc/examples_with_adminmetadata.zip differ
diff --git a/tests/processing/test_data.py b/tests/processing/test_data.py
index 1edf034a82ee4b8627d84bae75ae48751443e30d..eeb53fee31cd1d1349a549730bddf875d2b181b4 100644
--- a/tests/processing/test_data.py
+++ b/tests/processing/test_data.py
@@ -606,3 +606,25 @@ def test_read_metadata_from_file(proc_infra, test_user, other_test_user):
             assert entry_coauthors[j].email == coauthors[i][j].email
             assert entry_coauthors[j].first_name == coauthors[i][j].first_name
             assert entry_coauthors[j].last_name == coauthors[i][j].last_name
+
+
+@pytest.mark.parametrize('user,uploader', [
+    ('admin_user', 'other_test_user'),
+    ('test_user', 'test_user')
+])
+def test_read_adminmetadata_from_file(proc_infra, test_user, other_test_user, admin_user, user, uploader):
+    def user_from_name(user_name):
+        if user_name == 'test_user':
+            return test_user
+        if user_name == 'other_test_user':
+            return other_test_user
+        if user_name == 'admin_user':
+            return admin_user
+
+    user = user_from_name(user)
+    uploader = user_from_name(uploader)
+
+    upload = run_processing(
+        ('test_upload', 'tests/data/proc/examples_with_adminmetadata.zip'), user)
+    calc = Calc.objects(upload_id=upload.upload_id).first()
+    assert calc.metadata['uploader'] == uploader.user_id