diff --git a/editors/editoria/package.json b/editors/editoria/package.json
index 90fa15e12903e9c66e70432df752d9c0a73c047c..1c606034b2337af1871021140c29b208a76cd106 100644
--- a/editors/editoria/package.json
+++ b/editors/editoria/package.json
@@ -9,9 +9,11 @@
     "react-dom": "^16.8.6",
     "styled-components": "^4.2.0",
     "wax-prosemirror-components": "^0.0.3",
+    "wax-prosemirror-services": "^0.0.3",
     "wax-prosemirror-core": "^0.0.3",
     "wax-prosemirror-layouts": "^0.0.3",
     "wax-prosemirror-themes": "^0.0.3",
+    "wax-prosemirror-plugins": "^0.0.3",
     "babel-plugin-parameter-decorator": "1.0.12"
   },
   "scripts": {
diff --git a/editors/editoria/src/Editoria.js b/editors/editoria/src/Editoria.js
index ddce2216ca054016c343d7a13735474f0fd96285..78e16814bd68efc099e284860f5da7e26ed593a7 100644
--- a/editors/editoria/src/Editoria.js
+++ b/editors/editoria/src/Editoria.js
@@ -48,7 +48,9 @@ const Editoria = () => (
       autoFocus
       placeholder="Type Something..."
       fileUpload={file => renderImage(file)}
-      value="<p> this is some text and some more</p>"
+      value={
+        '<p class="paragraph">this is some text <a href="www.sss.ff" >some</a> more</p>'
+      }
       layout={EditoriaLayout}
       user={user}
       // onChange={content => {
diff --git a/wax-prosemirror-core/index.js b/wax-prosemirror-core/index.js
index 3b761a2640914a896c09c25399aeefae9447f7bb..a2fc67c75f2c4c482b87ff66aa36f72b6ecde5d9 100644
--- a/wax-prosemirror-core/index.js
+++ b/wax-prosemirror-core/index.js
@@ -1,4 +1,6 @@
 export { default as Wax } from "./src/Wax";
 export { default as Service } from "./src/services/Service";
 export { default as WaxContext } from "./src/ioc-react";
-export { default as componentPlugin } from "./src/services/LayoutService/components/componentPlugin";
+export {
+  default as componentPlugin
+} from "./src/services/LayoutService/components/componentPlugin";
diff --git a/wax-prosemirror-core/package.json b/wax-prosemirror-core/package.json
index d4ccd8fd9a84bd2cb385ce6c8497d954c4283fdb..bdb2a9aa5e6ae8e88ff699dae20870a20258fb07 100644
--- a/wax-prosemirror-core/package.json
+++ b/wax-prosemirror-core/package.json
@@ -27,7 +27,6 @@
     "inversify": "^5.0.1",
     "inversify-inject-decorators": "^3.1.0",
     "reflect-metadata": "^0.1.13",
-    "wax-prosemirror-services": "^0.0.3",
     "deepmerge": "^4.2.2"
   },
   "devDependencies": {
diff --git a/wax-prosemirror-core/src/WaxView.js b/wax-prosemirror-core/src/WaxView.js
index a327326039c6c21724366e5c42028321f32972c6..9d2ce10f9f21e706af628958faa0f916eaf81ebb 100644
--- a/wax-prosemirror-core/src/WaxView.js
+++ b/wax-prosemirror-core/src/WaxView.js
@@ -15,7 +15,7 @@ import trackedTransaction from "./track-changes/trackedTransaction";
 import { WaxContext } from "./ioc-react";
 
 export default props => {
-  const { readonly, onBlur, options, debug, autoFocus } = props;
+  const { readonly, onBlur, options, debug, autoFocus, user } = props;
   const editorRef = useRef();
 
   const context = useContext(WaxContext);
@@ -29,7 +29,7 @@ export default props => {
         dispatchTransaction: transaction => {
           const { TrackChange } = props;
           const tr = TrackChange
-            ? trackedTransaction(transaction, view.state, this)
+            ? trackedTransaction(transaction, view.state, user)
             : transaction;
 
           const state = view.state.apply(tr);
diff --git a/wax-prosemirror-core/src/services/LayoutService/LayoutService.js b/wax-prosemirror-core/src/services/LayoutService/LayoutService.js
index 38183390157414490b8c1d55831050cb81c56625..872feec5bfcba3afda88c368a4ec9b8b3ae857fa 100644
--- a/wax-prosemirror-core/src/services/LayoutService/LayoutService.js
+++ b/wax-prosemirror-core/src/services/LayoutService/LayoutService.js
@@ -1,5 +1,6 @@
 import Service from "../Service";
 import Layout from "./Layout";
+
 export default class LayoutService extends Service {
   name = "LayoutService";
 
diff --git a/wax-prosemirror-core/src/track-changes/trackedTransaction.js b/wax-prosemirror-core/src/track-changes/trackedTransaction.js
index f171a0bfc5e704156dc1d493d6d1c31d1132c86e..8f98b7f69a7cbbb7bfe3808ea7095906ab931f28 100644
--- a/wax-prosemirror-core/src/track-changes/trackedTransaction.js
+++ b/wax-prosemirror-core/src/track-changes/trackedTransaction.js
@@ -13,7 +13,7 @@ import markDeletion from "./markDeletion";
 import markInsertion from "./markInsertion";
 import markWrapping from "./markWrapping";
 
-const trackedTransaction = (tr, state, editor) => {
+const trackedTransaction = (tr, state, currentUser) => {
   if (
     !tr.steps.length ||
     (tr.meta &&
@@ -25,7 +25,7 @@ const trackedTransaction = (tr, state, editor) => {
   ) {
     return tr;
   }
-  const user = editor.props.user.userId,
+  const user = currentUser.userId,
     approved = false,
     // !editor.view.state.doc.firstChild.attrs.tracked &&
     // editor.docInfo.access_rights !== "write-tracked",
@@ -34,7 +34,7 @@ const trackedTransaction = (tr, state, editor) => {
     exactDate = Date.now(),
     date10 = Math.floor(exactDate / 600000) * 10, // 10 minute interval
     date1 = Math.floor(exactDate / 60000), // 1 minute interval
-    username = editor.props.user.username,
+    username = currentUser.username,
     // We only insert content if this is not directly a tr for cell deletion. This is because tables delete rows by deleting the
     // contents of each cell and replacing it with an empty paragraph.
     cellDeleteTr =
@@ -48,7 +48,9 @@ const trackedTransaction = (tr, state, editor) => {
     if (!step) {
       return;
     }
-    if (step instanceof ReplaceStep) {
+
+    //if (step instanceof ReplaceStep) {
+    if (step.jsonID === "replace") {
       const newStep = approved
         ? step
         : step.slice.size && !cellDeleteTr
@@ -66,6 +68,7 @@ const trackedTransaction = (tr, state, editor) => {
         if (trTemp.maybeStep(newStep).failed) {
           return;
         }
+
         const mappedNewStepTo = newStep.getMap().map(newStep.to);
         markInsertion(
           trTemp,
diff --git a/wax-prosemirror-schema/src/marks/linkMark.js b/wax-prosemirror-schema/src/marks/linkMark.js
index 1acb5dcc35216bd25089ebf5d9de8ee164b157eb..4c23c57a88a6f79475a5efc8021997a6f990728e 100644
--- a/wax-prosemirror-schema/src/marks/linkMark.js
+++ b/wax-prosemirror-schema/src/marks/linkMark.js
@@ -9,14 +9,15 @@ const link = {
   parseDOM: [
     {
       tag: "a[href]",
-      getAttrs: dom => {
-        const href = dom.getAttribute("href");
+      getAttrs(hook, next) {
+        const href = hook.dom.getAttribute("href");
         const target = href && href.indexOf("#") === 0 ? "" : "blank";
-        return {
-          href: dom.getAttribute("href"),
-          title: dom.getAttribute("title"),
+        Object.assign(hook, {
+          href: hook.dom.getAttribute("href"),
+          title: hook.dom.getAttribute("title"),
           target
-        };
+        });
+        next();
       }
     }
   ],
diff --git a/wax-prosemirror-services/package.json b/wax-prosemirror-services/package.json
index d9abe7c97389b2e14ba9f18ec542365c7f7f65a1..1d9c3f2bd43c77b43f92ebff1c0cbaa4af2dfaa5 100644
--- a/wax-prosemirror-services/package.json
+++ b/wax-prosemirror-services/package.json
@@ -11,8 +11,8 @@
   "dependencies": {
     "inversify": "^5.0.1",
     "inversify-inject-decorators": "^3.1.0",
-    "wax-prosemirror-components": "^0.0.3",
     "wax-prosemirror-core": "^0.0.3",
+    "wax-prosemirror-components": "^0.0.3",
     "wax-prosemirror-layouts": "^0.0.3",
     "styled-components": "^4.2.0"
   }
diff --git a/wax-prosemirror-services/src/DisplayBlockLevel/TitleService/Title.js b/wax-prosemirror-services/src/DisplayBlockLevel/TitleService/Title.js
index 94c85205fdefdce0793fe1be02d8c14364ea7fee..9f77b510ceca3a802dc4ee14dca643ac5fa669bc 100644
--- a/wax-prosemirror-services/src/DisplayBlockLevel/TitleService/Title.js
+++ b/wax-prosemirror-services/src/DisplayBlockLevel/TitleService/Title.js
@@ -1,7 +1,6 @@
 import Tools from "../../lib/Tools";
 import { injectable } from "inversify";
 import { setBlockType } from "prosemirror-commands";
-import { blockActive } from "../../lib/Utils";
 
 @injectable()
 export default class Title extends Tools {
diff --git a/wax-prosemirror-services/src/ImageService/Image.js b/wax-prosemirror-services/src/ImageService/Image.js
index 41d4a1ba69a5640f492281abc548e89009bc2c8d..e4cd287c48ff007a4428339cc3927175638e2b30 100644
--- a/wax-prosemirror-services/src/ImageService/Image.js
+++ b/wax-prosemirror-services/src/ImageService/Image.js
@@ -4,7 +4,7 @@ import { isEmpty } from "lodash";
 import { injectable } from "inversify";
 import { icons, ImageUpload } from "wax-prosemirror-components";
 import Tools from "../lib/Tools";
-import { canInsert } from "../lib/Utils";
+import { Commands } from "wax-prosemirror-utilities";
 import fileUpload from "./fileUpload";
 
 @injectable()
@@ -18,7 +18,7 @@ export default class Image extends Tools {
 
   get enable() {
     return state => {
-      return canInsert(state.config.schema.nodes.image)(state);
+      return Commands.canInsert(state.config.schema.nodes.image)(state);
     };
   }
 
diff --git a/wax-prosemirror-services/src/InlineAnnotations/CodeService/Code.js b/wax-prosemirror-services/src/InlineAnnotations/CodeService/Code.js
index 61887249a4c332293482402b79f9609392391ce7..ba88b541c0b58bb0d2485e681af6a1a1adfa4c01 100644
--- a/wax-prosemirror-services/src/InlineAnnotations/CodeService/Code.js
+++ b/wax-prosemirror-services/src/InlineAnnotations/CodeService/Code.js
@@ -1,5 +1,5 @@
 import { toggleMark } from "prosemirror-commands";
-import { markActive } from "../../lib/Utils";
+import { Commands } from "wax-prosemirror-utilities";
 import Tools from "../../lib/Tools";
 import { injectable } from "inversify";
 import { icons } from "wax-prosemirror-components";
@@ -17,7 +17,7 @@ export default class Code extends Tools {
 
   get active() {
     return state => {
-      return markActive(state.config.schema.marks.code)(state);
+      return Commands.markActive(state.config.schema.marks.code)(state);
     };
   }
 }
diff --git a/wax-prosemirror-services/src/InlineAnnotations/EmphasisService/Emphasis.js b/wax-prosemirror-services/src/InlineAnnotations/EmphasisService/Emphasis.js
index 21f977f7afa47e192c485d870769704b00fd18b9..e248a1604c6ed67b02a669fe8f3786181be91d8a 100644
--- a/wax-prosemirror-services/src/InlineAnnotations/EmphasisService/Emphasis.js
+++ b/wax-prosemirror-services/src/InlineAnnotations/EmphasisService/Emphasis.js
@@ -1,5 +1,5 @@
 import { toggleMark } from "prosemirror-commands";
-import { markActive } from "../../lib/Utils";
+import { Commands } from "wax-prosemirror-utilities";
 import Tools from "../../lib/Tools";
 import { injectable } from "inversify";
 import { icons } from "wax-prosemirror-components";
@@ -17,7 +17,7 @@ export default class Emphasis extends Tools {
 
   get active() {
     return state => {
-      return markActive(state.config.schema.marks.em)(state);
+      return Commands.markActive(state.config.schema.marks.em)(state);
     };
   }
 }
diff --git a/wax-prosemirror-services/src/InlineAnnotations/SmallCapsService/SmallCaps.js b/wax-prosemirror-services/src/InlineAnnotations/SmallCapsService/SmallCaps.js
index 34162290c3616fca12487206bfb7f569aa6173a6..e424113e576d202c11e81da91a13707a9be47f9a 100644
--- a/wax-prosemirror-services/src/InlineAnnotations/SmallCapsService/SmallCaps.js
+++ b/wax-prosemirror-services/src/InlineAnnotations/SmallCapsService/SmallCaps.js
@@ -1,5 +1,5 @@
 import { toggleMark } from "prosemirror-commands";
-import { markActive } from "../../lib/Utils";
+import { Commands } from "wax-prosemirror-utilities";
 import Tools from "../../lib/Tools";
 import { injectable } from "inversify";
 import { icons } from "wax-prosemirror-components";
@@ -17,7 +17,7 @@ export default class SmallCaps extends Tools {
 
   get active() {
     return state => {
-      return markActive(state.config.schema.marks.smallcaps)(state);
+      return Commands.markActive(state.config.schema.marks.smallcaps)(state);
     };
   }
 }
diff --git a/wax-prosemirror-services/src/InlineAnnotations/StrikeThroughService/StrikeThrough.js b/wax-prosemirror-services/src/InlineAnnotations/StrikeThroughService/StrikeThrough.js
index ef38b0a08335971695994a353245547f8a198b29..60b3be5674f90452c9906f61e624d3c3598503ee 100644
--- a/wax-prosemirror-services/src/InlineAnnotations/StrikeThroughService/StrikeThrough.js
+++ b/wax-prosemirror-services/src/InlineAnnotations/StrikeThroughService/StrikeThrough.js
@@ -1,5 +1,5 @@
 import { toggleMark } from "prosemirror-commands";
-import { markActive } from "../../lib/Utils";
+import { Commands } from "wax-prosemirror-utilities";
 import Tools from "../../lib/Tools";
 import { injectable } from "inversify";
 import { icons } from "wax-prosemirror-components";
@@ -17,7 +17,9 @@ export default class StrikeThrough extends Tools {
 
   get active() {
     return state => {
-      return markActive(state.config.schema.marks.strikethrough)(state);
+      return Commands.markActive(state.config.schema.marks.strikethrough)(
+        state
+      );
     };
   }
 }
diff --git a/wax-prosemirror-services/src/InlineAnnotations/StrongService/Strong.js b/wax-prosemirror-services/src/InlineAnnotations/StrongService/Strong.js
index c2f94db1e94422520cecb062e55457988ea12d6b..989f238a202e87c833a1ff3564dda91fc85db9c0 100644
--- a/wax-prosemirror-services/src/InlineAnnotations/StrongService/Strong.js
+++ b/wax-prosemirror-services/src/InlineAnnotations/StrongService/Strong.js
@@ -1,5 +1,5 @@
 import { toggleMark } from "prosemirror-commands";
-import { markActive } from "../../lib/Utils";
+import { Commands } from "wax-prosemirror-utilities";
 import Tools from "../../lib/Tools";
 import { injectable } from "inversify";
 import { icons } from "wax-prosemirror-components";
@@ -17,7 +17,7 @@ export default class Strong extends Tools {
 
   get active() {
     return state => {
-      return markActive(state.config.schema.marks.strong)(state);
+      return Commands.markActive(state.config.schema.marks.strong)(state);
     };
   }
 }
diff --git a/wax-prosemirror-services/src/InlineAnnotations/SubscriptService/Subscript.js b/wax-prosemirror-services/src/InlineAnnotations/SubscriptService/Subscript.js
index 53ef5fc7487d8a03d445475108a7b716bc002e3b..9bfd47526d644e0b2ad386f3ef1ea86790308749 100644
--- a/wax-prosemirror-services/src/InlineAnnotations/SubscriptService/Subscript.js
+++ b/wax-prosemirror-services/src/InlineAnnotations/SubscriptService/Subscript.js
@@ -1,5 +1,5 @@
 import { toggleMark } from "prosemirror-commands";
-import { markActive } from "../../lib/Utils";
+import { Commands } from "wax-prosemirror-utilities";
 import Tools from "../../lib/Tools";
 import { injectable } from "inversify";
 import { icons } from "wax-prosemirror-components";
@@ -17,7 +17,7 @@ export default class Subscript extends Tools {
 
   get active() {
     return state => {
-      return markActive(state.config.schema.marks.subscript)(state);
+      return Commands.markActive(state.config.schema.marks.subscript)(state);
     };
   }
 }
diff --git a/wax-prosemirror-services/src/InlineAnnotations/SuperscriptService/Superscript.js b/wax-prosemirror-services/src/InlineAnnotations/SuperscriptService/Superscript.js
index 9063597cd6496888b46fa2dd93f996f230ed55dc..f502bbf7cad0b3572ccbed451d7f9c013c506e71 100644
--- a/wax-prosemirror-services/src/InlineAnnotations/SuperscriptService/Superscript.js
+++ b/wax-prosemirror-services/src/InlineAnnotations/SuperscriptService/Superscript.js
@@ -1,5 +1,5 @@
 import { toggleMark } from "prosemirror-commands";
-import { markActive } from "../../lib/Utils";
+import { Commands } from "wax-prosemirror-utilities";
 import Tools from "../../lib/Tools";
 import { injectable } from "inversify";
 import { icons } from "wax-prosemirror-components";
@@ -17,7 +17,7 @@ export default class Superscript extends Tools {
 
   get active() {
     return state => {
-      return markActive(state.config.schema.marks.superscript)(state);
+      return Commands.markActive(state.config.schema.marks.superscript)(state);
     };
   }
 }
diff --git a/wax-prosemirror-services/src/InlineAnnotations/UnderlineService/Underline.js b/wax-prosemirror-services/src/InlineAnnotations/UnderlineService/Underline.js
index 1c1026b9c8261a558a0ca4d5a635d6f9e5d7f115..168dcb15f4194f9f1970758044ac1b0a9da969eb 100644
--- a/wax-prosemirror-services/src/InlineAnnotations/UnderlineService/Underline.js
+++ b/wax-prosemirror-services/src/InlineAnnotations/UnderlineService/Underline.js
@@ -1,5 +1,5 @@
 import { toggleMark } from "prosemirror-commands";
-import { markActive } from "../../lib/Utils";
+import { Commands } from "wax-prosemirror-utilities";
 import Tools from "../../lib/Tools";
 import { injectable } from "inversify";
 import { icons } from "wax-prosemirror-components";
@@ -17,7 +17,7 @@ export default class Underline extends Tools {
 
   get active() {
     return state => {
-      return markActive(state.config.schema.marks.underline)(state);
+      return Commands.markActive(state.config.schema.marks.underline)(state);
     };
   }
 }
diff --git a/wax-prosemirror-services/src/LinkService/LinkComponent.js b/wax-prosemirror-services/src/LinkService/LinkComponent.js
index feea49ad2129ac5c1c3751cb0d2d97fd40045a9a..19d7c8267803ba1ce4bc867caef93d1f3665e107 100644
--- a/wax-prosemirror-services/src/LinkService/LinkComponent.js
+++ b/wax-prosemirror-services/src/LinkService/LinkComponent.js
@@ -1,5 +1,7 @@
-import React, { useRef, useEffect } from "react";
+import React, { useRef, useEffect, useState, useContext } from "react";
 import styled from "styled-components";
+import { WaxContext } from "wax-prosemirror-core/src/ioc-react";
+import { DocumentHelpers } from "wax-prosemirror-utilities";
 // import { Button } from "wax-prosemirror-components";
 
 const LinkWrapper = styled.div`
@@ -13,7 +15,15 @@ const LinkWrapper = styled.div`
 const Button = styled.button``;
 
 const LinkComponent = ({ mark, setPosition, position }) => {
-  const ref = useRef(null);
+  const href = mark ? mark.attrs.href : null,
+    linkMark = mark ? mark : null,
+    { view: { main } } = useContext(WaxContext),
+    { state, dispatch } = main,
+    ref = useRef(null),
+    linkInput = useRef(null),
+    [addButtonText, setButtonText] = useState("Create"),
+    [lastLinkMark, setLLastLinkMark] = useState(linkMark),
+    [linkHref, setLinkHref] = useState(href);
 
   useEffect(
     () => {
@@ -21,15 +31,84 @@ const LinkComponent = ({ mark, setPosition, position }) => {
       const left = Math.abs(position.left - width / 2);
 
       setPosition({ ...position, left });
+      setLinkText();
+      removeMarkIfEmptyHref();
     },
-    [ref.current]
+    [ref.current, href]
   );
 
+  const addLink = () => {
+    const href = linkHref;
+    dispatch(
+      state.tr
+        .removeMark(mark.from, mark.to, state.schema.marks.link)
+        .addMark(mark.from, mark.to, state.schema.marks.link.create({ href }))
+    );
+    main.focus();
+  };
+
+  const removeLink = () => {
+    dispatch(state.tr.removeMark(mark.from, mark.to, state.schema.marks.link));
+    main.focus();
+  };
+
+  const handleKeyDown = event => {
+    if (event.key === "Enter" || event.which === 13) {
+      addLink();
+    }
+  };
+
+  const updateLink = () => {
+    const { current: { value } } = linkInput;
+    setLinkHref(value);
+  };
+
+  const setLinkText = () => {
+    if (mark && mark.attrs.href !== "") {
+      setButtonText("Update");
+      setLinkHref(mark.attrs.href);
+    } else {
+      setButtonText("Create");
+      setLinkHref("");
+      if (linkInput.current) linkInput.current.focus();
+    }
+  };
+
+  const removeMarkIfEmptyHref = () => {
+    const { selection: { $from, $to } } = state;
+    const PMLinkMark = state.schema.marks["link"];
+    const actualMark = DocumentHelpers.findMark(state, PMLinkMark);
+    setLLastLinkMark(actualMark);
+
+    if (
+      lastLinkMark.attrs.href === "" &&
+      ($from.pos < lastLinkMark.from || $to.pos > lastLinkMark.to)
+    ) {
+      dispatch(
+        state.tr
+          .setMeta("addToHistory", false)
+          .removeMark(
+            lastLinkMark.from,
+            lastLinkMark.to,
+            state.schema.marks.link
+          )
+      );
+    }
+  };
+
   return mark ? (
     <LinkWrapper ref={ref}>
-      <input type="text" onChange={() => {}} value={mark.attrs.href} />
-      <Button primary>Change</Button>
-      <Button>Cancel</Button>
+      <input
+        type="text"
+        ref={linkInput}
+        onChange={updateLink}
+        onKeyPress={handleKeyDown}
+        value={linkHref}
+      />
+      <Button primary onClick={addLink}>
+        {addButtonText}
+      </Button>
+      <Button onClick={removeLink}>Remove</Button>
     </LinkWrapper>
   ) : null;
 };
diff --git a/wax-prosemirror-services/src/LinkService/LinkTool.js b/wax-prosemirror-services/src/LinkService/LinkTool.js
index 84d61a6cf73d6334c6626d279346157ad897f873..a34f8930135459bd07524272799c604ff0b18d85 100644
--- a/wax-prosemirror-services/src/LinkService/LinkTool.js
+++ b/wax-prosemirror-services/src/LinkService/LinkTool.js
@@ -1,5 +1,5 @@
 import { toggleMark } from "prosemirror-commands";
-import { markActive, promptForURL } from "../lib/Utils";
+import { Commands } from "wax-prosemirror-utilities";
 import Tools from "../lib/Tools";
 import { injectable } from "inversify";
 import { icons } from "wax-prosemirror-components";
@@ -11,12 +11,11 @@ export default class LinkTool extends Tools {
 
   get run() {
     return (state, dispatch) => {
-      if (markActive(state.config.schema.marks.link)(state)) {
+      if (Commands.markActive(state.config.schema.marks.link)(state)) {
         toggleMark(state.config.schema.marks.link)(state, dispatch);
         return true;
       }
-
-      toggleMark(state.config.schema.marks.link, { href: "" })(state, dispatch);
+      Commands.createLink(state, dispatch);
     };
   }
 
@@ -26,7 +25,7 @@ export default class LinkTool extends Tools {
 
   get active() {
     return state => {
-      return markActive(state.config.schema.marks.link)(state);
+      return Commands.markActive(state.config.schema.marks.link)(state);
     };
   }
 }
diff --git a/wax-prosemirror-services/src/ListsService/BulletListService/BulletList.js b/wax-prosemirror-services/src/ListsService/BulletListService/BulletList.js
index 9caea1dc74e9fde36756688d20af42f4075d6eab..80ab99f14769e795af2350193d5e37a3970f5a93 100644
--- a/wax-prosemirror-services/src/ListsService/BulletListService/BulletList.js
+++ b/wax-prosemirror-services/src/ListsService/BulletListService/BulletList.js
@@ -2,7 +2,7 @@ import Tools from "../../lib/Tools";
 import { injectable } from "inversify";
 import { icons } from "wax-prosemirror-components";
 import { wrapInList } from "prosemirror-schema-list";
-import { blockActive } from "../../lib/Utils";
+import { Commands } from "wax-prosemirror-utilities";
 
 @injectable()
 export default class BulletList extends Tools {
@@ -23,7 +23,7 @@ export default class BulletList extends Tools {
 
   get active() {
     return state => {
-      return blockActive(state.config.schema.nodes.bulletlist)(state);
+      return Commands.blockActive(state.config.schema.nodes.bulletlist)(state);
     };
   }
 }
diff --git a/wax-prosemirror-services/src/ListsService/OrderedListService/OrderedList.js b/wax-prosemirror-services/src/ListsService/OrderedListService/OrderedList.js
index cff84727cdd3c4421c297c77091a8348dd53e51b..9f01a6b82605b9517a4686950d2f0cd7a431d3d2 100644
--- a/wax-prosemirror-services/src/ListsService/OrderedListService/OrderedList.js
+++ b/wax-prosemirror-services/src/ListsService/OrderedListService/OrderedList.js
@@ -2,7 +2,7 @@ import Tools from "../../lib/Tools";
 import { injectable } from "inversify";
 import { icons } from "wax-prosemirror-components";
 import { wrapInList } from "prosemirror-schema-list";
-import { blockActive } from "../../lib/Utils";
+import { Commands } from "wax-prosemirror-utilities";
 
 @injectable()
 export default class OrderedList extends Tools {
@@ -23,7 +23,7 @@ export default class OrderedList extends Tools {
 
   get active() {
     return state => {
-      return blockActive(state.config.schema.nodes.orderedlist)(state);
+      return Commands.blockActive(state.config.schema.nodes.orderedlist)(state);
     };
   }
 }
diff --git a/wax-prosemirror-services/src/MenuService/MenuService.js b/wax-prosemirror-services/src/MenuService/MenuService.js
index 8a8f2a92b206d5f68b21c94b6a4bb0a2b58a28cd..9c22785454acb497ad9ed31e9c86017a7810c8f9 100644
--- a/wax-prosemirror-services/src/MenuService/MenuService.js
+++ b/wax-prosemirror-services/src/MenuService/MenuService.js
@@ -3,7 +3,7 @@ import Menu from "./Menu";
 import MenuCollection from "./MenuCollection";
 import Service from "wax-prosemirror-core/src/services/Service";
 
-export default class MenuService extends Service {
+class MenuService extends Service {
   name = "MenuService";
   boot() {
     const { menus } = this.container.get("MenuCollection");
@@ -45,7 +45,9 @@ export default class MenuService extends Service {
             tools.push(tl);
           } catch (error) {
             throw Error(
-              `Could not load Service ${tool.name}. Please configure service through config`
+              `Could not load Service ${
+                tool.name
+              }. Please configure service through config`
             );
           }
         });
@@ -54,3 +56,4 @@ export default class MenuService extends Service {
     });
   }
 }
+export default MenuService;
diff --git a/wax-prosemirror-services/src/NoteService/Editor.js b/wax-prosemirror-services/src/NoteService/Editor.js
index 5f7c4a8522f514fe02fef3c0ecfa0461697446cd..3e6b902dc6f1f00951d80465ff238612936752a0 100644
--- a/wax-prosemirror-services/src/NoteService/Editor.js
+++ b/wax-prosemirror-services/src/NoteService/Editor.js
@@ -5,8 +5,7 @@ import { StepMap } from "prosemirror-transform";
 import { keymap } from "prosemirror-keymap";
 import { undo, redo } from "prosemirror-history";
 import { WaxContext } from "wax-prosemirror-core/src/ioc-react";
-
-import { markActive } from "../lib/Utils";
+import { Commands } from "wax-prosemirror-utilities";
 
 export default ({ node, view, pos }) => {
   const editorRef = useRef();
@@ -23,9 +22,9 @@ export default ({ node, view, pos }) => {
               "Mod-z": () => undo(view.state, view.dispatch),
               "Mod-y": () => redo(view.state, view.dispatch),
               "Mod-u": () =>
-                markActive(noteView.state.config.schema.marks.underline)(
-                  noteView.state
-                )
+                Commands.markActive(
+                  noteView.state.config.schema.marks.underline
+                )(noteView.state)
             })
           ]
         }),
diff --git a/wax-prosemirror-services/src/OverlayService/OverlayService.js b/wax-prosemirror-services/src/OverlayService/OverlayService.js
index 6c156844ecbd8d8a547d84be6801c961a39d00ac..296fcd7612719fe9be7ab00d4e84627ce9273619 100644
--- a/wax-prosemirror-services/src/OverlayService/OverlayService.js
+++ b/wax-prosemirror-services/src/OverlayService/OverlayService.js
@@ -1,5 +1,4 @@
 import Service from "wax-prosemirror-core/src/services/Service";
-
 import OverlayComponent from "./OverlayComponent";
 
 export default class OverlayService extends Service {
diff --git a/wax-prosemirror-services/src/OverlayService/usePosition.js b/wax-prosemirror-services/src/OverlayService/usePosition.js
index e4fe442f46fcca78ac3cd72d0fe3a2c434c9a221..2dfaa600c4d983da79f2200dbe17e224ea4bfaa6 100644
--- a/wax-prosemirror-services/src/OverlayService/usePosition.js
+++ b/wax-prosemirror-services/src/OverlayService/usePosition.js
@@ -1,6 +1,5 @@
 import { useState, useContext, useEffect, useCallback } from "react";
 import { isObject } from "lodash";
-import { markActive, getMarkPosition } from "../lib/Utils";
 import { WaxContext } from "wax-prosemirror-core/src/ioc-react";
 import { DocumentHelpers } from "wax-prosemirror-utilities";
 
diff --git a/wax-prosemirror-services/src/TablesService/EditTableService/TableDropDownOptions.js b/wax-prosemirror-services/src/TablesService/EditTableService/TableDropDownOptions.js
index b9d317b1c0b2a86736872fde3aaa7aca24f3c942..25ea0d5129a0ce955aee3848439b4fb5e06168b0 100644
--- a/wax-prosemirror-services/src/TablesService/EditTableService/TableDropDownOptions.js
+++ b/wax-prosemirror-services/src/TablesService/EditTableService/TableDropDownOptions.js
@@ -4,7 +4,7 @@ import { injectable } from "inversify";
 import { isEmpty } from "lodash";
 import { TableDropDown } from "wax-prosemirror-components";
 import { addColumnBefore } from "prosemirror-tables";
-import { canInsert } from "../../lib/Utils";
+import { Commands } from "wax-prosemirror-utilities";
 import Tools from "../../lib/Tools";
 
 @injectable()
@@ -20,7 +20,7 @@ export default class TableDropDownOptions extends Tools {
 
   get enable() {
     return state => {
-      return canInsert(state.config.schema.nodes.table)(state);
+      return Commands.canInsert(state.config.schema.nodes.table)(state);
     };
   }
 
diff --git a/wax-prosemirror-services/src/TablesService/InsertTableService/Table.js b/wax-prosemirror-services/src/TablesService/InsertTableService/Table.js
index 238c9084ecdb3ffc8cc4003598401d83db04685f..cae1293ff31721cdfcf1022dc4bfd4c26c7faf13 100644
--- a/wax-prosemirror-services/src/TablesService/InsertTableService/Table.js
+++ b/wax-prosemirror-services/src/TablesService/InsertTableService/Table.js
@@ -1,5 +1,5 @@
 import Tools from "../../lib/Tools";
-import { createTable, canInsert } from "../../lib/Utils";
+import { Commands } from "wax-prosemirror-utilities";
 import { injectable } from "inversify";
 import { icons } from "wax-prosemirror-components";
 
@@ -10,13 +10,13 @@ export default class Table extends Tools {
 
   get run() {
     return (state, dispatch) => {
-      return createTable(state, dispatch);
+      return Commands.createTable(state, dispatch);
     };
   }
 
   get enable() {
     return state => {
-      return canInsert(state.config.schema.nodes.table)(state);
+      return Commands.canInsert(state.config.schema.nodes.table)(state);
     };
   }
 }
diff --git a/wax-prosemirror-services/src/lib/ToolGroup.js b/wax-prosemirror-services/src/lib/ToolGroup.js
index 1340e666f8fbfa0e1ae2f9bc57302b2fde3060ea..93ae0ef7d02058e2baafda4730a26e676b76227d 100644
--- a/wax-prosemirror-services/src/lib/ToolGroup.js
+++ b/wax-prosemirror-services/src/lib/ToolGroup.js
@@ -1,6 +1,7 @@
 import React, { useState } from "react";
 import { injectable } from "inversify";
 import { isFunction } from "lodash";
+
 @injectable()
 export default class ToolGroup {
   _config = {};
diff --git a/wax-prosemirror-utilities/index.js b/wax-prosemirror-utilities/index.js
index d2548468a757183ed525e2473a46f7c511dc2d84..6996a4213ca6d4fc2401d8956792d362b931083f 100644
--- a/wax-prosemirror-utilities/index.js
+++ b/wax-prosemirror-utilities/index.js
@@ -1,2 +1,3 @@
 export { default as SchemaHelpers } from "./src/schema/SchemaHelpers";
 export { default as DocumentHelpers } from "./src/document/DocumentHelpers";
+export { default as Commands } from "./src/commands/Commands";
diff --git a/wax-prosemirror-services/src/lib/Utils.js b/wax-prosemirror-utilities/src/commands/Commands.js
similarity index 58%
rename from wax-prosemirror-services/src/lib/Utils.js
rename to wax-prosemirror-utilities/src/commands/Commands.js
index ba2fcf3e5763d746fac41b6577f9e674a88d6312..16d1fb8d68e9f77ccb00a2b2e6a07c26e25cb4f4 100644
--- a/wax-prosemirror-services/src/lib/Utils.js
+++ b/wax-prosemirror-utilities/src/commands/Commands.js
@@ -30,39 +30,6 @@ const canInsert = type => state => {
   return false;
 };
 
-const getMarkPosition = ($start, mark) => {
-  let startIndex = $start.index(),
-    endIndex = $start.indexAfter();
-  while (
-    startIndex > 0 &&
-    mark.isInSet($start.parent.child(startIndex - 1).marks)
-  )
-    startIndex--;
-  while (
-    endIndex < $start.parent.childCount &&
-    mark.isInSet($start.parent.child(endIndex).marks)
-  )
-    endIndex++;
-  let startPos = $start.start(),
-    endPos = startPos;
-  for (let i = 0; i < endIndex; i++) {
-    let size = $start.parent.child(i).nodeSize;
-    if (i < startIndex) startPos += size;
-    endPos += size;
-  }
-  return { from: startPos, to: endPos };
-};
-
-const promptForURL = () => {
-  let url = window && window.prompt("Enter the URL", "https://");
-
-  if (url && !/^https?:\/\//i.test(url)) {
-    url = "http://" + url;
-  }
-
-  return url;
-};
-
 const createTable = (state, dispatch) => {
   let rowCount = window && window.prompt("How many rows?", 2);
   let colCount = window && window.prompt("How many columns?", 2);
@@ -81,11 +48,13 @@ const createTable = (state, dispatch) => {
   dispatch(state.tr.replaceSelectionWith(table));
 };
 
-export {
-  markActive,
-  blockActive,
-  canInsert,
-  promptForURL,
-  createTable,
-  getMarkPosition
+const createLink = (state, dispatch) => {
+  const { selection: { $from, $to } } = state;
+  dispatch(
+    state.tr
+      .setMeta("addToHistory", false)
+      .addMark($from.pos, $to.pos, state.schema.marks.link.create({ href: "" }))
+  );
 };
+
+export default { markActive, blockActive, canInsert, createTable, createLink };