diff --git a/base-config.yaml b/base-config.yaml
index 1697c6009c9e383100f6bbe020e5926002e12c95..e9af71a4f35976f4e4bd8e76542689f10518fa44 100644
--- a/base-config.yaml
+++ b/base-config.yaml
@@ -10,6 +10,9 @@ pass: secret
 # The list of user IDs who are allowed to use commands
 whitelist:
 - '@user:example.com'
+# Map Matrix users to RT users
+usermap:
+  user: rt-userid
 # List of ticket properties to show
 filter_properties:
 - 'Queue'
diff --git a/maubot.yaml b/maubot.yaml
index 700068db7759d3d16c2fff2989c84d4fea17590a..1f023cf89bebe203b2d23642c2019b0373e1487a 100644
--- a/maubot.yaml
+++ b/maubot.yaml
@@ -5,7 +5,7 @@ maubot: 0.1.0
 id: ch.ethz.phys.rt
 
 # A PEP 440 compliant version string.
-version: 0.3.1
+version: 0.3.2
 
 # The SPDX license identifier for the plugin. https://spdx.org/licenses/
 # Optional, assumes all rights reserved if omitted.
diff --git a/rt.py b/rt.py
index 4dcc616ca690f50aaa4eac5f690ea7413cb2e639..4ca64f989aedbb6ae0f032d963388c4de3581444 100755
--- a/rt.py
+++ b/rt.py
@@ -14,6 +14,7 @@ class Config(BaseProxyConfig):
         helper.copy('user')
         helper.copy('pass')
         helper.copy('whitelist')
+        helper.copy('usermap')
         helper.copy('filter_properties')
         helper.copy('filter_entry')
 
@@ -21,6 +22,7 @@ class Config(BaseProxyConfig):
 class RT(Plugin):
     prefix: str
     whitelist: Set[UserID]
+    usermap: dict
     api: str
     login: dict
     headers = {'User-agent': 'maubot-rt'}
@@ -44,6 +46,7 @@ class RT(Plugin):
         self.config.load_and_update()
         self.prefix = self.config['prefix']
         self.whitelist = set(self.config['whitelist'])
+        self.usermap = self.config['usermap']
         self.url = self.config['url']
         self.rest = f'{self.url}/REST/1.0/'
         self.display = f'{self.url}/Ticket/Display.html'
@@ -58,6 +61,9 @@ class RT(Plugin):
     def can_manage(self, evt: MessageEvent) -> bool:
         return True if evt.sender in self.whitelist else False
 
+    def map_user(self, username: str) -> str:
+        return self.usermap[username] if username in self.usermap else username
+
     def valid_number(self, number: str) -> bool:
         return True if self.regex_number.match(number) else False
 
@@ -162,7 +168,7 @@ class RT(Plugin):
         target_ticket = self.regex_ticket.findall(target_evt.content.body)
         if len(target_ticket) == 1:
             number = target_ticket[0]
-            await self._edit(number, {'Owner': username})
+            await self._edit(number, {'Owner': self.map_user(username)})
             content = TextMessageEventContent(
                 msgtype=MessageType.NOTICE, format=Format.HTML,
                 body=f'{displayname} took {number}',
@@ -182,7 +188,7 @@ class RT(Plugin):
         target_displayname = await self._displayname(evt.room_id, target_mxid)
         if len(target_ticket) == 1:
             number = target_ticket[0]
-            await self._edit(number, {'Owner': target_username})
+            await self._edit(number, {'Owner': self.map_user(target_username)})
             content = TextMessageEventContent(
                 msgtype=MessageType.NOTICE, format=Format.HTML,
                 body=f'{displayname} politely rejected {number} and gave it back to '
@@ -348,7 +354,8 @@ class RT(Plugin):
             return
         await evt.mark_read()
         displayname = await self._displayname(evt.room_id, evt.sender)
-        await self._edit(number, {'Owner': evt.sender[1:].split(':')[0]})
+        username = evt.sender[1:].split(':')[0]
+        await self._edit(number, {'Owner': self.map_user(username)})
         content = TextMessageEventContent(
             msgtype=MessageType.NOTICE, format=Format.HTML,
             body=f'{displayname} took rt#{number} 👍️',
@@ -375,7 +382,7 @@ class RT(Plugin):
         displayname = await self._displayname(evt.room_id, evt.sender)
         target_mxid = member_mxids[user]
         target_username = target_mxid[1:].split(':')[0]
-        await self._edit(number, {'Owner': target_username})
+        await self._edit(number, {'Owner': self.map_user(target_username)})
         react = f'(\U0001F44D to accept, \U0001F595 to reject)'
         content = TextMessageEventContent(
             msgtype=MessageType.NOTICE, format=Format.HTML,
@@ -406,7 +413,8 @@ class RT(Plugin):
         await evt.mark_read()
         displayname = await self._displayname(evt.room_id, evt.sender)
         username = evt.sender[1:].split(':')[0]
-        params = {'query': f'Owner = "{username}" AND ( Status = "new" OR Status = "open" )'}
+        mapped_username = self.map_user(username)
+        params = {'query': f'Owner = "{mapped_username}" AND ( Status = "new" OR Status = "open" )'}
         tickets_dict = await self._search(params)
         links = {k: f'<a href="{self.display}?id={k}">{v}</a>' for k, v in tickets_dict.items()}
         if tickets_dict: