diff --git a/lib/config/definitions.js b/lib/config/definitions.js
index 5c38c479937f6acbe98f9579b013b1db54411587..f440730e70effb7f062b392f8c4d31ff077dedec 100644
--- a/lib/config/definitions.js
+++ b/lib/config/definitions.js
@@ -366,6 +366,7 @@ const options = [
       'docker',
       'hashicorp',
       'loose',
+      'node',
       'pep440',
       'ruby',
       'semver',
@@ -1148,6 +1149,7 @@ const options = [
     default: {
       enabled: false,
       fileMatch: ['^.travis.yml$'],
+      versionScheme: 'node',
     },
     mergeable: true,
     cli: false,
@@ -1159,6 +1161,7 @@ const options = [
     type: 'json',
     default: {
       fileMatch: ['^.nvmrc$'],
+      versionScheme: 'node',
     },
     mergeable: true,
     cli: false,
diff --git a/lib/manager/npm/extract/index.js b/lib/manager/npm/extract/index.js
index e37029c879048fb0978d5c402baabdfeaff62b0c..273729d5218e4f3b36bce9ae0b722eff29168ae8 100644
--- a/lib/manager/npm/extract/index.js
+++ b/lib/manager/npm/extract/index.js
@@ -141,7 +141,8 @@ async function extractPackageFile(content, fileName, config) {
     dep.currentValue = input.trim();
     if (depType === 'engines') {
       if (depName === 'node') {
-        dep.purl = 'pkg:github/nodejs/node?normalize=true';
+        dep.purl = 'pkg:github/nodejs/node';
+        dep.versionScheme = 'node';
       } else if (depName === 'yarn') {
         dep.purl = 'pkg:npm/yarn';
         dep.commitMessageTopic = 'Yarn';
diff --git a/lib/manager/nvm/extract.js b/lib/manager/nvm/extract.js
index 5c50835ccb7744ad50396f07f30042f567305eae..f3951782c8710e5ed588d13f771fc8d94924c4b5 100644
--- a/lib/manager/nvm/extract.js
+++ b/lib/manager/nvm/extract.js
@@ -8,7 +8,7 @@ function extractPackageFile(content) {
   const dep = {
     depName: 'node',
     currentValue: content.trim(),
-    purl: 'pkg:github/nodejs/node?normalize=true',
+    purl: 'pkg:github/nodejs/node',
   };
   if (!semver.isVersion(dep.currentValue)) {
     dep.skipReason = 'unsupported-version';
diff --git a/lib/manager/travis/package.js b/lib/manager/travis/package.js
index 17c1e5dea84637ccd4462adf22f49e178b37abcd..4d304d02f1f16aaf10bc8831681f68cf38fe7800 100644
--- a/lib/manager/travis/package.js
+++ b/lib/manager/travis/package.js
@@ -36,7 +36,7 @@ async function getPackageUpdates(config) {
   const newMajor = newValue[newValue.length - 1];
   if (config.rangeStrategy === 'pin' || isVersion(config.currentValue[0])) {
     const versions = (await getPkgReleases(
-      'pkg:github/nodejs/node?normalize=true',
+      'pkg:github/nodejs/node',
       config
     )).releases.map(release => release.version);
     newValue = newValue.map(value =>
diff --git a/lib/versioning/node/index.js b/lib/versioning/node/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..547c0dc76a5d17205fa0da9f79e8819d6a6f64ee
--- /dev/null
+++ b/lib/versioning/node/index.js
@@ -0,0 +1,20 @@
+const semver = require('../semver');
+
+function getNewValue(currentValue, rangeStrategy, fromVersion, toVersion) {
+  const res = semver.getNewValue(
+    currentValue,
+    rangeStrategy,
+    fromVersion,
+    toVersion
+  );
+  if (semver.isVersion(res)) {
+    // normalize out any 'v' prefix
+    return semver.isVersion(res);
+  }
+  return res;
+}
+
+module.exports = {
+  ...semver,
+  getNewValue,
+};
diff --git a/test/manager/npm/extract/__snapshots__/index.spec.js.snap b/test/manager/npm/extract/__snapshots__/index.spec.js.snap
index 2c2b698ba874513f3370bd525e8b1d0c3fce07a4..d9dd4ba44fd7b58d5360a6b867d70e16e0df0ad4 100644
--- a/test/manager/npm/extract/__snapshots__/index.spec.js.snap
+++ b/test/manager/npm/extract/__snapshots__/index.spec.js.snap
@@ -63,7 +63,8 @@ Object {
         "enabled": false,
       },
       "prettyDepType": "engine",
-      "purl": "pkg:github/nodejs/node?normalize=true",
+      "purl": "pkg:github/nodejs/node",
+      "versionScheme": "node",
     },
     Object {
       "commitMessageTopic": "npm",
diff --git a/test/manager/nvm/__snapshots__/extract.spec.js.snap b/test/manager/nvm/__snapshots__/extract.spec.js.snap
index edd93f6edec027e071f0aa23fdbb1584fe9b5840..332a6ef5a306a809dfe596f5822c78381ce7c4a6 100644
--- a/test/manager/nvm/__snapshots__/extract.spec.js.snap
+++ b/test/manager/nvm/__snapshots__/extract.spec.js.snap
@@ -5,7 +5,7 @@ Array [
   Object {
     "currentValue": "8.4.0",
     "depName": "node",
-    "purl": "pkg:github/nodejs/node?normalize=true",
+    "purl": "pkg:github/nodejs/node",
   },
 ]
 `;
@@ -15,7 +15,7 @@ Array [
   Object {
     "currentValue": "8.4",
     "depName": "node",
-    "purl": "pkg:github/nodejs/node?normalize=true",
+    "purl": "pkg:github/nodejs/node",
     "skipReason": "unsupported-version",
   },
 ]
diff --git a/test/versioning/node.spec.js b/test/versioning/node.spec.js
new file mode 100644
index 0000000000000000000000000000000000000000..e5ca0930a045a19a85417db9b315507f37657a18
--- /dev/null
+++ b/test/versioning/node.spec.js
@@ -0,0 +1,14 @@
+const nodever = require('../../lib/versioning/node');
+
+describe('semver.getNewValue()', () => {
+  it('returns normalized toVersion', () => {
+    expect(nodever.getNewValue('1.0.0', 'replace', '1.0.0', 'v1.1.0')).toEqual(
+      '1.1.0'
+    );
+  });
+  it('returns range', () => {
+    expect(nodever.getNewValue('~8.0.0', 'replace', '8.0.2', 'v8.2.0')).toEqual(
+      '~8.2.0'
+    );
+  });
+});