diff --git a/packages/xpub-edit/src/components/Editor.js b/packages/xpub-edit/src/components/Editor.js
index b05ec99b502b1bbcbbf30dc90a5e51a4d8c53215..740b76d2700d74861458fce650f41ded45ae5514 100644
--- a/packages/xpub-edit/src/components/Editor.js
+++ b/packages/xpub-edit/src/components/Editor.js
@@ -47,18 +47,22 @@ class Editor extends React.Component {
   }
 
   // TODO: debouncing?
-  // TODO: only fire on onBlur or onSubmit?
-  // TODO: send an event?
-  // onDocumentChange = (document, state) => {
-  //   this.props.onChange(this.props.converter.serialize(state))
-  // }
-
-  // TODO: only fire onChange if actually changed
-  // TODO: is this appropriate?
+  onDocumentChange = (document, state) => {
+    const { converter, onDocumentChange } = this.props
+
+    if (typeof onDocumentChange === 'function') {
+      onDocumentChange(converter.serialize(state))
+    }
+  }
+
+  // TODO: only fire onChange if actually changed?
   onBlur = () => {
+    const { converter, onChange } = this.props
     const { state } = this.state
 
-    this.props.onChange(this.props.converter.serialize(state))
+    if (typeof onChange === 'function') {
+      onChange(converter.serialize(state))
+    }
   }
 
   onKeyDown = (event, { isMod, key }, state) => {
@@ -148,7 +152,7 @@ class Editor extends React.Component {
           onKeyDown={this.onKeyDown}
           onPaste={this.onReceive}
           onDrop={this.onReceive}
-          // onDocumentChange={this.onDocumentChange}
+          onDocumentChange={this.onDocumentChange}
           placeholder={placeholder}
           spellCheck
         />
diff --git a/packages/xpub-edit/src/components/abstract/AbstractEditor.js b/packages/xpub-edit/src/components/abstract/AbstractEditor.js
index 91da1b2a91e22c37b47427ccb9fc94253ca8f4e9..e45e429109a4c3c16e90258a32d55353a5ebdcff 100644
--- a/packages/xpub-edit/src/components/abstract/AbstractEditor.js
+++ b/packages/xpub-edit/src/components/abstract/AbstractEditor.js
@@ -13,7 +13,7 @@ const AbstractEditor = ({ value, placeholder, title, onChange }) => (
     keys={keys}
     placeholder={placeholder}
     title={title}
-    onChange={onChange}
+    onDocumentChange={onChange}
   />
 )
 
diff --git a/packages/xpub-edit/src/components/note/NoteEditor.js b/packages/xpub-edit/src/components/note/NoteEditor.js
index b5d50d22dd6e5eb3df09ed0746834eb317f8cb3d..e24026791ca86301a5b4b022b559e2a481c4e107 100644
--- a/packages/xpub-edit/src/components/note/NoteEditor.js
+++ b/packages/xpub-edit/src/components/note/NoteEditor.js
@@ -13,7 +13,7 @@ const NoteEditor = ({ value, placeholder, title, onChange }) => (
     keys={keys}
     placeholder={placeholder}
     title={title}
-    onChange={onChange}
+    onDocumentChange={onChange}
   />
 )
 
diff --git a/packages/xpub-edit/src/components/title/TitleEditor.js b/packages/xpub-edit/src/components/title/TitleEditor.js
index a3b966ac8c221f414ac4593319c59790c9fab8db..9c62c8ea3ff2803b7ae94f23015fd907cf1e7cf6 100644
--- a/packages/xpub-edit/src/components/title/TitleEditor.js
+++ b/packages/xpub-edit/src/components/title/TitleEditor.js
@@ -15,7 +15,7 @@ const TitleEditor = ({ value, placeholder, title, onChange }) => (
     keys={keys}
     placeholder={placeholder}
     title={title}
-    onChange={onChange}
+    onDocumentChange={onChange}
   />
 )