diff --git a/Documentation/rest-api-changes.txt b/Documentation/rest-api-changes.txt
index 2f144c6..d092ca3 100644
--- a/Documentation/rest-api-changes.txt
+++ b/Documentation/rest-api-changes.txt
@@ -7278,7 +7278,7 @@
 |`real_author`         |optional|
 Real author of the message as an
 link:rest-api-accounts.html#account-info[AccountInfo] entity. +
-Set if the message was posted on behalf of another user.
+Only set if the message was posted on behalf of another user.
 |`date`            ||
 The link:rest-api.html#timestamp[timestamp] this message was posted.
 |`message`            ||
diff --git a/java/com/google/gerrit/server/ChangeMessagesUtil.java b/java/com/google/gerrit/server/ChangeMessagesUtil.java
index 81cff6e..c84c0e7 100644
--- a/java/com/google/gerrit/server/ChangeMessagesUtil.java
+++ b/java/com/google/gerrit/server/ChangeMessagesUtil.java
@@ -150,7 +150,7 @@
     cmi.tag = message.getTag();
     cmi._revisionNumber = patchNum != null ? patchNum.get() : null;
     Account.Id realAuthor = message.getRealAuthor();
-    if (realAuthor != null) {
+    if (realAuthor != null && !realAuthor.equals(message.getAuthor())) {
       cmi.realAuthor = accountLoader.get(realAuthor);
     }
     cmi.accountsInMessage =
diff --git a/javatests/com/google/gerrit/acceptance/rest/account/ImpersonationIT.java b/javatests/com/google/gerrit/acceptance/rest/account/ImpersonationIT.java
index 3531d1c..56b58a4 100644
--- a/javatests/com/google/gerrit/acceptance/rest/account/ImpersonationIT.java
+++ b/javatests/com/google/gerrit/acceptance/rest/account/ImpersonationIT.java
@@ -70,6 +70,7 @@
 import com.google.gerrit.extensions.restapi.AuthException;
 import com.google.gerrit.extensions.restapi.BadRequestException;
 import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.RestApiException;
 import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
 import com.google.gerrit.server.ChangeMessagesUtil;
 import com.google.gerrit.server.CommentsUtil;
@@ -143,11 +144,7 @@
       assertThat(psa.value()).isEqualTo(1);
       assertThat(psa.realAccountId()).isEqualTo(realUser.id());
 
-      ChangeData cd = r.getChange();
-      ChangeMessage m = Iterables.getLast(cmUtil.byChange(cd.notes()));
-      assertThat(m.getMessage()).endsWith(in.message);
-      assertThat(m.getAuthor()).isEqualTo(impersonatedUser.id());
-      assertThat(m.getRealAuthor()).isEqualTo(realUser.id());
+      assertLastChangeMessage(r.getChange(), in.message, impersonatedUser, realUser);
 
       // The change meta commit is created by the server and has the impersonated user as the
       // author.
@@ -187,11 +184,7 @@
     assertThat(psa.value()).isEqualTo(1);
     assertThat(psa.realAccountId()).isEqualTo(realUser.id());
 
-    ChangeData cd = r.getChange();
-    ChangeMessage m = Iterables.getLast(cmUtil.byChange(cd.notes()));
-    assertThat(m.getMessage()).endsWith(in.message);
-    assertThat(m.getAuthor()).isEqualTo(impersonatedUser.id());
-    assertThat(m.getRealAuthor()).isEqualTo(realUser.id());
+    assertLastChangeMessage(r.getChange(), in.message, impersonatedUser, realUser);
 
     // realUser2 votes Code-Review+1 on behalf of impersonatedUser, this should override the
     // impersonated Code-Review+1 of realUser with an impersonated Code-Review+1 of realUser2
@@ -208,11 +201,7 @@
     assertThat(psa.value()).isEqualTo(1);
     assertThat(psa.realAccountId()).isEqualTo(realUser2.id());
 
-    cd = r.getChange();
-    m = Iterables.getLast(cmUtil.byChange(cd.notes()));
-    assertThat(m.getMessage()).endsWith(in.message);
-    assertThat(m.getAuthor()).isEqualTo(impersonatedUser.id());
-    assertThat(m.getRealAuthor()).isEqualTo(realUser2.id());
+    assertLastChangeMessage(r.getChange(), in.message, impersonatedUser, realUser2);
   }
 
   @Test
@@ -237,11 +226,7 @@
     assertThat(psa.value()).isEqualTo(1);
     assertThat(psa.realAccountId()).isEqualTo(realUser.id());
 
-    ChangeData cd = r.getChange();
-    ChangeMessage m = Iterables.getLast(cmUtil.byChange(cd.notes()));
-    assertThat(m.getMessage()).endsWith(in.message);
-    assertThat(m.getAuthor()).isEqualTo(impersonatedUser.id());
-    assertThat(m.getRealAuthor()).isEqualTo(realUser.id());
+    assertLastChangeMessage(r.getChange(), in.message, impersonatedUser, realUser);
 
     // realUser2 votes Code-Review-1 on behalf of impersonatedUser, this should override the
     // impersonated Code-Review+1 of realUser with an impersonated Code-Review-1 of realUser2
@@ -258,11 +243,7 @@
     assertThat(psa.value()).isEqualTo(-1);
     assertThat(psa.realAccountId()).isEqualTo(realUser2.id());
 
-    cd = r.getChange();
-    m = Iterables.getLast(cmUtil.byChange(cd.notes()));
-    assertThat(m.getMessage()).endsWith(in.message);
-    assertThat(m.getAuthor()).isEqualTo(impersonatedUser.id());
-    assertThat(m.getRealAuthor()).isEqualTo(realUser2.id());
+    assertLastChangeMessage(r.getChange(), in.message, impersonatedUser, realUser2);
   }
 
   @Test
@@ -286,11 +267,7 @@
     assertThat(psa.value()).isEqualTo(1);
     assertThat(psa.realAccountId()).isEqualTo(realUser.id());
 
-    ChangeData cd = r.getChange();
-    ChangeMessage m = Iterables.getLast(cmUtil.byChange(cd.notes()));
-    assertThat(m.getMessage()).endsWith(in.message);
-    assertThat(m.getAuthor()).isEqualTo(impersonatedUser.id());
-    assertThat(m.getRealAuthor()).isEqualTo(realUser.id());
+    assertLastChangeMessage(r.getChange(), in.message, impersonatedUser, realUser);
 
     // impersonatedUser votes Code-Review+1 themselves, this should override the impersonated
     // Code-Review+1 with a non-impersonated Code-Review+1
@@ -306,11 +283,7 @@
     assertThat(psa.value()).isEqualTo(1);
     assertThat(psa.realAccountId()).isEqualTo(impersonatedUser.id());
 
-    cd = r.getChange();
-    m = Iterables.getLast(cmUtil.byChange(cd.notes()));
-    assertThat(m.getMessage()).endsWith(in.message);
-    assertThat(m.getAuthor()).isEqualTo(impersonatedUser.id());
-    assertThat(m.getRealAuthor()).isEqualTo(impersonatedUser.id());
+    assertLastChangeMessage(r.getChange(), in.message, impersonatedUser, impersonatedUser);
   }
 
   @Test
@@ -334,11 +307,7 @@
     assertThat(psa.value()).isEqualTo(1);
     assertThat(psa.realAccountId()).isEqualTo(realUser.id());
 
-    ChangeData cd = r.getChange();
-    ChangeMessage m = Iterables.getLast(cmUtil.byChange(cd.notes()));
-    assertThat(m.getMessage()).endsWith(in.message);
-    assertThat(m.getAuthor()).isEqualTo(impersonatedUser.id());
-    assertThat(m.getRealAuthor()).isEqualTo(realUser.id());
+    assertLastChangeMessage(r.getChange(), in.message, impersonatedUser, realUser);
 
     // impersonatedUser votes Code-Review-1 themselves, this should override the impersonated
     // Code-Review+1 with a non-impersonated Code-Review-1
@@ -354,11 +323,7 @@
     assertThat(psa.value()).isEqualTo(-1);
     assertThat(psa.realAccountId()).isEqualTo(impersonatedUser.id());
 
-    cd = r.getChange();
-    m = Iterables.getLast(cmUtil.byChange(cd.notes()));
-    assertThat(m.getMessage()).endsWith(in.message);
-    assertThat(m.getAuthor()).isEqualTo(impersonatedUser.id());
-    assertThat(m.getRealAuthor()).isEqualTo(impersonatedUser.id());
+    assertLastChangeMessage(r.getChange(), in.message, impersonatedUser, impersonatedUser);
   }
 
   @Test
@@ -879,11 +844,7 @@
     assertThat(psa.value()).isEqualTo(1);
     assertThat(psa.realAccountId()).isEqualTo(admin.id()); // not user2
 
-    ChangeData cd = r.getChange();
-    ChangeMessage m = Iterables.getLast(cmUtil.byChange(cd.notes()));
-    assertThat(m.getMessage()).endsWith(in.message);
-    assertThat(m.getAuthor()).isEqualTo(user.id());
-    assertThat(m.getRealAuthor()).isEqualTo(admin.id()); // not user2
+    assertLastChangeMessage(r.getChange(), in.message, user, admin);
   }
 
   @Test
@@ -902,10 +863,30 @@
     ChangeInfo info = gApi.changes().id(r.getChangeId()).get(MESSAGES);
     assertThat(info.messages).hasSize(2);
 
-    ChangeMessageInfo changeMessageInfo = Iterables.getLast(info.messages);
-    assertThat(changeMessageInfo.realAuthor).isNotNull();
-    assertThat(changeMessageInfo.realAuthor._accountId)
-        .isEqualTo(accountCreator.user2().id().get());
+    assertLastChangeMessage(r.getChange(), in.message, user, accountCreator.user2());
+  }
+
+  private void assertLastChangeMessage(
+      ChangeData changeData,
+      String expectedMessage,
+      TestAccount expectedAuthor,
+      TestAccount expectedRealAuthor)
+      throws RestApiException {
+    ChangeMessage m = Iterables.getLast(cmUtil.byChange(changeData.notes()));
+    assertThat(m.getMessage()).endsWith(expectedMessage);
+    assertThat(m.getAuthor()).isEqualTo(expectedAuthor.id());
+    assertThat(m.getRealAuthor()).isEqualTo(expectedRealAuthor.id());
+
+    ChangeMessageInfo lastChangeMessageInfo =
+        Iterables.getLast(gApi.changes().id(changeData.getId().get()).get().messages);
+    assertThat(lastChangeMessageInfo.message).endsWith(expectedMessage);
+    assertThat(lastChangeMessageInfo.author._accountId).isEqualTo(expectedAuthor.id().get());
+    if (expectedAuthor.id().equals(expectedRealAuthor.id())) {
+      assertThat(lastChangeMessageInfo.realAuthor).isNull();
+    } else {
+      assertThat(lastChangeMessageInfo.realAuthor._accountId)
+          .isEqualTo(expectedRealAuthor.id().get());
+    }
   }
 
   private void allowCodeReviewOnBehalfOf() throws Exception {
