diff --git a/lib/classes/ForumEntry.php b/lib/classes/ForumEntry.php
index 95721d75c2f74251f946c24038bf1a2f4d3a95fc..f18fbb2141c42b0e19528d928ec6fe2e54d5061d 100644
--- a/lib/classes/ForumEntry.php
+++ b/lib/classes/ForumEntry.php
@@ -146,7 +146,9 @@ class ForumEntry  implements PrivacyObject
         if (Studip\Markup::isHtml($description)) {
             // remove all blockquote tags
             $dom = new DOMDocument();
+            $old_libxml_error = libxml_use_internal_errors(true);
             $dom->loadHtml($description, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
+            libxml_use_internal_errors($old_libxml_error);
             $nodes = iterator_to_array($dom->getElementsByTagName('blockquote'));
 
             foreach ($nodes as $node) {
diff --git a/lib/classes/Markup.class.php b/lib/classes/Markup.class.php
index 26204aa7f5be8d534ddee56ac087711e33da59e9..0944f422564f3314369c66f3944a869b2f9cd29d 100644
--- a/lib/classes/Markup.class.php
+++ b/lib/classes/Markup.class.php
@@ -285,6 +285,8 @@ class Markup
             code
             div[class|style]
             em
+            figure[class|style]
+            figcaption
             h1
             h2
             h3
@@ -305,7 +307,7 @@ class Markup
             small
             sub
             sup
-            table[class]
+            table[class|style]
             tbody
             td[colspan|rowspan|style]
             thead
@@ -340,7 +342,9 @@ class Markup
             'height',
             'color',
             'background-color', // needed by span, td
-            'float'
+            'border-style',
+            'float',
+            'border'
         ]);
 
         if ($autoformat) {
@@ -375,6 +379,9 @@ class Markup
               'controls' => 'Text',     // Bool triggers bug in HTMLPurifier
         ]);
 
+        $def->addElement('figcaption', 'Inline', 'Flow', 'Common');
+        $def->addElement('figure', 'Block', 'Optional: (figcaption, Flow) | (Flow, figcaption) | Flow', 'Common');
+
         return new \HTMLPurifier($config);
     }
 
diff --git a/lib/models/Courseware/BlockTypes/Text.php b/lib/models/Courseware/BlockTypes/Text.php
index 7edeebc9262e359fb6c77acefbea5587010bdee7..4bccd883895bf563841a4f2d22f4d9d7440df21a 100644
--- a/lib/models/Courseware/BlockTypes/Text.php
+++ b/lib/models/Courseware/BlockTypes/Text.php
@@ -70,7 +70,9 @@ class Text extends BlockType
         $files = [];
 
         if ($payload['text']) {
+            $old_libxml_error = libxml_use_internal_errors(true);
             $document->loadHTML($payload['text']);
+            libxml_use_internal_errors($old_libxml_error);
             $imageElements = $document->getElementsByTagName('img');
             foreach ($imageElements as $element) {
                 if (!$element instanceof \DOMElement || !$element->hasAttribute('src')) {
@@ -82,6 +84,7 @@ class Text extends BlockType
                 }
             }
         }
+
         return $files;
     }
 
diff --git a/resources/assets/stylesheets/scss/content.scss b/resources/assets/stylesheets/scss/content.scss
index acfb03e19ecc3132778644cb4c655f204fef5215..aca9cb0a96df5465f304de8cf155d7ffdc9ebb87 100644
--- a/resources/assets/stylesheets/scss/content.scss
+++ b/resources/assets/stylesheets/scss/content.scss
@@ -54,6 +54,24 @@
     pre {   // pre-formatted content breaks the Stud.IP Layout!
         white-space: pre-wrap;
     }
+
+    figure {
+        display: table;
+        margin: 0.9em auto;
+
+        table {
+            width: 100%;
+            height: 100%;
+            border-collapse: collapse;
+            border-spacing: 0;
+
+            td {
+                border: unset;
+                min-width: 2em;
+                padding: 0.4em;
+            }
+        }
+    }
 }
 
 // Emphasize tt tags a little bit so ##monospace## blocks will stick out.