diff --git a/lib/manager/common.ts b/lib/manager/common.ts
index eba78df8891765bf27b7155702ad72d592d631eb..6869a3da2ed5a4de623a0c7389d20e4aa019904a 100644
--- a/lib/manager/common.ts
+++ b/lib/manager/common.ts
@@ -1,7 +1,7 @@
 import { ReleaseType } from 'semver';
 import { RangeStrategy, SkipReason } from '../types';
 import { ValidationMessage, GlobalConfig, UpdateType } from '../config/common';
-import { FileData } from '../platform/common';
+import { File } from '../platform/common';
 
 export type Result<T> = T | Promise<T>;
 
@@ -41,6 +41,8 @@ export interface UpdateArtifactsConfig extends ManagerConfig {
   cacheDir?: string;
   postUpdateOptions?: string[];
   ignoreScripts?: boolean;
+
+  toVersion?: string;
 }
 
 export interface PackageUpdateConfig {
@@ -188,7 +190,7 @@ export interface ArtifactError {
 
 export interface UpdateArtifactsResult {
   artifactError?: ArtifactError;
-  file?: FileData;
+  file?: File;
 }
 
 export interface UpdateArtifact {
diff --git a/lib/manager/gradle-wrapper/artifacts.spec.ts b/lib/manager/gradle-wrapper/artifacts.spec.ts
index 93d3be3094af0302c368230e9b050646d6879cd0..f54c718190bc9e6c6afc75eab70136ee6a306b7a 100644
--- a/lib/manager/gradle-wrapper/artifacts.spec.ts
+++ b/lib/manager/gradle-wrapper/artifacts.spec.ts
@@ -3,12 +3,14 @@ import { resolve } from 'path';
 import Git from 'simple-git/promise';
 import * as dcUpdate from '.';
 import { platform as _platform } from '../../platform';
-import { mocked } from '../../../test/util';
+import { mocked, getName } from '../../../test/util';
 import { ifSystemSupportsGradle } from '../gradle/__testutil__/gradle';
+import { setUtilConfig } from '../../util';
 
 const platform = mocked(_platform);
 const config = {
   localDir: resolve(__dirname, './__fixtures__/testFiles'),
+  toVersion: '5.6.4',
 };
 
 jest.mock('../../util/got');
@@ -23,14 +25,14 @@ async function resetTestFiles() {
   });
 }
 
-describe('manager/gradle-wrapper/update', () => {
+describe(getName(__filename), () => {
+  beforeAll(() => {
+    setUtilConfig(config);
+  });
+  beforeEach(() => {
+    jest.resetAllMocks();
+  });
   describe('updateArtifacts - replaces existing value', () => {
-    beforeEach(() => {
-      jest.resetModules();
-      jest.resetAllMocks();
-      jest.clearAllMocks();
-    });
-
     ifSystemSupportsGradle(6).it('replaces existing value', async () => {
       try {
         jest.setTimeout(5 * 60 * 1000);
@@ -53,7 +55,7 @@ describe('manager/gradle-wrapper/update', () => {
             ),
             'utf8'
           ),
-          config,
+          config: { ...config, toVersion: '6.3' },
         });
 
         expect(res).toEqual(
@@ -64,7 +66,6 @@ describe('manager/gradle-wrapper/update', () => {
             'gradlew.bat',
           ].map(fileProjectPath => {
             return {
-              artifactError: null,
               file: {
                 name: fileProjectPath,
                 contents: readFileSync(
@@ -98,12 +99,6 @@ describe('manager/gradle-wrapper/update', () => {
     });
   });
   describe('updateArtifacts - up to date', () => {
-    beforeEach(() => {
-      jest.resetModules();
-      jest.resetAllMocks();
-      jest.clearAllMocks();
-    });
-
     ifSystemSupportsGradle(6).it('up to date', async () => {
       try {
         jest.setTimeout(5 * 60 * 1000);
@@ -148,12 +143,6 @@ describe('manager/gradle-wrapper/update', () => {
     });
   });
   describe('updateArtifacts - error handling - getRepoStatus', () => {
-    beforeEach(() => {
-      jest.resetModules();
-      jest.resetAllMocks();
-      jest.clearAllMocks();
-    });
-
     ifSystemSupportsGradle(6).it('error handling - getRepoStatus', async () => {
       try {
         jest.setTimeout(5 * 60 * 1000);
@@ -201,12 +190,6 @@ describe('manager/gradle-wrapper/update', () => {
   });
 
   describe('updateArtifacts - error handling - command execution', () => {
-    beforeEach(() => {
-      jest.resetModules();
-      jest.resetAllMocks();
-      jest.clearAllMocks();
-    });
-
     ifSystemSupportsGradle(6).it(
       'error handling - command execution',
       async () => {
diff --git a/lib/manager/gradle-wrapper/artifacts.ts b/lib/manager/gradle-wrapper/artifacts.ts
index 322826ec1b65ce4ba33ccfc281540dc4d5ab3ba2..0e3b8f5270f8881d30dffdf2988fd560c3e68fa4 100644
--- a/lib/manager/gradle-wrapper/artifacts.ts
+++ b/lib/manager/gradle-wrapper/artifacts.ts
@@ -1,4 +1,3 @@
-/* istanbul ignore file */
 import Git from 'simple-git/promise';
 import { resolve } from 'path';
 import * as fs from 'fs-extra';
@@ -7,21 +6,17 @@ import { UpdateArtifact, UpdateArtifactsResult } from '../common';
 import { exec, ExecOptions } from '../../util/exec';
 import { readLocalFile } from '../../util/fs';
 import { platform } from '../../platform';
-import { VERSION_REGEX } from './search';
 import { gradleWrapperFileName, prepareGradleCommand } from '../gradle/index';
 
 async function addIfUpdated(
   status: Git.StatusResult,
-  projectDir: string,
   fileProjectPath: string
 ): Promise<UpdateArtifactsResult | null> {
   if (status.modified.includes(fileProjectPath)) {
-    const filePath = resolve(projectDir, `./${fileProjectPath}`);
     return {
-      artifactError: null,
       file: {
         name: fileProjectPath,
-        contents: await readLocalFile(filePath),
+        contents: await readLocalFile(fileProjectPath),
       },
     };
   }
@@ -31,34 +26,28 @@ async function addIfUpdated(
 export async function updateArtifacts({
   packageFileName,
   updatedDeps,
-  newPackageFileContent,
   config,
 }: UpdateArtifact): Promise<UpdateArtifactsResult[] | null> {
   try {
     const projectDir = config.localDir;
-    logger.debug(updatedDeps, 'gradle-wrapper.updateArtifacts()');
-    const gradlewPath = resolve(
-      projectDir,
-      `./${gradleWrapperFileName(config)}`
-    );
-    const version = VERSION_REGEX.exec(newPackageFileContent).groups.version;
-    await prepareGradleCommand(
-      gradleWrapperFileName(config),
+    logger.debug({ updatedDeps }, 'gradle-wrapper.updateArtifacts()');
+    const gradlew = gradleWrapperFileName(config);
+    const gradlewPath = resolve(projectDir, `./${gradlew}`);
+    const cmd = await prepareGradleCommand(
+      gradlew,
       projectDir,
       await fs.stat(gradlewPath).catch(() => null),
-      null
+      `wrapper --gradle-version ${config.toVersion}`
     );
-    const cmd = `${gradlewPath} wrapper --gradle-version ${version} --project-dir ${projectDir}`;
     logger.debug(`Updating gradle wrapper: "${cmd}"`);
     const execOptions: ExecOptions = {
-      cwd: config.localDir,
       docker: {
         image: 'renovate/gradle',
       },
     };
     try {
       await exec(cmd, execOptions);
-    } catch (err) /* istanbul ignore next */ {
+    } catch (err) {
       logger.warn(
         { err },
         'Error executing gradle wrapper update command. It can be not a critical one though.'
@@ -72,13 +61,12 @@ export async function updateArtifacts({
           'gradle/wrapper/gradle-wrapper.jar',
           'gradlew',
           'gradlew.bat',
-        ].map(async fileProjectPath =>
-          addIfUpdated(status, projectDir, fileProjectPath)
-        )
+        ].map(async fileProjectPath => addIfUpdated(status, fileProjectPath))
       )
     ).filter(e => e != null);
     logger.debug(
-      `Returning updated gradle-wrapper files: ${updateArtifactsResult}`
+      { files: updateArtifactsResult.map(r => r.file.name) },
+      `Returning updated gradle-wrapper files`
     );
     return updateArtifactsResult;
   } catch (err) {
diff --git a/lib/platform/azure/index.ts b/lib/platform/azure/index.ts
index 2f36c5d847e17cd2cdf541527ce3200c0c68d2d7..cb5debc846dbf645167caf88fe639531a726e709 100644
--- a/lib/platform/azure/index.ts
+++ b/lib/platform/azure/index.ts
@@ -6,7 +6,7 @@ import {
 import * as azureHelper from './azure-helper';
 import * as azureApi from './azure-got-wrapper';
 import * as hostRules from '../../util/host-rules';
-import GitStorage, { StatusResult, CommitFilesConfig } from '../git/storage';
+import GitStorage, { StatusResult } from '../git/storage';
 import { logger } from '../../logger';
 import {
   PlatformConfig,
@@ -20,6 +20,7 @@ import {
   FindPRConfig,
   EnsureCommentConfig,
   EnsureIssueResult,
+  CommitFilesConfig,
 } from '../common';
 import { sanitize } from '../../util/sanitize';
 import { smartTruncate } from '../utils/pr-body';
diff --git a/lib/platform/bitbucket-server/index.ts b/lib/platform/bitbucket-server/index.ts
index f91389d6d3c3ccd367892641ba47123143fed4ff..eda47919162c0d5a4d0aa506229e869a8cf8920b 100644
--- a/lib/platform/bitbucket-server/index.ts
+++ b/lib/platform/bitbucket-server/index.ts
@@ -4,7 +4,7 @@ import delay from 'delay';
 import { api } from './bb-got-wrapper';
 import * as utils from './utils';
 import * as hostRules from '../../util/host-rules';
-import GitStorage, { StatusResult, CommitFilesConfig } from '../git/storage';
+import GitStorage, { StatusResult } from '../git/storage';
 import { logger } from '../../logger';
 import {
   PlatformConfig,
@@ -20,6 +20,7 @@ import {
   EnsureCommentConfig,
   EnsureIssueResult,
   EnsureIssueConfig,
+  CommitFilesConfig,
 } from '../common';
 import { sanitize } from '../../util/sanitize';
 import { smartTruncate } from '../utils/pr-body';
diff --git a/lib/platform/bitbucket/index.ts b/lib/platform/bitbucket/index.ts
index 1fcda29f1ccc340d23bffea66f1015a3d9f8ae62..d7369de70ec5fe58c6a08ec6ca6145b188fdaad1 100644
--- a/lib/platform/bitbucket/index.ts
+++ b/lib/platform/bitbucket/index.ts
@@ -5,7 +5,7 @@ import { api } from './bb-got-wrapper';
 import * as utils from './utils';
 import * as hostRules from '../../util/host-rules';
 import { logger } from '../../logger';
-import GitStorage, { StatusResult, CommitFilesConfig } from '../git/storage';
+import GitStorage, { StatusResult } from '../git/storage';
 import { readOnlyIssueBody } from '../utils/read-only-issue-body';
 import * as comments from './comments';
 import {
@@ -21,6 +21,7 @@ import {
   FindPRConfig,
   EnsureCommentConfig,
   EnsureIssueResult,
+  CommitFilesConfig,
 } from '../common';
 import { sanitize } from '../../util/sanitize';
 import { smartTruncate } from '../utils/pr-body';
diff --git a/lib/platform/common.ts b/lib/platform/common.ts
index b234d58c419fc7c943363d78470eefcf2a6bc5b7..2217d14a0b37552f8f66ed359d271ff010ff6836 100644
--- a/lib/platform/common.ts
+++ b/lib/platform/common.ts
@@ -1,14 +1,30 @@
 import got from 'got';
 import Git from 'simple-git/promise';
 import { RenovateConfig } from '../config/common';
-import { CommitFilesConfig } from './git/storage';
 import { BranchStatus } from '../types';
 
-export interface FileData {
+/**
+ * File to commit to branch
+ */
+export interface File {
+  /**
+   * Relative file path
+   */
   name: string;
+
+  /**
+   * file contents
+   */
   contents: string | Buffer;
 }
 
+export type CommitFilesConfig = {
+  branchName: string;
+  files: File[];
+  message: string;
+  parentBranch?: string;
+};
+
 export interface GotApiOptions {
   useCache?: boolean;
   hostType?: string;
diff --git a/lib/platform/git/storage.ts b/lib/platform/git/storage.ts
index eebd206a56305162dd88ed72cb6c5bb084d59a3c..4c25006bf719fea3aa7b0a02a5b50671b1d6e866 100644
--- a/lib/platform/git/storage.ts
+++ b/lib/platform/git/storage.ts
@@ -12,6 +12,7 @@ import {
   REPOSITORY_EMPTY,
   REPOSITORY_TEMPORARY_ERROR,
 } from '../../constants/error-messages';
+import { CommitFilesConfig } from '../common';
 
 declare module 'fs-extra' {
   export function exists(pathLike: string): Promise<boolean>;
@@ -19,21 +20,6 @@ declare module 'fs-extra' {
 
 export type StatusResult = Git.StatusResult;
 
-/**
- * File to commit to branch
- */
-export interface File {
-  /**
-   * Relative file path
-   */
-  name: string;
-
-  /**
-   * file contents
-   */
-  contents: string | Buffer;
-}
-
 interface StorageConfig {
   localDir: string;
   baseBranch?: string;
@@ -49,13 +35,6 @@ interface LocalConfig extends StorageConfig {
   branchPrefix: string;
 }
 
-export type CommitFilesConfig = {
-  branchName: string;
-  files: File[];
-  message: string;
-  parentBranch?: string;
-};
-
 // istanbul ignore next
 function checkForPlatformFailure(err: Error): void {
   if (process.env.NODE_ENV === 'test') {
diff --git a/lib/platform/gitea/index.spec.ts b/lib/platform/gitea/index.spec.ts
index d325809190e5458730cb54e30741447137224c43..ff9c0e10be7ed68bc2e5331d0e5d1e3fd85cee76 100644
--- a/lib/platform/gitea/index.spec.ts
+++ b/lib/platform/gitea/index.spec.ts
@@ -15,11 +15,12 @@ import {
   RepoConfig,
   RepoParams,
   Platform,
+  CommitFilesConfig,
+  File,
 } from '..';
 import { logger as _logger } from '../../logger';
 import { BranchStatus } from '../../types';
 import { GiteaGotApi } from './gitea-got-wrapper';
-import { CommitFilesConfig, File } from '../git/storage';
 
 describe('platform/gitea', () => {
   let gitea: Platform;
diff --git a/lib/platform/gitea/index.ts b/lib/platform/gitea/index.ts
index 4ba3119ecb93bfa8df403707faefa8d80f4da6be..4a12c91926ede84ba0e2d1166b78e2771f3bb577 100644
--- a/lib/platform/gitea/index.ts
+++ b/lib/platform/gitea/index.ts
@@ -1,5 +1,5 @@
 import URL from 'url';
-import GitStorage, { CommitFilesConfig, StatusResult } from '../git/storage';
+import GitStorage, { StatusResult } from '../git/storage';
 import * as hostRules from '../../util/host-rules';
 import {
   BranchStatusConfig,
@@ -14,6 +14,7 @@ import {
   RepoConfig,
   RepoParams,
   VulnerabilityAlert,
+  CommitFilesConfig,
 } from '../common';
 import { api } from './gitea-got-wrapper';
 import { PLATFORM_TYPE_GITEA } from '../../constants/platforms';
diff --git a/lib/platform/github/index.ts b/lib/platform/github/index.ts
index 1fef0446d7e74751964c8071bb941cc6849bf258..d1ed07e7dc1cd77f6f9724293420eb4700334b5b 100644
--- a/lib/platform/github/index.ts
+++ b/lib/platform/github/index.ts
@@ -5,7 +5,7 @@ import URL from 'url';
 import { logger } from '../../logger';
 import { api } from './gh-got-wrapper';
 import * as hostRules from '../../util/host-rules';
-import GitStorage, { StatusResult, CommitFilesConfig } from '../git/storage';
+import GitStorage, { StatusResult } from '../git/storage';
 import {
   PlatformConfig,
   RepoParams,
@@ -18,6 +18,7 @@ import {
   FindPRConfig,
   EnsureCommentConfig,
   EnsureIssueResult,
+  CommitFilesConfig,
 } from '../common';
 
 import { configFileNames } from '../../config/app-strings';
diff --git a/lib/platform/gitlab/index.ts b/lib/platform/gitlab/index.ts
index f30100236a80d76930daa16134e33e7565396528..cc445eda375081c12676deacd66fd6a68ad57ed5 100644
--- a/lib/platform/gitlab/index.ts
+++ b/lib/platform/gitlab/index.ts
@@ -3,7 +3,7 @@ import is from '@sindresorhus/is';
 
 import { api } from './gl-got-wrapper';
 import * as hostRules from '../../util/host-rules';
-import GitStorage, { StatusResult, CommitFilesConfig } from '../git/storage';
+import GitStorage, { StatusResult } from '../git/storage';
 import {
   PlatformConfig,
   RepoParams,
@@ -17,6 +17,7 @@ import {
   BranchStatusConfig,
   FindPRConfig,
   EnsureCommentConfig,
+  CommitFilesConfig,
 } from '../common';
 import { configFileNames } from '../../config/app-strings';
 import { logger } from '../../logger';
diff --git a/lib/workers/branch/get-updated.ts b/lib/workers/branch/get-updated.ts
index 26274f7d9e8c7b142a800f8a32ac7ea24c3c9d86..69f227f9fbf4e20cdeb7c5b0953c40900fc31114 100644
--- a/lib/workers/branch/get-updated.ts
+++ b/lib/workers/branch/get-updated.ts
@@ -1,5 +1,5 @@
 import is from '@sindresorhus/is';
-import { FileData, platform } from '../../platform';
+import { File, platform } from '../../platform';
 import { logger } from '../../logger';
 import { get } from '../../manager';
 import { ArtifactError } from '../../manager/common';
@@ -11,8 +11,8 @@ import { BranchConfig } from '../common';
 export interface PackageFilesResult {
   artifactErrors: ArtifactError[];
   parentBranch?: string;
-  updatedPackageFiles: FileData[];
-  updatedArtifacts: FileData[];
+  updatedPackageFiles: File[];
+  updatedArtifacts: File[];
 }
 
 export async function getUpdatedPackageFiles(
@@ -108,7 +108,7 @@ export async function getUpdatedPackageFiles(
     name,
     contents: updatedFileContents[name],
   }));
-  const updatedArtifacts: FileData[] = [];
+  const updatedArtifacts: File[] = [];
   const artifactErrors: ArtifactError[] = [];
   for (const packageFile of updatedPackageFiles) {
     const manager = packageFileManagers[packageFile.name];
diff --git a/lib/workers/branch/index.ts b/lib/workers/branch/index.ts
index f703fb907677621eeddb7b0fe2901a47b4fe7b5d..c2e9d522cbe450454f178ac6f5a850af6dfee1a9 100644
--- a/lib/workers/branch/index.ts
+++ b/lib/workers/branch/index.ts
@@ -1,8 +1,6 @@
 import { DateTime } from 'luxon';
-import { readFile } from 'fs-extra';
 import is from '@sindresorhus/is';
 import minimatch from 'minimatch';
-import { join } from 'upath';
 import { logger } from '../../logger';
 import { isScheduledNow } from './schedule';
 import { getUpdatedPackageFiles } from './get-updated';
@@ -40,6 +38,7 @@ import {
 import { BranchStatus } from '../../types';
 import { exec } from '../../util/exec';
 import { regEx } from '../../util/regex';
+import { readLocalFile } from '../../util/fs';
 
 // TODO: proper typings
 function rebaseCheck(config: RenovateConfig, branchPr: any): boolean {
@@ -367,12 +366,10 @@ export async function processBranch(
                 { file: relativePath, pattern },
                 'Post-upgrade file saved'
               );
-              const existingContent = await readFile(
-                join(config.localDir, relativePath)
-              );
+              const existingContent = await readLocalFile(relativePath);
               config.updatedArtifacts.push({
                 name: relativePath,
-                contents: existingContent.toString(),
+                contents: existingContent,
               });
             }
           }
diff --git a/lib/workers/common.ts b/lib/workers/common.ts
index da26efba8117996f65a71bf57ac95d4cf0d7c527..af470e93ab547af76994248c7b13feed569c04cc 100644
--- a/lib/workers/common.ts
+++ b/lib/workers/common.ts
@@ -8,7 +8,7 @@ import {
   ValidationMessage,
 } from '../config';
 import { LookupUpdate } from './repository/process/lookup/common';
-import { FileData, PlatformPrOptions } from '../platform';
+import { File, PlatformPrOptions } from '../platform';
 import { Release } from '../datasource';
 
 export interface BranchUpgradeConfig
@@ -44,8 +44,8 @@ export interface BranchUpgradeConfig
   releaseTimestamp?: string;
 
   sourceDirectory?: string;
-  updatedPackageFiles?: FileData[];
-  updatedArtifacts?: FileData[];
+  updatedPackageFiles?: File[];
+  updatedArtifacts?: File[];
 }
 
 export enum PrResult {