diff --git a/ivette/src/dome/renderer/text/richtext.tsx b/ivette/src/dome/renderer/text/richtext.tsx
index d1eb51e67ffe398caee9c42de337a297f870ce1e..674f49f0e50c036620013ac169531b16ae3f5297 100644
--- a/ivette/src/dome/renderer/text/richtext.tsx
+++ b/ivette/src/dome/renderer/text/richtext.tsx
@@ -335,7 +335,11 @@ export class TextBuffer extends TextProxy {
       const view = this.proxy;
       if (view) { appendContents(view, data); }
       else {
-        this.text = this.toText().append(textOf(data));
+        const state = CS.EditorState.create({ doc: this.toText() });
+        const offset = state.doc.length;
+        const changes = { from: offset, insert: data };
+        const transaction = state.update({ changes });
+        this.text = transaction.state.doc;
         this.contents = undefined;
         // invariant established
       }
@@ -356,9 +360,12 @@ export class TextBuffer extends TextProxy {
     const view = this.proxy;
     if (view) dispatchReplace(view, range, data);
     else {
-      const doc = this.toText();
       const { offset, length } = range;
-      this.text = doc.replace(offset, offset+length, textOf(data));
+      const endOffset = offset + length;
+      const state = CS.EditorState.create({ doc: this.toText() });
+      const changes = { from: offset, to: endOffset, insert: data };
+      const transaction = state.update({ changes });
+      this.text = transaction.state.doc;
       // invariant preserved
     }
   }