diff --git a/lib/workers/repository/init/config.spec.ts b/lib/workers/repository/init/config.spec.ts
index 1707c056d91248f0e6997197d0c9f0631b298d3f..524380e758114f6d248ad2a5f68f08faab8aa533 100644
--- a/lib/workers/repository/init/config.spec.ts
+++ b/lib/workers/repository/init/config.spec.ts
@@ -1,5 +1,6 @@
 import {
   RenovateConfig,
+  fs,
   getConfig,
   mocked,
   platform,
@@ -7,6 +8,8 @@ import {
 import * as _migrateAndValidate from '../../../config/migrate-validate';
 import { mergeRenovateConfig } from './config';
 
+jest.mock('../../../util/fs');
+
 const migrateAndValidate = mocked(_migrateAndValidate);
 
 let config: RenovateConfig;
@@ -29,7 +32,7 @@ describe('workers/repository/init/config', () => {
     });
     it('returns config if not found', async () => {
       platform.getFileList.mockResolvedValue(['package.json']);
-      platform.getFile.mockResolvedValue('{}');
+      fs.readLocalFile.mockResolvedValue('{}');
       const res = await mergeRenovateConfig(config);
       expect(res).toMatchObject(config);
     });
@@ -41,12 +44,12 @@ describe('workers/repository/init/config', () => {
           prHourlyLimit: 10,
         },
       });
-      platform.getFile.mockResolvedValue(pJson);
+      fs.readLocalFile.mockResolvedValue(pJson);
       await mergeRenovateConfig(config);
     });
     it('returns error if cannot parse', async () => {
       platform.getFileList.mockResolvedValue(['package.json', 'renovate.json']);
-      platform.getFile.mockResolvedValue('cannot parse');
+      fs.readLocalFile.mockResolvedValue('cannot parse');
       let e;
       try {
         await mergeRenovateConfig(config);
@@ -60,7 +63,7 @@ describe('workers/repository/init/config', () => {
     });
     it('throws error if duplicate keys', async () => {
       platform.getFileList.mockResolvedValue(['package.json', '.renovaterc']);
-      platform.getFile.mockResolvedValue(
+      fs.readLocalFile.mockResolvedValue(
         '{ "enabled": true, "enabled": false }'
       );
       let e;
@@ -79,7 +82,7 @@ describe('workers/repository/init/config', () => {
         'package.json',
         'renovate.json5',
       ]);
-      platform.getFile.mockResolvedValue(`{
+      fs.readLocalFile.mockResolvedValue(`{
         // this is json5 format
       }`);
       await mergeRenovateConfig(config);
@@ -89,7 +92,7 @@ describe('workers/repository/init/config', () => {
         'package.json',
         '.github/renovate.json',
       ]);
-      platform.getFile.mockResolvedValue('{}');
+      fs.readLocalFile.mockResolvedValue('{}');
       await mergeRenovateConfig(config);
     });
     it('finds .gitlab/renovate.json', async () => {
@@ -97,7 +100,7 @@ describe('workers/repository/init/config', () => {
         'package.json',
         '.gitlab/renovate.json',
       ]);
-      platform.getFile.mockResolvedValue('{}');
+      fs.readLocalFile.mockResolvedValue('{}');
       await mergeRenovateConfig(config);
     });
     it('finds .renovaterc.json', async () => {
@@ -105,7 +108,7 @@ describe('workers/repository/init/config', () => {
         'package.json',
         '.renovaterc.json',
       ]);
-      platform.getFile.mockResolvedValue('{}');
+      fs.readLocalFile.mockResolvedValue('{}');
       await mergeRenovateConfig(config);
     });
     it('throws error if misconfigured', async () => {
@@ -113,7 +116,7 @@ describe('workers/repository/init/config', () => {
         'package.json',
         '.renovaterc.json',
       ]);
-      platform.getFile.mockResolvedValue('{}');
+      fs.readLocalFile.mockResolvedValue('{}');
       migrateAndValidate.migrateAndValidate.mockResolvedValueOnce({
         errors: [{ depName: 'dep', message: 'test error' }],
       });
diff --git a/lib/workers/repository/init/config.ts b/lib/workers/repository/init/config.ts
index 52b8b2cd22275887091ab5d727ed2305bf3bd8b5..547c2b39335b7bb3c81b06e8dfac9bf6b1efa93c 100644
--- a/lib/workers/repository/init/config.ts
+++ b/lib/workers/repository/init/config.ts
@@ -14,6 +14,7 @@ import {
 import * as npmApi from '../../../datasource/npm';
 import { logger } from '../../../logger';
 import { platform } from '../../../platform';
+import { readLocalFile } from '../../../util/fs';
 import * as hostRules from '../../../util/host-rules';
 import { flattenPackageRules } from './flatten';
 
@@ -27,7 +28,7 @@ export async function mergeRenovateConfig(
     for (const fileName of configFileNames) {
       if (fileName === 'package.json') {
         try {
-          const pJson = JSON.parse(await platform.getFile('package.json'));
+          const pJson = JSON.parse(await readLocalFile('package.json', 'utf8'));
           if (pJson.renovate) {
             logger.debug('Using package.json for global renovate config');
             return 'package.json';
@@ -50,10 +51,11 @@ export async function mergeRenovateConfig(
   let renovateJson;
   if (configFile === 'package.json') {
     // We already know it parses
-    renovateJson = JSON.parse(await platform.getFile('package.json')).renovate;
+    renovateJson = JSON.parse(await readLocalFile('package.json', 'utf8'))
+      .renovate;
     logger.debug({ config: renovateJson }, 'package.json>renovate config');
   } else {
-    let renovateConfig = await platform.getFile(configFile);
+    let renovateConfig = await readLocalFile(configFile, 'utf8');
     // istanbul ignore if
     if (renovateConfig === null) {
       logger.warn('Fetching renovate config returns null');
diff --git a/lib/workers/repository/onboarding/branch/check.ts b/lib/workers/repository/onboarding/branch/check.ts
index 728117308eb818240cb11d75e8a9632792098340..363c697cec7548f3c84a65069b5f67342b5d95ca 100644
--- a/lib/workers/repository/onboarding/branch/check.ts
+++ b/lib/workers/repository/onboarding/branch/check.ts
@@ -4,6 +4,7 @@ import { REPOSITORY_DISABLED } from '../../../../constants/error-messages';
 import { PR_STATE_NOT_OPEN } from '../../../../constants/pull-requests';
 import { logger } from '../../../../logger';
 import { platform } from '../../../../platform';
+import { readLocalFile } from '../../../../util/fs';
 
 const findFile = async (fileName: string): Promise<boolean> => {
   logger.debug(`findFile(${fileName})`);
@@ -22,7 +23,7 @@ const configFileExists = async (): Promise<boolean> => {
 
 const packageJsonConfigExists = async (): Promise<boolean> => {
   try {
-    const pJson = JSON.parse(await platform.getFile('package.json'));
+    const pJson = JSON.parse(await readLocalFile('package.json', 'utf8'));
     if (pJson.renovate) {
       return true;
     }
diff --git a/lib/workers/repository/onboarding/branch/config.ts b/lib/workers/repository/onboarding/branch/config.ts
index 70c99d825fee1931ec0497fb8e169f8e0e76ec45..45cee4492b8ebde0151fa621dfbda41b2e6b99c8 100644
--- a/lib/workers/repository/onboarding/branch/config.ts
+++ b/lib/workers/repository/onboarding/branch/config.ts
@@ -1,8 +1,8 @@
 import is from '@sindresorhus/is';
 import { RenovateConfig } from '../../../../config';
 import { logger } from '../../../../logger';
-import { platform } from '../../../../platform';
 import { clone } from '../../../../util/clone';
+import { readLocalFile } from '../../../../util/fs';
 
 export async function getOnboardingConfig(
   config: RenovateConfig
@@ -11,8 +11,9 @@ export async function getOnboardingConfig(
   try {
     logger.debug('Checking for greenkeeper config');
 
-    const greenkeeperConfig = JSON.parse(await platform.getFile('package.json'))
-      .greenkeeper;
+    const greenkeeperConfig = JSON.parse(
+      await readLocalFile('package.json', 'utf8')
+    ).greenkeeper;
     if (greenkeeperConfig) {
       onboardingConfig.statusCheckVerify = true;
     }
diff --git a/lib/workers/repository/onboarding/branch/index.spec.ts b/lib/workers/repository/onboarding/branch/index.spec.ts
index 1ffea415f255e41ed285056732835f870ccc72d3..7c9502a47fd03ac876b61130de3d7303da8e9604 100644
--- a/lib/workers/repository/onboarding/branch/index.spec.ts
+++ b/lib/workers/repository/onboarding/branch/index.spec.ts
@@ -1,5 +1,10 @@
 import { mock } from 'jest-mock-extended';
-import { RenovateConfig, getConfig, platform } from '../../../../../test/util';
+import {
+  RenovateConfig,
+  fs,
+  getConfig,
+  platform,
+} from '../../../../../test/util';
 import { PR_STATE_OPEN } from '../../../../constants/pull-requests';
 import { Pr } from '../../../../platform';
 import * as _rebase from './rebase';
@@ -8,6 +13,7 @@ import { checkOnboardingBranch } from '.';
 const rebase: any = _rebase;
 
 jest.mock('../../../../workers/repository/onboarding/branch/rebase');
+jest.mock('../../../../util/fs');
 
 describe('workers/repository/onboarding/branch', () => {
   describe('checkOnboardingBranch', () => {
@@ -26,7 +32,7 @@ describe('workers/repository/onboarding/branch', () => {
     });
     it('has default onboarding config', async () => {
       platform.getFileList.mockResolvedValue(['package.json']);
-      platform.getFile.mockResolvedValue('{}');
+      fs.readLocalFile.mockResolvedValue('{}');
       await checkOnboardingBranch(config);
       expect(
         platform.commitFilesToBranch.mock.calls[0][0].files[0].contents
@@ -49,7 +55,7 @@ describe('workers/repository/onboarding/branch', () => {
       config.requireConfig = true;
       config.onboarding = false;
       platform.getFileList.mockResolvedValueOnce(['package.json']);
-      platform.getFile.mockResolvedValueOnce('{}');
+      fs.readLocalFile.mockResolvedValueOnce('{}');
       const onboardingResult = checkOnboardingBranch(config);
       await expect(onboardingResult).rejects.toThrow('disabled');
     });
@@ -60,7 +66,7 @@ describe('workers/repository/onboarding/branch', () => {
     });
     it('detects repo is onboarded via package.json config', async () => {
       platform.getFileList.mockResolvedValueOnce(['package.json']);
-      platform.getFile.mockResolvedValueOnce('{"renovate":{}}');
+      fs.readLocalFile.mockResolvedValueOnce('{"renovate":{}}');
       const res = await checkOnboardingBranch(config);
       expect(res.repoIsOnboarded).toBe(true);
     });
@@ -93,7 +99,7 @@ describe('workers/repository/onboarding/branch', () => {
           ignore: ['foo', 'bar'],
         },
       });
-      platform.getFile.mockResolvedValue(pJsonContent);
+      fs.readLocalFile.mockResolvedValue(pJsonContent);
       platform.commitFilesToBranch.mockResolvedValueOnce('abc123');
       await checkOnboardingBranch(config);
       expect(
diff --git a/test/util.ts b/test/util.ts
index bfa4162860faa35da2d8f115afdd4ab9ba1043e3..34e742350300090ca56d4fe3765202a05e49c930 100644
--- a/test/util.ts
+++ b/test/util.ts
@@ -3,6 +3,7 @@ import * as upath from 'upath';
 import { RenovateConfig as _RenovateConfig } from '../lib/config';
 import { getConfig } from '../lib/config/defaults';
 import { platform as _platform } from '../lib/platform';
+import * as _fs from '../lib/util/fs';
 
 /**
  * Simple wrapper for getting mocked version of a module
@@ -41,6 +42,7 @@ export function partial<T>(obj: Partial<T>): T {
   return obj as T;
 }
 
+export const fs = mocked(_fs);
 export const platform = mocked(_platform);
 
 // Required because of isolatedModules