diff --git a/wax-prosemirror-components/src/components/HeadingsDropDown.js b/wax-prosemirror-components/src/components/HeadingsDropDown.js
index 9de03389a084e87ae5fe7e985017909968ba7b25..d4fdcaea747f914ccf1329ba587303778e7d4258 100644
--- a/wax-prosemirror-components/src/components/HeadingsDropDown.js
+++ b/wax-prosemirror-components/src/components/HeadingsDropDown.js
@@ -1,6 +1,6 @@
 import React from "react";
 import styled from "styled-components";
-import { setBlockType } from "prosemirror-commands";
+import { Commands } from "wax-prosemirror-utilities";
 import Dropdown from "react-dropdown";
 import "react-dropdown/style.css";
 
@@ -21,10 +21,9 @@ const HeadingsDropDown = ({ dispatch, state, item }) => (
   <DropdownStyled
     options={dropDownOptions}
     onChange={option => {
-      setBlockType(state.config.schema.nodes.heading, { level: option.value })(
-        state,
-        dispatch
-      );
+      Commands.setBlockType(state.config.schema.nodes.heading, {
+        level: option.value
+      })(state, dispatch);
     }}
     placeholder="Choose heading"
     select={item.select && item.select(state)}
diff --git a/wax-prosemirror-services/src/DisplayBlockLevel/AuthorService/Author.js b/wax-prosemirror-services/src/DisplayBlockLevel/AuthorService/Author.js
index 6be138dd84d3867dcf35a138f1efc71f55025856..e5bbf60a3a99afaf31834fdab52f2c7a2e181d0c 100644
--- a/wax-prosemirror-services/src/DisplayBlockLevel/AuthorService/Author.js
+++ b/wax-prosemirror-services/src/DisplayBlockLevel/AuthorService/Author.js
@@ -1,6 +1,6 @@
 import Tools from "../../lib/Tools";
 import { injectable } from "inversify";
-import { setBlockType } from "prosemirror-commands";
+import { Commands } from "wax-prosemirror-utilities";
 
 @injectable()
 export default class Author extends Tools {
@@ -9,13 +9,13 @@ export default class Author extends Tools {
 
   get run() {
     return (state, dispatch) => {
-      setBlockType(state.config.schema.nodes.author)(state, dispatch);
+      Commands.setBlockType(state.config.schema.nodes.author)(state, dispatch);
     };
   }
 
   get enable() {
     return state => {
-      return setBlockType(state.config.schema.nodes.author)(state);
+      return Commands.setBlockType(state.config.schema.nodes.author)(state);
     };
   }
 }
diff --git a/wax-prosemirror-services/src/DisplayBlockLevel/EpigraphPoetryService/EpigraphPoetry.js b/wax-prosemirror-services/src/DisplayBlockLevel/EpigraphPoetryService/EpigraphPoetry.js
index e3d63856ad2c61fd6adf2e4ed0d59a62ccb49597..f09ca8a8553e70de6d86cfe6342efa9602fd5691 100644
--- a/wax-prosemirror-services/src/DisplayBlockLevel/EpigraphPoetryService/EpigraphPoetry.js
+++ b/wax-prosemirror-services/src/DisplayBlockLevel/EpigraphPoetryService/EpigraphPoetry.js
@@ -1,6 +1,6 @@
 import Tools from "../../lib/Tools";
 import { injectable } from "inversify";
-import { setBlockType } from "prosemirror-commands";
+import { Commands } from "wax-prosemirror-utilities";
 
 @injectable()
 export default class EpigraphPoetry extends Tools {
@@ -9,13 +9,18 @@ export default class EpigraphPoetry extends Tools {
 
   get run() {
     return (state, dispatch) => {
-      setBlockType(state.config.schema.nodes.epigraphPoetry)(state, dispatch);
+      Commands.setBlockType(state.config.schema.nodes.epigraphPoetry)(
+        state,
+        dispatch
+      );
     };
   }
 
   get enable() {
     return state => {
-      return setBlockType(state.config.schema.nodes.epigraphPoetry)(state);
+      return Commands.setBlockType(state.config.schema.nodes.epigraphPoetry)(
+        state
+      );
     };
   }
 }
diff --git a/wax-prosemirror-services/src/DisplayBlockLevel/EpigraphProseService/EpigraphProse.js b/wax-prosemirror-services/src/DisplayBlockLevel/EpigraphProseService/EpigraphProse.js
index 8347f6bcba19e6d9775570556621f413bf7bdb68..735e98ada8f307629065bc97f60919b0f661d391 100644
--- a/wax-prosemirror-services/src/DisplayBlockLevel/EpigraphProseService/EpigraphProse.js
+++ b/wax-prosemirror-services/src/DisplayBlockLevel/EpigraphProseService/EpigraphProse.js
@@ -1,6 +1,6 @@
 import Tools from "../../lib/Tools";
 import { injectable } from "inversify";
-import { setBlockType } from "prosemirror-commands";
+import { Commands } from "wax-prosemirror-utilities";
 
 @injectable()
 export default class EpigraphProse extends Tools {
@@ -9,13 +9,18 @@ export default class EpigraphProse extends Tools {
 
   get run() {
     return (state, dispatch) => {
-      setBlockType(state.config.schema.nodes.epigraphProse)(state, dispatch);
+      Commands.setBlockType(state.config.schema.nodes.epigraphProse)(
+        state,
+        dispatch
+      );
     };
   }
 
   get enable() {
     return state => {
-      return setBlockType(state.config.schema.nodes.epigraphProse)(state);
+      return Commands.setBlockType(state.config.schema.nodes.epigraphProse)(
+        state
+      );
     };
   }
 }
diff --git a/wax-prosemirror-services/src/DisplayBlockLevel/HeadingService/Heading1.js b/wax-prosemirror-services/src/DisplayBlockLevel/HeadingService/Heading1.js
index 8ad2dc6815cae6e8a5f17475c58c0cbfefdde9df..7cd58aec6fc8c3d468438f110ead120108d5b0a4 100644
--- a/wax-prosemirror-services/src/DisplayBlockLevel/HeadingService/Heading1.js
+++ b/wax-prosemirror-services/src/DisplayBlockLevel/HeadingService/Heading1.js
@@ -1,6 +1,6 @@
 import Tools from "../../lib/Tools";
 import { injectable } from "inversify";
-import { setBlockType } from "prosemirror-commands";
+import { Commands } from "wax-prosemirror-utilities";
 
 @injectable()
 export default class Heading1 extends Tools {
@@ -9,7 +9,7 @@ export default class Heading1 extends Tools {
 
   get run() {
     return (state, dispatch) => {
-      setBlockType(state.config.schema.nodes.heading, { level: 1 })(
+      Commands.setBlockType(state.config.schema.nodes.heading, { level: 1 })(
         state,
         dispatch
       );
@@ -18,9 +18,8 @@ export default class Heading1 extends Tools {
 
   get enable() {
     return state => {
-      return setBlockType(state.config.schema.nodes.heading, {
-        level: 1,
-        track: []
+      return Commands.setBlockType(state.config.schema.nodes.heading, {
+        level: 1
       })(state);
     };
   }
diff --git a/wax-prosemirror-services/src/DisplayBlockLevel/HeadingService/Heading2.js b/wax-prosemirror-services/src/DisplayBlockLevel/HeadingService/Heading2.js
index 80a7b88e85be051e845f935af071e30ea4d22e20..77bc4d4eacc65e9d0c247573791bf91023312807 100644
--- a/wax-prosemirror-services/src/DisplayBlockLevel/HeadingService/Heading2.js
+++ b/wax-prosemirror-services/src/DisplayBlockLevel/HeadingService/Heading2.js
@@ -1,6 +1,6 @@
 import Tools from "../../lib/Tools";
 import { injectable } from "inversify";
-import { setBlockType } from "prosemirror-commands";
+import { Commands } from "wax-prosemirror-utilities";
 
 @injectable()
 export default class Heading2 extends Tools {
@@ -9,7 +9,7 @@ export default class Heading2 extends Tools {
 
   get run() {
     return (state, dispatch) => {
-      setBlockType(state.config.schema.nodes.heading, { level: 2 })(
+      Commands.setBlockType(state.config.schema.nodes.heading, { level: 2 })(
         state,
         dispatch
       );
@@ -18,9 +18,8 @@ export default class Heading2 extends Tools {
 
   get enable() {
     return state => {
-      return setBlockType(state.config.schema.nodes.heading, {
-        level: 2,
-        track: []
+      return Commands.setBlockType(state.config.schema.nodes.heading, {
+        level: 2
       })(state);
     };
   }
diff --git a/wax-prosemirror-services/src/DisplayBlockLevel/HeadingService/Heading3.js b/wax-prosemirror-services/src/DisplayBlockLevel/HeadingService/Heading3.js
index 8163289fb5ed31ef2f65eea71069b16779202170..bf27f4bcef78b858d9b65eea8f79a0d51fe9fd2a 100644
--- a/wax-prosemirror-services/src/DisplayBlockLevel/HeadingService/Heading3.js
+++ b/wax-prosemirror-services/src/DisplayBlockLevel/HeadingService/Heading3.js
@@ -1,6 +1,6 @@
 import Tools from "../../lib/Tools";
 import { injectable } from "inversify";
-import { setBlockType } from "prosemirror-commands";
+import { Commands } from "wax-prosemirror-utilities";
 
 @injectable()
 export default class Heading3 extends Tools {
@@ -9,7 +9,7 @@ export default class Heading3 extends Tools {
 
   get run() {
     return (state, dispatch) => {
-      setBlockType(state.config.schema.nodes.heading, { level: 3 })(
+      Commands.setBlockType(state.config.schema.nodes.heading, { level: 3 })(
         state,
         dispatch
       );
@@ -18,9 +18,8 @@ export default class Heading3 extends Tools {
 
   get enable() {
     return state => {
-      return setBlockType(state.config.schema.nodes.heading, {
-        level: 3,
-        track: []
+      return Commands.setBlockType(state.config.schema.nodes.heading, {
+        level: 3
       })(state);
     };
   }
diff --git a/wax-prosemirror-services/src/DisplayBlockLevel/SubTitleService/SubTitle.js b/wax-prosemirror-services/src/DisplayBlockLevel/SubTitleService/SubTitle.js
index caac1427b53f761996822dabc87b6173bcf65b36..e5932b625e8a5987c328e24fd2c17720481e6d3f 100644
--- a/wax-prosemirror-services/src/DisplayBlockLevel/SubTitleService/SubTitle.js
+++ b/wax-prosemirror-services/src/DisplayBlockLevel/SubTitleService/SubTitle.js
@@ -1,6 +1,6 @@
 import Tools from "../../lib/Tools";
 import { injectable } from "inversify";
-import { setBlockType } from "prosemirror-commands";
+import { Commands } from "wax-prosemirror-utilities";
 
 @injectable()
 export default class SubTitle extends Tools {
@@ -9,13 +9,16 @@ export default class SubTitle extends Tools {
 
   get run() {
     return (state, dispatch) => {
-      setBlockType(state.config.schema.nodes.subtitle)(state, dispatch);
+      Commands.setBlockType(state.config.schema.nodes.subtitle)(
+        state,
+        dispatch
+      );
     };
   }
 
   get enable() {
     return state => {
-      return setBlockType(state.config.schema.nodes.subtitle)(state);
+      return Commands.setBlockType(state.config.schema.nodes.subtitle)(state);
     };
   }
 }
diff --git a/wax-prosemirror-services/src/DisplayBlockLevel/TitleService/Title.js b/wax-prosemirror-services/src/DisplayBlockLevel/TitleService/Title.js
index 9f77b510ceca3a802dc4ee14dca643ac5fa669bc..e61b8665f313518d5a9db82d6cad1b383823445f 100644
--- a/wax-prosemirror-services/src/DisplayBlockLevel/TitleService/Title.js
+++ b/wax-prosemirror-services/src/DisplayBlockLevel/TitleService/Title.js
@@ -1,6 +1,6 @@
 import Tools from "../../lib/Tools";
 import { injectable } from "inversify";
-import { setBlockType } from "prosemirror-commands";
+import { Commands } from "wax-prosemirror-utilities";
 
 @injectable()
 export default class Title extends Tools {
@@ -9,13 +9,13 @@ export default class Title extends Tools {
 
   get run() {
     return (state, dispatch) => {
-      setBlockType(state.config.schema.nodes.title)(state, dispatch);
+      Commands.setBlockType(state.config.schema.nodes.title)(state, dispatch);
     };
   }
 
   get enable() {
     return state => {
-      return setBlockType(state.config.schema.nodes.title)(state);
+      return Commands.setBlockType(state.config.schema.nodes.title)(state);
     };
   }
 }
diff --git a/wax-prosemirror-services/src/TextBlockLevel/ExtractPoetryService/ExtractPoetry.js b/wax-prosemirror-services/src/TextBlockLevel/ExtractPoetryService/ExtractPoetry.js
index f3507f5d87bb4fdb95ed926d34ccb8bd9c2a1eba..6987304d15a9bac667ccb7dfb50fdb47ed366808 100644
--- a/wax-prosemirror-services/src/TextBlockLevel/ExtractPoetryService/ExtractPoetry.js
+++ b/wax-prosemirror-services/src/TextBlockLevel/ExtractPoetryService/ExtractPoetry.js
@@ -1,6 +1,6 @@
 import Tools from "../../lib/Tools";
 import { injectable } from "inversify";
-import { setBlockType } from "prosemirror-commands";
+import { Commands } from "wax-prosemirror-utilities";
 
 @injectable()
 class ExtractPoetry extends Tools {
@@ -9,13 +9,18 @@ class ExtractPoetry extends Tools {
 
   get run() {
     return (state, dispatch) => {
-      setBlockType(state.config.schema.nodes.extractPoetry)(state, dispatch);
+      Commands.setBlockType(state.config.schema.nodes.extractPoetry)(
+        state,
+        dispatch
+      );
     };
   }
 
   get enable() {
     return state => {
-      return setBlockType(state.config.schema.nodes.extractPoetry)(state);
+      return Commands.setBlockType(state.config.schema.nodes.extractPoetry)(
+        state
+      );
     };
   }
 }
diff --git a/wax-prosemirror-services/src/TextBlockLevel/ExtractProseService/ExtractProse.js b/wax-prosemirror-services/src/TextBlockLevel/ExtractProseService/ExtractProse.js
index 261cfe18de1fd51b7b63a0c5376a6fa338bfb281..05dd9edad772c15793154a04d45ea091ceea8e49 100644
--- a/wax-prosemirror-services/src/TextBlockLevel/ExtractProseService/ExtractProse.js
+++ b/wax-prosemirror-services/src/TextBlockLevel/ExtractProseService/ExtractProse.js
@@ -1,6 +1,6 @@
 import Tools from "../../lib/Tools";
 import { injectable } from "inversify";
-import { setBlockType } from "prosemirror-commands";
+import { Commands } from "wax-prosemirror-utilities";
 
 @injectable()
 class ExtractProse extends Tools {
@@ -9,13 +9,18 @@ class ExtractProse extends Tools {
 
   get run() {
     return (state, dispatch) => {
-      setBlockType(state.config.schema.nodes.extractProse)(state, dispatch);
+      Commands.setBlockType(state.config.schema.nodes.extractProse)(
+        state,
+        dispatch
+      );
     };
   }
 
   get enable() {
     return state => {
-      return setBlockType(state.config.schema.nodes.extractProse)(state);
+      return Commands.setBlockType(state.config.schema.nodes.extractProse)(
+        state
+      );
     };
   }
 }
diff --git a/wax-prosemirror-services/src/TextBlockLevel/ParagraphContinuedService/ParagraphContinued.js b/wax-prosemirror-services/src/TextBlockLevel/ParagraphContinuedService/ParagraphContinued.js
index bcc3c506e807d35422df6cf9fb47621c908c1575..1d2206f842f797173b3242137a045dc32500ebaa 100644
--- a/wax-prosemirror-services/src/TextBlockLevel/ParagraphContinuedService/ParagraphContinued.js
+++ b/wax-prosemirror-services/src/TextBlockLevel/ParagraphContinuedService/ParagraphContinued.js
@@ -1,6 +1,6 @@
 import Tools from "../../lib/Tools";
 import { injectable } from "inversify";
-import { setBlockType } from "prosemirror-commands";
+import { Commands } from "wax-prosemirror-utilities";
 
 @injectable()
 class ParagraphContinued extends Tools {
@@ -9,13 +9,18 @@ class ParagraphContinued extends Tools {
 
   get run() {
     return (state, dispatch) => {
-      setBlockType(state.config.schema.nodes.paragraphCont)(state, dispatch);
+      Commands.setBlockType(state.config.schema.nodes.paragraphCont)(
+        state,
+        dispatch
+      );
     };
   }
 
   get enable() {
     return state => {
-      return setBlockType(state.config.schema.nodes.paragraphCont)(state);
+      return Commands.setBlockType(state.config.schema.nodes.paragraphCont)(
+        state
+      );
     };
   }
 }
diff --git a/wax-prosemirror-services/src/TextBlockLevel/ParagraphService/Paragraph.js b/wax-prosemirror-services/src/TextBlockLevel/ParagraphService/Paragraph.js
index b4480b8d9767db366ec8c4ba88dc87ee389bd8c4..4d7b2bbed83fb34b2493daf409e9b45c1c83ca3d 100644
--- a/wax-prosemirror-services/src/TextBlockLevel/ParagraphService/Paragraph.js
+++ b/wax-prosemirror-services/src/TextBlockLevel/ParagraphService/Paragraph.js
@@ -1,6 +1,6 @@
 import Tools from "../../lib/Tools";
 import { injectable } from "inversify";
-import { setBlockType } from "prosemirror-commands";
+import { Commands } from "wax-prosemirror-utilities";
 
 @injectable()
 export default class Paragraph extends Tools {
@@ -9,13 +9,16 @@ export default class Paragraph extends Tools {
 
   get run() {
     return (state, dispatch) => {
-      setBlockType(state.config.schema.nodes.paragraph)(state, dispatch);
+      Commands.setBlockType(state.config.schema.nodes.paragraph)(
+        state,
+        dispatch
+      );
     };
   }
 
   get enable() {
     return state => {
-      return setBlockType(state.config.schema.nodes.paragraph)(state);
+      return Commands.setBlockType(state.config.schema.nodes.paragraph)(state);
     };
   }
 }
diff --git a/wax-prosemirror-services/src/TextBlockLevel/SourceNoteService/SourceNote.js b/wax-prosemirror-services/src/TextBlockLevel/SourceNoteService/SourceNote.js
index 5e05eea06c5494e8ef41034841d395b82be6bbf5..833bb7fc918cc67b11aef1b21f02e661a8274868 100644
--- a/wax-prosemirror-services/src/TextBlockLevel/SourceNoteService/SourceNote.js
+++ b/wax-prosemirror-services/src/TextBlockLevel/SourceNoteService/SourceNote.js
@@ -1,6 +1,6 @@
 import Tools from "../../lib/Tools";
 import { injectable } from "inversify";
-import { setBlockType } from "prosemirror-commands";
+import { Commands } from "wax-prosemirror-utilities";
 
 @injectable()
 class SourceNote extends Tools {
@@ -9,13 +9,16 @@ class SourceNote extends Tools {
 
   get run() {
     return (state, dispatch) => {
-      setBlockType(state.config.schema.nodes.sourceNote)(state, dispatch);
+      Commands.setBlockType(state.config.schema.nodes.sourceNote)(
+        state,
+        dispatch
+      );
     };
   }
 
   get enable() {
     return state => {
-      return setBlockType(state.config.schema.nodes.sourceNote)(state);
+      return Commands.setBlockType(state.config.schema.nodes.sourceNote)(state);
     };
   }
 }
diff --git a/wax-prosemirror-utilities/src/commands/Commands.js b/wax-prosemirror-utilities/src/commands/Commands.js
index 74d926b4dfe87fc73f790f632b2463d1048afe74..555e9f2fd95fbd5906631ae856ccf64507394707 100644
--- a/wax-prosemirror-utilities/src/commands/Commands.js
+++ b/wax-prosemirror-utilities/src/commands/Commands.js
@@ -1,5 +1,34 @@
 import { v4 as uuidv4 } from "uuid";
 
+const setBlockType = (nodeType, attrs = {}) => {
+  return (state, dispatch) => {
+    const { from, to } = state.selection;
+    const tr = state.tr;
+    state.doc.nodesBetween(from, to, (node, pos) => {
+      if (!node.isTextblock || node.hasMarkup(nodeType, attrs)) return;
+      let applicable = false;
+      if (node.type == nodeType) {
+        applicable = true;
+      } else {
+        const $pos = state.doc.resolve(pos),
+          index = $pos.index();
+        applicable = $pos.parent.canReplaceWith(index, index + 1, nodeType);
+      }
+      if (applicable) {
+        tr.setBlockType(
+          pos,
+          pos + node.nodeSize,
+          nodeType,
+          Object.assign({}, node.attrs, attrs)
+        );
+      }
+    });
+    if (!tr.steps.length) return false;
+    if (dispatch) dispatch(tr.scrollIntoView());
+    return true;
+  };
+};
+
 const markActive = type => state => {
   const { from, $from, to, empty } = state.selection;
 
@@ -83,6 +112,7 @@ const createComment = (state, dispatch, group) => {
 };
 
 export default {
+  setBlockType,
   blockActive,
   canInsert,
   createComment,