diff --git a/editors/editoria/package.json b/editors/editoria/package.json
index aa5d831e059fdf415030400b904a1096cedb9d5e..1574cdf6f3c0b770916eb60e2543fac87eac468d 100644
--- a/editors/editoria/package.json
+++ b/editors/editoria/package.json
@@ -4,9 +4,9 @@
   "private": true,
   "dependencies": {
     "@guardian/prosemirror-invisibles": "^1.2.0",
-    "prosemirror-tables": "^0.9.5",
-    "react": "^16.8.6",
-    "react-dom": "^16.8.6",
+    "prosemirror-tables": "^1.1.0",
+    "react": "^16.13.1",
+    "react-dom": "^16.13.1",
     "styled-components": "^4.2.0",
     "wax-prosemirror-components": "^0.0.8",
     "wax-prosemirror-core": "^0.0.8",
@@ -23,12 +23,7 @@
   "eslintConfig": {
     "extends": "react-app"
   },
-  "browserslist": [
-    ">0.2%",
-    "not dead",
-    "not ie <= 11",
-    "not op_mini all"
-  ],
+  "browserslist": [">0.2%", "not dead", "not ie <= 11", "not op_mini all"],
   "devDependencies": {
     "babel-eslint": "10.0.3",
     "babel-loader": "8.0.6",
diff --git a/editors/editoria/src/Editoria.js b/editors/editoria/src/Editoria.js
index ae4e7c88fd33bd2be26ca21014d8d4037fdb8edd..feb57c6796d0fbc6cf6ca9bd1ae1a4ead25eae15 100644
--- a/editors/editoria/src/Editoria.js
+++ b/editors/editoria/src/Editoria.js
@@ -49,6 +49,7 @@ const Editoria = () => (
       fileUpload={file => renderImage(file)}
       value={"this is some content"}
       layout={EditoriaLayout}
+      // TrackChange
       // onChange={source => console.log(source)}
       user={user}
     />
diff --git a/wax-prosemirror-components/index.js b/wax-prosemirror-components/index.js
index 49f165241f8026c65c7951706e246b295d3aa964..770e1e4b638ca7a286075f68de24d49c82db7a92 100644
--- a/wax-prosemirror-components/index.js
+++ b/wax-prosemirror-components/index.js
@@ -18,6 +18,4 @@ export {
   default as CommentBubbleComponent
 } from "./src/components/comments/CommentBubbleComponent";
 
-export {
-  default as CommentComponent
-} from "./src/components/comments/CommentComponent";
+export { default as RightArea } from "./src/components/rightArea/RightArea";
diff --git a/wax-prosemirror-components/package.json b/wax-prosemirror-components/package.json
index 3852da3073048dff2dd64b5631e8672c4573e209..e9fed7f0484b6ca37c8de7a08b7502e8a152e744 100644
--- a/wax-prosemirror-components/package.json
+++ b/wax-prosemirror-components/package.json
@@ -14,8 +14,8 @@
     "@fortawesome/free-solid-svg-icons": "^5.12.0",
     "@fortawesome/react-fontawesome": "^0.0.17",
     "lodash": "^4.17.4",
-    "react": "^16.8.6",
-    "react-dom": "^16.8.6",
+    "react": "^16.13.1",
+    "react-dom": "^16.13.1",
     "react-dropdown": "^1.6.2",
     "react-transition-group": "^4.3.0",
     "styled-components": "^4.2.0",
diff --git a/wax-prosemirror-components/src/components/comments/CommentBox.js b/wax-prosemirror-components/src/components/comments/CommentBox.js
index 301591f51427b2aab4391f3835bced54be175dbd..c394e7a9dbdf79fd80674217393c531d3ea36d6f 100644
--- a/wax-prosemirror-components/src/components/comments/CommentBox.js
+++ b/wax-prosemirror-components/src/components/comments/CommentBox.js
@@ -11,7 +11,7 @@ const CommentBoxStyled = styled.div`
   margin-top: 10px;
   background: black;
   position: absolute;
-  transition: ${({ state }) => "top 1s, opacity 1.5s"};
+  transition: ${({ state }) => "top 1s, opacity 1.5s, left 1s"};
   top: ${props => (props.top ? `${props.top}px` : 0)};
   left: ${props => (props.active ? `${63}%` : `${65}%`)};
   opacity: ${({ state }) => {
diff --git a/wax-prosemirror-components/src/components/comments/CommentComponent.js b/wax-prosemirror-components/src/components/rightArea/RightArea.js
similarity index 66%
rename from wax-prosemirror-components/src/components/comments/CommentComponent.js
rename to wax-prosemirror-components/src/components/rightArea/RightArea.js
index 35b5b12adee0a7c68b1cba75d7543442e391f796..910204385638f5d7c15c58e66dcbd4f8abda60f9 100644
--- a/wax-prosemirror-components/src/components/comments/CommentComponent.js
+++ b/wax-prosemirror-components/src/components/rightArea/RightArea.js
@@ -9,52 +9,51 @@ import React, {
 import styled from "styled-components";
 import { WaxContext } from "wax-prosemirror-core";
 import { DocumentHelpers } from "wax-prosemirror-utilities";
-import CommentsBoxList from "./CommentsBoxList";
+import CommentsBoxList from "./../comments/CommentsBoxList";
 import { each } from "lodash";
 
 export default ({ area }) => {
   const { view: { main }, app, activeView } = useContext(WaxContext);
   const activeCommentPlugin = app.PmPlugins.get("activeComment");
-  const [comments, setComments] = useState([]);
+  const [marks, setMarks] = useState([]);
   const [position, setPosition] = useState();
 
   const setTops = useCallback(() => {
     const result = [];
-    let commentEl = null;
+    let markEl = null;
     let annotationTop = 0;
     let boxHeight = 0;
     let top = 0;
     const allCommentsTop = [];
 
-    each(comments[area], (comment, pos) => {
+    each(marks[area], (mark, pos) => {
       const WaxSurface = main.dom.getBoundingClientRect();
-      const { attrs: { id } } = comment;
+      const { attrs: { id } } = mark;
       const activeComment = activeCommentPlugin.getState(activeView.state)
         .comment;
 
       let isActive = false;
-      if (activeComment && comment.attrs.id === activeComment.attrs.id)
+      if (activeComment && mark.attrs.id === activeComment.attrs.id)
         isActive = true;
 
       //annotation top
       if (area === "main") {
-        commentEl = document.querySelector(`span[data-id="${id}"]`);
-        if (commentEl)
-          annotationTop =
-            commentEl.getBoundingClientRect().top - WaxSurface.top;
+        markEl = document.querySelector(`span[data-id="${id}"]`);
+        if (markEl)
+          annotationTop = markEl.getBoundingClientRect().top - WaxSurface.top;
       } else {
         const panelWrapper = document.getElementsByClassName("panelWrapper");
         const panelWrapperHeight = panelWrapper[0].getBoundingClientRect()
           .height;
-        commentEl = document
+        markEl = document
           .querySelector("#notes-container")
           .querySelector(`span[data-id="${id}"]`);
-        if (commentEl)
+        if (markEl)
           annotationTop =
-            commentEl.getBoundingClientRect().top - panelWrapperHeight - 50;
+            markEl.getBoundingClientRect().top - panelWrapperHeight - 50;
       }
 
-      // get height of this comment box
+      // get height of this mark box
       const boxEl = document.querySelector(`div[data-comment="comment-${id}"]`);
       if (boxEl) boxHeight = parseInt(boxEl.offsetHeight);
 
@@ -63,20 +62,20 @@ export default ({ area }) => {
 
       // if the above comment box has already taken up the height, move down
       if (pos > 0) {
-        const previousBox = comments[area][pos - 1];
+        const previousBox = marks[area][pos - 1];
         const previousEndHeight = previousBox.endHeight;
         if (annotationTop < previousEndHeight) {
           top = previousEndHeight + 2;
         }
       }
       // store where the box ends to be aware of overlaps in the next box
-      comment.endHeight = top + boxHeight + 2;
+      mark.endHeight = top + boxHeight + 2;
       result[pos] = top;
       allCommentsTop.push({ [id]: result[pos] });
 
       // if active, move as many boxes above as needed to bring it to the annotation's height
       if (isActive) {
-        comment.endHeight = annotationTop + boxHeight + 2;
+        mark.endHeight = annotationTop + boxHeight + 2;
         result[pos] = annotationTop;
         allCommentsTop[pos][id] = result[pos];
         let b = true;
@@ -86,7 +85,7 @@ export default ({ area }) => {
         if (i === 0) b = false;
 
         while (b) {
-          const boxAbove = comments[area][i - 1];
+          const boxAbove = marks[area][i - 1];
           const boxAboveEnds = boxAbove.endHeight;
           const currentTop = result[i];
 
@@ -96,8 +95,7 @@ export default ({ area }) => {
             const overlap = boxAboveEnds - currentTop;
             result[i - 1] -= overlap;
 
-            allCommentsTop[i - 1][comments[area][i - 1].attrs.id] =
-              result[i - 1];
+            allCommentsTop[i - 1][marks[area][i - 1].attrs.id] = result[i - 1];
           }
 
           if (!doesOverlap) b = false;
@@ -112,49 +110,49 @@ export default ({ area }) => {
 
   useEffect(
     () => {
-      setComments(updateComments(main));
+      setMarks(updateMarks(main));
       setPosition(setTops());
     },
 
-    [JSON.stringify(updateComments(main)), JSON.stringify(setTops())]
+    [JSON.stringify(updateMarks(main)), JSON.stringify(setTops())]
   );
 
-  const CommentComponent = useMemo(
+  const CommentTrackComponent = useMemo(
     () => (
       <CommentsBoxList
-        comments={comments[area] || []}
+        comments={marks[area] || []}
         area={area}
         view={main}
         position={position}
       />
     ),
-    [comments[area] || [], position]
+    [marks[area] || [], position]
   );
-  return <Fragment>{CommentComponent}</Fragment>;
+  return <Fragment>{CommentTrackComponent}</Fragment>;
 };
 
-const updateComments = view => {
+const updateMarks = view => {
   if (view) {
-    const nodes = DocumentHelpers.findChildrenByMark(
+    const commentNodes = DocumentHelpers.findChildrenByMark(
       view.state.doc,
       view.state.schema.marks.comment,
       true
     );
-    const allComments = nodes.map(node => {
+    const allComments = commentNodes.map(node => {
       return node.node.marks.filter(comment => {
         return comment.type.name === "comment";
       });
     });
 
-    const groupedComments = {};
+    const groupedNodes = {};
     allComments.forEach(comment => {
-      if (!groupedComments[comment[0].attrs.group]) {
-        groupedComments[comment[0].attrs.group] = [comment[0]];
+      if (!groupedNodes[comment[0].attrs.group]) {
+        groupedNodes[comment[0].attrs.group] = [comment[0]];
       } else {
-        groupedComments[comment[0].attrs.group].push(comment[0]);
+        groupedNodes[comment[0].attrs.group].push(comment[0]);
       }
     });
-    return groupedComments;
+    return groupedNodes;
   }
   return [];
 };
diff --git a/wax-prosemirror-core/package.json b/wax-prosemirror-core/package.json
index b70bf140447e5196f16ea9cdf769576b26f086d8..c1412d604367b242c795e7532062b1249beb064b 100644
--- a/wax-prosemirror-core/package.json
+++ b/wax-prosemirror-core/package.json
@@ -10,10 +10,14 @@
     "build": "BABEL_ENV=production rollup -c"
   },
   "dependencies": {
+    "react": "^16.13.1",
+    "react-dom": "^16.13.1",
     "deepmerge": "^4.2.2",
     "inversify": "^5.0.1",
     "inversify-inject-decorators": "^3.1.0",
     "lodash": "^4.17.4",
+    "reflect-metadata": "^0.1.13",
+    "styled-components": "^4.2.0",
     "prosemirror-commands": "^1.1.3",
     "prosemirror-dev-tools": "^2.1.1",
     "prosemirror-dropcursor": "^1.3.2",
@@ -24,11 +28,7 @@
     "prosemirror-model": "^1.9.1",
     "prosemirror-state": "^1.3.2",
     "prosemirror-transform": "^1.2.3",
-    "prosemirror-view": "^1.13.11",
-    "react": "^16.8.6",
-    "react-dom": "^16.8.6",
-    "reflect-metadata": "^0.1.13",
-    "styled-components": "^4.2.0"
+    "prosemirror-view": "^1.13.11"
   },
   "devDependencies": {
     "mocha": "^3.4.2",
diff --git a/wax-prosemirror-layouts/package.json b/wax-prosemirror-layouts/package.json
index 615957c08178ae89cd172e95e2cf5eb5c854c7e4..cd8e9ef1b36d7d6bef78121083b09530a1c9af0f 100644
--- a/wax-prosemirror-layouts/package.json
+++ b/wax-prosemirror-layouts/package.json
@@ -10,8 +10,8 @@
     "build": "BABEL_ENV=production rollup -c"
   },
   "dependencies": {
-    "react": "^16.8.6",
-    "react-dom": "^16.8.6",
+    "react": "^16.13.1",
+    "react-dom": "^16.13.1",
     "react-panelgroup": "^1.0.10",
     "styled-components": "^4.2.0"
   }
diff --git a/wax-prosemirror-layouts/src/layouts/EditoriaLayout.js b/wax-prosemirror-layouts/src/layouts/EditoriaLayout.js
index b14375b4dfdf4e9614b67eb94517ba3e6ec4113e..d77f088e657f0bb3dab96d8f9f329169f759d6a5 100644
--- a/wax-prosemirror-layouts/src/layouts/EditoriaLayout.js
+++ b/wax-prosemirror-layouts/src/layouts/EditoriaLayout.js
@@ -204,7 +204,7 @@ const LeftSideBar = componentPlugin("leftSideBar");
 const RightSideBar = componentPlugin("rightSideBar");
 const TopBar = componentPlugin("topBar");
 const NotesArea = componentPlugin("notesArea");
-const CommentsArea = componentPlugin("commentsArea");
+const RightArea = componentPlugin("rightArea");
 const WaxOverlays = componentPlugin("waxOverlays");
 
 const withNotes = () => {
@@ -214,7 +214,7 @@ const withNotes = () => {
         <NotesArea />
       </NotesContainer>
       <CommentsContainer>
-        <CommentsArea area="notes" />
+        <RightArea area="notes" />
       </CommentsContainer>
     </NotesAreaContainer>
   );
@@ -257,7 +257,7 @@ const EditoriaLayout = ({ editor }) => {
               <WaxSurfaceScroll className="wax-surface-scroll">
                 <EditorContainer>{editor}</EditorContainer>
                 <CommentsContainer>
-                  <CommentsArea area="main" />
+                  <RightArea area="main" />
                 </CommentsContainer>
               </WaxSurfaceScroll>
               <RightSideBar />
diff --git a/wax-prosemirror-schema/package.json b/wax-prosemirror-schema/package.json
index bdc57cff05dad81d2a5bb4d8d25d67d873abc4f8..02b4770200b291befb4324c02d84012d1bfa9e3f 100644
--- a/wax-prosemirror-schema/package.json
+++ b/wax-prosemirror-schema/package.json
@@ -11,6 +11,6 @@
   },
   "dependencies": {
     "prosemirror-schema-list": "^1.1.2",
-    "prosemirror-tables": "^1.0.0"
+    "prosemirror-tables": "^1.1.0"
   }
 }
diff --git a/wax-prosemirror-schema/src/marks/trackChangesMarks/deletionMark.js b/wax-prosemirror-schema/src/marks/trackChangesMarks/deletionMark.js
index 7294dc1fe1344f60bff1c9054ab5f7ec0c5c5304..1de64cb023ee6bc9cf21e91ef49fdd737b717645 100644
--- a/wax-prosemirror-schema/src/marks/trackChangesMarks/deletionMark.js
+++ b/wax-prosemirror-schema/src/marks/trackChangesMarks/deletionMark.js
@@ -1,14 +1,10 @@
 const deletion = {
   attrs: {
-    user: {
-      default: 0
-    },
-    username: {
-      default: ""
-    },
-    date: {
-      default: 0
-    }
+    id: { default: "" },
+    user: { default: 0 },
+    username: { default: "" },
+    date: { default: 0 },
+    group: { default: "" }
   },
   inclusive: false,
   group: "track",
@@ -17,9 +13,11 @@ const deletion = {
       tag: "span.deletion",
       getAttrs(dom) {
         return {
+          id: dom.dataset.id,
           user: parseInt(dom.dataset.user),
           username: dom.dataset.username,
-          date: parseInt(dom.dataset.date)
+          date: parseInt(dom.dataset.date),
+          group: dom.dataset.group
         };
       }
     }
@@ -29,9 +27,11 @@ const deletion = {
       "span",
       {
         class: `deletion user-${node.attrs.user}`,
+        "data-id": node.attrs.id,
         "data-user": node.attrs.user,
         "data-username": node.attrs.username,
-        "data-date": node.attrs.date
+        "data-date": node.attrs.date,
+        "data-group": node.attrs.group
       }
     ];
   }
diff --git a/wax-prosemirror-schema/src/marks/trackChangesMarks/formatChangeMark.js b/wax-prosemirror-schema/src/marks/trackChangesMarks/formatChangeMark.js
index 37ceac821b6f8eb05db3a62762b42945b8cb7575..5fc79a00c48462208ed9e68150d36253f0f09b9c 100644
--- a/wax-prosemirror-schema/src/marks/trackChangesMarks/formatChangeMark.js
+++ b/wax-prosemirror-schema/src/marks/trackChangesMarks/formatChangeMark.js
@@ -1,20 +1,12 @@
 const format_change = {
   attrs: {
-    user: {
-      default: 0
-    },
-    username: {
-      default: ""
-    },
-    date: {
-      default: 0
-    },
-    before: {
-      default: []
-    },
-    after: {
-      default: []
-    }
+    id: { default: "" },
+    user: { default: 0 },
+    username: { default: "" },
+    date: { default: 0 },
+    before: { default: [] },
+    after: { default: [] },
+    group: { default: "" }
   },
   inclusive: false,
   group: "track",
@@ -23,11 +15,13 @@ const format_change = {
       tag: "span.format-change",
       getAttrs(dom) {
         return {
+          id: dom.dataset.id,
           user: parseInt(dom.dataset.user),
           username: dom.dataset.username,
           date: parseInt(dom.dataset.date),
           before: parseFormatList(dom.dataset.before),
-          after: parseFormatList(dom.dataset.after)
+          after: parseFormatList(dom.dataset.after),
+          group: dom.dataset.group
         };
       }
     }
@@ -37,11 +31,13 @@ const format_change = {
       "span",
       {
         class: `format-change user-${node.attrs.user}`,
+        "data-id": node.attrs.id,
         "data-user": node.attrs.user,
         "data-username": node.attrs.username,
         "data-date": node.attrs.date,
         "data-before": JSON.stringify(node.attrs.before),
-        "data-after": JSON.stringify(node.attrs.after)
+        "data-after": JSON.stringify(node.attrs.after),
+        "data-group": node.attrs.group
       }
     ];
   }
diff --git a/wax-prosemirror-schema/src/marks/trackChangesMarks/insertionMark.js b/wax-prosemirror-schema/src/marks/trackChangesMarks/insertionMark.js
index 365ccc3c52806b747bad3fe069aa6593c5c59dd5..945d52ea756b773020d1c7692f4596446a95b747 100644
--- a/wax-prosemirror-schema/src/marks/trackChangesMarks/insertionMark.js
+++ b/wax-prosemirror-schema/src/marks/trackChangesMarks/insertionMark.js
@@ -1,17 +1,11 @@
 const insertion = {
   attrs: {
-    user: {
-      default: 0
-    },
-    username: {
-      default: ""
-    },
-    date: {
-      default: 0
-    },
-    approved: {
-      default: true
-    }
+    id: { default: "" },
+    user: { default: 0 },
+    username: { default: "" },
+    date: { default: 0 },
+    approved: { default: true },
+    group: { default: "" }
   },
   inclusive: false,
   group: "track",
@@ -20,11 +14,13 @@ const insertion = {
       tag: "span.insertion",
       getAttrs(dom) {
         return {
+          id: dom.dataset.id,
           user: parseInt(dom.dataset.user),
           username: dom.dataset.username,
           date: parseInt(dom.dataset.date),
           inline: true,
-          approved: false
+          approved: false,
+          group: dom.dataset.group
         };
       }
     },
@@ -32,11 +28,13 @@ const insertion = {
       tag: "span.approved-insertion",
       getAttrs(dom) {
         return {
+          "data-id": node.attrs.id,
           user: parseInt(dom.dataset.user),
           username: dom.dataset.username,
           date: parseInt(dom.dataset.date),
           inline: true,
-          approved: true
+          approved: true,
+          group: dom.dataset.group
         };
       }
     }
@@ -48,9 +46,11 @@ const insertion = {
         class: node.attrs.approved
           ? "approved-insertion"
           : `insertion user-${node.attrs.user}`,
+        "data-id": node.attrs.id,
         "data-user": node.attrs.user,
         "data-username": node.attrs.username,
-        "data-date": node.attrs.date
+        "data-date": node.attrs.date,
+        "data-group": node.attrs.group
       }
     ];
   }
diff --git a/wax-prosemirror-schema/src/nodes/trackChangesNodes/authorTrackNode.js b/wax-prosemirror-schema/src/nodes/trackChangesNodes/authorTrackNode.js
index bc39089d513508c7c3a2b2b01c9297a341825692..4ee38f0b2f9704e57b3f87b737a20ebebe37e09a 100644
--- a/wax-prosemirror-schema/src/nodes/trackChangesNodes/authorTrackNode.js
+++ b/wax-prosemirror-schema/src/nodes/trackChangesNodes/authorTrackNode.js
@@ -6,14 +6,18 @@ const author = {
   priority: 0,
   defining: true,
   attrs: {
-    track: { default: [] }
+    id: { default: "" },
+    track: { default: [] },
+    group: { default: "" }
   },
   parseDOM: [
     {
       tag: "p.author",
       getAttrs(hook, next) {
         Object.assign(hook, {
-          track: SchemaHelpers.parseTracks(hook.dom.dataset.track)
+          id: hook.dom.dataset.id,
+          track: SchemaHelpers.parseTracks(hook.dom.dataset.track),
+          group: hook.dom.dataset.group
         });
         next();
       }
@@ -22,7 +26,9 @@ const author = {
   toDOM(hook, next) {
     if (hook.node.attrs.track.length) {
       Object.assign(hook.value[1], {
-        "data-track": JSON.stringify(hook.node.attrs.track)
+        "data-id": hook.node.attrs.id,
+        "data-track": JSON.stringify(hook.node.attrs.track),
+        "data-group": hook.node.attrs.group
       });
     }
     next();
diff --git a/wax-prosemirror-schema/src/nodes/trackChangesNodes/epigraphPoetryTrackNode.js b/wax-prosemirror-schema/src/nodes/trackChangesNodes/epigraphPoetryTrackNode.js
index f228c72d18b244951ec73ba55d4f56108d7a13c5..e888ed541803edf6cc7865a2b207895560f7b213 100644
--- a/wax-prosemirror-schema/src/nodes/trackChangesNodes/epigraphPoetryTrackNode.js
+++ b/wax-prosemirror-schema/src/nodes/trackChangesNodes/epigraphPoetryTrackNode.js
@@ -6,14 +6,18 @@ const epigraphPoetry = {
   priority: 0,
   defining: true,
   attrs: {
-    track: { default: [] }
+    id: { default: "" },
+    track: { default: [] },
+    group: { default: "" }
   },
   parseDOM: [
     {
       tag: "p.epigraph-poetry",
       getAttrs(hook, next) {
         Object.assign(hook, {
-          track: SchemaHelpers.parseTracks(hook.dom.dataset.track)
+          id: hook.dom.dataset.id,
+          track: SchemaHelpers.parseTracks(hook.dom.dataset.track),
+          group: hook.dom.dataset.group
         });
         next();
       }
@@ -22,7 +26,9 @@ const epigraphPoetry = {
   toDOM(hook, next) {
     if (hook.node.attrs.track.length) {
       Object.assign(hook.value[1], {
-        "data-track": JSON.stringify(hook.node.attrs.track)
+        "data-id": hook.node.attrs.id,
+        "data-track": JSON.stringify(hook.node.attrs.track),
+        "data-group": hook.node.attrs.group
       });
     }
     next();
diff --git a/wax-prosemirror-schema/src/nodes/trackChangesNodes/epigraphProseTrackNode.js b/wax-prosemirror-schema/src/nodes/trackChangesNodes/epigraphProseTrackNode.js
index 56515d4e66912b4ee9f40976af5c2b20ccc30fe9..e4135cf066f6a8bfafd80c67bdfff739efd81d35 100644
--- a/wax-prosemirror-schema/src/nodes/trackChangesNodes/epigraphProseTrackNode.js
+++ b/wax-prosemirror-schema/src/nodes/trackChangesNodes/epigraphProseTrackNode.js
@@ -6,14 +6,18 @@ const epigraphProse = {
   priority: 0,
   defining: true,
   attrs: {
-    track: { default: [] }
+    id: { default: "" },
+    track: { default: [] },
+    group: { default: "" }
   },
   parseDOM: [
     {
       tag: "p.epigraph-prose",
       getAttrs(hook, next) {
         Object.assign(hook, {
-          track: SchemaHelpers.parseTracks(hook.dom.dataset.track)
+          id: hook.dom.dataset.id,
+          track: SchemaHelpers.parseTracks(hook.dom.dataset.track),
+          group: hook.dom.dataset.group
         });
         next();
       }
@@ -22,7 +26,9 @@ const epigraphProse = {
   toDOM(hook, next) {
     if (hook.node.attrs.track.length) {
       Object.assign(hook.value[1], {
-        "data-track": JSON.stringify(hook.node.attrs.track)
+        "data-id": hook.node.attrs.id,
+        "data-track": JSON.stringify(hook.node.attrs.track),
+        "data-group": hook.node.attrs.group
       });
     }
     next();
diff --git a/wax-prosemirror-schema/src/nodes/trackChangesNodes/extractPoetryTrackNode.js b/wax-prosemirror-schema/src/nodes/trackChangesNodes/extractPoetryTrackNode.js
index c14c0fa3a4f8139fa9c1e8cdb022abf248a88678..937af7bd409a759bf6d7f6964bce034fc4a5652a 100644
--- a/wax-prosemirror-schema/src/nodes/trackChangesNodes/extractPoetryTrackNode.js
+++ b/wax-prosemirror-schema/src/nodes/trackChangesNodes/extractPoetryTrackNode.js
@@ -6,14 +6,18 @@ const extractPoetry = {
   priority: 0,
   defining: true,
   attrs: {
-    track: { default: [] }
+    id: { default: "" },
+    track: { default: [] },
+    group: { default: "" }
   },
   parseDOM: [
     {
       tag: "p.extract-poetry",
       getAttrs(hook, next) {
         Object.assign(hook, {
-          track: SchemaHelpers.parseTracks(hook.dom.dataset.track)
+          id: hook.dom.dataset.id,
+          track: SchemaHelpers.parseTracks(hook.dom.dataset.track),
+          group: hook.dom.dataset.group
         });
         next();
       }
@@ -22,7 +26,9 @@ const extractPoetry = {
   toDOM(hook, next) {
     if (hook.node.attrs.track.length) {
       Object.assign(hook.value[1], {
-        "data-track": JSON.stringify(hook.node.attrs.track)
+        "data-id": hook.node.attrs.id,
+        "data-track": JSON.stringify(hook.node.attrs.track),
+        "data-group": hook.node.attrs.group
       });
     }
     next();
diff --git a/wax-prosemirror-schema/src/nodes/trackChangesNodes/extractProseTrackNode.js b/wax-prosemirror-schema/src/nodes/trackChangesNodes/extractProseTrackNode.js
index 3d097662d0d416f441735bd59a085e3b104b81c7..83d9bda493c84dd53f96423beb3e4c3aae914462 100644
--- a/wax-prosemirror-schema/src/nodes/trackChangesNodes/extractProseTrackNode.js
+++ b/wax-prosemirror-schema/src/nodes/trackChangesNodes/extractProseTrackNode.js
@@ -6,14 +6,18 @@ const extractProse = {
   priority: 0,
   defining: true,
   attrs: {
-    track: { default: [] }
+    id: { default: "" },
+    track: { default: [] },
+    group: { default: "" }
   },
   parseDOM: [
     {
       tag: "p.extract-prose",
       getAttrs(hook, next) {
         Object.assign(hook, {
-          track: SchemaHelpers.parseTracks(hook.dom.dataset.track)
+          id: hook.dom.dataset.id,
+          track: SchemaHelpers.parseTracks(hook.dom.dataset.track),
+          group: hook.dom.dataset.group
         });
         next();
       }
@@ -22,7 +26,9 @@ const extractProse = {
   toDOM(hook, next) {
     if (hook.node.attrs.track.length) {
       Object.assign(hook.value[1], {
-        "data-track": JSON.stringify(hook.node.attrs.track)
+        "data-id": hook.node.attrs.id,
+        "data-track": JSON.stringify(hook.node.attrs.track),
+        "data-group": hook.node.attrs.group
       });
     }
     next();
diff --git a/wax-prosemirror-schema/src/nodes/trackChangesNodes/headingTrackNode.js b/wax-prosemirror-schema/src/nodes/trackChangesNodes/headingTrackNode.js
index 9f97c4bc7b1efbbf5b6c22769789fc640cd51280..55be2a66ac193dfde9ceb1173573cf41108c1b9e 100644
--- a/wax-prosemirror-schema/src/nodes/trackChangesNodes/headingTrackNode.js
+++ b/wax-prosemirror-schema/src/nodes/trackChangesNodes/headingTrackNode.js
@@ -2,7 +2,9 @@ import { SchemaHelpers } from "wax-prosemirror-utilities";
 
 const heading = {
   attrs: {
-    track: { default: [] }
+    id: { default: "" },
+    track: { default: [] },
+    group: { default: "" }
   },
   content: "inline*",
   group: "block",
@@ -12,7 +14,9 @@ const heading = {
       tag: "h1",
       getAttrs(hook, next) {
         Object.assign(hook, {
-          track: SchemaHelpers.parseTracks(hook.dom.dataset.track)
+          id: hook.dom.dataset.id,
+          track: SchemaHelpers.parseTracks(hook.dom.dataset.track),
+          group: hook.dom.dataset.group
         });
         next();
       }
@@ -21,7 +25,9 @@ const heading = {
       tag: "h2",
       getAttrs(hook, next) {
         Object.assign(hook, {
-          track: SchemaHelpers.parseTracks(hook.dom.dataset.track)
+          id: hook.dom.dataset.id,
+          track: SchemaHelpers.parseTracks(hook.dom.dataset.track),
+          group: hook.dom.dataset.group
         });
         next();
       }
@@ -30,7 +36,9 @@ const heading = {
       tag: "h3",
       getAttrs(hook, next) {
         Object.assign(hook, {
-          track: SchemaHelpers.parseTracks(hook.dom.dataset.track)
+          id: hook.dom.dataset.id,
+          track: SchemaHelpers.parseTracks(hook.dom.dataset.track),
+          group: hook.dom.dataset.group
         });
         next();
       }
@@ -39,7 +47,9 @@ const heading = {
   toDOM(hook, next) {
     if (hook.node.attrs.track.length) {
       Object.assign(hook.value[1], {
-        "data-track": JSON.stringify(hook.node.attrs.track)
+        "data-id": hook.node.attrs.id,
+        "data-track": JSON.stringify(hook.node.attrs.track),
+        "data-group": hook.node.attrs.group
       });
     }
     next();
diff --git a/wax-prosemirror-schema/src/nodes/trackChangesNodes/orderedListTrackNode.js b/wax-prosemirror-schema/src/nodes/trackChangesNodes/orderedListTrackNode.js
index bdb3840b97f5a943460e70557825876aab562a66..a4214da44d0fc2b9fb84141c968cee15b2bab89d 100644
--- a/wax-prosemirror-schema/src/nodes/trackChangesNodes/orderedListTrackNode.js
+++ b/wax-prosemirror-schema/src/nodes/trackChangesNodes/orderedListTrackNode.js
@@ -4,14 +4,18 @@ const orderedlist = {
   group: "block",
   content: "list_item+",
   attrs: {
-    track: { default: [] }
+    id: { default: "" },
+    track: { default: [] },
+    group: { default: "" }
   },
   parseDOM: [
     {
       tag: "ol",
       getAttrs(hook, next) {
         Object.assign(hook, {
-          track: SchemaHelpers.parseTracks(hook.dom.dataset.track)
+          id: hook.dom.dataset.id,
+          track: SchemaHelpers.parseTracks(hook.dom.dataset.track),
+          group: hook.dom.dataset.group
         });
         next();
       }
@@ -20,7 +24,9 @@ const orderedlist = {
   toDOM(hook, next) {
     if (hook.node.attrs.track.length) {
       Object.assign(hook.value[1], {
-        "data-track": JSON.stringify(hook.node.attrs.track)
+        "data-id": hook.node.attrs.id,
+        "data-track": JSON.stringify(hook.node.attrs.track),
+        "data-group": hook.node.attrs.group
       });
     }
     next();
diff --git a/wax-prosemirror-schema/src/nodes/trackChangesNodes/paragraphContTrackNode.js b/wax-prosemirror-schema/src/nodes/trackChangesNodes/paragraphContTrackNode.js
index 4443b04b29ed46bfe1e9ec1bfd32b202a0eed732..3bc477abf0276a19fe589ea4720ea7f21875e4ad 100644
--- a/wax-prosemirror-schema/src/nodes/trackChangesNodes/paragraphContTrackNode.js
+++ b/wax-prosemirror-schema/src/nodes/trackChangesNodes/paragraphContTrackNode.js
@@ -6,14 +6,18 @@ const paragraphCont = {
   priority: 0,
   defining: true,
   attrs: {
-    track: { default: [] }
+    id: { default: "" },
+    track: { default: [] },
+    group: { default: "" }
   },
   parseDOM: [
     {
       tag: "p.paragraph-cont",
       getAttrs(hook, next) {
         Object.assign(hook, {
-          track: SchemaHelpers.parseTracks(hook.dom.dataset.track)
+          id: hook.dom.dataset.id,
+          track: SchemaHelpers.parseTracks(hook.dom.dataset.track),
+          group: hook.dom.dataset.group
         });
         next();
       }
@@ -22,7 +26,9 @@ const paragraphCont = {
   toDOM(hook, next) {
     if (hook.node.attrs.track.length) {
       Object.assign(hook.value[1], {
-        "data-track": JSON.stringify(hook.node.attrs.track)
+        "data-id": hook.node.attrs.id,
+        "data-track": JSON.stringify(hook.node.attrs.track),
+        "data-group": hook.node.attrs.group
       });
     }
     next();
diff --git a/wax-prosemirror-schema/src/nodes/trackChangesNodes/sourceNoteTrackNode.js b/wax-prosemirror-schema/src/nodes/trackChangesNodes/sourceNoteTrackNode.js
index d09938b4470b907a060b446be41f2650c8cfddb4..cf9437b3c0dee938b6d47a1eb15f30fa19b3571f 100644
--- a/wax-prosemirror-schema/src/nodes/trackChangesNodes/sourceNoteTrackNode.js
+++ b/wax-prosemirror-schema/src/nodes/trackChangesNodes/sourceNoteTrackNode.js
@@ -6,14 +6,18 @@ const sourceNote = {
   priority: 0,
   defining: true,
   attrs: {
-    track: { default: [] }
+    id: { default: "" },
+    track: { default: [] },
+    group: { default: "" }
   },
   parseDOM: [
     {
       tag: "p.source-note",
       getAttrs(hook, next) {
         Object.assign(hook, {
-          track: SchemaHelpers.parseTracks(hook.dom.dataset.track)
+          id: hook.dom.dataset.id,
+          track: SchemaHelpers.parseTracks(hook.dom.dataset.track),
+          group: hook.dom.dataset.group
         });
         next();
       }
@@ -22,7 +26,9 @@ const sourceNote = {
   toDOM(hook, next) {
     if (hook.node.attrs.track.length) {
       Object.assign(hook.value[1], {
-        "data-track": JSON.stringify(hook.node.attrs.track)
+        "data-id": hook.node.attrs.id,
+        "data-track": JSON.stringify(hook.node.attrs.track),
+        "data-group": hook.node.attrs.group
       });
     }
     next();
diff --git a/wax-prosemirror-schema/src/nodes/trackChangesNodes/subTitleTrackNode.js b/wax-prosemirror-schema/src/nodes/trackChangesNodes/subTitleTrackNode.js
index e89a2e8402e8c8b63921c245f116e4aea48ce25c..c2d21e6124556dfc41efd55eed8c91927f878295 100644
--- a/wax-prosemirror-schema/src/nodes/trackChangesNodes/subTitleTrackNode.js
+++ b/wax-prosemirror-schema/src/nodes/trackChangesNodes/subTitleTrackNode.js
@@ -6,14 +6,18 @@ const subtitle = {
   priority: 0,
   defining: true,
   attrs: {
-    track: { default: [] }
+    id: { default: "" },
+    track: { default: [] },
+    group: { default: "" }
   },
   parseDOM: [
     {
       tag: "p.cst",
       getAttrs(hook, next) {
         Object.assign(hook, {
-          track: SchemaHelpers.parseTracks(hook.dom.dataset.track)
+          id: hook.dom.dataset.id,
+          track: SchemaHelpers.parseTracks(hook.dom.dataset.track),
+          group: hook.dom.dataset.group
         });
         next();
       }
@@ -22,7 +26,9 @@ const subtitle = {
   toDOM(hook, next) {
     if (hook.node.attrs.track.length) {
       Object.assign(hook.value[1], {
-        "data-track": JSON.stringify(hook.node.attrs.track)
+        "data-id": hook.node.attrs.id,
+        "data-track": JSON.stringify(hook.node.attrs.track),
+        "data-group": hook.node.attrs.group
       });
     }
     next();
diff --git a/wax-prosemirror-schema/src/nodes/trackChangesNodes/titleTrackNode.js b/wax-prosemirror-schema/src/nodes/trackChangesNodes/titleTrackNode.js
index 02c835d435804eb51e56db2919842c5dfe4a9cdd..81de595b527ab4a1761d3abaab3cd353480f2343 100644
--- a/wax-prosemirror-schema/src/nodes/trackChangesNodes/titleTrackNode.js
+++ b/wax-prosemirror-schema/src/nodes/trackChangesNodes/titleTrackNode.js
@@ -6,14 +6,18 @@ const title = {
   priority: 0,
   defining: true,
   attrs: {
-    track: { default: [] }
+    id: { default: "" },
+    track: { default: [] },
+    group: { default: "" }
   },
   parseDOM: [
     {
       tag: "p.title",
       getAttrs(hook, next) {
         Object.assign(hook, {
-          track: SchemaHelpers.parseTracks(hook.dom.dataset.track)
+          id: hook.dom.dataset.id,
+          track: SchemaHelpers.parseTracks(hook.dom.dataset.track),
+          group: hook.dom.dataset.group
         });
         next();
       }
@@ -22,7 +26,9 @@ const title = {
   toDOM(hook, next) {
     if (hook.node.attrs.track.length) {
       Object.assign(hook.value[1], {
-        "data-track": JSON.stringify(hook.node.attrs.track)
+        "data-id": hook.node.attrs.id,
+        "data-track": JSON.stringify(hook.node.attrs.track),
+        "data-group": hook.node.attrs.group
       });
     }
     next();
diff --git a/wax-prosemirror-services/package.json b/wax-prosemirror-services/package.json
index 01681fa80ffc857e22fb6db876e1e0e3c96c8acd..f639604af144dc8009c83b952919699f4f29c897 100644
--- a/wax-prosemirror-services/package.json
+++ b/wax-prosemirror-services/package.json
@@ -10,6 +10,8 @@
     "build": "BABEL_ENV=production rollup -c"
   },
   "dependencies": {
+    "react": "^16.13.1",
+    "react-dom": "^16.13.1",
     "inversify": "^5.0.1",
     "inversify-inject-decorators": "^3.1.0",
     "styled-components": "^4.2.0",
diff --git a/wax-prosemirror-services/src/CommentsService/CommentsService.js b/wax-prosemirror-services/src/CommentsService/CommentsService.js
index ad91909f20c428a62370ecc444d045ab91065b03..96d9ef630a477dbbfcfa9fae7f352f6327a16ccb 100644
--- a/wax-prosemirror-services/src/CommentsService/CommentsService.js
+++ b/wax-prosemirror-services/src/CommentsService/CommentsService.js
@@ -1,9 +1,6 @@
 import Service from "../Service";
 import { commentMark } from "wax-prosemirror-schema";
-import {
-  CommentComponent,
-  CommentBubbleComponent
-} from "wax-prosemirror-components";
+import { RightArea, CommentBubbleComponent } from "wax-prosemirror-components";
 import { ActiveComment } from "wax-prosemirror-plugins";
 
 const PLUGIN_KEY = "activeComment";
@@ -27,7 +24,7 @@ export default class CommentsService extends Service {
         selection: true
       }
     );
-    layout.addComponent("commentsArea", CommentComponent);
+    layout.addComponent("rightArea", RightArea);
   }
 
   register() {
diff --git a/wax-prosemirror-services/src/SchemaService/DefaultSchema.js b/wax-prosemirror-services/src/SchemaService/DefaultSchema.js
index 88b4f88c11c767cfa005f0eb18c9de88ae13ec90..23653b144e7c4f1ba734999afe5ddecba5bb721f 100644
--- a/wax-prosemirror-services/src/SchemaService/DefaultSchema.js
+++ b/wax-prosemirror-services/src/SchemaService/DefaultSchema.js
@@ -21,16 +21,20 @@ export default {
       group: "block",
       content: "inline*",
       attrs: {
+        id: { default: "" },
         class: { default: "paragraph" },
-        track: { default: [] }
+        track: { default: [] },
+        group: { default: "" }
       },
       parseDOM: [
         {
           tag: "p.paragraph",
           getAttrs(dom) {
             return {
+              id: dom.dataset.id,
               class: dom.getAttribute("class"),
-              track: SchemaHelpers.parseTracks(dom.dataset.track)
+              track: SchemaHelpers.parseTracks(dom.dataset.track),
+              group: dom.dataset.group
             };
           }
         }
diff --git a/wax-prosemirror-services/src/TrackChangeService/track-changes/markWrapping.js b/wax-prosemirror-services/src/TrackChangeService/track-changes/markWrapping.js
index 9e1ebc7cfbeb9ba3cff843f71e199a9b0dbeffde..e15856960572a4d2f080101551c63f2ca75e991b 100644
--- a/wax-prosemirror-services/src/TrackChangeService/track-changes/markWrapping.js
+++ b/wax-prosemirror-services/src/TrackChangeService/track-changes/markWrapping.js
@@ -1,3 +1,5 @@
+import { v4 as uuidv4 } from "uuid";
+
 const markWrapping = (tr, pos, oldNode, newNode, user, username, date1) => {
   let track = oldNode.attrs.track.slice(),
     blockTrack = track.find(track => track.type === "block_change");
@@ -36,7 +38,11 @@ const markWrapping = (tr, pos, oldNode, newNode, user, username, date1) => {
 
     track.push(blockTrack);
   }
-  tr.setNodeMarkup(pos, null, Object.assign({}, newNode.attrs, { track }));
+  tr.setNodeMarkup(
+    pos,
+    null,
+    Object.assign({}, newNode.attrs, { id: uuidv4(), track })
+  );
 };
 
 export default markWrapping;
diff --git a/wax-prosemirror-utilities/src/schema/SchemaHelpers.js b/wax-prosemirror-utilities/src/schema/SchemaHelpers.js
index fc773c2db35005ac17ae27a63a9b1ede15b24e34..40cac9e012a537675757e8afc68e529a7849e209 100644
--- a/wax-prosemirror-utilities/src/schema/SchemaHelpers.js
+++ b/wax-prosemirror-utilities/src/schema/SchemaHelpers.js
@@ -40,8 +40,10 @@ const parseTracks = str => {
 const blockLevelToDOM = node => {
   const attrs = node.attrs.track.length
     ? {
+        "data-id": node.attrs.id,
         class: node.attrs.class,
-        "data-track": JSON.stringify(node.attrs.track)
+        "data-track": JSON.stringify(node.attrs.track),
+        "data-group": node.attrs.group
       }
     : { class: node.attrs.class };
   return attrs;