diff --git a/mautrix_telegram/portal.py b/mautrix_telegram/portal.py
index 3b6a81e4..9b23dc84 100644
--- a/mautrix_telegram/portal.py
+++ b/mautrix_telegram/portal.py
@@ -51,7 +51,9 @@
     EditChatPhotoRequest,
     EditChatTitleRequest,
     ExportChatInviteRequest,
+    GetAllStickersRequest,
     GetMessageReactionsListRequest,
+    GetStickerSetRequest,
     MigrateChatRequest,
     SendReactionRequest,
     SetTypingRequest,
@@ -79,6 +81,7 @@
     InputPeerChat,
     InputPeerPhotoFileLocation,
     InputPeerUser,
+    InputStickerSetID,
     InputUser,
     MessageActionChannelCreate,
     MessageActionChatAddUser,
@@ -1626,6 +1629,31 @@ async def _handle_matrix_text(
                 msgtype=content.msgtype,
             )
 
+    async def _find_telegram_sticker(self, client, metadata):
+        sticker_set_id = int(metadata["pack"]["id"])
+        sticker_sets = await client(GetAllStickersRequest(0))
+
+        found_sticker_set = None
+        for sticker_set in sticker_sets.sets:
+            if sticker_set.id == sticker_set_id:
+                found_sticker_set = sticker_set
+                break
+        if not found_sticker_set:
+            return None
+
+        stickers = await client(
+            GetStickerSetRequest(
+                hash=0,
+                stickerset=InputStickerSetID(
+                    id=found_sticker_set.id, access_hash=found_sticker_set.access_hash
+                ),
+            )
+        )
+
+        for sticker in stickers.documents:
+            if sticker.id == int(metadata["id"]):
+                return sticker
+
     async def _handle_matrix_file(
         self,
         sender: u.User,
@@ -1646,6 +1674,7 @@ async def _handle_matrix_file(
             w = h = None
         max_image_size = self.config["bridge.image_as_file_size"] * 1000**2
         max_image_pixels = self.config["bridge.image_as_file_pixels"]
+        media = None
 
         if self.config["bridge.parallel_file_transfer"] and content.url:
             file_handle, file_size = await util.parallel_transfer_to_telegram(
@@ -1666,7 +1695,16 @@ async def _handle_matrix_file(
                 file = await self.main_intent.download_media(content.url)
 
             if content.msgtype == MessageType.STICKER:
-                if mime != "image/gif":
+                tg_sticker = None
+
+                if "net.maunium.telegram.sticker" in content.info:
+                    tg_sticker = await self._find_telegram_sticker(
+                        client, content.info["net.maunium.telegram.sticker"]
+                    )
+
+                if tg_sticker is not None:
+                    media = tg_sticker
+                elif mime != "image/gif":
                     mime, file, w, h = util.convert_image(
                         file, source_mime=mime, target_type="webp"
                     )
@@ -1708,7 +1746,9 @@ async def _handle_matrix_file(
         if "fi.mau.telegram.force_document" in content:
             force_document = bool(content["fi.mau.telegram.force_document"])
 
-        if (mime == "image/png" or mime == "image/jpeg") and not force_document:
+        if media is not None:
+            pass
+        elif (mime == "image/png" or mime == "image/jpeg") and not force_document:
             media = InputMediaUploadedPhoto(file_handle)
         else:
             media = InputMediaUploadedDocument(