diff --git a/changelog.d/888.bugfix b/changelog.d/888.bugfix
new file mode 100644
index 0000000000000000000000000000000000000000..dbb1c3b33cd31cbb5adda0132d869b60e4dfc5a7
--- /dev/null
+++ b/changelog.d/888.bugfix
@@ -0,0 +1 @@
+Prefer server-level display names when available.
diff --git a/src/bot.ts b/src/bot.ts
index 0ca0b768ab28c73af095abc216b5da394d786c9e..67993ca85d9375deac3c8a41a0524efcffcca11d 100644
--- a/src/bot.ts
+++ b/src/bot.ts
@@ -1027,7 +1027,7 @@ export class DiscordBot {
         }
 
         // Update presence because sometimes discord misses people.
-        await this.userSync.OnUpdateUser(msg.author, Boolean(msg.webhookID));
+        await this.userSync.OnUpdateUser(msg.author, Boolean(msg.webhookID), msg);
         let rooms: string[];
         try {
             rooms = await this.channelSync.GetRoomIdsFromChannel(msg.channel);
diff --git a/src/usersyncroniser.ts b/src/usersyncroniser.ts
index 51805200672eb67f4ea4d424896b10dde89f7036..1cdcf82e49fef45b9586f91629b653f2c7b524bb 100644
--- a/src/usersyncroniser.ts
+++ b/src/usersyncroniser.ts
@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
 limitations under the License.
 */
 
-import { User, GuildMember } from "better-discord.js";
+import { User, GuildMember, Message } from "better-discord.js";
 import { DiscordBot } from "./bot";
 import { Util } from "./util";
 import { DiscordBridgeConfig } from "./config";
@@ -96,8 +96,8 @@ export class UserSyncroniser {
      * @returns {Promise<void>}
      * @constructor
      */
-    public async OnUpdateUser(discordUser: User, isWebhook: boolean = false) {
-        const userState = await this.GetUserUpdateState(discordUser, isWebhook);
+    public async OnUpdateUser(discordUser: User, isWebhook: boolean = false, msg?: Message) {
+        const userState = await this.GetUserUpdateState(discordUser, isWebhook, msg);
         try {
             await this.ApplyStateToProfile(userState);
         } catch (e) {
@@ -230,7 +230,7 @@ export class UserSyncroniser {
         }
     }
 
-    public async GetUserUpdateState(discordUser: User, isWebhook: boolean = false): Promise<IUserState> {
+    public async GetUserUpdateState(discordUser: User, isWebhook: boolean = false, msg?: Message): Promise<IUserState> {
         log.verbose(`State update requested for ${discordUser.id}`);
         let mxidExtra = "";
         if (isWebhook) {
@@ -244,7 +244,7 @@ export class UserSyncroniser {
             id: discordUser.id + mxidExtra,
             mxUserId: `@_discord_${discordUser.id}${mxidExtra}:${this.config.bridge.domain}`,
         });
-        const displayName = Util.ApplyPatternString(this.config.ghosts.usernamePattern, {
+        const displayName = msg?.member?.nickname || Util.ApplyPatternString(this.config.ghosts.usernamePattern, {
             id: discordUser.id,
             tag: discordUser.discriminator,
             username: discordUser.username,