diff --git a/lib/datasource/docker/index.spec.ts b/lib/datasource/docker/index.spec.ts
index ebf61ddf0dc01dd1aef093810b256ad2a069ec51..50cc264f7dcbd7bc72af631ff8c93e6251d61f69 100644
--- a/lib/datasource/docker/index.spec.ts
+++ b/lib/datasource/docker/index.spec.ts
@@ -496,8 +496,9 @@ describe('api/docker', () => {
         .reply(200, null)
         .get('/my/node/tags/list?n=10000')
         .replyWithError('error');
-      const res = await docker.getReleases({
-        lookupName: 'my/node',
+      const res = await getPkgReleases({
+        datasource: docker.id,
+        depName: 'my/node',
       });
       expect(res).toBeNull();
       expect(httpMock.getTrace()).toMatchSnapshot();
diff --git a/lib/datasource/git-refs/index.spec.ts b/lib/datasource/git-refs/index.spec.ts
index 73736961dc3744c83fbaa4501476c9fe0feb2dd7..be43285cccbb85c8700c3b52358cf7f3794b4dd4 100644
--- a/lib/datasource/git-refs/index.spec.ts
+++ b/lib/datasource/git-refs/index.spec.ts
@@ -1,11 +1,12 @@
 import fs from 'fs-extra';
 import _simpleGit from 'simple-git/promise';
-import { getDigest, getReleases } from '.';
+import { getPkgReleases } from '..';
+import { id as datasource, getDigest } from '.';
 
 jest.mock('simple-git/promise');
 const simpleGit: any = _simpleGit;
 
-const lookupName = 'https://github.com/example/example.git';
+const depName = 'https://github.com/example/example.git';
 
 const lsRemote1 = fs.readFileSync(
   'lib/datasource/git-refs/__fixtures__/ls-remote-1.txt',
@@ -20,7 +21,10 @@ describe('datasource/git-refs', () => {
           return Promise.resolve(null);
         },
       });
-      const versions = await getReleases({ lookupName });
+      const versions = await getPkgReleases({
+        datasource,
+        depName,
+      });
       expect(versions).toBeNull();
     });
     it('returns nil if remote call throws exception', async () => {
@@ -29,7 +33,10 @@ describe('datasource/git-refs', () => {
           throw new Error();
         },
       });
-      const versions = await getReleases({ lookupName });
+      const versions = await getPkgReleases({
+        datasource,
+        depName,
+      });
       expect(versions).toBeNull();
     });
     it('returns versions filtered from tags', async () => {
@@ -39,8 +46,9 @@ describe('datasource/git-refs', () => {
         },
       });
 
-      const versions = await getReleases({
-        lookupName,
+      const versions = await getPkgReleases({
+        datasource,
+        depName,
       });
       expect(versions).toMatchSnapshot();
       const result = versions.releases.map((x) => x.version).sort();
diff --git a/lib/datasource/git-submodules/index.spec.ts b/lib/datasource/git-submodules/index.spec.ts
index a959c31b2c53437e113cff405618e5944b07d235..5d59836228dfac9ef9b699d62d190196e6cd2579 100644
--- a/lib/datasource/git-submodules/index.spec.ts
+++ b/lib/datasource/git-submodules/index.spec.ts
@@ -1,11 +1,13 @@
 import _simpleGit from 'simple-git/promise';
-import { getDigest, getReleases } from '.';
+import { getPkgReleases } from '..';
+import { id as versioning } from '../../versioning/git';
+import { id as datasource, getDigest } from '.';
 
 jest.mock('simple-git/promise');
 const simpleGit: any = _simpleGit;
 
-const lookupName = 'https://github.com/example/example.git';
-const registryUrls = [lookupName, 'master'];
+const depName = 'https://github.com/example/example.git';
+const registryUrls = [depName, 'master'];
 
 describe('datasource/git-submoduless', () => {
   describe('getReleases', () => {
@@ -15,7 +17,12 @@ describe('datasource/git-submoduless', () => {
           return Promise.resolve(null);
         },
       });
-      const versions = await getReleases({ lookupName, registryUrls });
+      const versions = await getPkgReleases({
+        datasource,
+        versioning,
+        depName,
+        registryUrls,
+      });
       expect(versions).toBeNull();
     });
     it('returns null if remote call throws exception', async () => {
@@ -24,7 +31,12 @@ describe('datasource/git-submoduless', () => {
           throw new Error();
         },
       });
-      const versions = await getReleases({ lookupName, registryUrls });
+      const versions = await getPkgReleases({
+        datasource,
+        versioning,
+        depName,
+        registryUrls,
+      });
       expect(versions).toBeNull();
     });
     it('returns versions filtered from tags', async () => {
@@ -34,8 +46,10 @@ describe('datasource/git-submoduless', () => {
         },
       });
 
-      const versions = await getReleases({
-        lookupName,
+      const versions = await getPkgReleases({
+        datasource,
+        versioning,
+        depName,
         registryUrls,
       });
       const result = versions.releases.map((x) => x.version).sort();
diff --git a/lib/datasource/git-tags/index.spec.ts b/lib/datasource/git-tags/index.spec.ts
index 172d19f82f870a9dd263198bd66d0f81d45b39bc..7cb76782b65dd2df9986255c7aa604307c013e62 100644
--- a/lib/datasource/git-tags/index.spec.ts
+++ b/lib/datasource/git-tags/index.spec.ts
@@ -1,11 +1,12 @@
 import fs from 'fs-extra';
 import _simpleGit from 'simple-git/promise';
-import { getDigest, getReleases } from '.';
+import { getPkgReleases } from '..';
+import { id as datasource, getDigest } from '.';
 
 jest.mock('simple-git/promise');
 const simpleGit: any = _simpleGit;
 
-const lookupName = 'https://github.com/example/example.git';
+const depName = 'https://github.com/example/example.git';
 
 const lsRemote1 = fs.readFileSync(
   'lib/datasource/git-refs/__fixtures__/ls-remote-1.txt',
@@ -20,7 +21,7 @@ describe('datasource/git-tags', () => {
           return Promise.resolve(null);
         },
       });
-      const versions = await getReleases({ lookupName });
+      const versions = await getPkgReleases({ datasource, depName });
       expect(versions).toBeNull();
     });
     it('returns nil if remote call throws exception', async () => {
@@ -29,7 +30,7 @@ describe('datasource/git-tags', () => {
           throw new Error();
         },
       });
-      const versions = await getReleases({ lookupName });
+      const versions = await getPkgReleases({ datasource, depName });
       expect(versions).toBeNull();
     });
     it('returns versions filtered from tags', async () => {
@@ -39,8 +40,9 @@ describe('datasource/git-tags', () => {
         },
       });
 
-      const versions = await getReleases({
-        lookupName,
+      const versions = await getPkgReleases({
+        datasource,
+        depName,
       });
       expect(versions).toMatchSnapshot();
     });
@@ -53,7 +55,7 @@ describe('datasource/git-tags', () => {
         },
       });
       const digest = await getDigest(
-        { lookupName: 'a tag to look up' },
+        { datasource, depName: 'a tag to look up' },
         'notfound'
       );
       expect(digest).toBeNull();
@@ -65,7 +67,7 @@ describe('datasource/git-tags', () => {
         },
       });
       const digest = await getDigest(
-        { lookupName: 'a tag to look up' },
+        { datasource, depName: 'a tag to look up' },
         'v1.0.2'
       );
       expect(digest).toMatchSnapshot();
@@ -77,7 +79,7 @@ describe('datasource/git-tags', () => {
         },
       });
       const digest = await getDigest(
-        { lookupName: 'another tag to look up' },
+        { datasource, depName: 'another tag to look up' },
         undefined
       );
       expect(digest).toMatchSnapshot();
diff --git a/lib/datasource/github-releases/__snapshots__/index.spec.ts.snap b/lib/datasource/github-releases/__snapshots__/index.spec.ts.snap
index 1ddafae4351bbdcbbed436c7c3479a5c8a3b8980..ed04de002e9f2f83bc4551439aacb1c1eb08b87f 100644
--- a/lib/datasource/github-releases/__snapshots__/index.spec.ts.snap
+++ b/lib/datasource/github-releases/__snapshots__/index.spec.ts.snap
@@ -3,16 +3,6 @@
 exports[`datasource/github-releases getReleases returns releases 1`] = `
 Object {
   "releases": Array [
-    Object {
-      "gitRef": "a",
-      "releaseTimestamp": "2020-03-09T13:00:00Z",
-      "version": "a",
-    },
-    Object {
-      "gitRef": "v",
-      "releaseTimestamp": "2020-03-09T12:00:00Z",
-      "version": "v",
-    },
     Object {
       "gitRef": "1.0.0",
       "releaseTimestamp": "2020-03-09T11:00:00Z",
diff --git a/lib/datasource/github-releases/index.spec.ts b/lib/datasource/github-releases/index.spec.ts
index 23555f8ae05fb567ec84fb7e5b61d7e5f2b9caaa..dd5b23070670c79e8b9c69420c329c35b1e4ef89 100644
--- a/lib/datasource/github-releases/index.spec.ts
+++ b/lib/datasource/github-releases/index.spec.ts
@@ -1,6 +1,7 @@
+import { getPkgReleases } from '..';
 import * as httpMock from '../../../test/httpMock';
 import * as _hostRules from '../../util/host-rules';
-import * as github from '.';
+import { id as datasource } from '.';
 
 jest.mock('../../util/host-rules');
 const hostRules: any = _hostRules;
@@ -32,11 +33,12 @@ describe('datasource/github-releases', () => {
           { tag_name: 'v1.1.0', published_at: '2020-03-09T10:00:00Z' },
         ]);
 
-      const res = await github.getReleases({
-        lookupName: 'some/dep',
+      const res = await getPkgReleases({
+        datasource,
+        depName: 'some/dep',
       });
       expect(res).toMatchSnapshot();
-      expect(res.releases).toHaveLength(4);
+      expect(res.releases).toHaveLength(2);
       expect(
         res.releases.find((release) => release.version === 'v1.1.0')
       ).toBeDefined();
diff --git a/lib/datasource/github-tags/index.spec.ts b/lib/datasource/github-tags/index.spec.ts
index 2fee2080d43e55e3f6d16e1cac7ed9772c85bb5e..672126c8bcc8936c8b8544e9fdf6334109520830 100644
--- a/lib/datasource/github-tags/index.spec.ts
+++ b/lib/datasource/github-tags/index.spec.ts
@@ -1,3 +1,4 @@
+import { getPkgReleases } from '..';
 import * as httpMock from '../../../test/httpMock';
 import * as _hostRules from '../../util/host-rules';
 import * as github from '.';
@@ -88,15 +89,15 @@ describe('datasource/github-tags', () => {
     });
   });
   describe('getReleases', () => {
-    const lookupName = 'some/dep2';
+    const depName = 'some/dep2';
 
     it('returns tags', async () => {
       const body = [{ name: 'v1.0.0' }, { name: 'v1.1.0' }];
       httpMock
         .scope(githubApiHost)
-        .get(`/repos/${lookupName}/tags?per_page=100`)
+        .get(`/repos/${depName}/tags?per_page=100`)
         .reply(200, body);
-      const res = await github.getReleases({ lookupName });
+      const res = await getPkgReleases({ datasource: github.id, depName });
       expect(res).toMatchSnapshot();
       expect(res.releases).toHaveLength(2);
       expect(httpMock.getTrace()).toMatchSnapshot();
diff --git a/lib/datasource/gitlab-tags/__snapshots__/index.spec.ts.snap b/lib/datasource/gitlab-tags/__snapshots__/index.spec.ts.snap
index 6a8e9aa049b9f4bb140bf6d33a46770368526274..c7a78215e4fc9c824136dfa5b263c6b2369e99cd 100644
--- a/lib/datasource/gitlab-tags/__snapshots__/index.spec.ts.snap
+++ b/lib/datasource/gitlab-tags/__snapshots__/index.spec.ts.snap
@@ -10,12 +10,10 @@ Object {
     },
     Object {
       "gitRef": "v1.1.0",
-      "releaseTimestamp": undefined,
       "version": "v1.1.0",
     },
     Object {
       "gitRef": "v1.1.1",
-      "releaseTimestamp": undefined,
       "version": "v1.1.1",
     },
   ],
@@ -43,12 +41,10 @@ Object {
   "releases": Array [
     Object {
       "gitRef": "v1.0.0",
-      "releaseTimestamp": undefined,
       "version": "v1.0.0",
     },
     Object {
       "gitRef": "v1.1.0",
-      "releaseTimestamp": undefined,
       "version": "v1.1.0",
     },
   ],
diff --git a/lib/datasource/gitlab-tags/index.spec.ts b/lib/datasource/gitlab-tags/index.spec.ts
index 17f10660dfb77e572323fa39c2bef02c44b2eb1b..5b049589a1954d8f2bab9f87bc3a29ba9bbc57f6 100644
--- a/lib/datasource/gitlab-tags/index.spec.ts
+++ b/lib/datasource/gitlab-tags/index.spec.ts
@@ -1,5 +1,6 @@
+import { getPkgReleases } from '..';
 import * as httpMock from '../../../test/httpMock';
-import * as gitlab from '.';
+import { id as datasource } from '.';
 
 describe('datasource/gitlab-tags', () => {
   beforeEach(() => {
@@ -27,9 +28,10 @@ describe('datasource/gitlab-tags', () => {
         .scope('https://gitlab.company.com')
         .get('/api/v4/api/v4/projects/some%2Fdep2/repository/tags?per_page=100')
         .reply(200, body);
-      const res = await gitlab.getReleases({
+      const res = await getPkgReleases({
+        datasource,
         registryUrls: ['https://gitlab.company.com/api/v4/'],
-        lookupName: 'some/dep2',
+        depName: 'some/dep2',
       });
       expect(res).toMatchSnapshot();
       expect(res.releases).toHaveLength(3);
@@ -42,8 +44,9 @@ describe('datasource/gitlab-tags', () => {
         .scope('https://gitlab.com')
         .get('/api/v4/projects/some%2Fdep2/repository/tags?per_page=100')
         .reply(200, body);
-      const res = await gitlab.getReleases({
-        lookupName: 'some/dep2',
+      const res = await getPkgReleases({
+        datasource,
+        depName: 'some/dep2',
       });
       expect(res).toMatchSnapshot();
       expect(res.releases).toHaveLength(2);
diff --git a/lib/datasource/go/index.spec.ts b/lib/datasource/go/index.spec.ts
index 0dc24554ef7e4ca028fde78f1e2a7d658d7bb535..7fb37a0b74c345213e26d9e6f1a3c0fe35c4dbc3 100644
--- a/lib/datasource/go/index.spec.ts
+++ b/lib/datasource/go/index.spec.ts
@@ -1,8 +1,8 @@
-import { ReleaseResult } from '..';
+import { ReleaseResult, getPkgReleases } from '..';
 import * as httpMock from '../../../test/httpMock';
 import { mocked, partial } from '../../../test/util';
 import * as _github from '../github-tags';
-import * as go from '.';
+import { id as datasource, getDigest } from '.';
 
 jest.mock('../github-tags');
 
@@ -37,7 +37,7 @@ describe('datasource/go', () => {
         .get('/y/text?go-get=1')
         .reply(200, res1);
       github.getDigest.mockResolvedValueOnce('abcdefabcdefabcdefabcdef');
-      const res = await go.getDigest({ lookupName: 'golang.org/y/text' }, null);
+      const res = await getDigest({ lookupName: 'golang.org/y/text' }, null);
       expect(res).toBeNull();
       expect(httpMock.getTrace()).toMatchSnapshot();
     });
@@ -47,7 +47,7 @@ describe('datasource/go', () => {
         .get('/x/text?go-get=1')
         .reply(200, res1);
       github.getDigest.mockResolvedValueOnce('abcdefabcdefabcdefabcdef');
-      const res = await go.getDigest({ lookupName: 'golang.org/x/text' }, null);
+      const res = await getDigest({ lookupName: 'golang.org/x/text' }, null);
       expect(res).toBe('abcdefabcdefabcdefabcdef');
       expect(httpMock.getTrace()).toMatchSnapshot();
     });
@@ -59,8 +59,9 @@ describe('datasource/go', () => {
         .get('/foo/something?go-get=1')
         .reply(200, res1);
       expect(
-        await go.getReleases({
-          lookupName: 'golang.org/foo/something',
+        await getPkgReleases({
+          datasource,
+          depName: 'golang.org/foo/something',
         })
       ).toBeNull();
       expect(httpMock.getTrace()).toMatchSnapshot();
@@ -71,8 +72,9 @@ describe('datasource/go', () => {
         .get('/foo/something?go-get=1')
         .reply(404);
       expect(
-        await go.getReleases({
-          lookupName: 'golang.org/foo/something',
+        await getPkgReleases({
+          datasource,
+          depName: 'golang.org/foo/something',
         })
       ).toBeNull();
       expect(httpMock.getTrace()).toMatchSnapshot();
@@ -83,8 +85,9 @@ describe('datasource/go', () => {
         .get('/foo/something?go-get=1')
         .replyWithError('error');
       expect(
-        await go.getReleases({
-          lookupName: 'golang.org/foo/something',
+        await getPkgReleases({
+          datasource,
+          depName: 'golang.org/foo/something',
         })
       ).toBeNull();
       expect(httpMock.getTrace()).toMatchSnapshot();
@@ -97,8 +100,9 @@ describe('datasource/go', () => {
       github.getReleases.mockResolvedValueOnce({
         releases: [{ version: 'v1.0.0' }, { version: 'v2.0.0' }],
       });
-      const res = await go.getReleases({
-        lookupName: 'golang.org/x/text',
+      const res = await getPkgReleases({
+        datasource,
+        depName: 'golang.org/x/text',
       });
       expect(res).toMatchSnapshot();
       expect(res).not.toBeNull();
@@ -110,8 +114,9 @@ describe('datasource/go', () => {
         .scope('https://golang.org/')
         .get('/x/sys?go-get=1')
         .reply(200, res1);
-      const res = await go.getReleases({
-        lookupName: 'golang.org/x/sys',
+      const res = await getPkgReleases({
+        datasource,
+        depName: 'golang.org/x/sys',
       });
       expect(res).toBeNull();
       expect(httpMock.getTrace()).toMatchSnapshot();
@@ -127,8 +132,9 @@ describe('datasource/go', () => {
             'https://google.com/golang/text/'
           )
         );
-      const res = await go.getReleases({
-        lookupName: 'golang.org/x/text',
+      const res = await getPkgReleases({
+        datasource,
+        depName: 'golang.org/x/text',
       });
       expect(res).toBeNull();
       expect(httpMock.getTrace()).toMatchSnapshot();
@@ -136,32 +142,32 @@ describe('datasource/go', () => {
     it('works for known servers', async () => {
       github.getReleases.mockClear();
       const packages = [
-        { lookupName: 'github.com/x/text' },
-        { lookupName: 'gopkg.in/x/text' },
-        { lookupName: 'gopkg.in/x' },
+        { datasource, depName: 'github.com/x/text' },
+        { datasource, depName: 'gopkg.in/x/text' },
+        { datasource, depName: 'gopkg.in/x' },
       ];
       const githubRes = { releases: [1, 2] } as any;
       for (const pkg of packages) {
         github.getReleases.mockResolvedValueOnce(
           partial<ReleaseResult>(githubRes)
         );
-        expect(await go.getReleases(pkg)).toEqual(githubRes);
+        expect(await getPkgReleases(pkg)).toEqual(githubRes);
       }
       expect(github.getReleases.mock.calls).toMatchSnapshot();
     });
     it('works for nested modules on github', async () => {
       github.getReleases.mockClear();
       const packages = [
-        { lookupName: 'github.com/x/text/a' },
-        { lookupName: 'github.com/x/text/b' },
+        { datasource, depName: 'github.com/x/text/a' },
+        { datasource, depName: 'github.com/x/text/b' },
       ];
 
       for (const pkg of packages) {
         github.getReleases.mockResolvedValueOnce({
           releases: [{ version: 'a/v1.0.0' }, { version: 'b/v2.0.0' }],
         });
-        const prefix = pkg.lookupName.split('/')[3];
-        const result = await go.getReleases(pkg);
+        const prefix = pkg.depName.split('/')[3];
+        const result = await getPkgReleases(pkg);
         expect(result.releases).toHaveLength(1);
         expect(result.releases[0].version.startsWith(prefix)).toBeFalse();
       }
@@ -170,8 +176,8 @@ describe('datasource/go', () => {
     it('falls back to old behaviour', async () => {
       github.getReleases.mockClear();
       const packages = [
-        { lookupName: 'github.com/x/text/a' },
-        { lookupName: 'github.com/x/text/b' },
+        { datasource, depName: 'github.com/x/text/a' },
+        { datasource, depName: 'github.com/x/text/b' },
       ];
 
       const releases = {
@@ -179,7 +185,7 @@ describe('datasource/go', () => {
       };
       for (const pkg of packages) {
         github.getReleases.mockResolvedValueOnce(releases);
-        expect(await go.getReleases(pkg)).toBe(releases);
+        expect(await getPkgReleases(pkg)).toStrictEqual(releases);
       }
     });
   });
diff --git a/lib/datasource/gradle-version/__snapshots__/index.spec.ts.snap b/lib/datasource/gradle-version/__snapshots__/index.spec.ts.snap
index 2b98af0ca7e1c44f6100106a791987b219f0b561..f2dc398b8076f7ce4f017036597e4aaeed79a702 100644
--- a/lib/datasource/gradle-version/__snapshots__/index.spec.ts.snap
+++ b/lib/datasource/gradle-version/__snapshots__/index.spec.ts.snap
@@ -5,352 +5,352 @@ Object {
   "homepage": "https://gradle.org",
   "releases": Array [
     Object {
-      "releaseTimestamp": null,
-      "version": "4.10.3",
-    },
-    Object {
-      "releaseTimestamp": null,
-      "version": "5.0",
+      "releaseTimestamp": "2009-07-20T08:50:13+0200",
+      "version": "0.7",
     },
     Object {
-      "releaseTimestamp": "2018-09-19T18:10:15+0000",
-      "version": "4.10.2",
+      "releaseTimestamp": "2009-07-20T08:50:13+0200",
+      "version": "0.7",
     },
     Object {
-      "releaseTimestamp": "2018-09-12T11:33:27+0000",
-      "version": "4.10.1",
+      "releaseTimestamp": "2009-09-28T14:01:59+0200",
+      "version": "0.8",
     },
     Object {
-      "releaseTimestamp": "2018-08-27T18:35:06+0000",
-      "version": "4.10",
+      "releaseTimestamp": "2009-09-28T14:01:59+0200",
+      "version": "0.8",
     },
     Object {
-      "releaseTimestamp": "2018-07-16T08:14:03+0000",
-      "version": "4.9",
+      "releaseTimestamp": "2010-12-19T12:50:06+1100",
+      "version": "0.9",
     },
     Object {
-      "releaseTimestamp": "2018-06-21T07:53:06+0000",
-      "version": "4.8.1",
+      "releaseTimestamp": "2010-12-19T12:50:06+1100",
+      "version": "0.9",
     },
     Object {
-      "releaseTimestamp": "2018-06-04T10:39:58+0000",
-      "version": "4.8",
+      "releaseTimestamp": "2011-01-02T11:40:57+1100",
+      "version": "0.9.1",
     },
     Object {
-      "releaseTimestamp": "2018-04-18T09:09:12+0000",
-      "version": "4.7",
+      "releaseTimestamp": "2011-01-02T11:40:57+1100",
+      "version": "0.9.1",
     },
     Object {
-      "releaseTimestamp": "2018-02-28T13:36:36+0000",
-      "version": "4.6",
+      "releaseTimestamp": "2011-01-23T13:34:21+1100",
+      "version": "0.9.2",
     },
     Object {
-      "releaseTimestamp": "2018-02-05T13:22:49+0000",
-      "version": "4.5.1",
+      "releaseTimestamp": "2011-01-23T13:34:21+1100",
+      "version": "0.9.2",
     },
     Object {
-      "releaseTimestamp": "2018-01-24T17:04:52+0000",
-      "version": "4.5",
+      "releaseTimestamp": "2012-06-12T02:56:21+0200",
+      "version": "1.0",
     },
     Object {
-      "releaseTimestamp": "2017-12-20T15:45:23+0000",
-      "version": "4.4.1",
+      "releaseTimestamp": "2012-06-12T02:56:21+0200",
+      "version": "1.0",
     },
     Object {
-      "releaseTimestamp": "2017-12-06T09:05:06+0000",
-      "version": "4.4",
+      "releaseTimestamp": "2012-07-31T13:24:32+0000",
+      "version": "1.1",
     },
     Object {
-      "releaseTimestamp": "2017-11-08T08:59:45+0000",
-      "version": "4.3.1",
+      "releaseTimestamp": "2012-07-31T13:24:32+0000",
+      "version": "1.1",
     },
     Object {
-      "releaseTimestamp": "2017-10-30T15:43:29+0000",
-      "version": "4.3",
+      "releaseTimestamp": "2012-09-12T10:46:02+0000",
+      "version": "1.2",
     },
     Object {
-      "releaseTimestamp": "2017-10-02T15:36:21+0000",
-      "version": "4.2.1",
+      "releaseTimestamp": "2012-09-12T10:46:02+0000",
+      "version": "1.2",
     },
     Object {
-      "releaseTimestamp": "2017-09-20T14:48:23+0000",
-      "version": "4.2",
+      "releaseTimestamp": "2012-11-20T11:37:38+0000",
+      "version": "1.3",
     },
     Object {
-      "releaseTimestamp": "2017-08-07T14:38:48+0000",
-      "version": "4.1",
+      "releaseTimestamp": "2012-11-20T11:37:38+0000",
+      "version": "1.3",
     },
     Object {
-      "releaseTimestamp": "2017-07-26T16:19:18+0000",
-      "version": "4.0.2",
+      "releaseTimestamp": "2013-01-28T03:42:46+0000",
+      "version": "1.4",
     },
     Object {
-      "releaseTimestamp": "2017-07-07T14:02:41+0000",
-      "version": "4.0.1",
+      "releaseTimestamp": "2013-01-28T03:42:46+0000",
+      "version": "1.4",
     },
     Object {
-      "releaseTimestamp": "2017-06-16T14:36:27+0000",
-      "version": "3.5.1",
+      "releaseTimestamp": "2013-03-27T14:09:35+0000",
+      "version": "1.5",
     },
     Object {
-      "releaseTimestamp": "2017-06-14T15:11:08+0000",
-      "version": "4.0",
+      "releaseTimestamp": "2013-03-27T14:09:35+0000",
+      "version": "1.5",
     },
     Object {
-      "releaseTimestamp": "2017-04-10T13:37:25+0000",
-      "version": "3.5",
+      "releaseTimestamp": "2013-05-07T09:12:14+0000",
+      "version": "1.6",
     },
     Object {
-      "releaseTimestamp": "2017-03-03T19:45:41+0000",
-      "version": "3.4.1",
+      "releaseTimestamp": "2013-05-07T09:12:14+0000",
+      "version": "1.6",
     },
     Object {
-      "releaseTimestamp": "2017-02-20T14:49:26+0000",
-      "version": "3.4",
+      "releaseTimestamp": "2013-08-06T11:19:56+0000",
+      "version": "1.7",
     },
     Object {
-      "releaseTimestamp": "2017-01-03T15:31:04+0000",
-      "version": "3.3",
+      "releaseTimestamp": "2013-08-06T11:19:56+0000",
+      "version": "1.7",
     },
     Object {
-      "releaseTimestamp": "2016-11-22T15:19:54+0000",
-      "version": "3.2.1",
+      "releaseTimestamp": "2013-09-24T07:32:33+0000",
+      "version": "1.8",
     },
     Object {
-      "releaseTimestamp": "2016-11-14T12:32:59+0000",
-      "version": "3.2",
+      "releaseTimestamp": "2013-09-24T07:32:33+0000",
+      "version": "1.8",
     },
     Object {
-      "releaseTimestamp": "2016-09-19T10:53:53+0000",
-      "version": "3.1",
+      "releaseTimestamp": "2013-11-19T08:20:02+0000",
+      "version": "1.9",
     },
     Object {
-      "releaseTimestamp": "2016-08-15T13:15:01+0000",
-      "version": "3.0",
+      "releaseTimestamp": "2013-11-19T08:20:02+0000",
+      "version": "1.9",
     },
     Object {
-      "releaseTimestamp": "2016-07-18T06:38:37+0000",
-      "version": "2.14.1",
+      "releaseTimestamp": "2013-12-17T09:28:15+0000",
+      "version": "1.10",
     },
     Object {
-      "releaseTimestamp": "2016-06-14T07:16:37+0000",
-      "version": "2.14",
+      "releaseTimestamp": "2013-12-17T09:28:15+0000",
+      "version": "1.10",
     },
     Object {
-      "releaseTimestamp": "2016-04-25T04:10:10+0000",
-      "version": "2.13",
+      "releaseTimestamp": "2014-02-11T11:34:39+0000",
+      "version": "1.11",
     },
     Object {
-      "releaseTimestamp": "2016-03-14T08:32:03+0000",
-      "version": "2.12",
+      "releaseTimestamp": "2014-02-11T11:34:39+0000",
+      "version": "1.11",
     },
     Object {
-      "releaseTimestamp": "2016-02-08T07:59:16+0000",
-      "version": "2.11",
+      "releaseTimestamp": "2014-04-29T09:24:31+0000",
+      "version": "1.12",
     },
     Object {
-      "releaseTimestamp": "2015-12-21T21:15:04+0000",
-      "version": "2.10",
+      "releaseTimestamp": "2014-04-29T09:24:31+0000",
+      "version": "1.12",
     },
     Object {
-      "releaseTimestamp": "2015-11-17T07:02:17+0000",
-      "version": "2.9",
+      "releaseTimestamp": "2014-07-01T07:45:34+0000",
+      "version": "2.0",
     },
     Object {
-      "releaseTimestamp": "2015-10-20T03:46:36+0000",
-      "version": "2.8",
+      "releaseTimestamp": "2014-07-01T07:45:34+0000",
+      "version": "2.0",
     },
     Object {
-      "releaseTimestamp": "2015-09-14T07:26:16+0000",
-      "version": "2.7",
+      "releaseTimestamp": "2014-09-08T10:40:39+0000",
+      "version": "2.1",
     },
     Object {
-      "releaseTimestamp": "2015-08-10T13:15:06+0000",
-      "version": "2.6",
+      "releaseTimestamp": "2014-09-08T10:40:39+0000",
+      "version": "2.1",
     },
     Object {
-      "releaseTimestamp": "2015-07-08T07:38:37+0000",
-      "version": "2.5",
+      "releaseTimestamp": "2014-11-10T13:31:44+0000",
+      "version": "2.2",
     },
     Object {
-      "releaseTimestamp": "2015-05-05T08:09:24+0000",
-      "version": "2.4",
+      "releaseTimestamp": "2014-11-10T13:31:44+0000",
+      "version": "2.2",
     },
     Object {
-      "releaseTimestamp": "2015-02-16T05:09:33+0000",
-      "version": "2.3",
+      "releaseTimestamp": "2014-11-24T09:45:35+0000",
+      "version": "2.2.1",
     },
     Object {
       "releaseTimestamp": "2014-11-24T09:45:35+0000",
       "version": "2.2.1",
     },
     Object {
-      "releaseTimestamp": "2014-11-10T13:31:44+0000",
-      "version": "2.2",
+      "releaseTimestamp": "2015-02-16T05:09:33+0000",
+      "version": "2.3",
     },
     Object {
-      "releaseTimestamp": "2014-09-08T10:40:39+0000",
-      "version": "2.1",
+      "releaseTimestamp": "2015-02-16T05:09:33+0000",
+      "version": "2.3",
     },
     Object {
-      "releaseTimestamp": "2014-07-01T07:45:34+0000",
-      "version": "2.0",
+      "releaseTimestamp": "2015-05-05T08:09:24+0000",
+      "version": "2.4",
     },
     Object {
-      "releaseTimestamp": "2014-04-29T09:24:31+0000",
-      "version": "1.12",
+      "releaseTimestamp": "2015-05-05T08:09:24+0000",
+      "version": "2.4",
     },
     Object {
-      "releaseTimestamp": "2014-02-11T11:34:39+0000",
-      "version": "1.11",
+      "releaseTimestamp": "2015-07-08T07:38:37+0000",
+      "version": "2.5",
     },
     Object {
-      "releaseTimestamp": "2013-12-17T09:28:15+0000",
-      "version": "1.10",
+      "releaseTimestamp": "2015-07-08T07:38:37+0000",
+      "version": "2.5",
     },
     Object {
-      "releaseTimestamp": "2013-11-19T08:20:02+0000",
-      "version": "1.9",
+      "releaseTimestamp": "2015-08-10T13:15:06+0000",
+      "version": "2.6",
     },
     Object {
-      "releaseTimestamp": "2013-09-24T07:32:33+0000",
-      "version": "1.8",
+      "releaseTimestamp": "2015-08-10T13:15:06+0000",
+      "version": "2.6",
     },
     Object {
-      "releaseTimestamp": "2013-08-06T11:19:56+0000",
-      "version": "1.7",
+      "releaseTimestamp": "2015-09-14T07:26:16+0000",
+      "version": "2.7",
     },
     Object {
-      "releaseTimestamp": "2013-05-07T09:12:14+0000",
-      "version": "1.6",
+      "releaseTimestamp": "2015-09-14T07:26:16+0000",
+      "version": "2.7",
     },
     Object {
-      "releaseTimestamp": "2013-03-27T14:09:35+0000",
-      "version": "1.5",
+      "releaseTimestamp": "2015-10-20T03:46:36+0000",
+      "version": "2.8",
     },
     Object {
-      "releaseTimestamp": "2013-01-28T03:42:46+0000",
-      "version": "1.4",
+      "releaseTimestamp": "2015-10-20T03:46:36+0000",
+      "version": "2.8",
     },
     Object {
-      "releaseTimestamp": "2012-11-20T11:37:38+0000",
-      "version": "1.3",
+      "releaseTimestamp": "2015-11-17T07:02:17+0000",
+      "version": "2.9",
     },
     Object {
-      "releaseTimestamp": "2012-09-12T10:46:02+0000",
-      "version": "1.2",
+      "releaseTimestamp": "2015-11-17T07:02:17+0000",
+      "version": "2.9",
     },
     Object {
-      "releaseTimestamp": "2012-07-31T13:24:32+0000",
-      "version": "1.1",
+      "releaseTimestamp": "2015-12-21T21:15:04+0000",
+      "version": "2.10",
     },
     Object {
-      "releaseTimestamp": "2012-06-12T02:56:21+0200",
-      "version": "1.0",
+      "releaseTimestamp": "2015-12-21T21:15:04+0000",
+      "version": "2.10",
     },
     Object {
-      "releaseTimestamp": "2011-01-23T13:34:21+1100",
-      "version": "0.9.2",
+      "releaseTimestamp": "2016-02-08T07:59:16+0000",
+      "version": "2.11",
     },
     Object {
-      "releaseTimestamp": "2011-01-02T11:40:57+1100",
-      "version": "0.9.1",
+      "releaseTimestamp": "2016-02-08T07:59:16+0000",
+      "version": "2.11",
     },
     Object {
-      "releaseTimestamp": "2010-12-19T12:50:06+1100",
-      "version": "0.9",
+      "releaseTimestamp": "2016-03-14T08:32:03+0000",
+      "version": "2.12",
     },
     Object {
-      "releaseTimestamp": "2009-09-28T14:01:59+0200",
-      "version": "0.8",
+      "releaseTimestamp": "2016-03-14T08:32:03+0000",
+      "version": "2.12",
     },
     Object {
-      "releaseTimestamp": "2009-07-20T08:50:13+0200",
-      "version": "0.7",
+      "releaseTimestamp": "2016-04-25T04:10:10+0000",
+      "version": "2.13",
     },
     Object {
-      "releaseTimestamp": null,
-      "version": "4.10.3",
+      "releaseTimestamp": "2016-04-25T04:10:10+0000",
+      "version": "2.13",
     },
     Object {
-      "releaseTimestamp": null,
-      "version": "5.0",
+      "releaseTimestamp": "2016-06-14T07:16:37+0000",
+      "version": "2.14",
+    },
+    Object {
+      "releaseTimestamp": "2016-06-14T07:16:37+0000",
+      "version": "2.14",
     },
     Object {
-      "releaseTimestamp": "2018-09-19T18:10:15+0000",
-      "version": "4.10.2",
+      "releaseTimestamp": "2016-07-18T06:38:37+0000",
+      "version": "2.14.1",
     },
     Object {
-      "releaseTimestamp": "2018-09-12T11:33:27+0000",
-      "version": "4.10.1",
+      "releaseTimestamp": "2016-07-18T06:38:37+0000",
+      "version": "2.14.1",
     },
     Object {
-      "releaseTimestamp": "2018-08-27T18:35:06+0000",
-      "version": "4.10",
+      "releaseTimestamp": "2016-08-15T13:15:01+0000",
+      "version": "3.0",
     },
     Object {
-      "releaseTimestamp": "2018-07-16T08:14:03+0000",
-      "version": "4.9",
+      "releaseTimestamp": "2016-08-15T13:15:01+0000",
+      "version": "3.0",
     },
     Object {
-      "releaseTimestamp": "2018-06-21T07:53:06+0000",
-      "version": "4.8.1",
+      "releaseTimestamp": "2016-09-19T10:53:53+0000",
+      "version": "3.1",
     },
     Object {
-      "releaseTimestamp": "2018-06-04T10:39:58+0000",
-      "version": "4.8",
+      "releaseTimestamp": "2016-09-19T10:53:53+0000",
+      "version": "3.1",
     },
     Object {
-      "releaseTimestamp": "2018-04-18T09:09:12+0000",
-      "version": "4.7",
+      "releaseTimestamp": "2016-11-14T12:32:59+0000",
+      "version": "3.2",
     },
     Object {
-      "releaseTimestamp": "2018-02-28T13:36:36+0000",
-      "version": "4.6",
+      "releaseTimestamp": "2016-11-14T12:32:59+0000",
+      "version": "3.2",
     },
     Object {
-      "releaseTimestamp": "2018-02-05T13:22:49+0000",
-      "version": "4.5.1",
+      "releaseTimestamp": "2016-11-22T15:19:54+0000",
+      "version": "3.2.1",
     },
     Object {
-      "releaseTimestamp": "2018-01-24T17:04:52+0000",
-      "version": "4.5",
+      "releaseTimestamp": "2016-11-22T15:19:54+0000",
+      "version": "3.2.1",
     },
     Object {
-      "releaseTimestamp": "2017-12-20T15:45:23+0000",
-      "version": "4.4.1",
+      "releaseTimestamp": "2017-01-03T15:31:04+0000",
+      "version": "3.3",
     },
     Object {
-      "releaseTimestamp": "2017-12-06T09:05:06+0000",
-      "version": "4.4",
+      "releaseTimestamp": "2017-01-03T15:31:04+0000",
+      "version": "3.3",
     },
     Object {
-      "releaseTimestamp": "2017-11-08T08:59:45+0000",
-      "version": "4.3.1",
+      "releaseTimestamp": "2017-02-20T14:49:26+0000",
+      "version": "3.4",
     },
     Object {
-      "releaseTimestamp": "2017-10-30T15:43:29+0000",
-      "version": "4.3",
+      "releaseTimestamp": "2017-02-20T14:49:26+0000",
+      "version": "3.4",
     },
     Object {
-      "releaseTimestamp": "2017-10-02T15:36:21+0000",
-      "version": "4.2.1",
+      "releaseTimestamp": "2017-03-03T19:45:41+0000",
+      "version": "3.4.1",
     },
     Object {
-      "releaseTimestamp": "2017-09-20T14:48:23+0000",
-      "version": "4.2",
+      "releaseTimestamp": "2017-03-03T19:45:41+0000",
+      "version": "3.4.1",
     },
     Object {
-      "releaseTimestamp": "2017-08-07T14:38:48+0000",
-      "version": "4.1",
+      "releaseTimestamp": "2017-04-10T13:37:25+0000",
+      "version": "3.5",
     },
     Object {
-      "releaseTimestamp": "2017-07-26T16:19:18+0000",
-      "version": "4.0.2",
+      "releaseTimestamp": "2017-04-10T13:37:25+0000",
+      "version": "3.5",
     },
     Object {
-      "releaseTimestamp": "2017-07-07T14:02:41+0000",
-      "version": "4.0.1",
+      "releaseTimestamp": "2017-06-16T14:36:27+0000",
+      "version": "3.5.1",
     },
     Object {
       "releaseTimestamp": "2017-06-16T14:36:27+0000",
@@ -361,176 +361,176 @@ Object {
       "version": "4.0",
     },
     Object {
-      "releaseTimestamp": "2017-04-10T13:37:25+0000",
-      "version": "3.5",
+      "releaseTimestamp": "2017-06-14T15:11:08+0000",
+      "version": "4.0",
     },
     Object {
-      "releaseTimestamp": "2017-03-03T19:45:41+0000",
-      "version": "3.4.1",
+      "releaseTimestamp": "2017-07-07T14:02:41+0000",
+      "version": "4.0.1",
     },
     Object {
-      "releaseTimestamp": "2017-02-20T14:49:26+0000",
-      "version": "3.4",
+      "releaseTimestamp": "2017-07-07T14:02:41+0000",
+      "version": "4.0.1",
     },
     Object {
-      "releaseTimestamp": "2017-01-03T15:31:04+0000",
-      "version": "3.3",
+      "releaseTimestamp": "2017-07-26T16:19:18+0000",
+      "version": "4.0.2",
     },
     Object {
-      "releaseTimestamp": "2016-11-22T15:19:54+0000",
-      "version": "3.2.1",
+      "releaseTimestamp": "2017-07-26T16:19:18+0000",
+      "version": "4.0.2",
     },
     Object {
-      "releaseTimestamp": "2016-11-14T12:32:59+0000",
-      "version": "3.2",
+      "releaseTimestamp": "2017-08-07T14:38:48+0000",
+      "version": "4.1",
     },
     Object {
-      "releaseTimestamp": "2016-09-19T10:53:53+0000",
-      "version": "3.1",
+      "releaseTimestamp": "2017-08-07T14:38:48+0000",
+      "version": "4.1",
     },
     Object {
-      "releaseTimestamp": "2016-08-15T13:15:01+0000",
-      "version": "3.0",
+      "releaseTimestamp": "2017-09-20T14:48:23+0000",
+      "version": "4.2",
     },
     Object {
-      "releaseTimestamp": "2016-07-18T06:38:37+0000",
-      "version": "2.14.1",
+      "releaseTimestamp": "2017-09-20T14:48:23+0000",
+      "version": "4.2",
     },
     Object {
-      "releaseTimestamp": "2016-06-14T07:16:37+0000",
-      "version": "2.14",
+      "releaseTimestamp": "2017-10-02T15:36:21+0000",
+      "version": "4.2.1",
     },
     Object {
-      "releaseTimestamp": "2016-04-25T04:10:10+0000",
-      "version": "2.13",
+      "releaseTimestamp": "2017-10-02T15:36:21+0000",
+      "version": "4.2.1",
     },
     Object {
-      "releaseTimestamp": "2016-03-14T08:32:03+0000",
-      "version": "2.12",
+      "releaseTimestamp": "2017-10-30T15:43:29+0000",
+      "version": "4.3",
     },
     Object {
-      "releaseTimestamp": "2016-02-08T07:59:16+0000",
-      "version": "2.11",
+      "releaseTimestamp": "2017-10-30T15:43:29+0000",
+      "version": "4.3",
     },
     Object {
-      "releaseTimestamp": "2015-12-21T21:15:04+0000",
-      "version": "2.10",
+      "releaseTimestamp": "2017-11-08T08:59:45+0000",
+      "version": "4.3.1",
     },
     Object {
-      "releaseTimestamp": "2015-11-17T07:02:17+0000",
-      "version": "2.9",
+      "releaseTimestamp": "2017-11-08T08:59:45+0000",
+      "version": "4.3.1",
     },
     Object {
-      "releaseTimestamp": "2015-10-20T03:46:36+0000",
-      "version": "2.8",
+      "releaseTimestamp": "2017-12-06T09:05:06+0000",
+      "version": "4.4",
     },
     Object {
-      "releaseTimestamp": "2015-09-14T07:26:16+0000",
-      "version": "2.7",
+      "releaseTimestamp": "2017-12-06T09:05:06+0000",
+      "version": "4.4",
     },
     Object {
-      "releaseTimestamp": "2015-08-10T13:15:06+0000",
-      "version": "2.6",
+      "releaseTimestamp": "2017-12-20T15:45:23+0000",
+      "version": "4.4.1",
     },
     Object {
-      "releaseTimestamp": "2015-07-08T07:38:37+0000",
-      "version": "2.5",
+      "releaseTimestamp": "2017-12-20T15:45:23+0000",
+      "version": "4.4.1",
     },
     Object {
-      "releaseTimestamp": "2015-05-05T08:09:24+0000",
-      "version": "2.4",
+      "releaseTimestamp": "2018-01-24T17:04:52+0000",
+      "version": "4.5",
     },
     Object {
-      "releaseTimestamp": "2015-02-16T05:09:33+0000",
-      "version": "2.3",
+      "releaseTimestamp": "2018-01-24T17:04:52+0000",
+      "version": "4.5",
     },
     Object {
-      "releaseTimestamp": "2014-11-24T09:45:35+0000",
-      "version": "2.2.1",
+      "releaseTimestamp": "2018-02-05T13:22:49+0000",
+      "version": "4.5.1",
     },
     Object {
-      "releaseTimestamp": "2014-11-10T13:31:44+0000",
-      "version": "2.2",
+      "releaseTimestamp": "2018-02-05T13:22:49+0000",
+      "version": "4.5.1",
     },
     Object {
-      "releaseTimestamp": "2014-09-08T10:40:39+0000",
-      "version": "2.1",
+      "releaseTimestamp": "2018-02-28T13:36:36+0000",
+      "version": "4.6",
     },
     Object {
-      "releaseTimestamp": "2014-07-01T07:45:34+0000",
-      "version": "2.0",
+      "releaseTimestamp": "2018-02-28T13:36:36+0000",
+      "version": "4.6",
     },
     Object {
-      "releaseTimestamp": "2014-04-29T09:24:31+0000",
-      "version": "1.12",
+      "releaseTimestamp": "2018-04-18T09:09:12+0000",
+      "version": "4.7",
     },
     Object {
-      "releaseTimestamp": "2014-02-11T11:34:39+0000",
-      "version": "1.11",
+      "releaseTimestamp": "2018-04-18T09:09:12+0000",
+      "version": "4.7",
     },
     Object {
-      "releaseTimestamp": "2013-12-17T09:28:15+0000",
-      "version": "1.10",
+      "releaseTimestamp": "2018-06-04T10:39:58+0000",
+      "version": "4.8",
     },
     Object {
-      "releaseTimestamp": "2013-11-19T08:20:02+0000",
-      "version": "1.9",
+      "releaseTimestamp": "2018-06-04T10:39:58+0000",
+      "version": "4.8",
     },
     Object {
-      "releaseTimestamp": "2013-09-24T07:32:33+0000",
-      "version": "1.8",
+      "releaseTimestamp": "2018-06-21T07:53:06+0000",
+      "version": "4.8.1",
     },
     Object {
-      "releaseTimestamp": "2013-08-06T11:19:56+0000",
-      "version": "1.7",
+      "releaseTimestamp": "2018-06-21T07:53:06+0000",
+      "version": "4.8.1",
     },
     Object {
-      "releaseTimestamp": "2013-05-07T09:12:14+0000",
-      "version": "1.6",
+      "releaseTimestamp": "2018-07-16T08:14:03+0000",
+      "version": "4.9",
     },
     Object {
-      "releaseTimestamp": "2013-03-27T14:09:35+0000",
-      "version": "1.5",
+      "releaseTimestamp": "2018-07-16T08:14:03+0000",
+      "version": "4.9",
     },
     Object {
-      "releaseTimestamp": "2013-01-28T03:42:46+0000",
-      "version": "1.4",
+      "releaseTimestamp": "2018-08-27T18:35:06+0000",
+      "version": "4.10",
     },
     Object {
-      "releaseTimestamp": "2012-11-20T11:37:38+0000",
-      "version": "1.3",
+      "releaseTimestamp": "2018-08-27T18:35:06+0000",
+      "version": "4.10",
     },
     Object {
-      "releaseTimestamp": "2012-09-12T10:46:02+0000",
-      "version": "1.2",
+      "releaseTimestamp": "2018-09-12T11:33:27+0000",
+      "version": "4.10.1",
     },
     Object {
-      "releaseTimestamp": "2012-07-31T13:24:32+0000",
-      "version": "1.1",
+      "releaseTimestamp": "2018-09-12T11:33:27+0000",
+      "version": "4.10.1",
     },
     Object {
-      "releaseTimestamp": "2012-06-12T02:56:21+0200",
-      "version": "1.0",
+      "releaseTimestamp": "2018-09-19T18:10:15+0000",
+      "version": "4.10.2",
     },
     Object {
-      "releaseTimestamp": "2011-01-23T13:34:21+1100",
-      "version": "0.9.2",
+      "releaseTimestamp": "2018-09-19T18:10:15+0000",
+      "version": "4.10.2",
     },
     Object {
-      "releaseTimestamp": "2011-01-02T11:40:57+1100",
-      "version": "0.9.1",
+      "releaseTimestamp": null,
+      "version": "4.10.3",
     },
     Object {
-      "releaseTimestamp": "2010-12-19T12:50:06+1100",
-      "version": "0.9",
+      "releaseTimestamp": null,
+      "version": "4.10.3",
     },
     Object {
-      "releaseTimestamp": "2009-09-28T14:01:59+0200",
-      "version": "0.8",
+      "releaseTimestamp": null,
+      "version": "5.0",
     },
     Object {
-      "releaseTimestamp": "2009-07-20T08:50:13+0200",
-      "version": "0.7",
+      "releaseTimestamp": null,
+      "version": "5.0",
     },
   ],
   "sourceUrl": "https://github.com/gradle/gradle",
@@ -567,268 +567,268 @@ Object {
   "homepage": "https://gradle.org",
   "releases": Array [
     Object {
-      "releaseTimestamp": null,
-      "version": "4.10.3",
-    },
-    Object {
-      "releaseTimestamp": null,
-      "version": "5.0",
+      "releaseTimestamp": "2009-07-20T08:50:13+0200",
+      "version": "0.7",
     },
     Object {
-      "releaseTimestamp": "2018-09-19T18:10:15+0000",
-      "version": "4.10.2",
+      "releaseTimestamp": "2009-09-28T14:01:59+0200",
+      "version": "0.8",
     },
     Object {
-      "releaseTimestamp": "2018-09-12T11:33:27+0000",
-      "version": "4.10.1",
+      "releaseTimestamp": "2010-12-19T12:50:06+1100",
+      "version": "0.9",
     },
     Object {
-      "releaseTimestamp": "2018-08-27T18:35:06+0000",
-      "version": "4.10",
+      "releaseTimestamp": "2011-01-02T11:40:57+1100",
+      "version": "0.9.1",
     },
     Object {
-      "releaseTimestamp": "2018-07-16T08:14:03+0000",
-      "version": "4.9",
+      "releaseTimestamp": "2011-01-23T13:34:21+1100",
+      "version": "0.9.2",
     },
     Object {
-      "releaseTimestamp": "2018-06-21T07:53:06+0000",
-      "version": "4.8.1",
+      "releaseTimestamp": "2012-06-12T02:56:21+0200",
+      "version": "1.0",
     },
     Object {
-      "releaseTimestamp": "2018-06-04T10:39:58+0000",
-      "version": "4.8",
+      "releaseTimestamp": "2012-07-31T13:24:32+0000",
+      "version": "1.1",
     },
     Object {
-      "releaseTimestamp": "2018-04-18T09:09:12+0000",
-      "version": "4.7",
+      "releaseTimestamp": "2012-09-12T10:46:02+0000",
+      "version": "1.2",
     },
     Object {
-      "releaseTimestamp": "2018-02-28T13:36:36+0000",
-      "version": "4.6",
+      "releaseTimestamp": "2012-11-20T11:37:38+0000",
+      "version": "1.3",
     },
     Object {
-      "releaseTimestamp": "2018-02-05T13:22:49+0000",
-      "version": "4.5.1",
+      "releaseTimestamp": "2013-01-28T03:42:46+0000",
+      "version": "1.4",
     },
     Object {
-      "releaseTimestamp": "2018-01-24T17:04:52+0000",
-      "version": "4.5",
+      "releaseTimestamp": "2013-03-27T14:09:35+0000",
+      "version": "1.5",
     },
     Object {
-      "releaseTimestamp": "2017-12-20T15:45:23+0000",
-      "version": "4.4.1",
+      "releaseTimestamp": "2013-05-07T09:12:14+0000",
+      "version": "1.6",
     },
     Object {
-      "releaseTimestamp": "2017-12-06T09:05:06+0000",
-      "version": "4.4",
+      "releaseTimestamp": "2013-08-06T11:19:56+0000",
+      "version": "1.7",
     },
     Object {
-      "releaseTimestamp": "2017-11-08T08:59:45+0000",
-      "version": "4.3.1",
+      "releaseTimestamp": "2013-09-24T07:32:33+0000",
+      "version": "1.8",
     },
     Object {
-      "releaseTimestamp": "2017-10-30T15:43:29+0000",
-      "version": "4.3",
+      "releaseTimestamp": "2013-11-19T08:20:02+0000",
+      "version": "1.9",
     },
     Object {
-      "releaseTimestamp": "2017-10-02T15:36:21+0000",
-      "version": "4.2.1",
+      "releaseTimestamp": "2013-12-17T09:28:15+0000",
+      "version": "1.10",
     },
     Object {
-      "releaseTimestamp": "2017-09-20T14:48:23+0000",
-      "version": "4.2",
+      "releaseTimestamp": "2014-02-11T11:34:39+0000",
+      "version": "1.11",
     },
     Object {
-      "releaseTimestamp": "2017-08-07T14:38:48+0000",
-      "version": "4.1",
+      "releaseTimestamp": "2014-04-29T09:24:31+0000",
+      "version": "1.12",
     },
     Object {
-      "releaseTimestamp": "2017-07-26T16:19:18+0000",
-      "version": "4.0.2",
+      "releaseTimestamp": "2014-07-01T07:45:34+0000",
+      "version": "2.0",
     },
     Object {
-      "releaseTimestamp": "2017-07-07T14:02:41+0000",
-      "version": "4.0.1",
+      "releaseTimestamp": "2014-09-08T10:40:39+0000",
+      "version": "2.1",
     },
     Object {
-      "releaseTimestamp": "2017-06-16T14:36:27+0000",
-      "version": "3.5.1",
+      "releaseTimestamp": "2014-11-10T13:31:44+0000",
+      "version": "2.2",
     },
     Object {
-      "releaseTimestamp": "2017-06-14T15:11:08+0000",
-      "version": "4.0",
+      "releaseTimestamp": "2014-11-24T09:45:35+0000",
+      "version": "2.2.1",
     },
     Object {
-      "releaseTimestamp": "2017-04-10T13:37:25+0000",
-      "version": "3.5",
+      "releaseTimestamp": "2015-02-16T05:09:33+0000",
+      "version": "2.3",
     },
     Object {
-      "releaseTimestamp": "2017-03-03T19:45:41+0000",
-      "version": "3.4.1",
+      "releaseTimestamp": "2015-05-05T08:09:24+0000",
+      "version": "2.4",
     },
     Object {
-      "releaseTimestamp": "2017-02-20T14:49:26+0000",
-      "version": "3.4",
+      "releaseTimestamp": "2015-07-08T07:38:37+0000",
+      "version": "2.5",
     },
     Object {
-      "releaseTimestamp": "2017-01-03T15:31:04+0000",
-      "version": "3.3",
+      "releaseTimestamp": "2015-08-10T13:15:06+0000",
+      "version": "2.6",
     },
     Object {
-      "releaseTimestamp": "2016-11-22T15:19:54+0000",
-      "version": "3.2.1",
+      "releaseTimestamp": "2015-09-14T07:26:16+0000",
+      "version": "2.7",
     },
     Object {
-      "releaseTimestamp": "2016-11-14T12:32:59+0000",
-      "version": "3.2",
+      "releaseTimestamp": "2015-10-20T03:46:36+0000",
+      "version": "2.8",
     },
     Object {
-      "releaseTimestamp": "2016-09-19T10:53:53+0000",
-      "version": "3.1",
+      "releaseTimestamp": "2015-11-17T07:02:17+0000",
+      "version": "2.9",
     },
     Object {
-      "releaseTimestamp": "2016-08-15T13:15:01+0000",
-      "version": "3.0",
+      "releaseTimestamp": "2015-12-21T21:15:04+0000",
+      "version": "2.10",
     },
     Object {
-      "releaseTimestamp": "2016-07-18T06:38:37+0000",
-      "version": "2.14.1",
+      "releaseTimestamp": "2016-02-08T07:59:16+0000",
+      "version": "2.11",
     },
     Object {
-      "releaseTimestamp": "2016-06-14T07:16:37+0000",
-      "version": "2.14",
+      "releaseTimestamp": "2016-03-14T08:32:03+0000",
+      "version": "2.12",
     },
     Object {
       "releaseTimestamp": "2016-04-25T04:10:10+0000",
       "version": "2.13",
     },
     Object {
-      "releaseTimestamp": "2016-03-14T08:32:03+0000",
-      "version": "2.12",
+      "releaseTimestamp": "2016-06-14T07:16:37+0000",
+      "version": "2.14",
     },
     Object {
-      "releaseTimestamp": "2016-02-08T07:59:16+0000",
-      "version": "2.11",
+      "releaseTimestamp": "2016-07-18T06:38:37+0000",
+      "version": "2.14.1",
     },
     Object {
-      "releaseTimestamp": "2015-12-21T21:15:04+0000",
-      "version": "2.10",
+      "releaseTimestamp": "2016-08-15T13:15:01+0000",
+      "version": "3.0",
     },
     Object {
-      "releaseTimestamp": "2015-11-17T07:02:17+0000",
-      "version": "2.9",
+      "releaseTimestamp": "2016-09-19T10:53:53+0000",
+      "version": "3.1",
     },
     Object {
-      "releaseTimestamp": "2015-10-20T03:46:36+0000",
-      "version": "2.8",
+      "releaseTimestamp": "2016-11-14T12:32:59+0000",
+      "version": "3.2",
     },
     Object {
-      "releaseTimestamp": "2015-09-14T07:26:16+0000",
-      "version": "2.7",
+      "releaseTimestamp": "2016-11-22T15:19:54+0000",
+      "version": "3.2.1",
     },
     Object {
-      "releaseTimestamp": "2015-08-10T13:15:06+0000",
-      "version": "2.6",
+      "releaseTimestamp": "2017-01-03T15:31:04+0000",
+      "version": "3.3",
     },
     Object {
-      "releaseTimestamp": "2015-07-08T07:38:37+0000",
-      "version": "2.5",
+      "releaseTimestamp": "2017-02-20T14:49:26+0000",
+      "version": "3.4",
     },
     Object {
-      "releaseTimestamp": "2015-05-05T08:09:24+0000",
-      "version": "2.4",
+      "releaseTimestamp": "2017-03-03T19:45:41+0000",
+      "version": "3.4.1",
     },
     Object {
-      "releaseTimestamp": "2015-02-16T05:09:33+0000",
-      "version": "2.3",
+      "releaseTimestamp": "2017-04-10T13:37:25+0000",
+      "version": "3.5",
     },
     Object {
-      "releaseTimestamp": "2014-11-24T09:45:35+0000",
-      "version": "2.2.1",
+      "releaseTimestamp": "2017-06-16T14:36:27+0000",
+      "version": "3.5.1",
     },
     Object {
-      "releaseTimestamp": "2014-11-10T13:31:44+0000",
-      "version": "2.2",
+      "releaseTimestamp": "2017-06-14T15:11:08+0000",
+      "version": "4.0",
     },
     Object {
-      "releaseTimestamp": "2014-09-08T10:40:39+0000",
-      "version": "2.1",
+      "releaseTimestamp": "2017-07-07T14:02:41+0000",
+      "version": "4.0.1",
     },
     Object {
-      "releaseTimestamp": "2014-07-01T07:45:34+0000",
-      "version": "2.0",
+      "releaseTimestamp": "2017-07-26T16:19:18+0000",
+      "version": "4.0.2",
     },
     Object {
-      "releaseTimestamp": "2014-04-29T09:24:31+0000",
-      "version": "1.12",
+      "releaseTimestamp": "2017-08-07T14:38:48+0000",
+      "version": "4.1",
     },
     Object {
-      "releaseTimestamp": "2014-02-11T11:34:39+0000",
-      "version": "1.11",
+      "releaseTimestamp": "2017-09-20T14:48:23+0000",
+      "version": "4.2",
     },
     Object {
-      "releaseTimestamp": "2013-12-17T09:28:15+0000",
-      "version": "1.10",
+      "releaseTimestamp": "2017-10-02T15:36:21+0000",
+      "version": "4.2.1",
     },
     Object {
-      "releaseTimestamp": "2013-11-19T08:20:02+0000",
-      "version": "1.9",
+      "releaseTimestamp": "2017-10-30T15:43:29+0000",
+      "version": "4.3",
     },
     Object {
-      "releaseTimestamp": "2013-09-24T07:32:33+0000",
-      "version": "1.8",
+      "releaseTimestamp": "2017-11-08T08:59:45+0000",
+      "version": "4.3.1",
     },
     Object {
-      "releaseTimestamp": "2013-08-06T11:19:56+0000",
-      "version": "1.7",
+      "releaseTimestamp": "2017-12-06T09:05:06+0000",
+      "version": "4.4",
     },
     Object {
-      "releaseTimestamp": "2013-05-07T09:12:14+0000",
-      "version": "1.6",
+      "releaseTimestamp": "2017-12-20T15:45:23+0000",
+      "version": "4.4.1",
     },
     Object {
-      "releaseTimestamp": "2013-03-27T14:09:35+0000",
-      "version": "1.5",
+      "releaseTimestamp": "2018-01-24T17:04:52+0000",
+      "version": "4.5",
     },
     Object {
-      "releaseTimestamp": "2013-01-28T03:42:46+0000",
-      "version": "1.4",
+      "releaseTimestamp": "2018-02-05T13:22:49+0000",
+      "version": "4.5.1",
     },
     Object {
-      "releaseTimestamp": "2012-11-20T11:37:38+0000",
-      "version": "1.3",
+      "releaseTimestamp": "2018-02-28T13:36:36+0000",
+      "version": "4.6",
     },
     Object {
-      "releaseTimestamp": "2012-09-12T10:46:02+0000",
-      "version": "1.2",
+      "releaseTimestamp": "2018-04-18T09:09:12+0000",
+      "version": "4.7",
     },
     Object {
-      "releaseTimestamp": "2012-07-31T13:24:32+0000",
-      "version": "1.1",
+      "releaseTimestamp": "2018-06-04T10:39:58+0000",
+      "version": "4.8",
     },
     Object {
-      "releaseTimestamp": "2012-06-12T02:56:21+0200",
-      "version": "1.0",
+      "releaseTimestamp": "2018-06-21T07:53:06+0000",
+      "version": "4.8.1",
     },
     Object {
-      "releaseTimestamp": "2011-01-23T13:34:21+1100",
-      "version": "0.9.2",
+      "releaseTimestamp": "2018-07-16T08:14:03+0000",
+      "version": "4.9",
     },
     Object {
-      "releaseTimestamp": "2011-01-02T11:40:57+1100",
-      "version": "0.9.1",
+      "releaseTimestamp": "2018-08-27T18:35:06+0000",
+      "version": "4.10",
     },
     Object {
-      "releaseTimestamp": "2010-12-19T12:50:06+1100",
-      "version": "0.9",
+      "releaseTimestamp": "2018-09-12T11:33:27+0000",
+      "version": "4.10.1",
     },
     Object {
-      "releaseTimestamp": "2009-09-28T14:01:59+0200",
-      "version": "0.8",
+      "releaseTimestamp": "2018-09-19T18:10:15+0000",
+      "version": "4.10.2",
     },
     Object {
-      "releaseTimestamp": "2009-07-20T08:50:13+0200",
-      "version": "0.7",
+      "releaseTimestamp": null,
+      "version": "4.10.3",
+    },
+    Object {
+      "releaseTimestamp": null,
+      "version": "5.0",
     },
   ],
   "sourceUrl": "https://github.com/gradle/gradle",
diff --git a/lib/datasource/gradle-version/index.spec.ts b/lib/datasource/gradle-version/index.spec.ts
index 6f60d98f646c18ac3b9dc31cb814f9a1aee07e95..1c656f47195bf9c128cfdd0d4bcbf1457411b1b4 100644
--- a/lib/datasource/gradle-version/index.spec.ts
+++ b/lib/datasource/gradle-version/index.spec.ts
@@ -1,18 +1,22 @@
 import fs from 'fs';
+import { GetPkgReleasesConfig, getPkgReleases } from '..';
 import * as httpMock from '../../../test/httpMock';
-import * as gradleVersion from '.';
+import { id as versioning } from '../../versioning/gradle';
+import { id as datasource } from '.';
 
 const allResponse: any = fs.readFileSync(
   'lib/datasource/gradle-version/__fixtures__/all.json'
 );
 
-let config: any = {};
+let config: GetPkgReleasesConfig;
 
 describe('datasource/gradle-version', () => {
   describe('getReleases', () => {
     beforeEach(() => {
       config = {
-        lookupName: 'abc',
+        datasource,
+        versioning,
+        depName: 'abc',
       };
       jest.clearAllMocks();
       httpMock.setup();
@@ -27,7 +31,7 @@ describe('datasource/gradle-version', () => {
         .scope('https://services.gradle.org/')
         .get('/versions/all')
         .reply(200, JSON.parse(allResponse));
-      const res = await gradleVersion.getReleases(config);
+      const res = await getPkgReleases(config);
       expect(res).toMatchSnapshot();
       expect(res).not.toBeNull();
       expect(httpMock.getTrace()).toMatchSnapshot();
@@ -44,7 +48,7 @@ describe('datasource/gradle-version', () => {
         .get('/')
         .reply(200, JSON.parse(allResponse));
 
-      const res = await gradleVersion.getReleases({
+      const res = await getPkgReleases({
         ...config,
         registryUrls: ['https://foo.bar', 'http://baz.qux'],
       });
diff --git a/lib/datasource/maven/index.spec.ts b/lib/datasource/maven/index.spec.ts
index 0915058b7b57745a91631e3d7f5d4604adce526f..bbe3d11b6d0709499e72a31c9a2b4487af851a68 100644
--- a/lib/datasource/maven/index.spec.ts
+++ b/lib/datasource/maven/index.spec.ts
@@ -5,7 +5,7 @@ import { getPkgReleases } from '..';
 import { DATASOURCE_FAILURE } from '../../constants/error-messages';
 import * as hostRules from '../../util/host-rules';
 import * as mavenVersioning from '../../versioning/maven';
-import * as maven from '.';
+import { id as datasource } from '.';
 
 const MYSQL_VERSIONS = ['6.0.5', '6.0.6', '8.0.7', '8.0.8', '8.0.9'];
 
@@ -27,13 +27,13 @@ const MYSQL_MAVEN_MYSQL_POM = fs.readFileSync(
 
 const config = {
   versioning: mavenVersioning.id,
-  datasource: maven.id,
+  datasource,
 };
 
 describe('datasource/maven', () => {
   beforeEach(() => {
     hostRules.add({
-      hostType: maven.id,
+      hostType: datasource,
       hostName: 'frontend_for_private_s3_repository',
       username: 'username',
       password: 'password',
@@ -190,9 +190,9 @@ describe('datasource/maven', () => {
 
       expect.assertions(1);
       await expect(
-        maven.getReleases({
+        getPkgReleases({
           ...config,
-          lookupName: 'org:artifact',
+          depName: 'org:artifact',
           registryUrls: ['https://repo.maven.apache.org/maven2/'],
         })
       ).rejects.toThrow(Error(DATASOURCE_FAILURE));
diff --git a/lib/datasource/npm/__snapshots__/index.spec.ts.snap b/lib/datasource/npm/__snapshots__/index.spec.ts.snap
index 2affe2c4f2cb776b98772fc0ea5d974acb9e81ea..33bc541ee000198f2cc8871ae3760a6218f2c1fd 100644
--- a/lib/datasource/npm/__snapshots__/index.spec.ts.snap
+++ b/lib/datasource/npm/__snapshots__/index.spec.ts.snap
@@ -2,25 +2,22 @@
 
 exports[`datasource/npm/index should fetch package info from custom registry 1`] = `
 Object {
-  "homepage": "https://github.com/renovateapp/dummy",
   "latestVersion": "0.0.1",
   "name": "foobar",
   "releases": Array [
     Object {
       "canBeUnpublished": false,
-      "gitRef": undefined,
       "releaseTimestamp": "2018-05-06T07:21:53+02:00",
       "version": "0.0.1",
     },
     Object {
       "canBeUnpublished": false,
-      "gitRef": undefined,
       "releaseTimestamp": "2018-05-07T07:21:53+02:00",
       "version": "0.0.2",
     },
   ],
   "sourceDirectory": "src/a",
-  "sourceUrl": "git://github.com/renovateapp/dummy.git",
+  "sourceUrl": "https://github.com/renovateapp/dummy",
   "tags": Object {
     "latest": "0.0.1",
   },
@@ -30,25 +27,22 @@ Object {
 
 exports[`datasource/npm/index should fetch package info from npm 1`] = `
 Object {
-  "homepage": "https://github.com/renovateapp/dummy",
   "latestVersion": "0.0.1",
   "name": "foobar",
   "releases": Array [
     Object {
       "canBeUnpublished": false,
-      "gitRef": undefined,
       "releaseTimestamp": "2018-05-06T07:21:53+02:00",
       "version": "0.0.1",
     },
     Object {
       "canBeUnpublished": false,
-      "gitRef": undefined,
       "releaseTimestamp": "2018-05-07T07:21:53+02:00",
       "version": "0.0.2",
     },
   ],
   "sourceDirectory": "src/a",
-  "sourceUrl": "git://github.com/renovateapp/dummy.git",
+  "sourceUrl": "https://github.com/renovateapp/dummy",
   "tags": Object {
     "latest": "0.0.1",
   },
@@ -58,25 +52,22 @@ Object {
 
 exports[`datasource/npm/index should handle foobar 1`] = `
 Object {
-  "homepage": "https://github.com/renovateapp/dummy",
   "latestVersion": "0.0.1",
   "name": "foobar",
   "releases": Array [
     Object {
       "canBeUnpublished": false,
-      "gitRef": undefined,
       "releaseTimestamp": "2018-05-06T07:21:53+02:00",
       "version": "0.0.1",
     },
     Object {
       "canBeUnpublished": false,
-      "gitRef": undefined,
       "releaseTimestamp": "2018-05-07T07:21:53+02:00",
       "version": "0.0.2",
     },
   ],
   "sourceDirectory": "src/a",
-  "sourceUrl": "git://github.com/renovateapp/dummy.git",
+  "sourceUrl": "https://github.com/renovateapp/dummy",
   "tags": Object {
     "latest": "0.0.1",
   },
@@ -86,23 +77,20 @@ Object {
 
 exports[`datasource/npm/index should handle no time 1`] = `
 Object {
-  "homepage": "https://github.com/renovateapp/dummy",
   "latestVersion": "0.0.1",
   "name": "foobar",
   "releases": Array [
     Object {
       "canBeUnpublished": false,
-      "gitRef": undefined,
       "releaseTimestamp": "2018-05-06T07:21:53+02:00",
       "version": "0.0.1",
     },
     Object {
-      "gitRef": undefined,
       "version": "0.0.2",
     },
   ],
   "sourceDirectory": "src/a",
-  "sourceUrl": "git://github.com/renovateapp/dummy.git",
+  "sourceUrl": "https://github.com/renovateapp/dummy",
   "tags": Object {
     "latest": "0.0.1",
   },
@@ -112,18 +100,16 @@ Object {
 
 exports[`datasource/npm/index should parse repo url (string) 1`] = `
 Object {
-  "homepage": undefined,
   "latestVersion": "0.0.1",
   "name": "foobar",
   "releases": Array [
     Object {
       "canBeUnpublished": false,
-      "gitRef": undefined,
       "releaseTimestamp": "2018-05-06T07:21:53+02:00",
       "version": "0.0.1",
     },
   ],
-  "sourceUrl": "git:github.com/renovateapp/dummy",
+  "sourceUrl": "https://github.com/renovateapp/dummy",
   "tags": Object {
     "latest": "0.0.1",
   },
@@ -133,18 +119,16 @@ Object {
 
 exports[`datasource/npm/index should parse repo url 1`] = `
 Object {
-  "homepage": undefined,
   "latestVersion": "0.0.1",
   "name": "foobar",
   "releases": Array [
     Object {
       "canBeUnpublished": false,
-      "gitRef": undefined,
       "releaseTimestamp": "2018-05-06T07:21:53+02:00",
       "version": "0.0.1",
     },
   ],
-  "sourceUrl": "git:github.com/renovateapp/dummy",
+  "sourceUrl": "https://github.com/renovateapp/dummy",
   "tags": Object {
     "latest": "0.0.1",
   },
@@ -154,25 +138,22 @@ Object {
 
 exports[`datasource/npm/index should replace any environment variable in npmrc 1`] = `
 Object {
-  "homepage": "https://github.com/renovateapp/dummy",
   "latestVersion": "0.0.1",
   "name": "foobar",
   "releases": Array [
     Object {
       "canBeUnpublished": false,
-      "gitRef": undefined,
       "releaseTimestamp": "2018-05-06T07:21:53+02:00",
       "version": "0.0.1",
     },
     Object {
       "canBeUnpublished": false,
-      "gitRef": undefined,
       "releaseTimestamp": "2018-05-07T07:21:53+02:00",
       "version": "0.0.2",
     },
   ],
   "sourceDirectory": "src/a",
-  "sourceUrl": "git://github.com/renovateapp/dummy.git",
+  "sourceUrl": "https://github.com/renovateapp/dummy",
   "tags": Object {
     "latest": "0.0.1",
   },
@@ -188,25 +169,22 @@ Object {
 
 Marking the latest version of an npm package as deprecated results in the entire package being considered deprecated, so contact the package author you think this is a mistake.",
   "deprecationSource": "npm",
-  "homepage": undefined,
   "latestVersion": "0.0.2",
   "name": "foobar",
   "releases": Array [
     Object {
       "canBeUnpublished": false,
-      "gitRef": undefined,
       "releaseTimestamp": "2018-05-06T07:21:53+02:00",
       "version": "0.0.1",
     },
     Object {
       "canBeUnpublished": false,
-      "gitRef": undefined,
       "isDeprecated": true,
       "releaseTimestamp": "2018-05-07T07:21:53+02:00",
       "version": "0.0.2",
     },
   ],
-  "sourceUrl": "git://github.com/renovateapp/dummy.git",
+  "sourceUrl": "https://github.com/renovateapp/dummy",
   "tags": Object {
     "latest": "0.0.2",
   },
@@ -224,25 +202,22 @@ Marking the latest version of an npm package as deprecated results in the entire
 
 exports[`datasource/npm/index should send an authorization header if provided 1`] = `
 Object {
-  "homepage": "https://github.com/renovateapp/dummy",
   "latestVersion": "0.0.1",
   "name": "foobar",
   "releases": Array [
     Object {
       "canBeUnpublished": false,
-      "gitRef": undefined,
       "releaseTimestamp": "2018-05-06T07:21:53+02:00",
       "version": "0.0.1",
     },
     Object {
       "canBeUnpublished": false,
-      "gitRef": undefined,
       "releaseTimestamp": "2018-05-07T07:21:53+02:00",
       "version": "0.0.2",
     },
   ],
   "sourceDirectory": "src/a",
-  "sourceUrl": "git://github.com/renovateapp/dummy.git",
+  "sourceUrl": "https://github.com/renovateapp/dummy",
   "tags": Object {
     "latest": "0.0.1",
   },
@@ -252,25 +227,22 @@ Object {
 
 exports[`datasource/npm/index should use NPM_TOKEN if provided 1`] = `
 Object {
-  "homepage": "https://github.com/renovateapp/dummy",
   "latestVersion": "0.0.1",
   "name": "foobar",
   "releases": Array [
     Object {
       "canBeUnpublished": false,
-      "gitRef": undefined,
       "releaseTimestamp": "2018-05-06T07:21:53+02:00",
       "version": "0.0.1",
     },
     Object {
       "canBeUnpublished": false,
-      "gitRef": undefined,
       "releaseTimestamp": "2018-05-07T07:21:53+02:00",
       "version": "0.0.2",
     },
   ],
   "sourceDirectory": "src/a",
-  "sourceUrl": "git://github.com/renovateapp/dummy.git",
+  "sourceUrl": "https://github.com/renovateapp/dummy",
   "tags": Object {
     "latest": "0.0.1",
   },
@@ -280,25 +252,22 @@ Object {
 
 exports[`datasource/npm/index should use default registry if missing from npmrc 1`] = `
 Object {
-  "homepage": "https://github.com/renovateapp/dummy",
   "latestVersion": "0.0.1",
   "name": "foobar",
   "releases": Array [
     Object {
       "canBeUnpublished": false,
-      "gitRef": undefined,
       "releaseTimestamp": "2018-05-06T07:21:53+02:00",
       "version": "0.0.1",
     },
     Object {
       "canBeUnpublished": false,
-      "gitRef": undefined,
       "releaseTimestamp": "2018-05-07T07:21:53+02:00",
       "version": "0.0.2",
     },
   ],
   "sourceDirectory": "src/a",
-  "sourceUrl": "git://github.com/renovateapp/dummy.git",
+  "sourceUrl": "https://github.com/renovateapp/dummy",
   "tags": Object {
     "latest": "0.0.1",
   },
@@ -308,25 +277,22 @@ Object {
 
 exports[`datasource/npm/index should use host rules by baseUrl if provided 1`] = `
 Object {
-  "homepage": "https://github.com/renovateapp/dummy",
   "latestVersion": "0.0.1",
   "name": "foobar",
   "releases": Array [
     Object {
       "canBeUnpublished": false,
-      "gitRef": undefined,
       "releaseTimestamp": "2018-05-06T07:21:53+02:00",
       "version": "0.0.1",
     },
     Object {
       "canBeUnpublished": false,
-      "gitRef": undefined,
       "releaseTimestamp": "2018-05-07T07:21:53+02:00",
       "version": "0.0.2",
     },
   ],
   "sourceDirectory": "src/a",
-  "sourceUrl": "git://github.com/renovateapp/dummy.git",
+  "sourceUrl": "https://github.com/renovateapp/dummy",
   "tags": Object {
     "latest": "0.0.1",
   },
@@ -336,25 +302,22 @@ Object {
 
 exports[`datasource/npm/index should use host rules by hostName if provided 1`] = `
 Object {
-  "homepage": "https://github.com/renovateapp/dummy",
   "latestVersion": "0.0.1",
   "name": "foobar",
   "releases": Array [
     Object {
       "canBeUnpublished": false,
-      "gitRef": undefined,
       "releaseTimestamp": "2018-05-06T07:21:53+02:00",
       "version": "0.0.1",
     },
     Object {
       "canBeUnpublished": false,
-      "gitRef": undefined,
       "releaseTimestamp": "2018-05-07T07:21:53+02:00",
       "version": "0.0.2",
     },
   ],
   "sourceDirectory": "src/a",
-  "sourceUrl": "git://github.com/renovateapp/dummy.git",
+  "sourceUrl": "https://github.com/renovateapp/dummy",
   "tags": Object {
     "latest": "0.0.1",
   },
diff --git a/lib/datasource/npm/index.spec.ts b/lib/datasource/npm/index.spec.ts
index 21d0b94cab06a1f9233a280cf4d55a0141f792ae..f2106aacbc6c1eb59c142722cbb654e62e4d0a87 100644
--- a/lib/datasource/npm/index.spec.ts
+++ b/lib/datasource/npm/index.spec.ts
@@ -1,10 +1,11 @@
 import moment from 'moment';
 import nock from 'nock';
 import _registryAuthToken from 'registry-auth-token';
+import { getPkgReleases } from '..';
 import { getName } from '../../../test/util';
 import { DATASOURCE_FAILURE } from '../../constants/error-messages';
 import * as hostRules from '../../util/host-rules';
-import * as npm from '.';
+import { id as datasource, getNpmrc, resetCache, setNpmrc } from '.';
 
 jest.mock('registry-auth-token');
 jest.mock('delay');
@@ -26,8 +27,8 @@ describe(getName(__filename), () => {
   beforeEach(() => {
     jest.resetAllMocks();
     global.trustLevel = 'low';
-    npm.resetCache();
-    npm.setNpmrc();
+    resetCache();
+    setNpmrc();
     npmResponse = {
       name: 'foobar',
       versions: {
@@ -63,12 +64,12 @@ describe(getName(__filename), () => {
     nock('https://registry.npmjs.org')
       .get('/foobar')
       .reply(200, missingVersions);
-    const res = await npm.getReleases({ lookupName: 'foobar' });
+    const res = await getPkgReleases({ datasource, depName: 'foobar' });
     expect(res).toBeNull();
   });
   it('should fetch package info from npm', async () => {
     nock('https://registry.npmjs.org').get('/foobar').reply(200, npmResponse);
-    const res = await npm.getReleases({ lookupName: 'foobar' });
+    const res = await getPkgReleases({ datasource, depName: 'foobar' });
     expect(res).toMatchSnapshot();
     expect(getRelease(res, '0.0.1').canBeUnpublished).toBe(false);
     expect(getRelease(res, '0.0.2').canBeUnpublished).toBe(false);
@@ -93,7 +94,7 @@ describe(getName(__filename), () => {
       },
     };
     nock('https://registry.npmjs.org').get('/foobar').reply(200, pkg);
-    const res = await npm.getReleases({ lookupName: 'foobar' });
+    const res = await getPkgReleases({ datasource, depName: 'foobar' });
     expect(res).toMatchSnapshot();
     expect(res.sourceUrl).toBeDefined();
   });
@@ -114,7 +115,7 @@ describe(getName(__filename), () => {
       },
     };
     nock('https://registry.npmjs.org').get('/foobar').reply(200, pkg);
-    const res = await npm.getReleases({ lookupName: 'foobar' });
+    const res = await getPkgReleases({ datasource, depName: 'foobar' });
     expect(res).toMatchSnapshot();
     expect(res.sourceUrl).toBeDefined();
   });
@@ -145,26 +146,26 @@ describe(getName(__filename), () => {
     nock('https://registry.npmjs.org')
       .get('/foobar')
       .reply(200, deprecatedPackage);
-    const res = await npm.getReleases({ lookupName: 'foobar' });
+    const res = await getPkgReleases({ datasource, depName: 'foobar' });
     expect(res).toMatchSnapshot();
     expect(res.deprecationMessage).toMatchSnapshot();
   });
   it('should handle foobar', async () => {
     nock('https://registry.npmjs.org').get('/foobar').reply(200, npmResponse);
-    const res = await npm.getReleases({ lookupName: 'foobar' });
+    const res = await getPkgReleases({ datasource, depName: 'foobar' });
     expect(res).toMatchSnapshot();
   });
   it('should reject name mismatch', async () => {
     nock('https://registry.npmjs.org')
       .get('/different')
       .reply(200, npmResponse);
-    const res = await npm.getReleases({ lookupName: 'different' });
+    const res = await getPkgReleases({ datasource, depName: 'different' });
     expect(res).toBeNull();
   });
   it('should handle no time', async () => {
     delete npmResponse.time['0.0.2'];
     nock('https://registry.npmjs.org').get('/foobar').reply(200, npmResponse);
-    const res = await npm.getReleases({ lookupName: 'foobar' });
+    const res = await getPkgReleases({ datasource, depName: 'foobar' });
     expect(res).toMatchSnapshot();
     expect(getRelease(res, '0.0.1').canBeUnpublished).toBe(false);
     expect(getRelease(res, '0.0.2').canBeUnpublished).toBeUndefined();
@@ -172,44 +173,50 @@ describe(getName(__filename), () => {
   it('should return canBeUnpublished=true', async () => {
     npmResponse.time['0.0.2'] = moment().subtract(6, 'hours').format();
     nock('https://registry.npmjs.org').get('/foobar').reply(200, npmResponse);
-    const res = await npm.getReleases({ lookupName: 'foobar' });
+    const res = await getPkgReleases({ datasource, depName: 'foobar' });
     expect(getRelease(res, '0.0.1').canBeUnpublished).toBe(false);
     expect(getRelease(res, '0.0.2').canBeUnpublished).toBe(true);
   });
   it('should return null if lookup fails 401', async () => {
     nock('https://registry.npmjs.org').get('/foobar').reply(401);
-    const res = await npm.getReleases({ lookupName: 'foobar' });
+    const res = await getPkgReleases({ datasource, depName: 'foobar' });
     expect(res).toBeNull();
   });
   it('should return null if lookup fails', async () => {
     nock('https://registry.npmjs.org').get('/foobar').reply(404);
-    const res = await npm.getReleases({ lookupName: 'foobar' });
+    const res = await getPkgReleases({ datasource, depName: 'foobar' });
     expect(res).toBeNull();
   });
   it('should throw error for unparseable', async () => {
     nock('https://registry.npmjs.org').get('/foobar').reply(200, 'oops');
-    await expect(npm.getReleases({ lookupName: 'foobar' })).rejects.toThrow();
+    await expect(
+      getPkgReleases({ datasource, depName: 'foobar' })
+    ).rejects.toThrow();
   });
   it('should throw error for 429', async () => {
     nock('https://registry.npmjs.org').get('/foobar').reply(429);
     nock('https://registry.npmjs.org').get('/foobar').reply(429);
-    await expect(npm.getReleases({ lookupName: 'foobar' })).rejects.toThrow();
+    await expect(
+      getPkgReleases({ datasource, depName: 'foobar' })
+    ).rejects.toThrow();
   });
   it('should throw error for 5xx', async () => {
     nock('https://registry.npmjs.org').get('/foobar').reply(503);
-    await expect(npm.getReleases({ lookupName: 'foobar' })).rejects.toThrow(
-      Error(DATASOURCE_FAILURE)
-    );
+    await expect(
+      getPkgReleases({ datasource, depName: 'foobar' })
+    ).rejects.toThrow(Error(DATASOURCE_FAILURE));
   });
   it('should throw error for 408', async () => {
     nock('https://registry.npmjs.org').get('/foobar').reply(408);
-    await expect(npm.getReleases({ lookupName: 'foobar' })).rejects.toThrow(
-      Error(DATASOURCE_FAILURE)
-    );
+    await expect(
+      getPkgReleases({ datasource, depName: 'foobar' })
+    ).rejects.toThrow(Error(DATASOURCE_FAILURE));
   });
   it('should throw error for others', async () => {
     nock('https://registry.npmjs.org').get('/foobar').reply(451);
-    await expect(npm.getReleases({ lookupName: 'foobar' })).rejects.toThrow();
+    await expect(
+      getPkgReleases({ datasource, depName: 'foobar' })
+    ).rejects.toThrow();
   });
   it('should send an authorization header if provided', async () => {
     registryAuthToken.mockImplementation(() => ({
@@ -217,14 +224,14 @@ describe(getName(__filename), () => {
       token: '1234',
     }));
     nock('https://registry.npmjs.org').get('/foobar').reply(200, npmResponse);
-    const res = await npm.getReleases({ lookupName: 'foobar' });
+    const res = await getPkgReleases({ datasource, depName: 'foobar' });
     expect(res).toMatchSnapshot();
   });
   it('should use NPM_TOKEN if provided', async () => {
     nock('https://registry.npmjs.org').get('/foobar').reply(200, npmResponse);
     const oldToken = process.env.NPM_TOKEN;
     process.env.NPM_TOKEN = 'some-token';
-    const res = await npm.getReleases({ lookupName: 'foobar' });
+    const res = await getPkgReleases({ datasource, depName: 'foobar' });
     process.env.NPM_TOKEN = oldToken;
     expect(res).toMatchSnapshot();
   });
@@ -238,7 +245,7 @@ describe(getName(__filename), () => {
       .get('/foobar')
       .reply(200, npmResponse);
     const npmrc = 'registry=https://npm.mycustomregistry.com/';
-    const res = await npm.getReleases({ lookupName: 'foobar', npmrc });
+    const res = await getPkgReleases({ datasource, depName: 'foobar', npmrc });
     expect(res).toMatchSnapshot();
   });
   it('should use host rules by baseUrl if provided', async () => {
@@ -255,27 +262,27 @@ describe(getName(__filename), () => {
       .reply(200, npmResponse);
     const npmrc =
       'registry=https://npm.mycustomregistry.com/_packaging/mycustomregistry/npm/registry/';
-    const res = await npm.getReleases({ lookupName: 'foobar', npmrc });
+    const res = await getPkgReleases({ datasource, depName: 'foobar', npmrc });
     expect(res).toMatchSnapshot();
   });
   it('resets npmrc', () => {
     const npmrcContent = 'something=something';
-    npm.setNpmrc(npmrcContent);
-    npm.setNpmrc(npmrcContent);
-    npm.setNpmrc();
-    expect(npm.getNpmrc()).toBeNull();
+    setNpmrc(npmrcContent);
+    setNpmrc(npmrcContent);
+    setNpmrc();
+    expect(getNpmrc()).toBeNull();
   });
   it('should use default registry if missing from npmrc', async () => {
     nock('https://registry.npmjs.org').get('/foobar').reply(200, npmResponse);
     const npmrc = 'foo=bar';
-    const res = await npm.getReleases({ lookupName: 'foobar', npmrc });
+    const res = await getPkgReleases({ datasource, depName: 'foobar', npmrc });
     expect(res).toMatchSnapshot();
   });
   it('should cache package info from npm', async () => {
     nock('https://registry.npmjs.org').get('/foobar').reply(200, npmResponse);
     const npmrc = '//registry.npmjs.org/:_authToken=abcdefghijklmnopqrstuvwxyz';
-    const res1 = await npm.getReleases({ lookupName: 'foobar', npmrc });
-    const res2 = await npm.getReleases({ lookupName: 'foobar', npmrc });
+    const res1 = await getPkgReleases({ datasource, depName: 'foobar', npmrc });
+    const res2 = await getPkgReleases({ datasource, depName: 'foobar', npmrc });
     expect(res1).not.toBeNull();
     expect(res1).toEqual(res2);
   });
@@ -286,7 +293,7 @@ describe(getName(__filename), () => {
     const npmrc =
       'registry=https://npm.mycustomregistry.com/\n//npm.mycustomregistry.com/:_auth = ' +
       Buffer.from('abcdef').toString('base64');
-    const res = await npm.getReleases({ lookupName: 'foobar', npmrc });
+    const res = await getPkgReleases({ datasource, depName: 'foobar', npmrc });
     expect(res).toMatchSnapshot();
   });
   it('should replace any environment variable in npmrc', async () => {
@@ -298,13 +305,13 @@ describe(getName(__filename), () => {
     global.trustLevel = 'high';
     // eslint-disable-next-line no-template-curly-in-string
     const npmrc = 'registry=${REGISTRY}';
-    const res = await npm.getReleases({ lookupName: 'foobar', npmrc });
+    const res = await getPkgReleases({ datasource, depName: 'foobar', npmrc });
     expect(res).toMatchSnapshot();
   });
   it('should throw error if necessary env var is not present', () => {
     global.trustLevel = 'high';
     // eslint-disable-next-line no-template-curly-in-string
-    expect(() => npm.setNpmrc('registry=${REGISTRY_MISSING}')).toThrow(
+    expect(() => setNpmrc('registry=${REGISTRY_MISSING}')).toThrow(
       Error('env-replace')
     );
   });
diff --git a/lib/datasource/nuget/__snapshots__/index.spec.ts.snap b/lib/datasource/nuget/__snapshots__/index.spec.ts.snap
index 730bf6e187ff088676a8dd2382b1d06b2e6863f0..7d4d8052d903c4615f54fe698de5cd5c97b9f89c 100644
--- a/lib/datasource/nuget/__snapshots__/index.spec.ts.snap
+++ b/lib/datasource/nuget/__snapshots__/index.spec.ts.snap
@@ -107,133 +107,133 @@ Object {
   "pkgName": "nunit",
   "releases": Array [
     Object {
-      "version": "3.11.0",
+      "version": "2.5.7.10213",
     },
     Object {
-      "version": "2.7.0",
+      "version": "2.5.9.10348",
     },
     Object {
-      "version": "2.6.7",
+      "version": "2.5.10.11092",
     },
     Object {
-      "version": "2.6.6",
+      "version": "2.6.0.12051",
     },
     Object {
-      "version": "2.6.5",
+      "version": "2.6.0.12054",
     },
     Object {
-      "version": "3.10.1",
+      "version": "2.6.1",
     },
     Object {
-      "version": "3.10.0",
+      "version": "2.6.2",
     },
     Object {
-      "version": "3.9.0",
+      "version": "2.6.3",
     },
     Object {
-      "version": "3.8.1",
+      "version": "2.6.4",
     },
     Object {
-      "version": "3.8.0",
+      "version": "2.6.5",
     },
     Object {
-      "version": "3.7.1",
+      "version": "2.6.6",
     },
     Object {
-      "version": "3.7.0",
+      "version": "2.6.7",
     },
     Object {
-      "version": "3.6.1",
+      "version": "2.7.0",
     },
     Object {
-      "version": "3.6.0",
+      "version": "3.0.0-alpha",
     },
     Object {
-      "version": "3.5.0",
+      "version": "3.0.0-alpha-2",
     },
     Object {
-      "version": "3.4.1",
+      "version": "3.0.0-alpha-3",
     },
     Object {
-      "version": "3.4.0",
+      "version": "3.0.0-alpha-4",
     },
     Object {
-      "version": "3.2.1",
+      "version": "3.0.0-alpha-5",
     },
     Object {
-      "version": "3.2.0",
+      "version": "3.0.0-beta-1",
     },
     Object {
-      "version": "3.0.1",
+      "version": "3.0.0-beta-2",
     },
     Object {
-      "version": "3.0.0",
+      "version": "3.0.0-beta-3",
     },
     Object {
-      "version": "2.6.4",
+      "version": "3.0.0-beta-4",
     },
     Object {
-      "version": "3.0.0-rc-3",
+      "version": "3.0.0-beta-5",
     },
     Object {
-      "version": "3.0.0-rc-2",
+      "version": "3.0.0-rc",
     },
     Object {
-      "version": "3.0.0-rc",
+      "version": "3.0.0-rc-2",
     },
     Object {
-      "version": "3.0.0-beta-5",
+      "version": "3.0.0-rc-3",
     },
     Object {
-      "version": "3.0.0-beta-4",
+      "version": "3.0.0",
     },
     Object {
-      "version": "2.6.3",
+      "version": "3.0.1",
     },
     Object {
-      "version": "2.6.2",
+      "version": "3.2.0",
     },
     Object {
-      "version": "3.0.0-alpha",
+      "version": "3.2.1",
     },
     Object {
-      "version": "2.6.0.12054",
+      "version": "3.4.0",
     },
     Object {
-      "version": "2.6.1",
+      "version": "3.4.1",
     },
     Object {
-      "version": "3.0.0-beta-2",
+      "version": "3.5.0",
     },
     Object {
-      "version": "3.0.0-beta-3",
+      "version": "3.6.0",
     },
     Object {
-      "version": "2.5.10.11092",
+      "version": "3.6.1",
     },
     Object {
-      "version": "2.5.7.10213",
+      "version": "3.7.0",
     },
     Object {
-      "version": "2.6.0.12051",
+      "version": "3.7.1",
     },
     Object {
-      "version": "3.0.0-alpha-3",
+      "version": "3.8.0",
     },
     Object {
-      "version": "3.0.0-beta-1",
+      "version": "3.8.1",
     },
     Object {
-      "version": "3.0.0-alpha-4",
+      "version": "3.9.0",
     },
     Object {
-      "version": "2.5.9.10348",
+      "version": "3.10.0",
     },
     Object {
-      "version": "3.0.0-alpha-2",
+      "version": "3.10.1",
     },
     Object {
-      "version": "3.0.0-alpha-5",
+      "version": "3.11.0",
     },
   ],
   "sourceUrl": "https://github.com/nunit/nunit",
@@ -612,133 +612,133 @@ Object {
   "pkgName": "nunit",
   "releases": Array [
     Object {
-      "version": "3.11.0",
+      "version": "2.5.7.10213",
     },
     Object {
-      "version": "2.7.0",
+      "version": "2.5.9.10348",
     },
     Object {
-      "version": "2.6.7",
+      "version": "2.5.10.11092",
     },
     Object {
-      "version": "2.6.6",
+      "version": "2.6.0.12051",
     },
     Object {
-      "version": "2.6.5",
+      "version": "2.6.0.12054",
     },
     Object {
-      "version": "3.10.1",
+      "version": "2.6.1",
     },
     Object {
-      "version": "3.10.0",
+      "version": "2.6.2",
     },
     Object {
-      "version": "3.9.0",
+      "version": "2.6.3",
     },
     Object {
-      "version": "3.8.1",
+      "version": "2.6.4",
     },
     Object {
-      "version": "3.8.0",
+      "version": "2.6.5",
     },
     Object {
-      "version": "3.7.1",
+      "version": "2.6.6",
     },
     Object {
-      "version": "3.7.0",
+      "version": "2.6.7",
     },
     Object {
-      "version": "3.6.1",
+      "version": "2.7.0",
     },
     Object {
-      "version": "3.6.0",
+      "version": "3.0.0-alpha",
     },
     Object {
-      "version": "3.5.0",
+      "version": "3.0.0-alpha-2",
     },
     Object {
-      "version": "3.4.1",
+      "version": "3.0.0-alpha-3",
     },
     Object {
-      "version": "3.4.0",
+      "version": "3.0.0-alpha-4",
     },
     Object {
-      "version": "3.2.1",
+      "version": "3.0.0-alpha-5",
     },
     Object {
-      "version": "3.2.0",
+      "version": "3.0.0-beta-1",
     },
     Object {
-      "version": "3.0.1",
+      "version": "3.0.0-beta-2",
     },
     Object {
-      "version": "3.0.0",
+      "version": "3.0.0-beta-3",
     },
     Object {
-      "version": "2.6.4",
+      "version": "3.0.0-beta-4",
     },
     Object {
-      "version": "3.0.0-rc-3",
+      "version": "3.0.0-beta-5",
     },
     Object {
-      "version": "3.0.0-rc-2",
+      "version": "3.0.0-rc",
     },
     Object {
-      "version": "3.0.0-rc",
+      "version": "3.0.0-rc-2",
     },
     Object {
-      "version": "3.0.0-beta-5",
+      "version": "3.0.0-rc-3",
     },
     Object {
-      "version": "3.0.0-beta-4",
+      "version": "3.0.0",
     },
     Object {
-      "version": "2.6.3",
+      "version": "3.0.1",
     },
     Object {
-      "version": "2.6.2",
+      "version": "3.2.0",
     },
     Object {
-      "version": "3.0.0-alpha",
+      "version": "3.2.1",
     },
     Object {
-      "version": "2.6.0.12054",
+      "version": "3.4.0",
     },
     Object {
-      "version": "2.6.1",
+      "version": "3.4.1",
     },
     Object {
-      "version": "3.0.0-beta-2",
+      "version": "3.5.0",
     },
     Object {
-      "version": "3.0.0-beta-3",
+      "version": "3.6.0",
     },
     Object {
-      "version": "2.5.10.11092",
+      "version": "3.6.1",
     },
     Object {
-      "version": "2.5.7.10213",
+      "version": "3.7.0",
     },
     Object {
-      "version": "2.6.0.12051",
+      "version": "3.7.1",
     },
     Object {
-      "version": "3.0.0-alpha-3",
+      "version": "3.8.0",
     },
     Object {
-      "version": "3.0.0-beta-1",
+      "version": "3.8.1",
     },
     Object {
-      "version": "3.0.0-alpha-4",
+      "version": "3.9.0",
     },
     Object {
-      "version": "2.5.9.10348",
+      "version": "3.10.0",
     },
     Object {
-      "version": "3.0.0-alpha-2",
+      "version": "3.10.1",
     },
     Object {
-      "version": "3.0.0-alpha-5",
+      "version": "3.11.0",
     },
   ],
 }
diff --git a/lib/datasource/nuget/index.spec.ts b/lib/datasource/nuget/index.spec.ts
index b39e391e20481baaa5f0229ba38eeabc16013317..fd27306f98570064f94a4358c3b21fa59998eac6 100644
--- a/lib/datasource/nuget/index.spec.ts
+++ b/lib/datasource/nuget/index.spec.ts
@@ -1,7 +1,9 @@
 import fs from 'fs';
+import { getPkgReleases } from '..';
 import * as httpMock from '../../../test/httpMock';
 import * as _hostRules from '../../util/host-rules';
-import * as nuget from '.';
+import { id as versioning } from '../../versioning/nuget';
+import { id as datasource } from '.';
 
 const hostRules: any = _hostRules;
 
@@ -60,7 +62,9 @@ const nugetIndexV3 = fs.readFileSync(
 );
 
 const configV3V2 = {
-  lookupName: 'nunit',
+  datasource,
+  versioning,
+  depName: 'nunit',
   registryUrls: [
     'https://api.nuget.org/v3/index.json',
     'https://www.nuget.org/api/v2/',
@@ -68,22 +72,30 @@ const configV3V2 = {
 };
 
 const configV2 = {
-  lookupName: 'nunit',
+  datasource,
+  versioning,
+  depName: 'nunit',
   registryUrls: ['https://www.nuget.org/api/v2/'],
 };
 
 const configV3 = {
-  lookupName: 'nunit',
+  datasource,
+  versioning,
+  depName: 'nunit',
   registryUrls: ['https://api.nuget.org/v3/index.json'],
 };
 
 const configV3NotNugetOrg = {
-  lookupName: 'nunit',
+  datasource,
+  versioning,
+  depName: 'nunit',
   registryUrls: ['https://myprivatefeed/index.json'],
 };
 
 const configV3Multiple = {
-  lookupName: 'nunit',
+  datasource,
+  versioning,
+  depName: 'nunit',
   registryUrls: [
     'https://api.nuget.org/v3/index.json',
     'https://myprivatefeed/index.json',
@@ -104,12 +116,14 @@ describe('datasource/nuget', () => {
 
     it(`can't detect nuget feed version`, async () => {
       const config = {
-        lookupName: 'nunit',
+        datasource,
+        versioning,
+        depName: 'nunit',
         registryUrls: ['#$#api.nuget.org/v3/index.xml'],
       };
 
       expect(
-        await nuget.getReleases({
+        await getPkgReleases({
           ...config,
         })
       ).toBeNull();
@@ -118,10 +132,12 @@ describe('datasource/nuget', () => {
     it('extracts feed version from registry URL hash', async () => {
       httpMock.scope('https://my-registry').get('/').reply(200);
       const config = {
-        lookupName: 'nunit',
+        datasource,
+        versioning,
+        depName: 'nunit',
         registryUrls: ['https://my-registry#protocolVersion=3'],
       };
-      await nuget.getReleases({
+      await getPkgReleases({
         ...config,
       });
       const trace = httpMock.getTrace();
@@ -139,7 +155,7 @@ describe('datasource/nuget', () => {
         .get('/query?q=PackageId:nunit&semVerLevel=2.0.0&prerelease=true')
         .reply(500);
 
-      const res = await nuget.getReleases({
+      const res = await getPkgReleases({
         ...configV3,
       });
 
@@ -156,7 +172,7 @@ describe('datasource/nuget', () => {
         .get('/query?q=PackageId:nunit&semVerLevel=2.0.0&prerelease=true')
         .reply(200, JSON.parse('{"totalHits": 0}'));
 
-      const res = await nuget.getReleases({
+      const res = await getPkgReleases({
         ...configV3,
       });
 
@@ -176,7 +192,7 @@ describe('datasource/nuget', () => {
         )
         .reply(200, null);
       expect(
-        await nuget.getReleases({
+        await getPkgReleases({
           ...configV3V2,
         })
       ).toBeNull();
@@ -190,7 +206,7 @@ describe('datasource/nuget', () => {
         )
         .reply(200, {});
       expect(
-        await nuget.getReleases({
+        await getPkgReleases({
           ...configV2,
         })
       ).toBeNull();
@@ -201,7 +217,7 @@ describe('datasource/nuget', () => {
         .scope('https://api.nuget.org')
         .get('/v3/index.json')
         .reply(200, {});
-      const res = await nuget.getReleases({
+      const res = await getPkgReleases({
         ...configV3,
       });
       expect(res).toBeNull();
@@ -217,7 +233,7 @@ describe('datasource/nuget', () => {
         )
         .reply(500);
       expect(
-        await nuget.getReleases({
+        await getPkgReleases({
           ...configV3V2,
         })
       ).toBeNull();
@@ -226,7 +242,7 @@ describe('datasource/nuget', () => {
     it('returns null for non 200 (v3)', async () => {
       httpMock.scope('https://api.nuget.org').get('/v3/index.json').reply(500);
       expect(
-        await nuget.getReleases({
+        await getPkgReleases({
           ...configV3,
         })
       ).toBeNull();
@@ -240,7 +256,7 @@ describe('datasource/nuget', () => {
         )
         .reply(500);
       expect(
-        await nuget.getReleases({
+        await getPkgReleases({
           ...configV2,
         })
       ).toBeNull();
@@ -259,7 +275,7 @@ describe('datasource/nuget', () => {
         )
         .replyWithError('');
       expect(
-        await nuget.getReleases({
+        await getPkgReleases({
           ...configV3V2,
         })
       ).toBeNull();
@@ -283,7 +299,7 @@ describe('datasource/nuget', () => {
         .get('/index.json')
         .reply(200, JSON.parse(nugetIndexV3));
 
-      const res = await nuget.getReleases({
+      const res = await getPkgReleases({
         ...configV3Multiple,
       });
       expect(res).not.toBeNull();
@@ -297,7 +313,7 @@ describe('datasource/nuget', () => {
         .get('/v3/index.json')
         .replyWithError('');
       expect(
-        await nuget.getReleases({
+        await getPkgReleases({
           ...configV3,
         })
       ).toBeNull();
@@ -313,7 +329,7 @@ describe('datasource/nuget', () => {
         .get('/query?q=PackageId:nunit&semVerLevel=2.0.0&prerelease=true')
         .replyWithError('');
       expect(
-        await nuget.getReleases({
+        await getPkgReleases({
           ...configV3,
         })
       ).toBeNull();
@@ -327,7 +343,7 @@ describe('datasource/nuget', () => {
         )
         .replyWithError('');
       expect(
-        await nuget.getReleases({
+        await getPkgReleases({
           ...configV2,
         })
       ).toBeNull();
@@ -344,7 +360,7 @@ describe('datasource/nuget', () => {
         .scope('https://api-v2v3search-0.nuget.org')
         .get('/query?q=PackageId:nunit&semVerLevel=2.0.0&prerelease=true')
         .reply(200, JSON.parse(pkgListV3));
-      const res = await nuget.getReleases({
+      const res = await getPkgReleases({
         ...configV3,
       });
       expect(res).not.toBeNull();
@@ -362,7 +378,7 @@ describe('datasource/nuget', () => {
         .get('/index.json')
         .reply(200, JSON.parse(nugetIndexV3));
 
-      const res = await nuget.getReleases({
+      const res = await getPkgReleases({
         ...configV3NotNugetOrg,
       });
       expect(res).not.toBeNull();
@@ -379,9 +395,11 @@ describe('datasource/nuget', () => {
         .scope('https://myprivatefeed')
         .get('/index.json')
         .reply(200, JSON.parse(nugetIndexV3));
-      const res = await nuget.getReleases({
+      const res = await getPkgReleases({
         ...configV3NotNugetOrg,
-        lookupName: 'nun',
+        datasource,
+        versioning,
+        depName: 'nun',
       });
       expect(res).toBeNull();
       expect(httpMock.getTrace()).toMatchSnapshot();
@@ -395,7 +413,7 @@ describe('datasource/nuget', () => {
         .scope('https://myprivatefeed')
         .get('/index.json')
         .reply(200, JSON.parse(nugetIndexV3));
-      const res = await nuget.getReleases({
+      const res = await getPkgReleases({
         ...configV3NotNugetOrg,
       });
       expect(res).not.toBeNull();
@@ -412,7 +430,7 @@ describe('datasource/nuget', () => {
         .scope('https://myprivatefeed')
         .get('/index.json')
         .reply(200, JSON.parse(nugetIndexV3));
-      const res = await nuget.getReleases({
+      const res = await getPkgReleases({
         ...configV3NotNugetOrg,
       });
       expect(res).not.toBeNull();
@@ -426,7 +444,7 @@ describe('datasource/nuget', () => {
           '/api/v2//FindPackagesById()?id=%27nunit%27&$select=Version,IsLatestVersion,ProjectUrl'
         )
         .reply(200, pkgListV2);
-      const res = await nuget.getReleases({
+      const res = await getPkgReleases({
         ...configV2,
       });
       expect(res).not.toBeNull();
@@ -441,7 +459,7 @@ describe('datasource/nuget', () => {
           '/api/v2//FindPackagesById()?id=%27nunit%27&$select=Version,IsLatestVersion,ProjectUrl'
         )
         .reply(200, pkgListV2NoRelease);
-      const res = await nuget.getReleases({
+      const res = await getPkgReleases({
         ...configV2,
       });
       expect(res).toBeNull();
@@ -454,7 +472,7 @@ describe('datasource/nuget', () => {
           '/api/v2//FindPackagesById()?id=%27nunit%27&$select=Version,IsLatestVersion,ProjectUrl'
         )
         .reply(200, pkgListV2WithoutProjectUrl);
-      const res = await nuget.getReleases({
+      const res = await getPkgReleases({
         ...configV2,
       });
       expect(res).not.toBeNull();
@@ -469,7 +487,7 @@ describe('datasource/nuget', () => {
           '/api/v2//FindPackagesById()?id=%27nunit%27&$select=Version,IsLatestVersion,ProjectUrl'
         )
         .reply(200, pkgListV2NoGitHubProjectUrl);
-      const res = await nuget.getReleases({
+      const res = await getPkgReleases({
         ...configV2,
       });
       expect(res).not.toBeNull();
@@ -487,7 +505,7 @@ describe('datasource/nuget', () => {
         .scope('https://example.org')
         .get('/')
         .reply(200, pkgListV2Page2of2);
-      const res = await nuget.getReleases({
+      const res = await getPkgReleases({
         ...configV2,
       });
       expect(res).not.toBeNull();
diff --git a/lib/datasource/orb/__snapshots__/index.spec.ts.snap b/lib/datasource/orb/__snapshots__/index.spec.ts.snap
index fd44a5442d86385363d422612d136ac699264ef6..efeac7f74b2324bf7474a8baf64d5cc899643e02 100644
--- a/lib/datasource/orb/__snapshots__/index.spec.ts.snap
+++ b/lib/datasource/orb/__snapshots__/index.spec.ts.snap
@@ -6,44 +6,44 @@ Object {
   "name": "hyper-expanse/library-release-workflows",
   "releases": Array [
     Object {
-      "releaseTimestamp": "2018-12-13T23:19:09.356Z",
-      "version": "4.2.0",
-    },
-    Object {
-      "releaseTimestamp": "2018-12-12T18:56:42.563Z",
-      "version": "4.1.6",
+      "releaseTimestamp": "2018-12-11T05:28:14.080Z",
+      "version": "3.0.0",
     },
     Object {
-      "releaseTimestamp": "2018-12-12T17:13:31.542Z",
-      "version": "4.1.5",
+      "releaseTimestamp": "2018-12-11T17:41:26.595Z",
+      "version": "4.0.0",
     },
     Object {
-      "releaseTimestamp": "2018-12-11T22:13:29.297Z",
-      "version": "4.1.4",
+      "releaseTimestamp": "2018-12-11T18:14:41.116Z",
+      "version": "4.1.0",
     },
     Object {
-      "releaseTimestamp": "2018-12-11T21:40:44.870Z",
-      "version": "4.1.3",
+      "releaseTimestamp": "2018-12-11T18:24:13.119Z",
+      "version": "4.1.1",
     },
     Object {
       "releaseTimestamp": "2018-12-11T21:28:37.846Z",
       "version": "4.1.2",
     },
     Object {
-      "releaseTimestamp": "2018-12-11T18:24:13.119Z",
-      "version": "4.1.1",
+      "releaseTimestamp": "2018-12-11T21:40:44.870Z",
+      "version": "4.1.3",
     },
     Object {
-      "releaseTimestamp": "2018-12-11T18:14:41.116Z",
-      "version": "4.1.0",
+      "releaseTimestamp": "2018-12-11T22:13:29.297Z",
+      "version": "4.1.4",
     },
     Object {
-      "releaseTimestamp": "2018-12-11T17:41:26.595Z",
-      "version": "4.0.0",
+      "releaseTimestamp": "2018-12-12T17:13:31.542Z",
+      "version": "4.1.5",
     },
     Object {
-      "releaseTimestamp": "2018-12-11T05:28:14.080Z",
-      "version": "3.0.0",
+      "releaseTimestamp": "2018-12-12T18:56:42.563Z",
+      "version": "4.1.6",
+    },
+    Object {
+      "releaseTimestamp": "2018-12-13T23:19:09.356Z",
+      "version": "4.2.0",
     },
   ],
   "versions": Object {},
@@ -88,44 +88,44 @@ Object {
   "name": "hyper-expanse/library-release-workflows",
   "releases": Array [
     Object {
-      "releaseTimestamp": "2018-12-13T23:19:09.356Z",
-      "version": "4.2.0",
-    },
-    Object {
-      "releaseTimestamp": "2018-12-12T18:56:42.563Z",
-      "version": "4.1.6",
+      "releaseTimestamp": "2018-12-11T05:28:14.080Z",
+      "version": "3.0.0",
     },
     Object {
-      "releaseTimestamp": "2018-12-12T17:13:31.542Z",
-      "version": "4.1.5",
+      "releaseTimestamp": "2018-12-11T17:41:26.595Z",
+      "version": "4.0.0",
     },
     Object {
-      "releaseTimestamp": "2018-12-11T22:13:29.297Z",
-      "version": "4.1.4",
+      "releaseTimestamp": "2018-12-11T18:14:41.116Z",
+      "version": "4.1.0",
     },
     Object {
-      "releaseTimestamp": "2018-12-11T21:40:44.870Z",
-      "version": "4.1.3",
+      "releaseTimestamp": "2018-12-11T18:24:13.119Z",
+      "version": "4.1.1",
     },
     Object {
       "releaseTimestamp": "2018-12-11T21:28:37.846Z",
       "version": "4.1.2",
     },
     Object {
-      "releaseTimestamp": "2018-12-11T18:24:13.119Z",
-      "version": "4.1.1",
+      "releaseTimestamp": "2018-12-11T21:40:44.870Z",
+      "version": "4.1.3",
     },
     Object {
-      "releaseTimestamp": "2018-12-11T18:14:41.116Z",
-      "version": "4.1.0",
+      "releaseTimestamp": "2018-12-11T22:13:29.297Z",
+      "version": "4.1.4",
     },
     Object {
-      "releaseTimestamp": "2018-12-11T17:41:26.595Z",
-      "version": "4.0.0",
+      "releaseTimestamp": "2018-12-12T17:13:31.542Z",
+      "version": "4.1.5",
     },
     Object {
-      "releaseTimestamp": "2018-12-11T05:28:14.080Z",
-      "version": "3.0.0",
+      "releaseTimestamp": "2018-12-12T18:56:42.563Z",
+      "version": "4.1.6",
+    },
+    Object {
+      "releaseTimestamp": "2018-12-13T23:19:09.356Z",
+      "version": "4.2.0",
     },
   ],
   "versions": Object {},
diff --git a/lib/datasource/orb/index.spec.ts b/lib/datasource/orb/index.spec.ts
index 7e173785f1bbb8074ef3cfd0299482bcca5120ff..028a0d104fcaa155ea2e6c669e77210abc05d1ef 100644
--- a/lib/datasource/orb/index.spec.ts
+++ b/lib/datasource/orb/index.spec.ts
@@ -1,5 +1,6 @@
+import { getPkgReleases } from '..';
 import * as httpMock from '../../../test/httpMock';
-import * as datasource from '.';
+import { id as datasource } from '.';
 
 const orbData = {
   data: {
@@ -38,8 +39,9 @@ describe('datasource/orb', () => {
     it('returns null for empty result', async () => {
       httpMock.scope(baseUrl).post('/graphql-unstable').reply(200, {});
       expect(
-        await datasource.getReleases({
-          lookupName: 'hyper-expanse/library-release-workflows',
+        await getPkgReleases({
+          datasource,
+          depName: 'hyper-expanse/library-release-workflows',
         })
       ).toBeNull();
       expect(httpMock.getTrace()).toMatchSnapshot();
@@ -50,8 +52,9 @@ describe('datasource/orb', () => {
         .post('/graphql-unstable')
         .reply(200, { data: {} });
       expect(
-        await datasource.getReleases({
-          lookupName: 'hyper-expanse/library-release-wonkflows',
+        await getPkgReleases({
+          datasource,
+          depName: 'hyper-expanse/library-release-wonkflows',
         })
       ).toBeNull();
       expect(httpMock.getTrace()).toMatchSnapshot();
@@ -59,8 +62,9 @@ describe('datasource/orb', () => {
     it('returns null for 404', async () => {
       httpMock.scope(baseUrl).post('/graphql-unstable').reply(404);
       expect(
-        await datasource.getReleases({
-          lookupName: 'hyper-expanse/library-release-workflows',
+        await getPkgReleases({
+          datasource,
+          depName: 'hyper-expanse/library-release-workflows',
         })
       ).toBeNull();
       expect(httpMock.getTrace()).toMatchSnapshot();
@@ -68,16 +72,18 @@ describe('datasource/orb', () => {
     it('returns null for unknown error', async () => {
       httpMock.scope(baseUrl).post('/graphql-unstable').replyWithError('');
       expect(
-        await datasource.getReleases({
-          lookupName: 'hyper-expanse/library-release-workflows',
+        await getPkgReleases({
+          datasource,
+          depName: 'hyper-expanse/library-release-workflows',
         })
       ).toBeNull();
       expect(httpMock.getTrace()).toMatchSnapshot();
     });
     it('processes real data', async () => {
       httpMock.scope(baseUrl).post('/graphql-unstable').reply(200, orbData);
-      const res = await datasource.getReleases({
-        lookupName: 'hyper-expanse/library-release-workflows',
+      const res = await getPkgReleases({
+        datasource,
+        depName: 'hyper-expanse/library-release-workflows',
       });
       expect(res).toMatchSnapshot();
       expect(res).not.toBeNull();
@@ -86,8 +92,9 @@ describe('datasource/orb', () => {
     it('processes homeUrl', async () => {
       orbData.data.orb.homeUrl = 'https://google.com';
       httpMock.scope(baseUrl).post('/graphql-unstable').reply(200, orbData);
-      const res = await datasource.getReleases({
-        lookupName: 'hyper-expanse/library-release-workflows',
+      const res = await getPkgReleases({
+        datasource,
+        depName: 'hyper-expanse/library-release-workflows',
       });
       expect(res).toMatchSnapshot();
       expect(res.homepage).toEqual('https://google.com');
diff --git a/lib/datasource/packagist/__snapshots__/index.spec.ts.snap b/lib/datasource/packagist/__snapshots__/index.spec.ts.snap
index fd5e7a8af7b5f0874e87716867b336e136067c4b..04058857c4c499aa66c185da58dd6cad031e27d8 100644
--- a/lib/datasource/packagist/__snapshots__/index.spec.ts.snap
+++ b/lib/datasource/packagist/__snapshots__/index.spec.ts.snap
@@ -2,24 +2,8 @@
 
 exports[`datasource/packagist getReleases adds packagist source implicitly 1`] = `
 Object {
-  "homepage": "https://github.com/drewm/mailchimp-api",
   "name": "drewm/mailchimp-api",
   "releases": Array [
-    Object {
-      "gitRef": "dev-api-v2",
-      "releaseTimestamp": "2016-01-17T15:57:27+00:00",
-      "version": "dev-api-v2",
-    },
-    Object {
-      "gitRef": "dev-api-v3",
-      "releaseTimestamp": "2016-01-17T15:59:26+00:00",
-      "version": "dev-api-v3",
-    },
-    Object {
-      "gitRef": "dev-master",
-      "releaseTimestamp": "2018-02-23T09:45:38+00:00",
-      "version": "dev-master",
-    },
     Object {
       "gitRef": "v1.0",
       "releaseTimestamp": "2014-05-30T16:51:39+00:00",
@@ -96,7 +80,7 @@ Object {
       "version": "2.5",
     },
   ],
-  "sourceUrl": "https://github.com/drewm/mailchimp-api.git",
+  "sourceUrl": "https://github.com/drewm/mailchimp-api",
 }
 `;
 
@@ -252,24 +236,8 @@ Array [
 
 exports[`datasource/packagist getReleases processes real versioned data 1`] = `
 Object {
-  "homepage": "https://github.com/drewm/mailchimp-api",
   "name": "drewm/mailchimp-api",
   "releases": Array [
-    Object {
-      "gitRef": "dev-api-v2",
-      "releaseTimestamp": "2016-01-17T15:57:27+00:00",
-      "version": "dev-api-v2",
-    },
-    Object {
-      "gitRef": "dev-api-v3",
-      "releaseTimestamp": "2016-01-17T15:59:26+00:00",
-      "version": "dev-api-v3",
-    },
-    Object {
-      "gitRef": "dev-master",
-      "releaseTimestamp": "2018-02-23T09:45:38+00:00",
-      "version": "dev-master",
-    },
     Object {
       "gitRef": "v1.0",
       "releaseTimestamp": "2014-05-30T16:51:39+00:00",
@@ -346,7 +314,7 @@ Object {
       "version": "2.5",
     },
   ],
-  "sourceUrl": "https://github.com/drewm/mailchimp-api.git",
+  "sourceUrl": "https://github.com/drewm/mailchimp-api",
 }
 `;
 
@@ -506,7 +474,7 @@ Object {
       "version": "3.8.1",
     },
   ],
-  "sourceUrl": "https://github.com/guzzle/guzzle.git",
+  "sourceUrl": "https://github.com/guzzle/guzzle",
 }
 `;
 
@@ -539,27 +507,18 @@ Array [
 
 exports[`datasource/packagist getReleases supports plain packages 1`] = `
 Object {
-  "homepage": undefined,
   "name": "vendor/package-name",
   "releases": Array [
     Object {
-      "gitRef": "dev-master",
-      "releaseTimestamp": undefined,
-      "version": "dev-master",
+      "gitRef": "0.0.1",
+      "version": "0.0.1",
     },
     Object {
       "gitRef": "1.0.x-dev",
-      "releaseTimestamp": undefined,
       "version": "1.0.x-dev",
     },
-    Object {
-      "gitRef": "0.0.1",
-      "releaseTimestamp": undefined,
-      "version": "0.0.1",
-    },
     Object {
       "gitRef": "1.0.0",
-      "releaseTimestamp": undefined,
       "version": "1.0.0",
     },
   ],
@@ -588,34 +547,24 @@ Object {
   "releases": Array [
     Object {
       "gitRef": "1.0",
-      "releaseTimestamp": undefined,
       "version": "1.0",
     },
     Object {
       "gitRef": "1.1",
-      "releaseTimestamp": undefined,
       "version": "1.1",
     },
     Object {
       "gitRef": "1.4",
-      "releaseTimestamp": undefined,
       "version": "1.4",
     },
     Object {
       "gitRef": "1.5",
-      "releaseTimestamp": undefined,
       "version": "1.5",
     },
     Object {
       "gitRef": "1.5.1",
-      "releaseTimestamp": undefined,
       "version": "1.5.1",
     },
-    Object {
-      "gitRef": "dev-trunk",
-      "releaseTimestamp": "2018-09-03 21:31:30",
-      "version": "dev-trunk",
-    },
   ],
   "sourceUrl": "https://plugins.svn.wordpress.org/1beyt/",
 }
@@ -663,34 +612,24 @@ Object {
   "releases": Array [
     Object {
       "gitRef": "1.0",
-      "releaseTimestamp": undefined,
       "version": "1.0",
     },
     Object {
       "gitRef": "1.1",
-      "releaseTimestamp": undefined,
       "version": "1.1",
     },
     Object {
       "gitRef": "1.4",
-      "releaseTimestamp": undefined,
       "version": "1.4",
     },
     Object {
       "gitRef": "1.5",
-      "releaseTimestamp": undefined,
       "version": "1.5",
     },
     Object {
       "gitRef": "1.5.1",
-      "releaseTimestamp": undefined,
       "version": "1.5.1",
     },
-    Object {
-      "gitRef": "dev-trunk",
-      "releaseTimestamp": "2018-09-03 21:31:30",
-      "version": "dev-trunk",
-    },
   ],
   "sourceUrl": "https://plugins.svn.wordpress.org/1beyt/",
 }
diff --git a/lib/datasource/packagist/index.spec.ts b/lib/datasource/packagist/index.spec.ts
index a1cef7d2c1194f6de1032b51b51840080a56113b..96a931bf8c9e80562aa4a2f0d95f2cf98e841ee1 100644
--- a/lib/datasource/packagist/index.spec.ts
+++ b/lib/datasource/packagist/index.spec.ts
@@ -1,8 +1,10 @@
 import fs from 'fs';
+import { getPkgReleases } from '..';
 import * as httpMock from '../../../test/httpMock';
 import * as _hostRules from '../../util/host-rules';
 import * as composerVersioning from '../../versioning/composer';
-import * as packagist from '.';
+import { id as versioning } from '../../versioning/loose';
+import { id as datasource } from '.';
 
 jest.mock('../../util/host-rules');
 
@@ -45,9 +47,11 @@ describe('datasource/packagist', () => {
       config = {
         registryUrls: ['https://composer.renovatebot.com'],
       };
-      const res = await packagist.getReleases({
+      const res = await getPkgReleases({
         ...config,
-        lookupName: 'something/one',
+        datasource,
+        versioning,
+        depName: 'something/one',
       });
       expect(res).toBeNull();
     });
@@ -66,9 +70,11 @@ describe('datasource/packagist', () => {
         .scope('https://composer.renovatebot.com')
         .get('/packages.json')
         .reply(200, packagesOnly);
-      const res = await packagist.getReleases({
+      const res = await getPkgReleases({
         ...config,
-        lookupName: 'vendor/package-name',
+        datasource,
+        versioning,
+        depName: 'vendor/package-name',
       });
       expect(res).toMatchSnapshot();
       expect(httpMock.getTrace()).toMatchSnapshot();
@@ -79,9 +85,11 @@ describe('datasource/packagist', () => {
         .get('/packages.json')
         .replyWithError({ code: 'ETIMEDOUT' });
       httpMock.scope(baseUrl).get('/p/vendor/package-name2.json').reply(200);
-      const res = await packagist.getReleases({
+      const res = await getPkgReleases({
         ...config,
-        lookupName: 'vendor/package-name2',
+        datasource,
+        versioning,
+        depName: 'vendor/package-name2',
       });
       expect(res).toBeNull();
       expect(httpMock.getTrace()).toMatchSnapshot();
@@ -92,9 +100,11 @@ describe('datasource/packagist', () => {
         .get('/packages.json')
         .reply(403);
       httpMock.scope(baseUrl).get('/p/vendor/package-name.json').reply(200);
-      const res = await packagist.getReleases({
+      const res = await getPkgReleases({
         ...config,
-        lookupName: 'vendor/package-name',
+        datasource,
+        versioning,
+        depName: 'vendor/package-name',
       });
       expect(res).toBeNull();
       expect(httpMock.getTrace()).toMatchSnapshot();
@@ -105,9 +115,11 @@ describe('datasource/packagist', () => {
         .get('/packages.json')
         .reply(404);
       httpMock.scope(baseUrl).get('/p/drewm/mailchip-api.json').reply(200);
-      const res = await packagist.getReleases({
+      const res = await getPkgReleases({
         ...config,
-        lookupName: 'drewm/mailchip-api',
+        datasource,
+        versioning,
+        depName: 'drewm/mailchip-api',
       });
       expect(res).toBeNull();
       expect(httpMock.getTrace()).toMatchSnapshot();
@@ -131,9 +143,11 @@ describe('datasource/packagist', () => {
         .reply(200, packagesJson)
         .get('/include/all$afbf74d51f31c7cbb5ff10304f9290bfb4f4e68b.json')
         .reply(200, JSON.parse(includesJson));
-      const res = await packagist.getReleases({
+      const res = await getPkgReleases({
         ...config,
-        lookupName: 'guzzlehttp/guzzle',
+        datasource,
+        versioning,
+        depName: 'guzzlehttp/guzzle',
       });
       expect(res).toMatchSnapshot();
       expect(res).not.toBeNull();
@@ -174,9 +188,11 @@ describe('datasource/packagist', () => {
           '/p/wpackagist-plugin/1beyt$b574a802b5bf20a58c0f027e73aea2a75d23a6f654afc298a8dc467331be316a.json'
         )
         .reply(200, JSON.parse(beytJson));
-      const res = await packagist.getReleases({
+      const res = await getPkgReleases({
         ...config,
-        lookupName: 'wpackagist-plugin/1beyt',
+        datasource,
+        versioning,
+        depName: 'wpackagist-plugin/1beyt',
       });
       expect(res).toMatchSnapshot();
       expect(res).not.toBeNull();
@@ -217,9 +233,11 @@ describe('datasource/packagist', () => {
         .scope(baseUrl)
         .get('/p/some/other.json')
         .reply(200, JSON.parse(beytJson));
-      const res = await packagist.getReleases({
+      const res = await getPkgReleases({
         ...config,
-        lookupName: 'some/other',
+        datasource,
+        versioning,
+        depName: 'some/other',
       });
       expect(res).toBeNull();
       expect(httpMock.getTrace()).toMatchSnapshot();
@@ -247,9 +265,11 @@ describe('datasource/packagist', () => {
           '/p/wpackagist-plugin/1beyt$b574a802b5bf20a58c0f027e73aea2a75d23a6f654afc298a8dc467331be316a.json'
         )
         .reply(200, JSON.parse(beytJson));
-      const res = await packagist.getReleases({
+      const res = await getPkgReleases({
         ...config,
-        lookupName: 'wpackagist-plugin/1beyt',
+        datasource,
+        versioning,
+        depName: 'wpackagist-plugin/1beyt',
       });
       expect(res).toMatchSnapshot();
       expect(res).not.toBeNull();
@@ -278,9 +298,11 @@ describe('datasource/packagist', () => {
         .scope(baseUrl)
         .get('/p/some/other.json')
         .reply(200, JSON.parse(beytJson));
-      const res = await packagist.getReleases({
+      const res = await getPkgReleases({
         ...config,
-        lookupName: 'some/other',
+        datasource,
+        versioning,
+        depName: 'some/other',
       });
       expect(res).toBeNull();
       expect(httpMock.getTrace()).toMatchSnapshot();
@@ -292,9 +314,11 @@ describe('datasource/packagist', () => {
         .reply(200, JSON.parse(mailchimpJson));
       config.registryUrls = ['https://packagist.org'];
       expect(
-        await packagist.getReleases({
+        await getPkgReleases({
           ...config,
-          lookupName: 'drewm/mailchimp-api',
+          datasource,
+          versioning,
+          depName: 'drewm/mailchimp-api',
         })
       ).toMatchSnapshot();
       expect(httpMock.getTrace()).toMatchSnapshot();
@@ -306,9 +330,11 @@ describe('datasource/packagist', () => {
         .reply(200, JSON.parse(mailchimpJson));
       config.registryUrls = [];
       expect(
-        await packagist.getReleases({
+        await getPkgReleases({
           ...config,
-          lookupName: 'drewm/mailchimp-api',
+          datasource,
+          versioning,
+          depName: 'drewm/mailchimp-api',
         })
       ).toMatchSnapshot();
       expect(httpMock.getTrace()).toMatchSnapshot();
diff --git a/lib/datasource/pypi/__snapshots__/index.spec.ts.snap b/lib/datasource/pypi/__snapshots__/index.spec.ts.snap
index 70ac7523c9dba623ab5116c871ed130f5979bc8f..9c8ea62c2cba72c10050fa4fea9d63177d16d490 100644
--- a/lib/datasource/pypi/__snapshots__/index.spec.ts.snap
+++ b/lib/datasource/pypi/__snapshots__/index.spec.ts.snap
@@ -158,32 +158,11 @@ Array [
 
 exports[`datasource/pypi getReleases processes real data 1`] = `
 Object {
-  "homepage": "https://github.com/Azure/azure-cli",
   "releases": Array [
     Object {
       "releaseTimestamp": "2017-04-03T16:55:14",
       "version": "0.0.1",
     },
-    Object {
-      "releaseTimestamp": "2017-09-22T23:47:59",
-      "version": "0.0.10",
-    },
-    Object {
-      "releaseTimestamp": "2017-10-24T02:14:07",
-      "version": "0.0.11",
-    },
-    Object {
-      "releaseTimestamp": "2017-11-14T18:31:57",
-      "version": "0.0.12",
-    },
-    Object {
-      "releaseTimestamp": "2017-12-05T18:57:54",
-      "version": "0.0.13",
-    },
-    Object {
-      "releaseTimestamp": "2018-01-05T21:26:03",
-      "version": "0.0.14",
-    },
     Object {
       "releaseTimestamp": "2017-04-17T20:32:30",
       "version": "0.0.2",
@@ -216,6 +195,26 @@ Object {
       "releaseTimestamp": "2017-08-28T20:14:33",
       "version": "0.0.9",
     },
+    Object {
+      "releaseTimestamp": "2017-09-22T23:47:59",
+      "version": "0.0.10",
+    },
+    Object {
+      "releaseTimestamp": "2017-10-24T02:14:07",
+      "version": "0.0.11",
+    },
+    Object {
+      "releaseTimestamp": "2017-11-14T18:31:57",
+      "version": "0.0.12",
+    },
+    Object {
+      "releaseTimestamp": "2017-12-05T18:57:54",
+      "version": "0.0.13",
+    },
+    Object {
+      "releaseTimestamp": "2018-01-05T21:26:03",
+      "version": "0.0.14",
+    },
     Object {
       "releaseTimestamp": "2018-01-17T18:36:39",
       "version": "0.1.0",
@@ -272,16 +271,13 @@ exports[`datasource/pypi getReleases respects compatibility 1`] = `
 Object {
   "releases": Array [
     Object {
-      "releaseTimestamp": undefined,
-      "version": "0.30.3",
+      "version": "0.4.0",
     },
     Object {
-      "releaseTimestamp": undefined,
-      "version": "0.31.0",
+      "version": "0.30.3",
     },
     Object {
-      "releaseTimestamp": undefined,
-      "version": "0.4.0",
+      "version": "0.31.0",
     },
   ],
 }
diff --git a/lib/datasource/pypi/index.spec.ts b/lib/datasource/pypi/index.spec.ts
index 87638f5f872a8adf5d21dea8f035d24484260de3..98ae67e1d5b82bdc641c3938fde789a9073f479e 100644
--- a/lib/datasource/pypi/index.spec.ts
+++ b/lib/datasource/pypi/index.spec.ts
@@ -1,6 +1,7 @@
 import fs from 'fs';
+import { getPkgReleases } from '..';
 import * as httpMock from '../../../test/httpMock';
-import * as pypi from '.';
+import { id as datasource } from '.';
 
 const res1: any = fs.readFileSync(
   'lib/datasource/pypi/__fixtures__/azure-cli-monitor.json'
@@ -36,8 +37,9 @@ describe('datasource/pypi', () => {
     it('returns null for empty result', async () => {
       httpMock.scope(baseUrl).get('/something/json').reply(200);
       expect(
-        await pypi.getReleases({
-          lookupName: 'something',
+        await getPkgReleases({
+          datasource,
+          depName: 'something',
         })
       ).toBeNull();
       expect(httpMock.getTrace()).toMatchSnapshot();
@@ -45,8 +47,9 @@ describe('datasource/pypi', () => {
     it('returns null for 404', async () => {
       httpMock.scope(baseUrl).get('/something/json').reply(404);
       expect(
-        await pypi.getReleases({
-          lookupName: 'something',
+        await getPkgReleases({
+          datasource,
+          depName: 'something',
         })
       ).toBeNull();
       expect(httpMock.getTrace()).toMatchSnapshot();
@@ -57,8 +60,9 @@ describe('datasource/pypi', () => {
         .get('/azure-cli-monitor/json')
         .reply(200, JSON.parse(res1));
       expect(
-        await pypi.getReleases({
-          lookupName: 'azure-cli-monitor',
+        await getPkgReleases({
+          datasource,
+          depName: 'azure-cli-monitor',
         })
       ).toMatchSnapshot();
       expect(httpMock.getTrace()).toMatchSnapshot();
@@ -71,9 +75,10 @@ describe('datasource/pypi', () => {
       const config = {
         registryUrls: ['https://custom.pypi.net/foo'],
       };
-      await pypi.getReleases({
+      await getPkgReleases({
         ...config,
-        lookupName: 'azure-cli-monitor',
+        datasource,
+        depName: 'azure-cli-monitor',
       });
       expect(httpMock.getTrace()).toMatchSnapshot();
     });
@@ -84,8 +89,9 @@ describe('datasource/pypi', () => {
         .reply(200, JSON.parse(res1));
       const pipIndexUrl = process.env.PIP_INDEX_URL;
       process.env.PIP_INDEX_URL = 'https://my.pypi.python/pypi/';
-      await pypi.getReleases({
-        lookupName: 'azure-cli-monitor',
+      await getPkgReleases({
+        datasource,
+        depName: 'azure-cli-monitor',
       });
       expect(httpMock.getTrace()).toMatchSnapshot();
       process.env.PIP_INDEX_URL = pipIndexUrl;
@@ -106,9 +112,10 @@ describe('datasource/pypi', () => {
           'https://third-index/foo',
         ],
       };
-      await pypi.getReleases({
+      await getPkgReleases({
         ...config,
-        lookupName: 'azure-cli-monitor',
+        datasource,
+        depName: 'azure-cli-monitor',
       });
       expect(httpMock.getTrace()).toMatchSnapshot();
     });
@@ -123,8 +130,9 @@ describe('datasource/pypi', () => {
           },
         });
       expect(
-        await pypi.getReleases({
-          lookupName: 'something',
+        await getPkgReleases({
+          datasource,
+          depName: 'something',
         })
       ).toMatchSnapshot();
       expect(httpMock.getTrace()).toMatchSnapshot();
@@ -142,8 +150,9 @@ describe('datasource/pypi', () => {
         },
       };
       httpMock.scope(baseUrl).get('/flexget/json').reply(200, { info });
-      const result = await pypi.getReleases({
-        lookupName: 'flexget',
+      const result = await getPkgReleases({
+        datasource,
+        depName: 'flexget',
       });
       expect(result.sourceUrl).toBe(info.project_urls.Repository);
       expect(result.changelogUrl).toBe(info.project_urls.changelog);
@@ -161,8 +170,9 @@ describe('datasource/pypi', () => {
           },
         });
       expect(
-        await pypi.getReleases({
-          lookupName: 'something',
+        await getPkgReleases({
+          datasource,
+          depName: 'something',
         })
       ).toBeNull();
       expect(httpMock.getTrace()).toMatchSnapshot();
@@ -187,9 +197,10 @@ describe('datasource/pypi', () => {
           },
         });
       expect(
-        await pypi.getReleases({
+        await getPkgReleases({
+          datasource,
           compatibility: { python: '2.7' },
-          lookupName: 'doit',
+          depName: 'doit',
         })
       ).toMatchSnapshot();
       expect(httpMock.getTrace()).toMatchSnapshot();
@@ -203,10 +214,11 @@ describe('datasource/pypi', () => {
         registryUrls: ['https://pypi.org/simple/'],
       };
       expect(
-        await pypi.getReleases({
+        await getPkgReleases({
+          datasource,
           ...config,
           compatibility: { python: '2.7' },
-          lookupName: 'dj-database-url',
+          depName: 'dj-database-url',
         })
       ).toMatchSnapshot();
       expect(httpMock.getTrace()).toMatchSnapshot();
@@ -220,10 +232,11 @@ describe('datasource/pypi', () => {
         registryUrls: ['https://some.registry.org/+simple/'],
       };
       expect(
-        await pypi.getReleases({
+        await getPkgReleases({
+          datasource,
           ...config,
           compatibility: { python: '2.7' },
-          lookupName: 'dj-database-url',
+          depName: 'dj-database-url',
         })
       ).toMatchSnapshot();
       expect(httpMock.getTrace()).toMatchSnapshot();
@@ -237,10 +250,11 @@ describe('datasource/pypi', () => {
         registryUrls: ['https://pypi.org/simple/'],
       };
       expect(
-        await pypi.getReleases({
+        await getPkgReleases({
+          datasource,
           ...config,
           compatibility: { python: '2.7' },
-          lookupName: 'image-collector',
+          depName: 'image-collector',
         })
       ).toMatchSnapshot();
       expect(httpMock.getTrace()).toMatchSnapshot();
@@ -254,10 +268,11 @@ describe('datasource/pypi', () => {
         registryUrls: ['https://pypi.org/simple/'],
       };
       expect(
-        await pypi.getReleases({
+        await getPkgReleases({
+          datasource,
           ...config,
           compatibility: { python: '2.7' },
-          lookupName: 'dj-database-url',
+          depName: 'dj-database-url',
         })
       ).toBeNull();
       expect(httpMock.getTrace()).toMatchSnapshot();
@@ -271,10 +286,11 @@ describe('datasource/pypi', () => {
         registryUrls: ['https://pypi.org/simple/'],
       };
       expect(
-        await pypi.getReleases({
+        await getPkgReleases({
+          datasource,
           ...config,
           compatibility: { python: '2.7' },
-          lookupName: 'dj-database-url',
+          depName: 'dj-database-url',
         })
       ).toBeNull();
       expect(httpMock.getTrace()).toMatchSnapshot();
@@ -288,10 +304,11 @@ describe('datasource/pypi', () => {
         registryUrls: ['https://pypi.org/simple/'],
       };
       expect(
-        await pypi.getReleases({
+        await getPkgReleases({
+          datasource,
           ...config,
           compatibility: { python: '2.7' },
-          lookupName: 'dj-database-url',
+          depName: 'dj-database-url',
         })
       ).toEqual({ releases: [] });
     });
diff --git a/lib/datasource/repology/index.spec.ts b/lib/datasource/repology/index.spec.ts
index e94ec4d9f6ef17ec1ea4d1f6371714f059fe246c..56b34cdcab70861aa23dc2c8c6c66ea00eb63781 100644
--- a/lib/datasource/repology/index.spec.ts
+++ b/lib/datasource/repology/index.spec.ts
@@ -1,9 +1,10 @@
 import fs from 'fs';
+import { getPkgReleases } from '..';
 import * as httpMock from '../../../test/httpMock';
 import { getName } from '../../../test/util';
 import { DATASOURCE_FAILURE } from '../../constants/error-messages';
-import * as ds from '.';
-import { RepologyPackage } from '.';
+import { id as versioning } from '../../versioning/loose';
+import { RepologyPackage, id as datasource } from '.';
 
 const repologyApiHost = 'https://repology.org/';
 
@@ -72,7 +73,11 @@ describe(getName(__filename), () => {
       );
 
       expect(
-        await ds.getReleases({ lookupName: 'debian_stable/nginx' })
+        await getPkgReleases({
+          datasource,
+          versioning,
+          depName: 'debian_stable/nginx',
+        })
       ).toBeNull();
       expect(httpMock.getTrace()).toMatchSnapshot();
     });
@@ -86,7 +91,11 @@ describe(getName(__filename), () => {
       );
 
       expect(
-        await ds.getReleases({ lookupName: 'this_should/never-exist' })
+        await getPkgReleases({
+          datasource,
+          versioning,
+          depName: 'this_should/never-exist',
+        })
       ).toBeNull();
       expect(httpMock.getTrace()).toMatchSnapshot();
     });
@@ -100,7 +109,11 @@ describe(getName(__filename), () => {
       );
 
       expect(
-        await ds.getReleases({ lookupName: 'unsupported_repo/nginx' })
+        await getPkgReleases({
+          datasource,
+          versioning,
+          depName: 'unsupported_repo/nginx',
+        })
       ).toBeNull();
       expect(httpMock.getTrace()).toMatchSnapshot();
     });
@@ -109,7 +122,11 @@ describe(getName(__filename), () => {
       mockProjectBy('debian_stable', 'nginx', { status: 500 }, null);
 
       await expect(
-        ds.getReleases({ lookupName: 'debian_stable/nginx' })
+        getPkgReleases({
+          datasource,
+          versioning,
+          depName: 'debian_stable/nginx',
+        })
       ).rejects.toThrow(DATASOURCE_FAILURE);
       expect(httpMock.getTrace()).toMatchSnapshot();
     });
@@ -118,14 +135,22 @@ describe(getName(__filename), () => {
       mockProjectBy('debian_stable', 'nginx', { status: 404 }, { status: 500 });
 
       await expect(
-        ds.getReleases({ lookupName: 'debian_stable/nginx' })
+        getPkgReleases({
+          datasource,
+          versioning,
+          depName: 'debian_stable/nginx',
+        })
       ).rejects.toThrow(DATASOURCE_FAILURE);
       expect(httpMock.getTrace()).toMatchSnapshot();
     });
 
     it('throws without repository and package name', async () => {
       await expect(
-        ds.getReleases({ lookupName: 'invalid-lookup-name' })
+        getPkgReleases({
+          datasource,
+          versioning,
+          depName: 'invalid-lookup-name',
+        })
       ).rejects.toThrow(DATASOURCE_FAILURE);
       expect(httpMock.getTrace()).toMatchSnapshot();
     });
@@ -138,7 +163,11 @@ describe(getName(__filename), () => {
         null
       );
 
-      const res = await ds.getReleases({ lookupName: 'debian_stable/nginx' });
+      const res = await getPkgReleases({
+        datasource,
+        versioning,
+        depName: 'debian_stable/nginx',
+      });
       expect(res).toMatchSnapshot();
       expect(res.releases).toHaveLength(1);
       expect(res.releases[0].version).toEqual('1.14.2-2+deb10u1');
@@ -153,8 +182,10 @@ describe(getName(__filename), () => {
         { status: 200, body: fixtureGccDefaults }
       );
 
-      const res = await ds.getReleases({
-        lookupName: 'debian_stable/gcc-defaults',
+      const res = await getPkgReleases({
+        datasource,
+        versioning,
+        depName: 'debian_stable/gcc-defaults',
       });
       expect(res).toMatchSnapshot();
       expect(res.releases).toHaveLength(1);
@@ -170,7 +201,11 @@ describe(getName(__filename), () => {
         null
       );
 
-      const res = await ds.getReleases({ lookupName: 'alpine_3_12/gcc' });
+      const res = await getPkgReleases({
+        datasource,
+        versioning,
+        depName: 'alpine_3_12/gcc',
+      });
       expect(res).toMatchSnapshot();
       expect(res.releases).toHaveLength(1);
       expect(res.releases[0].version).toEqual('9.3.0-r2');
@@ -185,8 +220,10 @@ describe(getName(__filename), () => {
         null
       );
 
-      const res = await ds.getReleases({
-        lookupName: 'debian_stable/pulseaudio-utils',
+      const res = await getPkgReleases({
+        datasource,
+        versioning,
+        depName: 'debian_stable/pulseaudio-utils',
       });
       expect(res).toMatchSnapshot();
       expect(res.releases).toHaveLength(1);
@@ -208,7 +245,13 @@ describe(getName(__filename), () => {
         { status: 200, body: pkgsJSON }
       );
 
-      expect(await ds.getReleases({ lookupName: 'dummy/example' })).toBeNull();
+      expect(
+        await getPkgReleases({
+          datasource,
+          versioning,
+          depName: 'dummy/example',
+        })
+      ).toBeNull();
     });
   });
 });
diff --git a/lib/datasource/terraform-module/index.spec.ts b/lib/datasource/terraform-module/index.spec.ts
index 4d9b4db72d9a2a84c49835799efeada5d2c6bc69..df5e7c7b6c29fc68cabedbe1efef37d03cdfb64f 100644
--- a/lib/datasource/terraform-module/index.spec.ts
+++ b/lib/datasource/terraform-module/index.spec.ts
@@ -1,6 +1,7 @@
 import fs from 'fs';
+import { getPkgReleases } from '..';
 import * as httpMock from '../../../test/httpMock';
-import * as terraform from '.';
+import { id as datasource } from '.';
 
 const consulData: any = fs.readFileSync(
   'lib/datasource/terraform-module/__fixtures__/registry-consul.json'
@@ -25,8 +26,9 @@ describe('datasource/terraform-module', () => {
         .get('/v1/modules/hashicorp/consul/aws')
         .reply(200, {});
       expect(
-        await terraform.getReleases({
-          lookupName: 'hashicorp/consul/aws',
+        await getPkgReleases({
+          datasource,
+          depName: 'hashicorp/consul/aws',
         })
       ).toBeNull();
       expect(httpMock.getTrace()).toMatchSnapshot();
@@ -37,8 +39,9 @@ describe('datasource/terraform-module', () => {
         .get('/v1/modules/hashicorp/consul/aws')
         .reply(404, {});
       expect(
-        await terraform.getReleases({
-          lookupName: 'hashicorp/consul/aws',
+        await getPkgReleases({
+          datasource,
+          depName: 'hashicorp/consul/aws',
         })
       ).toBeNull();
       expect(httpMock.getTrace()).toMatchSnapshot();
@@ -49,8 +52,9 @@ describe('datasource/terraform-module', () => {
         .get('/v1/modules/hashicorp/consul/aws')
         .replyWithError('');
       expect(
-        await terraform.getReleases({
-          lookupName: 'hashicorp/consul/aws',
+        await getPkgReleases({
+          datasource,
+          depName: 'hashicorp/consul/aws',
         })
       ).toBeNull();
       expect(httpMock.getTrace()).toMatchSnapshot();
@@ -60,8 +64,9 @@ describe('datasource/terraform-module', () => {
         .scope(baseUrl)
         .get('/v1/modules/hashicorp/consul/aws')
         .reply(200, consulData);
-      const res = await terraform.getReleases({
-        lookupName: 'hashicorp/consul/aws',
+      const res = await getPkgReleases({
+        datasource,
+        depName: 'hashicorp/consul/aws',
       });
       expect(res).toMatchSnapshot();
       expect(res).not.toBeNull();
@@ -72,8 +77,9 @@ describe('datasource/terraform-module', () => {
         .scope(baseUrl)
         .get('/v1/modules/hashicorp/consul/aws')
         .reply(200, consulData);
-      const res = await terraform.getReleases({
-        lookupName: 'registry.terraform.io/hashicorp/consul/aws',
+      const res = await getPkgReleases({
+        datasource,
+        depName: 'registry.terraform.io/hashicorp/consul/aws',
       });
       expect(res).toMatchSnapshot();
       expect(res).not.toBeNull();
@@ -84,8 +90,9 @@ describe('datasource/terraform-module', () => {
         .scope('https://terraform.company.com')
         .get('/v1/modules/consul/foo')
         .reply(200, consulData);
-      const res = await terraform.getReleases({
-        lookupName: 'consul/foo',
+      const res = await getPkgReleases({
+        datasource,
+        depName: 'consul/foo',
         registryUrls: ['https://terraform.company.com'],
       });
       expect(res).toBeNull();
diff --git a/lib/datasource/terraform-provider/index.spec.ts b/lib/datasource/terraform-provider/index.spec.ts
index f730f0de25340bc79c2ee1fb0731a0cb7b521dde..4456859da2a7d8116a06698f56b21c29fd3791ce 100644
--- a/lib/datasource/terraform-provider/index.spec.ts
+++ b/lib/datasource/terraform-provider/index.spec.ts
@@ -1,6 +1,7 @@
 import fs from 'fs';
+import { getPkgReleases } from '..';
 import * as httpMock from '../../../test/httpMock';
-import * as terraformProvider from '.';
+import { id as datasource } from '.';
 
 const consulData: any = fs.readFileSync(
   'lib/datasource/terraform-provider/__fixtures__/azurerm-provider.json'
@@ -25,8 +26,9 @@ describe('datasource/terraform', () => {
         .get('/v1/providers/hashicorp/azurerm')
         .reply(200, {});
       expect(
-        await terraformProvider.getReleases({
-          lookupName: 'azurerm',
+        await getPkgReleases({
+          datasource,
+          depName: 'azurerm',
         })
       ).toBeNull();
       expect(httpMock.getTrace()).toMatchSnapshot();
@@ -34,8 +36,9 @@ describe('datasource/terraform', () => {
     it('returns null for 404', async () => {
       httpMock.scope(baseUrl).get('/v1/providers/hashicorp/azurerm').reply(404);
       expect(
-        await terraformProvider.getReleases({
-          lookupName: 'azurerm',
+        await getPkgReleases({
+          datasource,
+          depName: 'azurerm',
         })
       ).toBeNull();
       expect(httpMock.getTrace()).toMatchSnapshot();
@@ -46,8 +49,9 @@ describe('datasource/terraform', () => {
         .get('/v1/providers/hashicorp/azurerm')
         .replyWithError('');
       expect(
-        await terraformProvider.getReleases({
-          lookupName: 'azurerm',
+        await getPkgReleases({
+          datasource,
+          depName: 'azurerm',
         })
       ).toBeNull();
       expect(httpMock.getTrace()).toMatchSnapshot();
@@ -57,8 +61,9 @@ describe('datasource/terraform', () => {
         .scope(baseUrl)
         .get('/v1/providers/hashicorp/azurerm')
         .reply(200, JSON.parse(consulData));
-      const res = await terraformProvider.getReleases({
-        lookupName: 'azurerm',
+      const res = await getPkgReleases({
+        datasource,
+        depName: 'azurerm',
       });
       expect(res).toMatchSnapshot();
       expect(res).not.toBeNull();