diff --git a/openlobby/core/migrations/0010_user_name_collision_id.py b/openlobby/core/migrations/0010_user_has_colliding_name.py
similarity index 64%
rename from openlobby/core/migrations/0010_user_name_collision_id.py
rename to openlobby/core/migrations/0010_user_has_colliding_name.py
index 3295b6434b56aca0834b96f16b928735379fb4cc..5eae315ff2b9d87c1231b044675ca91c7611794d 100644
--- a/openlobby/core/migrations/0010_user_name_collision_id.py
+++ b/openlobby/core/migrations/0010_user_has_colliding_name.py
@@ -1,4 +1,4 @@
-# Generated by Django 2.0.2 on 2018-02-20 20:28
+# Generated by Django 2.0.2 on 2018-02-21 11:45
 
 from django.db import migrations, models
 
@@ -12,7 +12,7 @@ class Migration(migrations.Migration):
     operations = [
         migrations.AddField(
             model_name='user',
-            name='name_collision_id',
-            field=models.IntegerField(default=0),
+            name='has_colliding_name',
+            field=models.BooleanField(default=False),
         ),
     ]
diff --git a/openlobby/core/models.py b/openlobby/core/models.py
index 74d21119c62a8c66b1dac89f4707c6bd9b01d9c8..0860348fe2cff13be8430b3c0f71eef7ead27c8d 100644
--- a/openlobby/core/models.py
+++ b/openlobby/core/models.py
@@ -13,15 +13,16 @@ class User(AbstractUser):
     openid_uid = models.CharField(max_length=255, null=True)
     extra = JSONField(null=True, blank=True)
     is_author = models.BooleanField(default=False)
-    name_collision_id = models.IntegerField(default=0)
+    has_colliding_name = models.BooleanField(default=False)
 
     def save(self, *args, **kwargs):
         # deal with first name and last name collisions
-        collisions = User.objects.filter(first_name=self.first_name, last_name=self.last_name)\
-            .order_by('-name_collision_id')
-        if len(collisions) > 0 and self not in collisions:
-            self.name_collision_id = collisions[0].name_collision_id + 1
-        # TODO when we allow name change, it should also reset name_collision_id
+        if self.is_author:
+            collisions = User.objects.filter(first_name=self.first_name, last_name=self.last_name,
+                is_author=True).exclude(id=self.id)
+            if collisions.count() > 0:
+                self.has_colliding_name = True
+                collisions.update(has_colliding_name=True)
         super().save(*args, **kwargs)
 
 
@@ -66,4 +67,6 @@ class Report(models.Model):
 
     def save(self, *args, **kwargs):
         super().save(*args, **kwargs)
-        User.objects.filter(id=self.author.id).update(is_author=True)
+        if not self.author.is_author:
+            self.author.is_author = True
+            self.author.save()
diff --git a/tests/test_models.py b/tests/test_models.py
index 3048752736590939a8b95c4210d424544768e18b..8988d6e97eecc723e106613874458dcc3462e650 100644
--- a/tests/test_models.py
+++ b/tests/test_models.py
@@ -77,27 +77,34 @@ def test_login_attempt__default_expiration():
 
 
 def test_user__no_name_collision():
-    User.objects.create(username='a', first_name='Ryan', last_name='Gosling')
-    User.objects.create(username='b', first_name='Burt', last_name='Reynolds')
-    user = User.objects.create(username='c', first_name='Ryan', last_name='Reynolds')
-    assert user.name_collision_id == 0
+    User.objects.create(username='a', is_author=True, first_name='Ryan', last_name='Gosling')
+    User.objects.create(username='b', is_author=True, first_name='Ryan', last_name='Reynolds')
+    assert User.objects.get(username='a').has_colliding_name is False
+    assert User.objects.get(username='b').has_colliding_name is False
 
 
 def test_user__name_collision():
-    u1 = User.objects.create(username='a', first_name='Ryan', last_name='Gosling')
-    u2 = User.objects.create(username='b', first_name='Ryan', last_name='Gosling')
-    u3 = User.objects.create(username='c', first_name='Ryan', last_name='Gosling')
-    assert u1.name_collision_id == 0
-    assert u2.name_collision_id == 1
-    assert u3.name_collision_id == 2
-
-
-def test_user__name_collision_is_not_updated_for_existing_user():
-    u1 = User.objects.create(username='a', first_name='Ryan', last_name='Reynolds')
-    u2 = User.objects.create(username='b', first_name='Ryan', last_name='Reynolds')
-    assert u1.name_collision_id == 0
-    assert u2.name_collision_id == 1
-    u1.save()
-    u2.save()
-    assert u1.name_collision_id == 0
-    assert u2.name_collision_id == 1
+    User.objects.create(username='a', is_author=True, first_name='Ryan', last_name='Gosling')
+    User.objects.create(username='b', is_author=True, first_name='Ryan', last_name='Gosling')
+    assert User.objects.get(username='a').has_colliding_name is True
+    assert User.objects.get(username='b').has_colliding_name is True
+
+
+def test_user__name_collision_affects_only_authors():
+    User.objects.create(username='a', is_author=False, first_name='Ryan', last_name='Gosling')
+    User.objects.create(username='b', is_author=True, first_name='Ryan', last_name='Gosling')
+    User.objects.create(username='c', is_author=False, first_name='Ryan', last_name='Gosling')
+    assert User.objects.get(username='a').has_colliding_name is False
+    assert User.objects.get(username='b').has_colliding_name is False
+    assert User.objects.get(username='c').has_colliding_name is False
+    User.objects.create(username='d', is_author=True, first_name='Ryan', last_name='Gosling')
+    assert User.objects.get(username='a').has_colliding_name is False
+    assert User.objects.get(username='b').has_colliding_name is True
+    assert User.objects.get(username='c').has_colliding_name is False
+    assert User.objects.get(username='d').has_colliding_name is True
+
+
+def test_user__name_collision_excludes_self_on_update():
+    u = User.objects.create(username='a', is_author=True, first_name='Ryan', last_name='Gosling')
+    u.save()
+    assert User.objects.get(username='a').has_colliding_name is False