diff --git a/src/matrixmessageprocessor.ts b/src/matrixmessageprocessor.ts
index a0a4c550d4d051d936568afb81603e2986385ec3..1cdeff18b0611de1188f7273c89e56dddfad21b6 100644
--- a/src/matrixmessageprocessor.ts
+++ b/src/matrixmessageprocessor.ts
@@ -304,6 +304,14 @@ export class MatrixMessageProcessor {
                     return "";
                 case "hr":
                     return "\n----------\n";
+                case "h1":
+                case "h2":
+                case "h3":
+                case "h4":
+                case "h5":
+                case "h6":
+                    const level = parseInt(nodeHtml.tagName[1], 10);
+                    return `**${"#".repeat(level)} ${await this.walkChildNodes(nodeHtml)}**\n`;
                 default:
                     return await this.walkChildNodes(nodeHtml);
             }
diff --git a/test/test_matrixmessageprocessor.ts b/test/test_matrixmessageprocessor.ts
index 611496fd6a9fe833e0aefb17354fff207b4be1df..af6253c67219f8cca1f64d07dec3a33fcb1b6c35 100644
--- a/test/test_matrixmessageprocessor.ts
+++ b/test/test_matrixmessageprocessor.ts
@@ -165,6 +165,23 @@ code
             const result = await mp.FormatMessage(msg, guild as any);
             expect(result).is.equal("test\n----------\nfoxes");
         });
+        it("handles headings", async () => {
+            const mp = new MatrixMessageProcessor(bot);
+            const guild = new MockGuild("1234");
+            const msg = getHtmlMessage(`<h1>fox</h1>
+<h2>floof</h2>
+<h3>pony</h3>
+<h4>hooves</h4>
+<h5>tail</h5>
+<h6>foxies</h6>`);
+            const result = await mp.FormatMessage(msg, guild as any);
+            expect(result).is.equal(`**# fox**
+**## floof**
+**### pony**
+**#### hooves**
+**##### tail**
+**###### foxies**`);
+        });
     });
     describe("FormatMessage / formatted_body / complex", () => {
         it("html unescapes stuff inside of code", async () => {