diff --git a/docs/introduction.md b/docs/introduction.md
index ea2ef026826103559ed8ee904f71ccd2bc15ba12..87fdc273ac287d71cae6bd86009e2159aefbcaa6 100644
--- a/docs/introduction.md
+++ b/docs/introduction.md
@@ -178,7 +178,7 @@ experiments or other entities.
 each `pid` a shorter `handle` is created. Handles can be registered with a handle system,
 e.g. the central nomad installation at MPCDF is registered at a MPCDF/GWDW handle system.
 - The `calc_hash` is computed from the main and other parsed raw files.
-- Entry data comprises *user metadata* (comments, references, datasets, coauthors),
+- Entry data comprises *user metadata* (comments, references, datasets, coauthors, etc.),
 *calculation metadata* (code, version, system and symmetry, used DFT method, etc.),
 the *archive data* (a hierarchy of all parsed quantities), and the uploaded *raw files*.
 
diff --git a/gui/src/components/entry/EditUserMetadataDialog.js b/gui/src/components/entry/EditUserMetadataDialog.js
index 9ef244beeaa7e6d990c8dcf89053515279f787e8..f43938fcd0e1618e1421e5a14169b7d6cffbb507 100644
--- a/gui/src/components/entry/EditUserMetadataDialog.js
+++ b/gui/src/components/entry/EditUserMetadataDialog.js
@@ -776,7 +776,7 @@ class EditUserMetadataDialogUnstyled extends React.Component {
     this.editData = {
       comment: '',
       references: [],
-      coauthors: [],
+      entry_coauthors: [],
       shared_with: [],
       datasets: []
     }
@@ -808,7 +808,7 @@ class EditUserMetadataDialogUnstyled extends React.Component {
     this.editData = {
       comment: example.comment || '',
       references: example.references || [],
-      coauthors: (example.authors || [])
+      entry_coauthors: (example.authors || [])
         .filter(user => user.user_id !== example.uploader.user_id)
         .map(user => user.user_id),
       shared_with: (example.owners || [])
@@ -1052,10 +1052,10 @@ class EditUserMetadataDialogUnstyled extends React.Component {
                   label="References"
                 />
               </UserMetadataField>
-              <UserMetadataField {...metadataFieldProps('coauthors', true)}>
+              <UserMetadataField {...metadataFieldProps('entry_coauthors', true)}>
                 <ListTextInput
                   component={UserInput}
-                  {...listTextInputProps('coauthors', true)}
+                  {...listTextInputProps('entry_coauthors', true)}
                   label="Co-author"
                 />
               </UserMetadataField>
diff --git a/gui/src/components/uploads/UploadPage.js b/gui/src/components/uploads/UploadPage.js
index e159345683fc2f98be39cdaf4297082843f7e96c..bc8525cbe8a2a84bfc4aa8b9844c4ed1c85ce05f 100644
--- a/gui/src/components/uploads/UploadPage.js
+++ b/gui/src/components/uploads/UploadPage.js
@@ -123,7 +123,7 @@ const useUploadNameStyles = makeStyles(theme => ({
   }
 }))
 
-function UploadName({name, onChange}) {
+function UploadName({upload_name, onChange}) {
   const [edit, setEdit] = useState(false)
   const [value, setValue] = useState(null)
   const classes = useUploadNameStyles()
@@ -143,15 +143,15 @@ function UploadName({name, onChange}) {
   }
 
   return <WithButton size="small"
-    icon={<EditIcon style={{fontSize: 24}} />} onClick={() => { setEdit(true); setValue(name) }}
+    icon={<EditIcon style={{fontSize: 24}} />} onClick={() => { setEdit(true); setValue(upload_name) }}
   >
     <Typography variant="h6">
-      {name || <i>unnamed upload</i>}
+      {upload_name || <i>unnamed upload</i>}
     </Typography>
   </WithButton>
 }
 UploadName.propTypes = {
-  name: PropTypes.string,
+  upload_name: PropTypes.string,
   onChange: PropTypes.func
 }
 
@@ -352,8 +352,8 @@ function UploadPage() {
       })
   }
 
-  const handleNameChange = (name) => {
-    api.put(`/uploads/${uploadId}/metadata?upload_name=${name}`)
+  const handleNameChange = (upload_name) => {
+    api.put(`/uploads/${uploadId}/metadata?upload_name=${upload_name}`)
       .then(results => setUpload(results.data))
       .catch(errors.raiseError)
   }
@@ -409,7 +409,11 @@ function UploadPage() {
         <UploadStatus upload={upload} fontSize="large" />
       </Grid>
       <Grid item style={{flexGrow: 1}}>
+<<<<<<< HEAD
         <UploadName name={upload?.upload_name} onChange={handleNameChange} />
+=======
+        <UploadName upload_name={upload?.upload_name} onChange={handleNameChange} />
+>>>>>>> Renamed coauthors -> entry_coauthors
         <WithButton clipboard={uploadId}>
           <Typography>upload id: {uploadId}</Typography>
         </WithButton>
diff --git a/nomad/app/v1/routers/entries.py b/nomad/app/v1/routers/entries.py
index 8e9d07ee6af9510ed74ca58619517c4cf4bd157c..7647a503752fdaedc9456422b17b9a0d6444a339 100644
--- a/nomad/app/v1/routers/entries.py
+++ b/nomad/app/v1/routers/entries.py
@@ -1144,7 +1144,10 @@ def edit(query: Query, user: User, mongo_update: Dict[str, Any] = None, re_index
 
 
 def get_quantity_values(quantity, **kwargs):
-    ''' Get all the uploader from the query, to check coauthers and shared_with for uploaders. '''
+    '''
+    Performs the search defined by `kwargs`, aggregated by quantity, and returns the encountered
+    values of this quantity.
+    '''
     response = perform_search(
         **kwargs,
         aggregations=dict(agg=Aggregation(terms=TermsAggregation(quantity=quantity))),
diff --git a/nomad/cli/client/integrationtests.py b/nomad/cli/client/integrationtests.py
index a50a08a6a8752f986b6fb82316844efae688b589..a8a2b49e0cc7e18d4125efb956589a72501fad75 100644
--- a/nomad/cli/client/integrationtests.py
+++ b/nomad/cli/client/integrationtests.py
@@ -176,7 +176,7 @@ def integrationtests(auth: api.Auth, skip_parsers: bool, skip_publish: bool, ski
         actions = {
             'comment': {'value': 'Test comment'},
             'references': [{'value': 'http;//test_reference.com'}],
-            'coauthors': [{'value': user['user_id']}],
+            'entry_coauthors': [{'value': user['user_id']}],
             'shared_with': [{'value': user['user_id']}],
             'datasets': [{'value': dataset}]}
 
diff --git a/nomad/datamodel/datamodel.py b/nomad/datamodel/datamodel.py
index 133adc519d206aa7bf315f3f689455b44901e887..d087683175a2ff32d92192eab96fc64b54f3aefd 100644
--- a/nomad/datamodel/datamodel.py
+++ b/nomad/datamodel/datamodel.py
@@ -325,7 +325,7 @@ def derive_authors(entry: 'EntryMetadata') -> List[User]:
     uploaders: List[User] = []
     if entry.uploader is not None and entry.external_db is None:
         uploaders = [entry.uploader]
-    return uploaders + entry.coauthors
+    return uploaders + entry.entry_coauthors
 
 
 class UploadMetadata(metainfo.MSection):
@@ -370,8 +370,9 @@ class EntryMetadata(metainfo.MSection):
         comment: An arbitrary string with user provided information about the entry.
         references: A list of URLs for resources that are related to the entry.
         uploader: Id of the uploader of this entry.
-        coauthors: Ids of all co-authors (excl. the uploader) of this entry. Co-authors are
-            shown as authors of this entry alongside its uploader.
+        entry_coauthors: Ids of all co-authors (excl. the uploader) specified on the entry level,
+            rather than on the upload level. They are shown as authors of this entry alongside
+            its uploader.
         shared_with: Ids of all users that this entry is shared with. These users can find,
             see, and download all data for this entry, even if it is in staging or
             has an embargo.
@@ -407,25 +408,27 @@ class EntryMetadata(metainfo.MSection):
     files = metainfo.Quantity(
         type=str, shape=['0..*'],
         description='''
-        The paths to the files within the upload that belong to this entry.
-        All files within the same directory as the entry's mainfile are considered the
-        auxiliary files that belong to the entry.
+            The paths to the files within the upload that belong to this entry.
+            All files within the same directory as the entry's mainfile are considered the
+            auxiliary files that belong to the entry.
         ''',
         a_elasticsearch=PathSearch())
 
     pid = metainfo.Quantity(
         type=str,
         description='''
-        The unique, sequentially enumerated, integer PID that was used in the legacy
-        NOMAD CoE. It allows to resolve URLs of the old NOMAD CoE Repository.''',
+            The unique, sequentially enumerated, integer PID that was used in the legacy
+            NOMAD CoE. It allows to resolve URLs of the old NOMAD CoE Repository.
+        ''',
         categories=[MongoEntryMetadata],
         a_elasticsearch=Elasticsearch(entry_type))
 
     raw_id = metainfo.Quantity(
         type=str,
         description='''
-        The code specific identifier extracted from the entry's raw files by the parser,
-        if supported.''',
+            The code specific identifier extracted from the entry's raw files by the parser,
+            if supported.
+        ''',
         categories=[UserProvidableMetadata],
         a_elasticsearch=Elasticsearch(entry_type))
 
@@ -502,9 +505,12 @@ class EntryMetadata(metainfo.MSection):
         derived=derive_origin,
         a_elasticsearch=Elasticsearch(material_entry_type))
 
-    coauthors = metainfo.Quantity(
+    entry_coauthors = metainfo.Quantity(
         type=author_reference, shape=['0..*'], default=[], categories=[MongoEntryMetadata, EditableUserMetadata],
-        description='A user provided list of co-authors')
+        description='''
+            A user provided list of co-authors specific for this entry. Note that normally,
+            coauthors should be set on the upload level.
+        ''')
 
     authors = metainfo.Quantity(
         type=author_reference, shape=['0..*'],
@@ -568,8 +574,9 @@ class EntryMetadata(metainfo.MSection):
     external_id = metainfo.Quantity(
         type=str, categories=[MongoEntryMetadata, UserProvidableMetadata],
         description='''
-        A user provided external id. Usually the id for an entry in an external database
-        where the data was imported from.''',
+            A user provided external id. Usually the id for an entry in an external database
+            where the data was imported from.
+        ''',
         a_elasticsearch=Elasticsearch())
 
     last_edit_time = metainfo.Quantity(
@@ -592,10 +599,6 @@ class EntryMetadata(metainfo.MSection):
 
     encyclopedia = metainfo.SubSection(sub_section=EncyclopediaMetadata, categories=[FastAccess])
 
-    def apply_user_metadata(self, metadata: dict):
-        ''' Applies a user provided metadata dict to this calc. '''
-        self.m_update(**metadata)
-
     def apply_archvie_metadata(self, archive):
         quantities = set()
         n_quantities = 0
@@ -625,6 +628,7 @@ class EntryMetadata(metainfo.MSection):
             n_quantities += 1
 
         self.quantities = list(quantities)
+        self.quantities.sort()
         self.n_quantities = n_quantities
 
 
diff --git a/nomad/metainfo/elasticsearch_extension.py b/nomad/metainfo/elasticsearch_extension.py
index 817b19001e0ea2b85fbffe165bdc58c2b13ced68..0ba3cdfc82ec1ad9b0be60c1c7796864d28abc79 100644
--- a/nomad/metainfo/elasticsearch_extension.py
+++ b/nomad/metainfo/elasticsearch_extension.py
@@ -277,7 +277,7 @@ class DocumentType():
                 if is_section_reference:
                     # Treat referenced sections as sub-sections
                     assert quantity_def.type.target_section_def is not None
-                    # TODO e.g. owners, coauthors, etc. ... should be treated as multiple inner docs
+                    # TODO e.g. owners, entry_coauthors, etc. ... should be treated as multiple inner docs
                     # assert quantity_def.is_scalar
 
                     if prefix is None:
diff --git a/nomad/processing/data.py b/nomad/processing/data.py
index 6dcbd49350c7b0349121c56c2576a73db1807b56..56378933e458cb88f40755e863b86cdd31e53660 100644
--- a/nomad/processing/data.py
+++ b/nomad/processing/data.py
@@ -161,7 +161,8 @@ class Calc(Proc):
         nomad_commit: the NOMAD commit used for the last processing
         comment: a user provided comment for this entry
         references: user provided references (URLs) for this entry
-        coauthors: a user provided list of co-authors
+        entry_coauthors: a user provided list of co-authors specific for this entry. Note
+            that normally, coauthors should be set on the upload level.
         datasets: a list of user curated datasets this entry belongs to
     '''
     upload_id = StringField()
@@ -179,7 +180,7 @@ class Calc(Proc):
     nomad_commit = StringField()
     comment = StringField()
     references = ListField(StringField(), default=None)
-    coauthors = ListField(StringField(), default=None)
+    entry_coauthors = ListField(StringField(), default=None)
     shared_with = ListField(StringField(), default=None)
     datasets = ListField(StringField(), default=None)
 
@@ -1784,7 +1785,7 @@ class Upload(Proc):
                     'Mismatching upload_id in entry definition')
                 assert entry_dict['_id'] == generate_entry_id(self.upload_id, entry_dict['mainfile']), (
                     'Provided entry id does not match generated value')
-                check_user_ids(entry_dict.get('coauthors', []), 'Invalid coauthor reference: {id}')
+                check_user_ids(entry_dict.get('entry_coauthors', []), 'Invalid entry_coauthor reference: {id}')
                 check_user_ids(entry_dict.get('shared_with', []), 'Invalid shared_with reference: {id}')
 
                 # Instantiate an entry object from the json, and validate it
diff --git a/tests/app/flask/test_dcat.py b/tests/app/flask/test_dcat.py
index 651153035fe66e5217ca820539bae49c73d463cf..708578a48388a5c070acf6e3f532bf6c9e9994a5 100644
--- a/tests/app/flask/test_dcat.py
+++ b/tests/app/flask/test_dcat.py
@@ -52,7 +52,7 @@ def data(test_user, other_test_user, elastic_infra):
         upload_create_time=datetime.now(),
         last_processing_time=datetime.now(),
         uploader=test_user,
-        coauthors=[other_test_user],
+        entry_coauthors=[other_test_user],
         comment='this is a calculation comment',
         published=True)
 
diff --git a/tests/app/v1/routers/test_entries_edit.py b/tests/app/v1/routers/test_entries_edit.py
index 37b921c67cebac7d77ee886f1ff0e7f393aa7b9d..1530fbfe06b3d5e0a05bd4a9c20f55e01cbf72b9 100644
--- a/tests/app/v1/routers/test_entries_edit.py
+++ b/tests/app/v1/routers/test_entries_edit.py
@@ -143,7 +143,7 @@ class TestEditRepo():
         edit_data = dict(
             comment='test_edit_props',
             references=['http://test', 'http://test2'],
-            coauthors=[other_test_user.user_id],
+            entry_coauthors=[other_test_user.user_id],
             shared_with=[other_test_user.user_id])
         rv = self.perform_edit(**edit_data, query=self.query('upload_1'))
         result = rv.json()
@@ -159,7 +159,7 @@ class TestEditRepo():
 
         assert self.mongo(1, comment='test_edit_props')
         assert self.mongo(1, references=['http://test', 'http://test2'])
-        assert self.mongo(1, coauthors=[other_test_user.user_id])
+        assert self.mongo(1, entry_coauthors=[other_test_user.user_id])
         assert self.mongo(1, shared_with=[other_test_user.user_id])
 
         self.assert_elastic(1, comment='test_edit_props')
@@ -170,7 +170,7 @@ class TestEditRepo():
         edit_data = dict(
             comment='',
             references=[],
-            coauthors=[],
+            entry_coauthors=[],
             shared_with=[])
         rv = self.perform_edit(**edit_data, query=self.query('upload_1'))
         result = rv.json()
@@ -186,7 +186,7 @@ class TestEditRepo():
 
         assert self.mongo(1, comment=None)
         assert self.mongo(1, references=[])
-        assert self.mongo(1, coauthors=[])
+        assert self.mongo(1, entry_coauthors=[])
         assert self.mongo(1, shared_with=[])
 
         self.assert_elastic(1, comment=None)
@@ -225,19 +225,19 @@ class TestEditRepo():
         assert not self.mongo(1, comment='test_edit_verify', edited=False)
 
     def test_edit_empty_list(self, other_test_user):
-        rv = self.perform_edit(coauthors=[other_test_user.user_id], query=self.query('upload_1'))
-        self.assert_edit(rv, quantity='coauthors', success=True, message=False)
-        rv = self.perform_edit(coauthors=[], query=self.query('upload_1'))
-        self.assert_edit(rv, quantity='coauthors', success=True, message=False)
-        assert self.mongo(1, coauthors=[])
+        rv = self.perform_edit(entry_coauthors=[other_test_user.user_id], query=self.query('upload_1'))
+        self.assert_edit(rv, quantity='entry_coauthors', success=True, message=False)
+        rv = self.perform_edit(entry_coauthors=[], query=self.query('upload_1'))
+        self.assert_edit(rv, quantity='entry_coauthors', success=True, message=False)
+        assert self.mongo(1, entry_coauthors=[])
 
     def test_edit_duplicate_value(self, other_test_user):
-        rv = self.perform_edit(coauthors=[other_test_user.user_id, other_test_user.user_id], query=self.query('upload_1'))
-        self.assert_edit(rv, status_code=400, quantity='coauthors', success=False, message=True)
+        rv = self.perform_edit(entry_coauthors=[other_test_user.user_id, other_test_user.user_id], query=self.query('upload_1'))
+        self.assert_edit(rv, status_code=400, quantity='entry_coauthors', success=False, message=True)
 
     def test_edit_uploader_as_coauthor(self, test_user):
-        rv = self.perform_edit(coauthors=[test_user.user_id], query=self.query('upload_1'))
-        self.assert_edit(rv, status_code=400, quantity='coauthors', success=False, message=True)
+        rv = self.perform_edit(entry_coauthors=[test_user.user_id], query=self.query('upload_1'))
+        self.assert_edit(rv, status_code=400, quantity='entry_coauthors', success=False, message=True)
 
     def test_edit_ds(self):
         rv = self.perform_edit(
@@ -291,12 +291,12 @@ class TestEditRepo():
         assert self.mongo(1, datasets=[new_dataset.dataset_id])
 
     def test_edit_bad_user(self):
-        rv = self.perform_edit(coauthors=['bad_user'], query=self.query('upload_1'))
-        self.assert_edit(rv, status_code=400, quantity='coauthors', success=False, message=True)
+        rv = self.perform_edit(entry_coauthors=['bad_user'], query=self.query('upload_1'))
+        self.assert_edit(rv, status_code=400, quantity='entry_coauthors', success=False, message=True)
 
     def test_edit_user(self, other_test_user):
-        rv = self.perform_edit(coauthors=[other_test_user.user_id], query=self.query('upload_1'))
-        self.assert_edit(rv, quantity='coauthors', success=True, message=False)
+        rv = self.perform_edit(entry_coauthors=[other_test_user.user_id], query=self.query('upload_1'))
+        self.assert_edit(rv, quantity='entry_coauthors', success=True, message=False)
 
     @pytest.mark.skip(reason='Not necessary during transition. Fails because uploader is not editable anyways.')
     def test_admin_only(self, other_test_user):
diff --git a/tests/conftest.py b/tests/conftest.py
index 130486745030319c9381173ba8736f8a7b39abed..77f07eba4d800b6247be769d3bf0d7f04bd71356 100644
--- a/tests/conftest.py
+++ b/tests/conftest.py
@@ -551,7 +551,7 @@ def example_user_metadata(other_test_user, test_user) -> dict:
     return {
         'comment': 'test comment',
         'references': ['http://external.ref/one', 'http://external.ref/two'],
-        'coauthors': [other_test_user.user_id],
+        'entry_coauthors': [other_test_user.user_id],
         '_pid': '256',
         'external_id': 'external_test_id'
     }
diff --git a/tests/data/proc/examples_qcms.zip b/tests/data/proc/examples_qcms.zip
index 5a88d74773afea140718f93a7516c73ae56a039e..3095e968e9187318599c6a0a7bf489a62f142580 100644
Binary files a/tests/data/proc/examples_qcms.zip and b/tests/data/proc/examples_qcms.zip differ
diff --git a/tests/processing/test_data.py b/tests/processing/test_data.py
index a754ad3802387f0e4d1a3553bca8e681919efc9d..3c58f8290800662a80230b7e11fbfd093c458e60 100644
--- a/tests/processing/test_data.py
+++ b/tests/processing/test_data.py
@@ -614,7 +614,7 @@ def test_read_metadata_from_file(proc_infra, test_user, other_test_user, tmp):
     with zipfile.ZipFile(upload_file, 'w') as zf:
         calc_1 = dict(
             comment='Calculation 1 of 3',
-            coauthors=other_test_user.user_id,
+            entry_coauthors=other_test_user.user_id,
             references=['http://test'],
             external_id='external_id_1')
         with zf.open('examples/calc_1/nomad.yaml', 'w') as f: f.write(yaml.dump(calc_1).encode())
@@ -646,20 +646,20 @@ def test_read_metadata_from_file(proc_infra, test_user, other_test_user, tmp):
     comment = ['Calculation 1 of 3', 'Calculation 2 of 3', 'Calculation 3 of 3', None]
     external_ids = ['external_id_1', 'external_id_2', 'external_id_3', None]
     references = [['http://test'], ['http://ttest'], ['http://ttest'], None]
-    coauthors = [[other_test_user], [], [], []]
+    expected_entry_coauthors = [[other_test_user], [], [], []]
 
     for i in range(len(calcs)):
         entry_metadata = calcs[i].full_entry_metadata(upload)
         assert entry_metadata.comment == comment[i]
         assert entry_metadata.references == references[i]
         assert entry_metadata.external_id == external_ids[i]
-        entry_coauthors = [a.m_proxy_resolve() for a in entry_metadata.coauthors]
+        entry_coauthors = [a.m_proxy_resolve() for a in entry_metadata.entry_coauthors]
         for j in range(len(entry_coauthors)):
-            assert entry_coauthors[j].user_id == coauthors[i][j].user_id
-            assert entry_coauthors[j].username == coauthors[i][j].username
-            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
+            assert entry_coauthors[j].user_id == expected_entry_coauthors[i][j].user_id
+            assert entry_coauthors[j].username == expected_entry_coauthors[i][j].username
+            assert entry_coauthors[j].email == expected_entry_coauthors[i][j].email
+            assert entry_coauthors[j].first_name == expected_entry_coauthors[i][j].first_name
+            assert entry_coauthors[j].last_name == expected_entry_coauthors[i][j].last_name
 
 
 @pytest.mark.parametrize('user, metadata_to_set, should_succeed', [
diff --git a/tests/test_datamodel.py b/tests/test_datamodel.py
index b3303d7b5811c5686ad9d4fe80ac69acb5de381a..bfb7094027861c06e7bd8cb8480d917365440d52 100644
--- a/tests/test_datamodel.py
+++ b/tests/test_datamodel.py
@@ -83,7 +83,7 @@ def generate_calc(pid: int = 0, calc_id: str = None, upload_id: str = None, with
 
     entry.with_embargo = with_embargo if with_embargo is not None else random.choice([True, False])
     entry.published = True
-    entry.coauthors = list(_gen_user() for _ in range(0, random.choice(low_numbers_for_refs_and_datasets)))
+    entry.entry_coauthors = list(_gen_user() for _ in range(0, random.choice(low_numbers_for_refs_and_datasets)))
     entry.shared_with = list(_gen_user() for _ in range(0, random.choice(low_numbers_for_refs_and_datasets)))
     entry.comment = random.choice(comments)
     entry.references = list(_gen_ref() for _ in range(0, random.choice(low_numbers_for_refs_and_datasets)))
diff --git a/tests/test_search.py b/tests/test_search.py
index 67c1cf41ccc6586f26f01b27ab6a9679aac0d3e9..4c0921752ccb4672f3795195838af5bd4190d84d 100644
--- a/tests/test_search.py
+++ b/tests/test_search.py
@@ -70,7 +70,7 @@ def assert_search_upload(
                 assert key in hit, f'{key} is missing'
                 assert hit[key] != config.services.unavailable_value
 
-            for coauthor in hit.get('coauthors', []):
+            for coauthor in hit.get('entry_coauthors', []):
                 assert coauthor.get('name', None) is not None