diff --git a/examples/demo/demo.css b/examples/demo/demo.css
index b72220f97..cc1e62705 100644
--- a/examples/demo/demo.css
+++ b/examples/demo/demo.css
@@ -3,6 +3,11 @@ body {
     height:100vh;
 }
 
+* {
+    border-top: 3px black solid;
+    margin: 0;
+}
+
 jw-editor {
     display: block;
     height: 100vh;
diff --git a/examples/demo/demo.xml b/examples/demo/demo.xml
index a7eb03a9b..4b9b46e34 100644
--- a/examples/demo/demo.xml
+++ b/examples/demo/demo.xml
@@ -17,37 +17,6 @@ neologisms such as "galumphing" and "chortle".
 
 
Table examples
 
-
-  
-    
-      | -
 | -
 | -
 | 
-    
-      | -
 | -
 | 
-    
-      | -
 | -
 | 
-    
-      | -
 | -
 | 
-    
-      | -
 | © Piet
-      Mondrian- | 
-    
-      | -
 | 
-  
-
-
 
 
 
@@ -132,7 +101,14 @@ neologisms such as "galumphing" and "chortle".
       
       
         
-            - 1.2.1+
- A 2 br
 
 
+- A br + char
 
+- B 3 br
 
 
 
+- B 2 br + char
 
 
+- P B 3 br
 
 
 
 
+- P B 2 br + char
 
 
 
+- B 4 br
 
 
 
 
+- B 3 br + char
 
 
 
- 1.2.2
- 1.2.3
- 
diff --git a/packages/plugin-linebreak/src/LineBreakDomObjectRenderer.ts b/packages/plugin-linebreak/src/LineBreakDomObjectRenderer.ts
index 12f57257b..6805960a3 100644
--- a/packages/plugin-linebreak/src/LineBreakDomObjectRenderer.ts
+++ b/packages/plugin-linebreak/src/LineBreakDomObjectRenderer.ts
@@ -22,10 +22,11 @@ export class LineBreakDomObjectRenderer extends NodeRenderer {
         worker.locate([node], br);
         if (!node.nextSibling()) {
             // If a LineBreakNode has no next sibling, it must be rendered
-            // as two BRs in order for it to be visible.
-            const br2 = { tag: 'BR' };
-            const domObject = { children: [br, br2] };
-            worker.locate([node], br2);
+            // as a BR and a placeholder invisible char in order for it to be
+            // visible.
+            const invisible: DomObject = { text: '\u200B' };
+            const domObject = { children: [br, invisible] };
+            worker.locate([node], invisible);
             return domObject;
         }
         return br;
diff --git a/packages/plugin-linebreak/src/LineBreakXmlDomParser.ts b/packages/plugin-linebreak/src/LineBreakXmlDomParser.ts
index 929609cd8..032dd3825 100644
--- a/packages/plugin-linebreak/src/LineBreakXmlDomParser.ts
+++ b/packages/plugin-linebreak/src/LineBreakXmlDomParser.ts
@@ -10,7 +10,13 @@ export class LineBreakXmlDomParser extends AbstractParser {
     engine: XmlDomParsingEngine;
 
     predicate = (item: Node): boolean => {
-        return item instanceof Element && nodeName(item) === 'BR';
+        return (
+            (item instanceof Element && nodeName(item) === 'BR') ||
+            (item instanceof Text &&
+                item.textContent === '\u200B' &&
+                !item.nextSibling &&
+                (!item.previousSibling || nodeName(item.previousSibling) === 'BR'))
+        );
     };
 
     async parse(item: Element): Promise {
diff --git a/packages/plugin-renderer-dom-object/src/DomObjectRenderingEngine.ts b/packages/plugin-renderer-dom-object/src/DomObjectRenderingEngine.ts
index 2d1393ab9..da7d31da1 100644
--- a/packages/plugin-renderer-dom-object/src/DomObjectRenderingEngine.ts
+++ b/packages/plugin-renderer-dom-object/src/DomObjectRenderingEngine.ts
@@ -270,7 +270,7 @@ export class DomObjectRenderingEngine extends RenderingEngine {
     async renderChildren(node: VNode): Promise> {
         const children: Array = node.children();
         if (!children.length && this.editor.mode.is(node, RuleProperty.ALLOW_EMPTY) !== true) {
-            children.push({ tag: 'BR' });
+            children.push({ text: '\u200B' });
         }
         return children;
     }