diff --git a/CHANGELOG.md b/CHANGELOG.md
index 09b18de32af2dea6fda0d8d0034962b30e420e88..db162b92527ce937fca6e6eecc0f1f66c22dc2e7 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -19,6 +19,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 
 ### Fixed (for any bug fixes)
 
+* Fixed saving of text properties that were changed in the Source-Editing mode
+  of the WYSIWYG editor.
+
 ### Security (in case of vulnerabilities)
 
 ### Documentation (for notable additions or changes of the documentation)
@@ -40,7 +43,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 * Optional WYSIWYG editor with markdown output for text properties. Controled by
   the `BUILD_MODULE_EXT_EDITMODE_WYSIWYG_TEXT` build variable which is set do
   `DISABLED` by default.
-  - Added button to version history panel that allows restoring old versions
+* Added button to version history panel that allows restoring old versions
 
 ### Changed (for changes in existing functionality)
 
diff --git a/src/core/js/ext_editmode_wysiwyg_text.js b/src/core/js/ext_editmode_wysiwyg_text.js
index f784dbd5d998ffeb95b4d594c907ff725441eadd..d5cd88a85084c76fd92c8710d9845bd80f09fb95 100644
--- a/src/core/js/ext_editmode_wysiwyg_text.js
+++ b/src/core/js/ext_editmode_wysiwyg_text.js
@@ -39,6 +39,8 @@
  */
 var ext_editmode_wysiwyg_text = function ($, logger, ClassicEditor, edit_mode, getPropertyElements, getPropertyDatatype, getPropertyName) {
 
+    var _callOnSave = [];
+
     var insertEditorInProperty = async function (prop) {
         if (!(getPropertyDatatype(prop) === 'TEXT')) {
             // Ignore anything that isn't a list property, even LIST<TEXT>
@@ -62,7 +64,7 @@ var ext_editmode_wysiwyg_text = function ($, logger, ClassicEditor, edit_mode, g
             logger.debug('Initialized editor for ' + getPropertyName(prop));
             // Manually implement saving the data since edit mode is not
             // a form to be submitted.
-            editor.model.document.on("change:data", (e) => {
+            _callOnSave.push(() => {
                 editor.updateSourceElement();
             });
         } catch (error) {
@@ -70,7 +72,23 @@ var ext_editmode_wysiwyg_text = function ($, logger, ClassicEditor, edit_mode, g
         }
     }
 
+    const proxySaveMethod = function (original) {
+        const result = function (entity) {
+            _callOnSave.forEach(cb => {
+                cb();
+            });
+            if (typeof original === "function") {
+                return original(entity);
+            }
+            return undefined;
+        }
+        return result;
+    }
+
     var replaceTextAreas = function (entity) {
+        // on save, call callbacks
+        edit_mode.app.onBeforeInsert = proxySaveMethod(edit_mode.app.onBeforeInsert);
+        edit_mode.app.onBeforeUpdate = proxySaveMethod(edit_mode.app.onBeforeUpdate);
         const properties = getPropertyElements(entity);
         for (let prop of properties) {
             // TODO(fspreck): This will be replaced by a whitelist of properties
@@ -107,6 +125,12 @@ var ext_editmode_wysiwyg_text = function ($, logger, ClassicEditor, edit_mode, g
             logger.debug('Re-rendering ' + getPropertyName(e.target));
             ext_editmode_wysiwyg_text.insertEditorInProperty(e.target);
         }, true);
+
+        // Clear list of saving callbacks when leaving the edit mode (regardless
+        // of saving or cancelling)
+        document.body.addEventListener(edit_mode.end_edit.type, (e) => {
+            this._callOnSave = [];
+        }, true);
     };
 
     return {