diff --git a/.gitignore b/.gitignore
index 1f603b21..7b72ec14 100644
--- a/.gitignore
+++ b/.gitignore
@@ -77,5 +77,4 @@ typings/
 userdata.json
 
 # build output
-lib
 umd
\ No newline at end of file
diff --git a/.travis.yml b/.travis.yml
index a53bfca6..9c76ff82 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,6 +1,6 @@
 language: node_js
 node_js:
-- '8'
+  - '8'
 dist: trusty
 before_install: |
   set -e
@@ -10,19 +10,20 @@ before_install: |
 install: |
   set -e
   date
-  npm install
+  npm install -g lerna@^3.15.0
+  lerna bootstrap 2>&1
   date
-script: npm run build && npm run test 2>&1
+script: npm run test 2>&1
 deploy:
-  provider: script
-  script:
-  - if [ "$TRAVIS_PULL_REQUEST" = "false" ]; then bash ./.travis/deploy.sh; fi
-  skip_cleanup: true
-  on:
-    all_branches: true
-    repo: accordproject/markdown-transform
+    provider: script
+    script: 
+      - 'if [ "$TRAVIS_PULL_REQUEST" = "false" ]; then bash ./.travis/deploy.sh; fi'
+    skip_cleanup: true
+    on:
+      all_branches: true
+      repo: accordproject/markdown-transform
 after_failure: tail -n +1 -- /home/travis/.npm/_logs/*-debug.log
-after_success: 
+after_success:
 cache:
   directories:
   - node_modules
diff --git a/.travis/deploy.sh b/.travis/deploy.sh
index d25a5fce..75fc4c9c 100755
--- a/.travis/deploy.sh
+++ b/.travis/deploy.sh
@@ -87,7 +87,7 @@ export VERSION=$(node -e "console.log(require('${DIR}/package.json').version)")
 
 # Publish with tag
 echo "Pushing with tag ${TAG}"
-npm publish --tag="${TAG}" 2>&1
+lerna exec -- npm publish --tag="${TAG}" 2>&1
 
 # Check that all required modules have been published to npm and are retrievable
 for j in ${NPM_MODULES}; do
diff --git a/.travis/stable.sh b/.travis/stable.sh
index 9e4804c9..a74b2ee5 100755
--- a/.travis/stable.sh
+++ b/.travis/stable.sh
@@ -22,5 +22,5 @@ echo "NPM_TOKEN " ${NPM_TOKEN}
 npm config set registry https://registry.npmjs.org/
 npm config set //registry.npmjs.org/:_authToken ${NPM_TOKEN}
 
-npm publish --tag="${NPM_TAG}" 2>&1
-echo "Published to npm."
+lerna publish --yes --conventional-commits -m "chore(release): publish %s" --force-publish=*
+echo "Published to npm using lerna."
diff --git a/.travis/unstable.sh b/.travis/unstable.sh
index 9e4804c9..079e155b 100755
--- a/.travis/unstable.sh
+++ b/.travis/unstable.sh
@@ -22,5 +22,5 @@ echo "NPM_TOKEN " ${NPM_TOKEN}
 npm config set registry https://registry.npmjs.org/
 npm config set //registry.npmjs.org/:_authToken ${NPM_TOKEN}
 
-npm publish --tag="${NPM_TAG}" 2>&1
-echo "Published to npm."
+lerna publish --yes --canary --conventional-commits -m "chore(release): publish %s"
+echo "Published to npm using lerna."
diff --git a/header.txt b/HEADER
similarity index 100%
rename from header.txt
rename to HEADER
diff --git a/lerna.json b/lerna.json
index a1654a95..a70bbd53 100644
--- a/lerna.json
+++ b/lerna.json
@@ -1,5 +1,5 @@
 {
-  "lerna": "2.11.0",
+  "lerna": "3.15.0",
   "packages": [
     "packages/*"
   ],
diff --git a/package-lock.json b/package-lock.json
index 5bb1d917..566bd400 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -60,6 +60,11 @@
 					"version": "2.1.2",
 					"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
 					"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+				},
+				"semver": {
+					"version": "5.7.1",
+					"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+					"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
 				}
 			}
 		},
@@ -682,6 +687,13 @@
 				"invariant": "^2.2.2",
 				"js-levenshtein": "^1.1.3",
 				"semver": "^5.5.0"
+			},
+			"dependencies": {
+				"semver": {
+					"version": "5.7.1",
+					"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+					"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
+				}
 			}
 		},
 		"@babel/register": {
@@ -815,6 +827,11 @@
 					"version": "2.0.0",
 					"resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz",
 					"integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ=="
+				},
+				"semver": {
+					"version": "5.7.1",
+					"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+					"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
 				}
 			}
 		},
@@ -896,6 +913,11 @@
 					"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz",
 					"integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg=="
 				},
+				"semver": {
+					"version": "5.7.1",
+					"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+					"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
+				},
 				"yallist": {
 					"version": "3.0.3",
 					"resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz",
@@ -1122,6 +1144,13 @@
 				"npm-package-arg": "^6.1.0",
 				"p-map": "^1.2.0",
 				"semver": "^5.5.0"
+			},
+			"dependencies": {
+				"semver": {
+					"version": "5.7.1",
+					"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+					"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
+				}
 			}
 		},
 		"@lerna/batch-packages": {
@@ -1162,6 +1191,13 @@
 				"p-waterfall": "^1.0.0",
 				"read-package-tree": "^5.1.6",
 				"semver": "^5.5.0"
+			},
+			"dependencies": {
+				"semver": {
+					"version": "5.7.1",
+					"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+					"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
+				}
 			}
 		},
 		"@lerna/changed": {
@@ -1305,6 +1341,11 @@
 					"version": "3.0.0",
 					"resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
 					"integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY="
+				},
+				"semver": {
+					"version": "5.7.1",
+					"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+					"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
 				}
 			}
 		},
@@ -1338,6 +1379,11 @@
 					"resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
 					"integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY="
 				},
+				"semver": {
+					"version": "5.7.1",
+					"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+					"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
+				},
 				"slash": {
 					"version": "1.0.0",
 					"resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
@@ -1482,6 +1528,13 @@
 			"requires": {
 				"@lerna/child-process": "3.14.2",
 				"semver": "^5.5.0"
+			},
+			"dependencies": {
+				"semver": {
+					"version": "5.7.1",
+					"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+					"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
+				}
 			}
 		},
 		"@lerna/import": {
@@ -1757,6 +1810,13 @@
 				"npm-package-arg": "^6.1.0",
 				"npmlog": "^4.1.2",
 				"semver": "^5.5.0"
+			},
+			"dependencies": {
+				"semver": {
+					"version": "5.7.1",
+					"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+					"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
+				}
 			}
 		},
 		"@lerna/prerelease-id-from-version": {
@@ -1765,6 +1825,13 @@
 			"integrity": "sha512-Ap3Z/dNhqQuSrKmK+JmzYvQYI2vowxHvUVxZJiDVilW8dyNnxkCsYFmkuZytk5sxVz4VeGLNPS2RSsU5eeSS+Q==",
 			"requires": {
 				"semver": "^5.5.0"
+			},
+			"dependencies": {
+				"semver": {
+					"version": "5.7.1",
+					"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+					"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
+				}
 			}
 		},
 		"@lerna/project": {
@@ -1949,6 +2016,11 @@
 						"ssri": "^6.0.0"
 					}
 				},
+				"semver": {
+					"version": "5.7.1",
+					"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+					"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
+				},
 				"yallist": {
 					"version": "3.0.3",
 					"resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz",
@@ -2108,6 +2180,11 @@
 				"temp-write": "^3.4.0"
 			},
 			"dependencies": {
+				"semver": {
+					"version": "5.7.1",
+					"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+					"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
+				},
 				"slash": {
 					"version": "1.0.0",
 					"resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
@@ -3455,6 +3532,11 @@
 						"caniuse-lite": "^1.0.30000844",
 						"electron-to-chromium": "^1.3.47"
 					}
+				},
+				"semver": {
+					"version": "5.7.1",
+					"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+					"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
 				}
 			}
 		},
@@ -3808,9 +3890,9 @@
 			"integrity": "sha1-M3dm2hWAEhD92VbCLpxokaudAzc="
 		},
 		"buffer": {
-			"version": "5.4.2",
-			"resolved": "https://registry.npmjs.org/buffer/-/buffer-5.4.2.tgz",
-			"integrity": "sha512-iy9koArjAFCzGnx3ZvNA6Z0clIbbFgbdWQ0mKD3hO0krOrZh8UgA6qMKcZvwLJxS+D6iVR76+5/pV56yMNYTag==",
+			"version": "5.4.3",
+			"resolved": "https://registry.npmjs.org/buffer/-/buffer-5.4.3.tgz",
+			"integrity": "sha512-zvj65TkFeIt3i6aj5bIvJDzjjQQGs4o/sNoezg1F1kYap9Nu2jcUdpwzRSJTHMMzG0H7bZkn4rNQpImhuxWX2A==",
 			"requires": {
 				"base64-js": "^1.0.2",
 				"ieee754": "^1.1.4"
@@ -4850,6 +4932,13 @@
 				"semver": "^5.5.0",
 				"shebang-command": "^1.2.0",
 				"which": "^1.2.9"
+			},
+			"dependencies": {
+				"semver": {
+					"version": "5.7.1",
+					"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+					"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
+				}
 			}
 		},
 		"crypto-browserify": {
@@ -5254,9 +5343,9 @@
 			}
 		},
 		"electron-to-chromium": {
-			"version": "1.3.255",
-			"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.255.tgz",
-			"integrity": "sha512-SZ6NlaNw3h4WR5kA1BK8XltdJCax02P+lW+z78RYoLDqmpyYuDQ5bS+/O6MCJ/j761qoZIFox2qYYt+UwqGA5w=="
+			"version": "1.3.256",
+			"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.256.tgz",
+			"integrity": "sha512-GHY1r2mO56BRMng6rkxxJvsWKtqy9k/IlSBrAV/VKwZKpTydVUJnOwajTNnl5uutJpthHgZy+HeofK5K6PqEgQ=="
 		},
 		"elliptic": {
 			"version": "6.5.1",
@@ -5524,6 +5613,11 @@
 					"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
 					"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
 				},
+				"semver": {
+					"version": "5.7.1",
+					"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+					"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
+				},
 				"strip-ansi": {
 					"version": "4.0.0",
 					"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
@@ -5596,9 +5690,9 @@
 			"integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="
 		},
 		"event-stream": {
-			"version": "3.3.5",
-			"resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.5.tgz",
-			"integrity": "sha512-vyibDcu5JL20Me1fP734QBH/kenBGLZap2n0+XXM7mvuUPzJ20Ydqj1aKcIeMdri1p+PU+4yAKugjN8KCVst+g==",
+			"version": "4.0.1",
+			"resolved": "https://registry.npmjs.org/event-stream/-/event-stream-4.0.1.tgz",
+			"integrity": "sha512-qACXdu/9VHPBzcyhdOWR5/IahhGMf0roTeZJfzz077GwylcDd90yOHLouhmv7GJ5XzPi6ekaQWd8AvPP2nOvpA==",
 			"requires": {
 				"duplexer": "^0.1.1",
 				"from": "^0.1.7",
@@ -5941,6 +6035,37 @@
 			"resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz",
 			"integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY="
 		},
+		"fileset": {
+			"version": "0.2.1",
+			"resolved": "https://registry.npmjs.org/fileset/-/fileset-0.2.1.tgz",
+			"integrity": "sha1-WI74lzxmI7KnbfRlEFaWuWqsgGc=",
+			"requires": {
+				"glob": "5.x",
+				"minimatch": "2.x"
+			},
+			"dependencies": {
+				"glob": {
+					"version": "5.0.15",
+					"resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz",
+					"integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=",
+					"requires": {
+						"inflight": "^1.0.4",
+						"inherits": "2",
+						"minimatch": "2 || 3",
+						"once": "^1.3.0",
+						"path-is-absolute": "^1.0.0"
+					}
+				},
+				"minimatch": {
+					"version": "2.0.10",
+					"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz",
+					"integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=",
+					"requires": {
+						"brace-expansion": "^1.0.0"
+					}
+				}
+			}
+		},
 		"fill-range": {
 			"version": "4.0.0",
 			"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
@@ -6065,6 +6190,11 @@
 				"for-in": "^1.0.1"
 			}
 		},
+		"foreach": {
+			"version": "2.0.5",
+			"resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz",
+			"integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k="
+		},
 		"foreground-child": {
 			"version": "1.5.6",
 			"resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz",
@@ -7282,6 +7412,22 @@
 				"gulp-util": "^3.0.7",
 				"through2": "^2.0.1",
 				"vinyl-file": "^2.0.0"
+			},
+			"dependencies": {
+				"event-stream": {
+					"version": "3.3.5",
+					"resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.5.tgz",
+					"integrity": "sha512-vyibDcu5JL20Me1fP734QBH/kenBGLZap2n0+XXM7mvuUPzJ20Ydqj1aKcIeMdri1p+PU+4yAKugjN8KCVst+g==",
+					"requires": {
+						"duplexer": "^0.1.1",
+						"from": "^0.1.7",
+						"map-stream": "0.0.7",
+						"pause-stream": "^0.0.11",
+						"split": "^1.0.1",
+						"stream-combiner": "^0.2.2",
+						"through": "^2.3.8"
+					}
+				}
 			}
 		},
 		"gulp-sourcemaps": {
@@ -7757,6 +7903,13 @@
 				"semver": "2.x || 3.x || 4 || 5",
 				"validate-npm-package-license": "^3.0.1",
 				"validate-npm-package-name": "^3.0.0"
+			},
+			"dependencies": {
+				"semver": {
+					"version": "5.7.1",
+					"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+					"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
+				}
 			}
 		},
 		"inquirer": {
@@ -8193,6 +8346,157 @@
 				}
 			}
 		},
+		"istanbul-combine": {
+			"version": "0.3.0",
+			"resolved": "https://registry.npmjs.org/istanbul-combine/-/istanbul-combine-0.3.0.tgz",
+			"integrity": "sha1-VrLV5joiBZi23ErIrVcucV6ZV3M=",
+			"requires": {
+				"glob": "^5.0.3",
+				"istanbul": "0.3.x",
+				"minimist": "^1.1.1",
+				"q": "^1.2.0"
+			},
+			"dependencies": {
+				"abbrev": {
+					"version": "1.0.9",
+					"resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz",
+					"integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU="
+				},
+				"async": {
+					"version": "1.5.2",
+					"resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
+					"integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo="
+				},
+				"escodegen": {
+					"version": "1.7.1",
+					"resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.7.1.tgz",
+					"integrity": "sha1-MOz89mypjcZ80v0WKr626vqM5vw=",
+					"requires": {
+						"esprima": "^1.2.2",
+						"estraverse": "^1.9.1",
+						"esutils": "^2.0.2",
+						"optionator": "^0.5.0",
+						"source-map": "~0.2.0"
+					},
+					"dependencies": {
+						"esprima": {
+							"version": "1.2.5",
+							"resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.5.tgz",
+							"integrity": "sha1-CZNQL+r2aBODJXVvMPmlH+7sEek="
+						}
+					}
+				},
+				"esprima": {
+					"version": "2.5.0",
+					"resolved": "https://registry.npmjs.org/esprima/-/esprima-2.5.0.tgz",
+					"integrity": "sha1-84ekb9NEwbGjm6+MIL+0O20AWMw="
+				},
+				"estraverse": {
+					"version": "1.9.3",
+					"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz",
+					"integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q="
+				},
+				"fast-levenshtein": {
+					"version": "1.0.7",
+					"resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-1.0.7.tgz",
+					"integrity": "sha1-AXjc3uAjuSkFGTrwlZ6KdjnP3Lk="
+				},
+				"glob": {
+					"version": "5.0.15",
+					"resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz",
+					"integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=",
+					"requires": {
+						"inflight": "^1.0.4",
+						"inherits": "2",
+						"minimatch": "2 || 3",
+						"once": "^1.3.0",
+						"path-is-absolute": "^1.0.0"
+					}
+				},
+				"has-flag": {
+					"version": "1.0.0",
+					"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+					"integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo="
+				},
+				"istanbul": {
+					"version": "0.3.22",
+					"resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.3.22.tgz",
+					"integrity": "sha1-PhZNhQIf4ZyYXR8OfvDD4i0BLrY=",
+					"requires": {
+						"abbrev": "1.0.x",
+						"async": "1.x",
+						"escodegen": "1.7.x",
+						"esprima": "2.5.x",
+						"fileset": "0.2.x",
+						"handlebars": "^4.0.1",
+						"js-yaml": "3.x",
+						"mkdirp": "0.5.x",
+						"nopt": "3.x",
+						"once": "1.x",
+						"resolve": "1.1.x",
+						"supports-color": "^3.1.0",
+						"which": "^1.1.1",
+						"wordwrap": "^1.0.0"
+					}
+				},
+				"levn": {
+					"version": "0.2.5",
+					"resolved": "https://registry.npmjs.org/levn/-/levn-0.2.5.tgz",
+					"integrity": "sha1-uo0znQykphDjo/FFucr0iAcVUFQ=",
+					"requires": {
+						"prelude-ls": "~1.1.0",
+						"type-check": "~0.3.1"
+					}
+				},
+				"minimist": {
+					"version": "1.2.0",
+					"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+					"integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
+				},
+				"optionator": {
+					"version": "0.5.0",
+					"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.5.0.tgz",
+					"integrity": "sha1-t1qJlaLUF98ltuTjhi9QqohlE2g=",
+					"requires": {
+						"deep-is": "~0.1.2",
+						"fast-levenshtein": "~1.0.0",
+						"levn": "~0.2.5",
+						"prelude-ls": "~1.1.1",
+						"type-check": "~0.3.1",
+						"wordwrap": "~0.0.2"
+					},
+					"dependencies": {
+						"wordwrap": {
+							"version": "0.0.3",
+							"resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",
+							"integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc="
+						}
+					}
+				},
+				"resolve": {
+					"version": "1.1.7",
+					"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz",
+					"integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs="
+				},
+				"source-map": {
+					"version": "0.2.0",
+					"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz",
+					"integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=",
+					"optional": true,
+					"requires": {
+						"amdefine": ">=0.0.4"
+					}
+				},
+				"supports-color": {
+					"version": "3.2.3",
+					"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+					"integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+					"requires": {
+						"has-flag": "^1.0.0"
+					}
+				}
+			}
+		},
 		"istanbul-lib-coverage": {
 			"version": "2.0.5",
 			"resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz",
@@ -8279,6 +8583,203 @@
 				}
 			}
 		},
+		"istanbul-merge": {
+			"version": "1.1.1",
+			"resolved": "https://registry.npmjs.org/istanbul-merge/-/istanbul-merge-1.1.1.tgz",
+			"integrity": "sha1-db5kNDbU3nI+A6lNHKX1+ZSwvXI=",
+			"requires": {
+				"foreach": "^2.0.5",
+				"glob": "^7.0.5",
+				"istanbul-lib-coverage": "^1.0.0",
+				"mkdirp": "^0.5.1",
+				"yargs": "^4.8.1"
+			},
+			"dependencies": {
+				"camelcase": {
+					"version": "3.0.0",
+					"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
+					"integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo="
+				},
+				"cliui": {
+					"version": "3.2.0",
+					"resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
+					"integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
+					"requires": {
+						"string-width": "^1.0.1",
+						"strip-ansi": "^3.0.1",
+						"wrap-ansi": "^2.0.0"
+					}
+				},
+				"find-up": {
+					"version": "1.1.2",
+					"resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
+					"integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
+					"requires": {
+						"path-exists": "^2.0.0",
+						"pinkie-promise": "^2.0.0"
+					}
+				},
+				"invert-kv": {
+					"version": "1.0.0",
+					"resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
+					"integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY="
+				},
+				"is-fullwidth-code-point": {
+					"version": "1.0.0",
+					"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+					"integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+					"requires": {
+						"number-is-nan": "^1.0.0"
+					}
+				},
+				"istanbul-lib-coverage": {
+					"version": "1.2.1",
+					"resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz",
+					"integrity": "sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ=="
+				},
+				"lcid": {
+					"version": "1.0.0",
+					"resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
+					"integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
+					"requires": {
+						"invert-kv": "^1.0.0"
+					}
+				},
+				"load-json-file": {
+					"version": "1.1.0",
+					"resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
+					"integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
+					"requires": {
+						"graceful-fs": "^4.1.2",
+						"parse-json": "^2.2.0",
+						"pify": "^2.0.0",
+						"pinkie-promise": "^2.0.0",
+						"strip-bom": "^2.0.0"
+					}
+				},
+				"os-locale": {
+					"version": "1.4.0",
+					"resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
+					"integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=",
+					"requires": {
+						"lcid": "^1.0.0"
+					}
+				},
+				"parse-json": {
+					"version": "2.2.0",
+					"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
+					"integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
+					"requires": {
+						"error-ex": "^1.2.0"
+					}
+				},
+				"path-exists": {
+					"version": "2.1.0",
+					"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
+					"integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
+					"requires": {
+						"pinkie-promise": "^2.0.0"
+					}
+				},
+				"path-type": {
+					"version": "1.1.0",
+					"resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
+					"integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
+					"requires": {
+						"graceful-fs": "^4.1.2",
+						"pify": "^2.0.0",
+						"pinkie-promise": "^2.0.0"
+					}
+				},
+				"pify": {
+					"version": "2.3.0",
+					"resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+					"integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
+				},
+				"read-pkg": {
+					"version": "1.1.0",
+					"resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
+					"integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
+					"requires": {
+						"load-json-file": "^1.0.0",
+						"normalize-package-data": "^2.3.2",
+						"path-type": "^1.0.0"
+					}
+				},
+				"read-pkg-up": {
+					"version": "1.0.1",
+					"resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
+					"integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
+					"requires": {
+						"find-up": "^1.0.0",
+						"read-pkg": "^1.0.0"
+					}
+				},
+				"require-main-filename": {
+					"version": "1.0.1",
+					"resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
+					"integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE="
+				},
+				"string-width": {
+					"version": "1.0.2",
+					"resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+					"integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+					"requires": {
+						"code-point-at": "^1.0.0",
+						"is-fullwidth-code-point": "^1.0.0",
+						"strip-ansi": "^3.0.0"
+					}
+				},
+				"strip-bom": {
+					"version": "2.0.0",
+					"resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
+					"integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
+					"requires": {
+						"is-utf8": "^0.2.0"
+					}
+				},
+				"which-module": {
+					"version": "1.0.0",
+					"resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz",
+					"integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8="
+				},
+				"y18n": {
+					"version": "3.2.1",
+					"resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
+					"integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE="
+				},
+				"yargs": {
+					"version": "4.8.1",
+					"resolved": "https://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz",
+					"integrity": "sha1-wMQpJMpKqmsObaFznfshZDn53cA=",
+					"requires": {
+						"cliui": "^3.2.0",
+						"decamelize": "^1.1.1",
+						"get-caller-file": "^1.0.1",
+						"lodash.assign": "^4.0.3",
+						"os-locale": "^1.4.0",
+						"read-pkg-up": "^1.0.1",
+						"require-directory": "^2.1.1",
+						"require-main-filename": "^1.0.1",
+						"set-blocking": "^2.0.0",
+						"string-width": "^1.0.1",
+						"which-module": "^1.0.0",
+						"window-size": "^0.2.0",
+						"y18n": "^3.2.1",
+						"yargs-parser": "^2.4.1"
+					}
+				},
+				"yargs-parser": {
+					"version": "2.4.1",
+					"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz",
+					"integrity": "sha1-hVaN488VD/SfpRgl8DqMiA3cxcQ=",
+					"requires": {
+						"camelcase": "^3.0.0",
+						"lodash.assign": "^4.0.6"
+					}
+				}
+			}
+		},
 		"istanbul-reports": {
 			"version": "2.2.6",
 			"resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.6.tgz",
@@ -9361,6 +9862,33 @@
 				"vinyl-fs": "^2.4.3"
 			}
 		},
+		"license-check-and-add": {
+			"version": "2.3.6",
+			"resolved": "https://registry.npmjs.org/license-check-and-add/-/license-check-and-add-2.3.6.tgz",
+			"integrity": "sha512-fTSOoJL12YhsTOS+xqutJ7uwIcN4kPcmhCk39FWTjc1Zllyc62JGT1i+NqTfyTh38wzLQDzfLDjqsI4jSzMnfg==",
+			"requires": {
+				"pkg-conf": "^1.1.2"
+			}
+		},
+		"licensecheck": {
+			"version": "1.3.0",
+			"resolved": "https://registry.npmjs.org/licensecheck/-/licensecheck-1.3.0.tgz",
+			"integrity": "sha1-ouuJ7fqZ0ndBZ1LWp9Mp+p+wz9Q=",
+			"requires": {
+				"colors": "1.1.2",
+				"markdown": "0.5.0",
+				"spdx-license-list": "2.1.0",
+				"strip-json-comments": "2.0.1",
+				"treeify": "1.0.1"
+			},
+			"dependencies": {
+				"colors": {
+					"version": "1.1.2",
+					"resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz",
+					"integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM="
+				}
+			}
+		},
 		"linkify-it": {
 			"version": "2.2.0",
 			"resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz",
@@ -9476,6 +10004,11 @@
 			"resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz",
 			"integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI="
 		},
+		"lodash.assign": {
+			"version": "4.2.0",
+			"resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz",
+			"integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc="
+		},
 		"lodash.clonedeep": {
 			"version": "4.5.0",
 			"resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
@@ -9621,6 +10154,11 @@
 				"triple-beam": "^1.3.0"
 			},
 			"dependencies": {
+				"colors": {
+					"version": "1.3.3",
+					"resolved": "https://registry.npmjs.org/colors/-/colors-1.3.3.tgz",
+					"integrity": "sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg=="
+				},
 				"ms": {
 					"version": "2.1.2",
 					"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
@@ -9681,6 +10219,13 @@
 			"requires": {
 				"pify": "^4.0.1",
 				"semver": "^5.6.0"
+			},
+			"dependencies": {
+				"semver": {
+					"version": "5.7.1",
+					"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+					"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
+				}
 			}
 		},
 		"make-fetch-happen": {
@@ -9760,6 +10305,24 @@
 				"object-visit": "^1.0.0"
 			}
 		},
+		"markdown": {
+			"version": "0.5.0",
+			"resolved": "https://registry.npmjs.org/markdown/-/markdown-0.5.0.tgz",
+			"integrity": "sha1-KCBbVlqK51kt4gdGPWY33BgnIrI=",
+			"requires": {
+				"nopt": "~2.1.1"
+			},
+			"dependencies": {
+				"nopt": {
+					"version": "2.1.2",
+					"resolved": "https://registry.npmjs.org/nopt/-/nopt-2.1.2.tgz",
+					"integrity": "sha1-bMzZd7gBMqB3MdbozljCyDA8+a8=",
+					"requires": {
+						"abbrev": "1"
+					}
+				}
+			}
+		},
 		"markdown-it": {
 			"version": "8.4.2",
 			"resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.2.tgz",
@@ -10297,6 +10860,13 @@
 			"requires": {
 				"object.getownpropertydescriptors": "^2.0.3",
 				"semver": "^5.7.0"
+			},
+			"dependencies": {
+				"semver": {
+					"version": "5.7.1",
+					"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+					"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
+				}
 			}
 		},
 		"node-fetch": {
@@ -10406,6 +10976,13 @@
 				"semver": "^5.5.0",
 				"shellwords": "^0.1.1",
 				"which": "^1.3.0"
+			},
+			"dependencies": {
+				"semver": {
+					"version": "5.7.1",
+					"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+					"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
+				}
 			}
 		},
 		"node-releases": {
@@ -10414,6 +10991,13 @@
 			"integrity": "sha512-BHcr1g6NeUH12IL+X3Flvs4IOnl1TL0JczUhEZjDE+FXXPQcVCNr8NEPb01zqGxzhTpdyJL5GXemaCW7aw6Khw==",
 			"requires": {
 				"semver": "^5.3.0"
+			},
+			"dependencies": {
+				"semver": {
+					"version": "5.7.1",
+					"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+					"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
+				}
 			}
 		},
 		"nopt": {
@@ -10433,6 +11017,13 @@
 				"resolve": "^1.10.0",
 				"semver": "2 || 3 || 4 || 5",
 				"validate-npm-package-license": "^3.0.1"
+			},
+			"dependencies": {
+				"semver": {
+					"version": "5.7.1",
+					"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+					"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
+				}
 			}
 		},
 		"normalize-path": {
@@ -10481,6 +11072,13 @@
 				"osenv": "^0.1.5",
 				"semver": "^5.6.0",
 				"validate-npm-package-name": "^3.0.0"
+			},
+			"dependencies": {
+				"semver": {
+					"version": "5.7.1",
+					"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+					"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
+				}
 			}
 		},
 		"npm-packlist": {
@@ -10500,6 +11098,13 @@
 				"figgy-pudding": "^3.5.1",
 				"npm-package-arg": "^6.0.0",
 				"semver": "^5.4.1"
+			},
+			"dependencies": {
+				"semver": {
+					"version": "5.7.1",
+					"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+					"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
+				}
 			}
 		},
 		"npm-run-path": {
@@ -11993,9 +12598,9 @@
 			}
 		},
 		"semver": {
-			"version": "5.7.1",
-			"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
-			"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
+			"version": "6.2.0",
+			"resolved": "https://registry.npmjs.org/semver/-/semver-6.2.0.tgz",
+			"integrity": "sha512-jdFC1VdUGT/2Scgbimf7FSx9iJLXoqfglSF+gJeuNWVpiE37OIbc1jywR/GJyFdz3mnkz2/id0L0J/cr0izR5A=="
 		},
 		"serialize-javascript": {
 			"version": "1.9.1",
@@ -12090,6 +12695,11 @@
 			"resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
 			"integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A=="
 		},
+		"sleep-promise": {
+			"version": "8.0.1",
+			"resolved": "https://registry.npmjs.org/sleep-promise/-/sleep-promise-8.0.1.tgz",
+			"integrity": "sha1-jXlaJ+ojlT32tSuRCB5eImZZk8U="
+		},
 		"slice-ansi": {
 			"version": "1.0.0",
 			"resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz",
@@ -12264,9 +12874,9 @@
 			}
 		},
 		"source-map-support": {
-			"version": "0.5.13",
-			"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz",
-			"integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==",
+			"version": "0.5.12",
+			"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz",
+			"integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==",
 			"requires": {
 				"buffer-from": "^1.0.0",
 				"source-map": "^0.6.0"
@@ -12335,6 +12945,11 @@
 			"resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz",
 			"integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q=="
 		},
+		"spdx-license-list": {
+			"version": "2.1.0",
+			"resolved": "https://registry.npmjs.org/spdx-license-list/-/spdx-license-list-2.1.0.tgz",
+			"integrity": "sha1-N4j/tcgLJK++goOTTp5mhOpqIY0="
+		},
 		"split": {
 			"version": "1.0.1",
 			"resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz",
@@ -12984,6 +13599,11 @@
 			"resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.1.tgz",
 			"integrity": "sha512-4hjqbObwlh2dLyW4tcz0Ymw0ggoaVDMveUB9w8kFSQScdRLo0gxO9J7WFcUBo+W3C1TLdFIEwNOWebgZZ0RH9Q=="
 		},
+		"treeify": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/treeify/-/treeify-1.0.1.tgz",
+			"integrity": "sha1-abPNAiAioWhCTnz6HO1EyTnT6y8="
+		},
 		"trim-newlines": {
 			"version": "2.0.0",
 			"resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz",
@@ -13721,6 +14341,11 @@
 				"string-width": "^1.0.2 || 2"
 			}
 		},
+		"window-size": {
+			"version": "0.2.0",
+			"resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz",
+			"integrity": "sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU="
+		},
 		"windows-release": {
 			"version": "3.2.0",
 			"resolved": "https://registry.npmjs.org/windows-release/-/windows-release-3.2.0.tgz",
diff --git a/package.json b/package.json
index 25cdc10e..59645ada 100644
--- a/package.json
+++ b/package.json
@@ -1,17 +1,20 @@
 {
   "devDependencies": {
-    "chai": "4.2.0",
-    "chai-as-promised": "7.1.1",
-    "chai-things": "0.2.0",
+    "colors": "1.3.3",
     "concurrently": "4.1.1",
     "coveralls": "3.0.4",
-    "eslint": "4.19.1",
+    "istanbul-combine": "0.3.0",
+    "istanbul-merge": "1.1.1",
     "jsdoc": "^3.6.3",
     "jsdoc-sphinx": "0.0.6",
     "lerna": "3.15.0",
     "license-check": "1.1.5",
-    "mocha": "6.1.4",
-    "tsd-jsdoc": "^2.3.0"
+    "semver": "6.2.0",
+    "sleep-promise": "8.0.1",
+    "source-map-support": "0.5.12",
+    "licensecheck": "1.3.0",
+    "license-check-and-add": "2.3.6",
+    "event-stream": "4.0.1"
   },
   "engines": {
     "node": ">=8",
@@ -29,7 +32,7 @@
     "pretest": "npm run licchk",
     "test": "lerna run test",
     "repoclean": "lerna clean",
-    "licchk": "license-check",
+    "licchk": "license-check-and-add",
     "pkgcheck": "node ./scripts/pkgcheck.js",
     "pkgstamp": "node ./scripts/pkgstamp.js",
     "pkgbump": "node ./scripts/pkgbump.js && node ./scripts/pkgcheck.js --fix",
@@ -40,9 +43,6 @@
     "type": "git",
     "url": "https://github.com/accordproject/markdown-transform.git"
   },
-  "publishConfig": {
-    "access": "public"
-  },
   "keywords": [
     "accord",
     "markdown",
@@ -53,46 +53,78 @@
   "bugs": {
     "url": "https://github.com/accordproject/markdown-transform/issues"
   },
-  "license-check-config": {
-    "src": [
-      "**/*.js",
-      "!./scripts/**/*",
-      "!./.travis/**/*",
-      "!./test/**/*",
-      "!./coverage/**/*",
-      "!./node_modules/**/*",
-      "!./out/**/*",
-      "!./lib/**/*",
-      "!./umd/**/*",
-      "!./bin/index.js"
-    ],
-    "path": "header.txt",
-    "blocking": true,
-    "logInfo": false,
-    "logError": true
-  },
-  "nyc": {
-    "produce-source-map": "true",
-    "sourceMap": "inline",
-    "reporter": [
-      "lcov",
-      "text",
-      "text-summary",
-      "html",
-      "json"
-    ],
-    "include": [
-      "src/**/*.js"
+  "license-check-and-add-config": {
+    "folder": ".",
+    "license": "HEADER",
+    "exact_paths_method": "EXCLUDE",
+    "exact_paths": [
+      ".git",
+      ".github",
+      "node_modules",
+      "packages",
+      "softhsm",
+      "build.cfg",
+      "README.md",
+      "CONTRIBUTING.md",
+      "DEVELOPERS.md",
+      "NOTICES.md",
+      "CHARTER.md",
+      "LICENSE",
+      "HEADER",
+      "docs/",
+      "scripts/",
+      ".travis",
+      "coverage",
+      ".gitignore",
+      ".DS_Store"
     ],
-    "exclude": [
-      "scripts/**/*.js"
+    "file_type_method": "EXCLUDE",
+    "file_types": [
+      ".yml",
+      ".log",
+      ".enc",
+      ".xmind",
+      ".deb",
+      ".vo",
+      ".glob",
+      ".aux",
+      ".v.d",
+      ".ctoj",
+      ".depends",
+      ".annot",
+      ".byte",
+      ".cmi",
+      ".cmo",
+      ".tem",
+      ".txt",
+      ".config",
+      ".coq_modules"
     ],
-    "all": true,
-    "check-coverage": true,
-    "statements": 88,
-    "branches": 76,
-    "functions": 84,
-    "lines": 88
+    "insert_license": false,
+    "license_formats": {
+      "js|ergo|cto": {
+        "prepend": "/*",
+        "append": " */",
+        "eachLine": {
+          "prepend": " * "
+        }
+      },
+      "v|atd|mll|mly": {
+        "prepend": "*",
+        "append": " *)",
+        "eachLine": {
+          "prepend": " * "
+        }
+      },
+      "gitattributes|cfg|ocp-indent": {
+        "eachLine": {
+          "prepend": "# "
+        }
+      },
+      "md": {
+        "file": "HEADER"
+      }
+    }
   },
   "dependencies": {}
 }
\ No newline at end of file
diff --git a/packages/markdown-cicero/.gitignore b/packages/markdown-cicero/.gitignore
new file mode 100644
index 00000000..4bd86293
--- /dev/null
+++ b/packages/markdown-cicero/.gitignore
@@ -0,0 +1,68 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+
+# Runtime data
+pids
+*.pid
+*.seed
+*.pid.lock
+
+# output directory
+/out
+/dist
+/umd
+/lib
+
+# Directory for instrumented libs generated by jscoverage/JSCover
+lib-cov
+
+# Coverage directory used by tools like istanbul
+coverage
+
+# nyc test coverage
+.nyc_output
+
+# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
+.grunt
+
+# Bower dependency directory (https://bower.io/)
+bower_components
+
+# node-waf configuration
+.lock-wscript
+
+# Compiled binary addons (http://nodejs.org/api/addons.html)
+build/Release
+
+# Dependency directories
+node_modules/
+!test/data/with-node_modules/node_modules/
+jspm_packages/
+
+# Typescript v1 declaration files
+typings/
+
+# Optional npm cache directory
+.npm
+
+# Optional eslint cache
+.eslintcache
+
+# Optional REPL history
+.node_repl_history
+
+# Output of 'npm pack'
+*.tgz
+
+# Yarn Integrity file
+.yarn-integrity
+
+# dotenv environment variables file
+.env
+
+# dynamically created archives
+test/data/archives/
diff --git a/packages/markdown-cli/lib/Commands.js b/packages/markdown-cli/lib/Commands.js
new file mode 100644
index 00000000..447f9c1a
--- /dev/null
+++ b/packages/markdown-cli/lib/Commands.js
@@ -0,0 +1,120 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+'use strict';
+
+const Fs = require('fs');
+const Logger = require('@accordproject/markdown-common').Logger;
+
+const CommonMark = require('@accordproject/markdown-common').CommonMark;
+const CiceroMark = require('@accordproject/markdown-cicero').CiceroMark;
+
+/**
+ * Utility class that implements the commands exposed by the CLI.
+ * @class
+ */
+class Commands {
+    /**
+     * Set a default for a file argument
+     *
+     * @param {object} argv the inbound argument values object
+     * @param {string} argName the argument name
+     * @param {string} argDefaultName the argument default name
+     * @param {Function} argDefaultFun how to compute the argument default
+     * @param {object} argDefaultValue an optional default value if all else fails
+     * @returns {object} a modified argument object
+     */
+    static setDefaultFileArg(argv, argName, argDefaultName, argDefaultFun) {
+        if(!argv[argName]){
+            Logger.info(`Loading a default ${argDefaultName} file.`);
+            argv[argName] = argDefaultFun(argv, argDefaultName);
+        }
+
+        let argExists = true;
+        if (Array.isArray(argv[argName])) {
+            // All files should exist
+            for (let i = 0; i < argv[argName].length; i++) {
+                if (Fs.existsSync(argv[argName][i]) && argExists) {
+                    argExists = true;
+                } else {
+                    argExists = false;
+                }
+            }
+        } else {
+            // This file should exist
+            argExists = Fs.existsSync(argv[argName]);
+        }
+
+        if (!argExists){
+            throw new Error(`A ${argDefaultName} file is required. Try the --${argName} flag or create a ${argDefaultName} in the root folder of your template.`);
+        } else {
+            return argv;
+        }
+    }
+
+    /**
+     * Set default params before we parse a sample text using a template
+     *
+     * @param {object} argv the inbound argument values object
+     * @returns {object} a modfied argument object
+     */
+    static validateParseArgs(argv) {
+        argv = Commands.setDefaultFileArg(argv, 'sample', 'sample.md', ((argv, argDefaultName) => { return argDefaultName; }));
+
+        if(argv.verbose) {
+            Logger.info(`parse sample ${argv.sample} using a template ${argv.template}`);
+        }
+
+        return argv;
+    }
+
+    /**
+     * Parse a sample markdown
+     *
+     * @param {string} samplePath to the sample file
+     * @param {string} outPath to an output file
+     * @param {boolean} generateMarkdown whether to transform back to markdown
+     * @param {boolean} withCicero whether to further transform for Cicero
+     * @param {boolean} noWrap whether to avoid wrapping Cicero variables in XML tags
+     * @returns {object} Promise to the result of parsing
+     */
+    static parse(samplePath, outPath, generateMarkdown, withCicero, noWrap) {
+        const commonMark = new CommonMark();
+        const ciceroMark = new CiceroMark();
+        const markdownText = Fs.readFileSync(samplePath, 'utf8');
+        let concertoObject = commonMark.fromString(markdownText);
+        if (withCicero) {
+            concertoObject = ciceroMark.fromCommonMark(concertoObject);
+        }
+        let result;
+        if (generateMarkdown) {
+            if (withCicero) {
+                const options = noWrap ? { wrapVariables: false } : null;
+                concertoObject = ciceroMark.toCommonMark(concertoObject, options);
+            }
+            result = commonMark.toString(concertoObject);
+        } else {
+            const json = ciceroMark.getSerializer().toJSON(concertoObject);
+            result = JSON.stringify(json);
+        }
+        if (outPath) {
+            Logger.info('Creating file: ' + outPath);
+            Fs.writeFileSync(outPath, result);
+        }
+        return Promise.resolve(result);
+    }
+
+}
+
+module.exports = Commands;
diff --git a/packages/markdown-common/.gitignore b/packages/markdown-common/.gitignore
new file mode 100644
index 00000000..4bd86293
--- /dev/null
+++ b/packages/markdown-common/.gitignore
@@ -0,0 +1,68 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+
+# Runtime data
+pids
+*.pid
+*.seed
+*.pid.lock
+
+# output directory
+/out
+/dist
+/umd
+/lib
+
+# Directory for instrumented libs generated by jscoverage/JSCover
+lib-cov
+
+# Coverage directory used by tools like istanbul
+coverage
+
+# nyc test coverage
+.nyc_output
+
+# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
+.grunt
+
+# Bower dependency directory (https://bower.io/)
+bower_components
+
+# node-waf configuration
+.lock-wscript
+
+# Compiled binary addons (http://nodejs.org/api/addons.html)
+build/Release
+
+# Dependency directories
+node_modules/
+!test/data/with-node_modules/node_modules/
+jspm_packages/
+
+# Typescript v1 declaration files
+typings/
+
+# Optional npm cache directory
+.npm
+
+# Optional eslint cache
+.eslintcache
+
+# Optional REPL history
+.node_repl_history
+
+# Output of 'npm pack'
+*.tgz
+
+# Yarn Integrity file
+.yarn-integrity
+
+# dotenv environment variables file
+.env
+
+# dynamically created archives
+test/data/archives/
diff --git a/scripts/depcheck.js b/scripts/depcheck.js
index 7887b92f..5050d6ac 100755
--- a/scripts/depcheck.js
+++ b/scripts/depcheck.js
@@ -21,9 +21,59 @@ const path = require('path');
 
 const packages = {};
 
-const npmDirectory = path.resolve('.');
+const lernaDirectory = path.resolve('.');
 
-const masterPackageFile = path.resolve(npmDirectory, 'package.json');
+const masterPackageFile = path.resolve(lernaDirectory, 'package.json');
 const masterPackage = require(masterPackageFile);
 packages['package.json'] = masterPackage;
 
+const packagesDirectory = path.resolve(lernaDirectory, 'packages');
+const packageNames = fs.readdirSync(packagesDirectory);
+packageNames.forEach((packageName) => {
+    const packageFile = path.resolve(packagesDirectory, packageName, 'package.json');
+    const thisPackage = require(packageFile);
+    packages[packageName] = thisPackage;
+});
+
+// Not going to catch ranges but unlikely to see those anyway
+const badDependencies = {};
+const checkValue = function checkValue(packageIndex, dependency, currentValue) {
+    if (isNaN(currentValue.slice(0,1))) {
+        if (!badDependencies[packageIndex]) {
+            badDependencies[packageIndex] = [];
+        }
+        badDependencies[packageIndex].push({ dependency: dependency, currentValue: currentValue });
+    }
+};
+
+for (const packageIndex in packages) {
+    const currentPackage = packages[packageIndex];
+    for (const dependency in currentPackage.dependencies) {
+        checkValue(packageIndex, dependency, currentPackage.dependencies[dependency]);
+    }
+    for (const dependency in currentPackage.devDependencies) {
+        checkValue(packageIndex, dependency, currentPackage.devDependencies[dependency]);
+    }
+    for (const dependency in currentPackage.peerDependencies) {
+        checkValue(packageIndex, dependency, currentPackage.peerDependencies[dependency]);
+    }    
+}
+
+if (Object.keys(badDependencies).length > 0) {
+    console.error('Error: there is a mismatch between the versions of the packages in this repository!\n');
+    for (const i in packages) {
+        if (badDependencies[i]) {
+            const currentPackage = packages[i];
+            console.error(`  ${i} ${currentPackage.version.green}`);
+            if (badDependencies[i]) {
+                badDependencies[i].forEach((badDependency) => {
+                    console.error(`    ${badDependency.dependency}@${badDependency.currentValue.red} (should be exact)`);
+                });
+            }
+        }
+    }
+    console.error('\n');
+    process.exit(1);
+} else {
+    console.log('Status: no problems detected!');
+}
\ No newline at end of file
diff --git a/scripts/manualrelease.sh b/scripts/manualrelease.sh
index ac1d3007..c49424c4 100755
--- a/scripts/manualrelease.sh
+++ b/scripts/manualrelease.sh
@@ -28,12 +28,12 @@ git pull origin master
 
 # Increase the version number
 npm run pkgbump
-TARGET_VERSION=$( jq -r '.version' package.json )
+TARGET_VERSION=$( jq -r '.version' lerna.json )
 git add package.json
-git commit -m "chore(release): Bump Markdown Editor source version" -s
+git commit -m "chore(release): Bump Markdown Transform source version" -s
 
 # Publish each package to NPM registry. Generate changelog and update package.json files
-npm publish --tag="${TARGET_VERSION}" 2>&1
+lerna publish --conventional-commits -m 'chore(release): publish %s' --force-publish=* --repo-version ${TARGET_VERSION} --yes
 
 # Fix DCO sign-off
 git commit --amend -s --no-edit
diff --git a/scripts/pkgbump.js b/scripts/pkgbump.js
index 979b3baa..910725d4 100755
--- a/scripts/pkgbump.js
+++ b/scripts/pkgbump.js
@@ -19,9 +19,9 @@ const fs = require('fs');
 const path = require('path');
 const semver = require('semver');
 
-const npmDirectory = path.resolve('.');
-const npmConfigFile = path.resolve(npmDirectory, 'package.json');
-const npmConfig = require(npmConfigFile);
-const targetVersion = semver.inc(npmConfig.version, 'patch');
-npmConfig.version = targetVersion;
-fs.writeFileSync(npmConfigFile, JSON.stringify(npmConfig, null, 2), 'utf8');
\ No newline at end of file
+const lernaDirectory = path.resolve('.');
+const lernaConfigFile = path.resolve(lernaDirectory, 'lerna.json');
+const lernaConfig = require(lernaConfigFile);
+const targetVersion = semver.inc(lernaConfig.version, 'patch');
+lernaConfig.version = targetVersion;
+fs.writeFileSync(lernaConfigFile, JSON.stringify(lernaConfig, null, 2), 'utf8');
\ No newline at end of file
diff --git a/scripts/pkgcheck.js b/scripts/pkgcheck.js
index fc446361..3662ee6e 100755
--- a/scripts/pkgcheck.js
+++ b/scripts/pkgcheck.js
@@ -24,19 +24,108 @@ const semver = require('semver')
 const packages = {};
 const fix = (process.argv.indexOf('--fix') !== -1);
 
-const npmDirectory = path.resolve('.');
-const npmConfigFile = path.resolve(npmDirectory, 'package.json');
-const npmConfig = require(npmConfigFile);
-const targetVersion = npmConfig.version;
+const lernaDirectory = path.resolve('.');
+const lernaConfigFile = path.resolve(lernaDirectory, 'lerna.json');
+const lernaConfig = require(lernaConfigFile);
+const targetVersion = lernaConfig.version;
 const targetDependency = `${targetVersion}`;
-packages['package.json'] = npmConfig;
+packages['lerna.json'] = lernaConfig;
 
 if (!semver.valid(targetVersion)) {
-    console.error(`Error: the version "${targetVersion}" in "${npmConfigFile}" is invalid!`);
+    console.error(`Error: the version "${targetVersion}" in "${lernaConfigFile}" is invalid!`);
     process.exit(1);
 }
 
-const masterPackageFile = path.resolve(npmDirectory, 'package.json');
+const masterPackageFile = path.resolve(lernaDirectory, 'package.json');
 const masterPackage = require(masterPackageFile);
 packages['package.json'] = masterPackage;
 
+const packagesDirectory = path.resolve(lernaDirectory, 'packages');
+const packageNames = fs.readdirSync(packagesDirectory);
+packageNames.forEach((packageName) => {
+    const packageFile = path.resolve(packagesDirectory, packageName, 'package.json');
+    const thisPackage = require(packageFile);
+    packages[packageName] = thisPackage;
+});
+
+let mismatch = false;
+const badDependencies = {};
+for (const i in packages) {
+    const currentPackage = packages[i];
+    if (targetVersion !== currentPackage.version) {
+        mismatch = true;
+        break;
+    }
+}
+
+for (const i in packages) {
+    const currentPackage = packages[i];
+    for (const j in packages) {
+        const otherPackage = packages[j];
+        for (const dependency in currentPackage.dependencies) {
+            const currentValue = currentPackage.dependencies[dependency];
+            if (dependency === otherPackage.name) {
+                if (currentValue !== targetDependency) {
+                    if (!badDependencies[i]) {
+                        badDependencies[i] = [];
+                    }
+                    badDependencies[i].push({ dependency: dependency, currentValue: currentValue });
+                    mismatch = true;
+                }
+            }
+        }
+        for (const dependency in currentPackage.devDependencies) {
+            const currentValue = currentPackage.devDependencies[dependency];
+            if (dependency === otherPackage.name) {
+                if (currentValue !== targetDependency) {
+                    if (!badDependencies[i]) {
+                        badDependencies[i] = [];
+                    }
+                    badDependencies[i].push({ dependency: dependency, currentValue: currentValue });
+                    mismatch = true;
+                }
+            }
+        }
+        for (const dependency in currentPackage.peerDependencies) {
+            const currentValue = currentPackage.peerDependencies[dependency];
+            if (dependency === otherPackage.name) {
+                if (currentValue !== targetDependency) {
+                    if (!badDependencies[i]) {
+                        badDependencies[i] = [];
+                    }
+                    badDependencies[i].push({ dependency: dependency, currentValue: currentValue });
+                    mismatch = true;
+                }
+            }
+        }        
+    }
+}
+
+if (mismatch && !fix) {
+    console.error('Error: there is a mismatch between the versions of the packages in this repository!\n');
+    for (const i in packages) {
+        const currentPackage = packages[i];
+        if (targetVersion !== currentPackage.version) {
+            console.error(`  ${i} ${currentPackage.version.red} (should be ${targetVersion})`);
+        } else {
+            console.error(`  ${i} ${currentPackage.version.green}`);
+        }
+        if (badDependencies[i]) {
+            badDependencies[i].forEach((badDependency) => {
+                console.error(`    ${badDependency.dependency}@${badDependency.currentValue.red} (should be ${targetDependency})`);
+            });
+        }
+    }
+    console.error('\n');
+    console.error(`Run "scripts/pkgcheck.js --fix" inside the directory "${lernaDirectory}" to resolve this problem and change the version to "${targetVersion}"`);
+    process.exit(1);
+} else if (mismatch && fix) {
+    const command = `lerna publish --skip-git --skip-npm --yes --repo-version ${targetVersion} --force-publish '*' --exact`;
+    console.warn(`Status: running command ${command} to fix problems ...`)
+    child_process.execSync(command);
+    console.warn(`Status: modifying "${masterPackageFile} to fix problems ...`);
+    masterPackage.version = targetVersion;
+    fs.writeFileSync(masterPackageFile, JSON.stringify(masterPackage, null, 2), 'utf8');
+} else {
+    console.log('Status: no problems detected!');
+}
\ No newline at end of file
diff --git a/scripts/pkgset.js b/scripts/pkgset.js
index 069120f8..5b1a1505 100644
--- a/scripts/pkgset.js
+++ b/scripts/pkgset.js
@@ -19,11 +19,52 @@ const fs = require('fs');
 const path = require('path');
 const semver = require('semver')
 
-const npmDirectory = path.resolve('.');
-const npmConfigFile = path.resolve(npmDirectory, 'package.json');
-const npmConfig = require(npmConfigFile);
-npmConfig.version.replace(/-.*/, '');
+const lernaDirectory = path.resolve('.');
+const lernaConfigFile = path.resolve(lernaDirectory, 'lerna.json');
+const lernaConfig = require(lernaConfigFile);
+lernaConfig.version.replace(/-.*/, '');
 const targetVersion = semver.clean(process.argv[2]);
-npmConfig.version = targetVersion;
-fs.writeFileSync(npmConfigFile, JSON.stringify(npmConfig, null, 2), 'utf8');
+lernaConfig.version = targetVersion;
+fs.writeFileSync(lernaConfigFile, JSON.stringify(lernaConfig, null, 2), 'utf8');
 
+const masterPackageFile = path.resolve(lernaDirectory, 'package.json');
+const masterPackage = require(masterPackageFile);
+masterPackage.version = targetVersion;
+fs.writeFileSync(masterPackageFile, JSON.stringify(masterPackage, null, 2), 'utf8');
+
+const packagesDirectory = path.resolve(lernaDirectory, 'packages');
+const packageNames = fs.readdirSync(packagesDirectory);
+const packages = {};
+packageNames.forEach((packageName) => {
+    const packageFile = path.resolve(packagesDirectory, packageName, 'package.json');
+    const thisPackage = require(packageFile);
+    thisPackage.version = targetVersion;
+    packages[packageName] = thisPackage;
+});
+
+for (const i in packages) {
+    const currentPackage = packages[i];
+    for (const j in packages) {
+        const otherPackage = packages[j];
+        for (const dependency in currentPackage.dependencies) {
+            const currentValue = currentPackage.dependencies[dependency];
+            if (dependency === otherPackage.name) {
+                currentPackage.dependencies[dependency] = targetVersion;
+            }
+        }
+        for (const dependency in currentPackage.devDependencies) {
+            const currentValue = currentPackage.devDependencies[dependency];
+            if (dependency === otherPackage.name) {
+                currentPackage.devDependencies[dependency] = targetVersion;
+            }
+        }
+        for (const dependency in currentPackage.peerDependencies) {
+            const currentValue = currentPackage.peerDependencies[dependency];
+            if (dependency === otherPackage.name) {
+                currentPackage.peerDependencies[dependency] = targetVersion;
+            }
+        }        
+    }
+    const packageFile = path.resolve(packagesDirectory, i, 'package.json');
+    fs.writeFileSync(packageFile, JSON.stringify(currentPackage, null, 2), 'utf8');
+}
diff --git a/scripts/pkgstamp.js b/scripts/pkgstamp.js
index 8b8a409d..0c0e48ed 100755
--- a/scripts/pkgstamp.js
+++ b/scripts/pkgstamp.js
@@ -22,11 +22,52 @@ const semver = require('semver');
 
 const timestamp = moment().format('YYYYMMDDHHmmss');
 
-const npmDirectory = path.resolve('.');
-const npmConfigFile = path.resolve(npmDirectory, 'package.json');
-const npmConfig = require(npmConfigFile);
-npmConfig.version.replace(/-.*/, '');
-const targetVersion = semver.inc(npmConfig.version, 'patch') + '-' + timestamp;
-npmConfig.version = targetVersion;
-fs.writeFileSync(npmConfigFile, JSON.stringify(npmConfig, null, 2), 'utf8');
+const lernaDirectory = path.resolve('.');
+const lernaConfigFile = path.resolve(lernaDirectory, 'lerna.json');
+const lernaConfig = require(lernaConfigFile);
+lernaConfig.version.replace(/-.*/, '');
+const targetVersion = semver.inc(lernaConfig.version, 'patch') + '-' + timestamp;
+lernaConfig.version = targetVersion;
+fs.writeFileSync(lernaConfigFile, JSON.stringify(lernaConfig, null, 2), 'utf8');
 
+const masterPackageFile = path.resolve(lernaDirectory, 'package.json');
+const masterPackage = require(masterPackageFile);
+masterPackage.version = targetVersion;
+fs.writeFileSync(masterPackageFile, JSON.stringify(masterPackage, null, 2), 'utf8');
+
+const packagesDirectory = path.resolve(lernaDirectory, 'packages');
+const packageNames = fs.readdirSync(packagesDirectory);
+const packages = {};
+packageNames.forEach((packageName) => {
+    const packageFile = path.resolve(packagesDirectory, packageName, 'package.json');
+    const thisPackage = require(packageFile);
+    thisPackage.version = targetVersion;
+    packages[packageName] = thisPackage;
+});
+
+for (const i in packages) {
+    const currentPackage = packages[i];
+    for (const j in packages) {
+        const otherPackage = packages[j];
+        for (const dependency in currentPackage.dependencies) {
+            const currentValue = currentPackage.dependencies[dependency];
+            if (dependency === otherPackage.name) {
+                currentPackage.dependencies[dependency] = targetVersion;
+            }
+        }
+        for (const dependency in currentPackage.devDependencies) {
+            const currentValue = currentPackage.devDependencies[dependency];
+            if (dependency === otherPackage.name) {
+                currentPackage.devDependencies[dependency] = targetVersion;
+            }
+        }
+        for (const dependency in currentPackage.peerDependencies) {
+            const currentValue = currentPackage.peerDependencies[dependency];
+            if (dependency === otherPackage.name) {
+                currentPackage.peerDependencies[dependency] = targetVersion;
+            }
+        }        
+    }
+    const packageFile = path.resolve(packagesDirectory, i, 'package.json');
+    fs.writeFileSync(packageFile, JSON.stringify(currentPackage, null, 2), 'utf8');
+}