diff --git a/invenio_utilities_tuw/cli/drafts.py b/invenio_utilities_tuw/cli/drafts.py
index fabf8b639c6727469a9f6efdc3bf6e075506c1de..f43661b3a7a42a42812b129e17bf08dbab93bc6d 100644
--- a/invenio_utilities_tuw/cli/drafts.py
+++ b/invenio_utilities_tuw/cli/drafts.py
@@ -25,7 +25,7 @@ from invenio_records_resources.services.errors import PermissionDeniedError
 from ..utils import get_identity_for_user, get_user_by_identifier
 from .options import (
     option_as_user,
-    option_owners,
+    option_owner,
     option_pid_type,
     option_pid_value,
     option_pretty_print,
@@ -37,7 +37,7 @@ from .utils import (
     create_record_from_metadata,
     patch_metadata,
     read_metadata,
-    set_record_owners,
+    set_record_owner,
 )
 
 
@@ -119,10 +119,10 @@ def list_drafts(user):
     default=False,
     help="publish the draft after creation (default: false)",
 )
-@option_owners
+@option_owner
 @option_vanity_pid
 @with_appcontext
-def create_draft(metadata_path, publish, user, owners, vanity_pid):
+def create_draft(metadata_path, publish, user, owner, vanity_pid):
     """Create a new record draft with the specified metadata.
 
     The specified metadata path can either point to a JSON file containing the metadata,
@@ -194,9 +194,9 @@ def create_draft(metadata_path, publish, user, owners, vanity_pid):
     else:
         raise TypeError(f"neither a file nor a directory: {metadata_path}")
 
-    if owners:
-        owners = [get_user_by_identifier(owner) for owner in owners]
-        set_record_owners(draft, owners)
+    if owner:
+        owner = get_user_by_identifier(owner)
+        set_record_owner(draft, owner)
         if service.indexer:
             service.indexer.index(draft)
 
@@ -242,9 +242,9 @@ def show_draft(pid, pid_type, user, pretty_print, raw):
         "(default: replace)"
     ),
 )
-@option_owners
+@option_owner
 @with_appcontext
-def update_draft(metadata_file, pid, pid_type, user, patch, owners):
+def update_draft(metadata_file, pid, pid_type, user, patch, owner):
     """Update the specified draft's metadata."""
     pid = convert_to_recid(pid, pid_type)
     identity = get_identity_for_user(user)
@@ -254,10 +254,10 @@ def update_draft(metadata_file, pid, pid_type, user, patch, owners):
         draft_data = service.read_draft(id_=pid, identity=identity).data.copy()
         metadata = patch_metadata(draft_data, metadata)
 
-    if owners:
+    if owner:
         draft = service.read_draft(id_=pid, identity=identity)._record
-        owners = [get_user_by_identifier(owner) for owner in owners]
-        set_record_owners(draft, owners)
+        owner = get_user_by_identifier(owner)
+        set_record_owner(draft, owner)
 
     service.update_draft(id_=pid, identity=identity, data=metadata)
     click.secho(pid, fg="green")
@@ -480,15 +480,7 @@ def list_stale_drafts(num_days):
     for draft in stale_drafts:
         recid = draft.pid.pid_value
         title = draft.metadata.get("title", "[UNNAMED]")
-
-        # InvenioRDM v11 still supports several record owners
         uploader = draft.parent.access.owned_by
-        if isinstance(uploader, list):
-            if uploader:
-                uploader = uploader[0]
-            else:
-                uploader = None
-
         uploader_email = uploader.resolve().email if uploader else "[N/A]"
         updated = draft.updated.date() if draft.updated else "[N/A]"
         stale_draft_infos.append(draft_info(recid, title, uploader_email, updated))
diff --git a/invenio_utilities_tuw/cli/options.py b/invenio_utilities_tuw/cli/options.py
index 8f8f5707b42f1c2cd8b9bfa0d3565c24c9df8418..1eec88903e7be79ae3038259dc8c5c8f5ed292c0 100644
--- a/invenio_utilities_tuw/cli/options.py
+++ b/invenio_utilities_tuw/cli/options.py
@@ -65,14 +65,14 @@ option_pid_values = click.option(
     ),
 )
 
-option_owners = click.option(
+option_owner = click.option(
     "--owner",
     "-o",
-    "owners",
+    "owner",
     metavar="OWNER",
     required=False,
-    multiple=True,
-    help="email address of the record owner to set (can be specified multiple times)",
+    multiple=False,
+    help="email address of the record owner to set",
 )
 
 option_vanity_pid = click.option(
diff --git a/invenio_utilities_tuw/cli/records.py b/invenio_utilities_tuw/cli/records.py
index f13a8a23feb935a882dec8ed49bfad42815c149d..69978b3a30722331a3f5ffbb8f89e16063be55db 100644
--- a/invenio_utilities_tuw/cli/records.py
+++ b/invenio_utilities_tuw/cli/records.py
@@ -20,14 +20,14 @@ from invenio_records_resources.services.errors import PermissionDeniedError
 from ..utils import get_identity_for_user, get_user_by_identifier
 from .options import (
     option_as_user,
-    option_owners,
+    option_owner,
     option_pid_type,
     option_pid_value,
     option_pid_values,
     option_pretty_print,
     option_raw,
 )
-from .utils import convert_to_recid, get_object_uuid, patch_metadata, set_record_owners
+from .utils import convert_to_recid, get_object_uuid, patch_metadata, set_record_owner
 
 
 @click.group()
@@ -109,9 +109,9 @@ def show_record(pid, pid_type, user, pretty_print, raw):
         "and update the record directly (not recommended)"
     ),
 )
-@option_owners
+@option_owner
 @with_appcontext
-def update_record(metadata_file, pid, pid_type, user, patch, owners, direct):
+def update_record(metadata_file, pid, pid_type, user, patch, owner, direct):
     """Update the specified draft's metadata."""
     pid = convert_to_recid(pid, pid_type)
     identity = get_identity_for_user(user)
@@ -145,10 +145,10 @@ def update_record(metadata_file, pid, pid_type, user, patch, owners, direct):
             click.secho("trying with service.update()...", fg="yellow", err=True)
             service.update(id_=pid, identity=identity, data=metadata)
 
-    if owners:
+    if owner:
         record = service.read(id_=pid, identity=identity)._record
-        owners = [get_user_by_identifier(owner) for owner in owners]
-        set_record_owners(record, owners)
+        owner = get_user_by_identifier(owner)
+        set_record_owner(record, owner)
         if service.indexer:
             service.indexer.index(record)
 
diff --git a/invenio_utilities_tuw/cli/utils.py b/invenio_utilities_tuw/cli/utils.py
index 59c4fb04e1d6fe6b9a7d4da9cd86be80fe052b08..9ef6dd272ab819df6a27e1f8a9de3594a3001067 100644
--- a/invenio_utilities_tuw/cli/utils.py
+++ b/invenio_utilities_tuw/cli/utils.py
@@ -9,7 +9,6 @@
 """Utilities for the CLI commands."""
 
 import json
-from collections.abc import Iterable
 
 from invenio_db import db
 from invenio_pidstore.errors import PIDAlreadyExists
@@ -99,14 +98,11 @@ def convert_to_recid(pid_value, pid_type):
     return pid_value
 
 
-def set_record_owners(record, owners, commit=True):
-    """Set the record's owners, assuming an RDMRecord-like record object."""
+def set_record_owner(record, owner, commit=True):
+    """Set the record's owner, assuming an RDMRecord-like record object."""
     parent = record.parent
 
-    parent.access.owners.clear()
-    for owner in owners:
-        parent.access.owners.add(owner)
-
+    parent.access.owned_by = owner
     if commit:
         parent.commit()
         db.session.commit()
@@ -128,12 +124,5 @@ def bytes_to_human(size):
 
 def is_owned_by(user, record):
     """Check if the record is owned by the given user."""
-    owners = record.parent.access.owned_by
-
-    # note: InvenioRDM v12 changed record ownership to a single entity rather
-    #       than a list of entities, but we're still on v11 so we make it
-    #       compatible with both variants
-    if not isinstance(owners, Iterable):
-        owners = [owners]
-
-    return any([o and o.owner_id == user.id for o in owners])
+    owner = record.parent.access.owned_by
+    return owner and owner.owner_id == user.id