diff --git a/opentech/apply/users/management/commands/migrate_users.py b/opentech/apply/users/management/commands/migrate_users.py
index 934d67d4d7a88eac1e9f48a2238bda1f68f0b67d..3beff4ed26e69f68db1d4d1e3ea44fe1c6c654de 100644
--- a/opentech/apply/users/management/commands/migrate_users.py
+++ b/opentech/apply/users/management/commands/migrate_users.py
@@ -15,7 +15,7 @@ class Command(BaseCommand):
     groups = Group.objects.all()
 
     def add_arguments(self, parser):
-        parser.add_argument('source', nargs='?', type=argparse.FileType('r'), help='Migration source JSON file')
+        parser.add_argument('source', type=argparse.FileType('r'), help='Migration source JSON file')
 
     @transaction.atomic
     def handle(self, *args, **options):
@@ -37,18 +37,27 @@ class Command(BaseCommand):
 
                 operation = "Imported" if created else "Processed"
 
-                for group in self.get_user_groups(user):
-                    user_object.groups.add(group)
+                groups = self.get_user_groups(user)
+                user_object.groups.set(groups)
 
                 # Ensure uid is set
                 user_object.drupal_id = uid
                 user_object.save()
 
-                print(f"{operation} user {uid} ({full_name})")
+                self.stdout.write(f"{operation} user {uid} ({full_name})")
 
     def get_full_name(self, user):
         full_name = user.get('field_otf_real_name', None)
         try:
+            """
+            Drupal is i18n-ready out of the box. As such, the data
+            structure includes a language reference, defaulting to 'und' (undefined)
+            In addition to that, most fields are arrays indexed by language, and
+            the value delta. Different field types will have a different value.
+            Native entity fields are loaded directly (as string or int). They are
+            things like entity id, owner, created/updated timestamp.
+            And name/mail on users.
+            """
             full_name = full_name['und'][0]['safe_value']
         except (KeyError, TypeError):
             full_name = user.get('name')