diff --git a/lib/datasource/github.js b/lib/datasource/github.js
index 518612cd7418311c02710f8db5b01c1d9961ddb0..25fd0d44ad12eac75daae5cd28a8a254f468b719 100644
--- a/lib/datasource/github.js
+++ b/lib/datasource/github.js
@@ -1,5 +1,7 @@
 const ghGot = require('../platform/github/gh-got-wrapper');
-const { isPinnedVersion } = require('../versioning/semver');
+const versioning = require('../versioning');
+
+const { isPinnedVersion } = versioning('semver');
 
 module.exports = {
   getDependency,
diff --git a/lib/manager/buildkite/extract.js b/lib/manager/buildkite/extract.js
index 45849232e9986c4f0ad2ad4ca1b0deefa5428e30..ece74e261417256f10fc758ce95b79a1f9f2b903 100644
--- a/lib/manager/buildkite/extract.js
+++ b/lib/manager/buildkite/extract.js
@@ -1,4 +1,6 @@
-const { isPinnedVersion } = require('../../versioning/semver');
+const versioning = require('../../versioning');
+
+const { isPinnedVersion } = versioning('semver');
 
 module.exports = {
   extractDependencies,
diff --git a/lib/manager/docker/package.js b/lib/manager/docker/package.js
index 035ae0b885e0d1788a8b11fda9e4d4ac7202433b..d0cd360adc40c8686ec5a6a0b44ced47037cce97 100644
--- a/lib/manager/docker/package.js
+++ b/lib/manager/docker/package.js
@@ -1,4 +1,4 @@
-const { getMajor, isValid } = require('../../versioning/semver');
+const versioning = require('../../versioning');
 const dockerApi = require('../../datasource/docker');
 const compareVersions = require('compare-versions');
 
@@ -18,6 +18,7 @@ async function getPackageUpdates(config) {
     unstablePattern,
     ignoreUnstable,
   } = config;
+  const { getMajor, isValid } = versioning('semver');
   const upgrades = [];
   if (currentDigest || config.pinDigests) {
     logger.debug('Checking docker pinDigests');
diff --git a/lib/manager/npm/extract/index.js b/lib/manager/npm/extract/index.js
index 1d55191f9e331fb2dd6a72a990281f647081a15c..8ee9f7e5a855e6c379129735d71111a8c2695a45 100644
--- a/lib/manager/npm/extract/index.js
+++ b/lib/manager/npm/extract/index.js
@@ -3,7 +3,9 @@ const upath = require('upath');
 const { getLockedVersions } = require('./locked-versions');
 const { detectMonorepos } = require('./monorepo');
 const { mightBeABrowserLibrary } = require('./type');
-const semver = require('../../../versioning/semver');
+const versioning = require('../../../versioning');
+
+const semver = versioning('semver');
 
 module.exports = {
   extractDependencies,
diff --git a/lib/manager/travis/package.js b/lib/manager/travis/package.js
index ff4d4be42f66c2eadcdcc0e1a1308d21a0bf211f..8cbb8f381f04d6d77bcbcb55d7433d853992a987 100644
--- a/lib/manager/travis/package.js
+++ b/lib/manager/travis/package.js
@@ -1,9 +1,8 @@
 const { isEqual } = require('lodash');
 const { getDependency } = require('../../datasource/github');
-const {
-  isPinnedVersion,
-  maxSatisfyingVersion,
-} = require('../../versioning/semver');
+const versioning = require('../../versioning');
+
+const { isPinnedVersion, maxSatisfyingVersion } = versioning('semver');
 
 module.exports = {
   getPackageUpdates,
diff --git a/lib/versioning/index.js b/lib/versioning/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..f08f9862e6ad811af7613b5813c6e62f98427141
--- /dev/null
+++ b/lib/versioning/index.js
@@ -0,0 +1,14 @@
+const semver = require('./semver');
+
+const schemes = {
+  semver,
+};
+
+module.exports = function getVersionScheme(versionScheme) {
+  const scheme = schemes[versionScheme];
+  if (!scheme) {
+    logger.warn({ versionScheme }, 'Unknown verion scheme');
+    return semver;
+  }
+  return scheme;
+};
diff --git a/test/versioning/index.spec.js b/test/versioning/index.spec.js
new file mode 100644
index 0000000000000000000000000000000000000000..8dcfd0eb588d2eda9ab75fa731897f647be319de
--- /dev/null
+++ b/test/versioning/index.spec.js
@@ -0,0 +1,8 @@
+const versioning = require('../../lib/versioning');
+
+describe('versioning(versionScheme)', () => {
+  it('should fallback to semver', () => {
+    expect(versioning(undefined)).toBe(versioning('semver'));
+    expect(versioning('unknown')).toBe(versioning('semver'));
+  });
+});
diff --git a/test/util/semver.spec.js b/test/versioning/semver.spec.js
similarity index 89%
rename from test/util/semver.spec.js
rename to test/versioning/semver.spec.js
index 31aa5babc45a9d193d7909bac1ecb72500f89930..6a6d76ce585f8f23a155fc3c06612f355fccace9 100644
--- a/test/util/semver.spec.js
+++ b/test/versioning/semver.spec.js
@@ -1,6 +1,6 @@
-const semver = require('../../lib/versioning/semver');
+const semver = require('../../lib/versioning')('semver');
 
-describe('.isValid(input)', () => {
+describe('semver.isValid(input)', () => {
   it('should return null for irregular versions', () => {
     expect(!!semver.isValid('17.04.0')).toBe(false);
   });
@@ -26,7 +26,7 @@ describe('.isValid(input)', () => {
     ).toBe(false);
   });
 });
-describe('.isRange(input)', () => {
+describe('semver.isRange(input)', () => {
   it('rejects simple semver', () => {
     expect(!!semver.isRange('1.2.3')).toBe(false);
   });