diff --git a/lib/workers/branch/lock-files.js b/lib/workers/branch/lock-files.js
index f57e7b6d3e7d827ab3a11a249aae46c5affd88b3..586897e9b5366772443dbfcc397d3ae63c851008 100644
--- a/lib/workers/branch/lock-files.js
+++ b/lib/workers/branch/lock-files.js
@@ -95,12 +95,12 @@ async function writeExistingFiles(config) {
   const { logger } = config;
   if (config.npmrc) {
     logger.debug('Writing repo .npmrc');
-    await fs.outputFile(path.join(config.tmpDir.name, '.npmrc'), config.npmrc);
+    await fs.outputFile(path.join(config.tmpDir.path, '.npmrc'), config.npmrc);
   }
   if (config.yarnrc) {
     logger.debug('Writing repo .yarnrc');
     await fs.outputFile(
-      path.join(config.tmpDir.name, '.yarnrc'),
+      path.join(config.tmpDir.path, '.yarnrc'),
       config.yarnrc
     );
   }
@@ -109,7 +109,7 @@ async function writeExistingFiles(config) {
   }
   for (const packageFile of config.packageFiles) {
     const basedir = path.join(
-      config.tmpDir.name,
+      config.tmpDir.path,
       path.dirname(packageFile.packageFile)
     );
     if (packageFile.packageFile.endsWith('package.json')) {
@@ -184,7 +184,7 @@ async function writeUpdatedPackageFiles(config) {
     delete massagedFile.engines;
     delete massagedFile.scripts;
     await fs.outputFile(
-      path.join(config.tmpDir.name, packageFile.name),
+      path.join(config.tmpDir.path, packageFile.name),
       JSON.stringify(massagedFile)
     );
   }
@@ -211,7 +211,7 @@ async function getUpdatedLockFiles(config) {
     for (const lockFileDir of dirs.packageLockFileDirs) {
       logger.debug(`Generating package-lock.json for ${lockFileDir}`);
       const newContent = await npm.generateLockFile(
-        path.join(config.tmpDir.name, lockFileDir),
+        path.join(config.tmpDir.path, lockFileDir),
         logger
       );
       if (newContent) {
@@ -237,7 +237,7 @@ async function getUpdatedLockFiles(config) {
     for (const lockFileDir of dirs.yarnLockFileDirs) {
       logger.debug(`Generating yarn.lock for ${lockFileDir}`);
       const newContent = await yarn.generateLockFile(
-        path.join(config.tmpDir.name, lockFileDir),
+        path.join(config.tmpDir.path, lockFileDir),
         logger
       );
       if (newContent) {
diff --git a/lib/workers/branch/npm.js b/lib/workers/branch/npm.js
index c2ce0bb1bd88495acac00a490b4be3e89ba57d82..599432b32452f22ebbc7236f5c95c2dce72c0a71 100644
--- a/lib/workers/branch/npm.js
+++ b/lib/workers/branch/npm.js
@@ -65,7 +65,10 @@ async function generateLockFile(tmpDir, logger) {
     logger.debug(`npm stderr:\n${stderr}`);
     const duration = process.hrtime(startTime);
     const seconds = Math.round(duration[0] + duration[1] / 1e9);
-    lockFile = fs.readFileSync(path.join(tmpDir, 'package-lock.json'), 'utf8');
+    lockFile = await fs.readFile(
+      path.join(tmpDir, 'package-lock.json'),
+      'utf8'
+    );
     logger.info(
       { seconds, type: 'package-lock.json', stdout, stderr },
       'Generated lockfile'
diff --git a/lib/workers/branch/yarn.js b/lib/workers/branch/yarn.js
index 212d910cb62b8518703b6a43383a939b82d43064..51b06610349b9bb0658de56c5e223a4b725b56da 100644
--- a/lib/workers/branch/yarn.js
+++ b/lib/workers/branch/yarn.js
@@ -66,7 +66,7 @@ async function generateLockFile(tmpDir, logger) {
     logger.debug(`yarn stderr:\n${stderr}`);
     const duration = process.hrtime(startTime);
     const seconds = Math.round(duration[0] + duration[1] / 1e9);
-    lockFile = fs.readFileSync(path.join(tmpDir, 'yarn.lock'), 'utf8');
+    lockFile = await fs.readFile(path.join(tmpDir, 'yarn.lock'), 'utf8');
     logger.info(
       { seconds, type: 'yarn.lock', stdout, stderr },
       'Generated lockfile'
diff --git a/lib/workers/repository/index.js b/lib/workers/repository/index.js
index 318b024a78021ca4ebae833c090bbf98ec10c7d8..d1a5b54a22d73d613d414fd3fa767e84b3b705f2 100644
--- a/lib/workers/repository/index.js
+++ b/lib/workers/repository/index.js
@@ -1,5 +1,5 @@
 const convertHrTime = require('convert-hrtime');
-const tmp = require('tmp');
+const tmp = require('tmp-promise');
 // Workers
 const branchWorker = require('../branch');
 // children
@@ -28,7 +28,7 @@ async function renovateRepository(repoConfig, token) {
   let config = { ...repoConfig };
   const { logger } = config;
   logger.trace({ config }, 'renovateRepository');
-  config.tmpDir = tmp.dirSync({ unsafeCleanup: true });
+  config.tmpDir = await tmp.dir({ unsafeCleanup: true });
   config.errors = [];
   config.warnings = [];
   async function renovateRepositoryInner(count = 1) {
@@ -166,5 +166,5 @@ async function renovateRepository(repoConfig, token) {
       logger.debug({ err });
     }
   }
-  config.tmpDir.removeCallback();
+  config.tmpDir.cleanup();
 }
diff --git a/package.json b/package.json
index 735c25ea7faf52bc3fc348f21316e843c6cb3378..4a20f134e46556591d9ab6b55768de82d89a22a5 100644
--- a/package.json
+++ b/package.json
@@ -73,7 +73,7 @@
     "semver-stable": "2.0.4",
     "semver-utils": "1.1.1",
     "showdown": "1.7.6",
-    "tmp": "0.0.33",
+    "tmp-promise": "1.0.3",
     "traverse": "0.6.6",
     "yarn": "1.2.1"
   },
diff --git a/test/workers/branch/lock-files.spec.js b/test/workers/branch/lock-files.spec.js
index 333077a47649d51b411d63898d860d76f7022008..cbec321bb0e411135d17ceca4b3144b5ef86c745 100644
--- a/test/workers/branch/lock-files.spec.js
+++ b/test/workers/branch/lock-files.spec.js
@@ -181,7 +181,7 @@ describe('workers/branch/lock-files', () => {
       config = {
         ...defaultConfig,
         logger,
-        tmpDir: { name: 'some-tmp-dir' },
+        tmpDir: { path: 'some-tmp-dir' },
       };
       fs.outputFile = jest.fn();
       fs.remove = jest.fn();
@@ -234,7 +234,7 @@ describe('workers/branch/lock-files', () => {
       config = {
         ...defaultConfig,
         logger,
-        tmpDir: { name: 'some-tmp-dir' },
+        tmpDir: { path: 'some-tmp-dir' },
       };
       fs.outputFile = jest.fn();
     });
@@ -281,7 +281,7 @@ describe('workers/branch/lock-files', () => {
           getFileContent: jest.fn(() => 'some lock file contents'),
         },
         logger,
-        tmpDir: { name: 'some-tmp-dir' },
+        tmpDir: { path: 'some-tmp-dir' },
       };
       npm.generateLockFile = jest.fn();
       npm.generateLockFile.mockReturnValue('some lock file contents');
diff --git a/test/workers/branch/npm.spec.js b/test/workers/branch/npm.spec.js
index 9a68104620090c8ed8afe7a1c55acdf309b37d60..b5319b7e37b21f145d889f54900dc709541ea8c4 100644
--- a/test/workers/branch/npm.spec.js
+++ b/test/workers/branch/npm.spec.js
@@ -18,9 +18,9 @@ describe('generateLockFile', () => {
       stdout: '',
       stderror: '',
     });
-    fs.readFileSync = jest.fn(() => 'package-lock-contents');
+    fs.readFile = jest.fn(() => 'package-lock-contents');
     const lockFile = await npmHelper.generateLockFile('some-dir', logger);
-    expect(fs.readFileSync.mock.calls.length).toEqual(1);
+    expect(fs.readFile.mock.calls.length).toEqual(1);
     expect(lockFile).toEqual('package-lock-contents');
   });
   it('catches errors', async () => {
@@ -29,11 +29,11 @@ describe('generateLockFile', () => {
       stdout: '',
       stderror: 'some-error',
     });
-    fs.readFileSync = jest.fn(() => {
+    fs.readFile = jest.fn(() => {
       throw new Error('not found');
     });
     const lockFile = await npmHelper.generateLockFile('some-dir', logger);
-    expect(fs.readFileSync.mock.calls.length).toEqual(1);
+    expect(fs.readFile.mock.calls.length).toEqual(1);
     expect(lockFile).toBe(null);
   });
   it('finds npm embedded in renovate', async () => {
@@ -48,9 +48,9 @@ describe('generateLockFile', () => {
       stdout: '',
       stderror: '',
     });
-    fs.readFileSync = jest.fn(() => 'package-lock-contents');
+    fs.readFile = jest.fn(() => 'package-lock-contents');
     const lockFile = await npmHelper.generateLockFile('some-dir', logger);
-    expect(fs.readFileSync.mock.calls.length).toEqual(1);
+    expect(fs.readFile.mock.calls.length).toEqual(1);
     expect(lockFile).toEqual('package-lock-contents');
   });
   it('finds npm globally', async () => {
@@ -66,9 +66,9 @@ describe('generateLockFile', () => {
       stdout: '',
       stderror: '',
     });
-    fs.readFileSync = jest.fn(() => 'package-lock-contents');
+    fs.readFile = jest.fn(() => 'package-lock-contents');
     const lockFile = await npmHelper.generateLockFile('some-dir', logger);
-    expect(fs.readFileSync.mock.calls.length).toEqual(1);
+    expect(fs.readFile.mock.calls.length).toEqual(1);
     expect(lockFile).toEqual('package-lock-contents');
   });
   it('uses fallback npm', async () => {
@@ -86,9 +86,9 @@ describe('generateLockFile', () => {
       stdout: '',
       stderror: '',
     });
-    fs.readFileSync = jest.fn(() => 'package-lock-contents');
+    fs.readFile = jest.fn(() => 'package-lock-contents');
     const lockFile = await npmHelper.generateLockFile('some-dir', logger);
-    expect(fs.readFileSync.mock.calls.length).toEqual(1);
+    expect(fs.readFile.mock.calls.length).toEqual(1);
     expect(lockFile).toEqual('package-lock-contents');
   });
 });
diff --git a/test/workers/branch/yarn.spec.js b/test/workers/branch/yarn.spec.js
index 5ee773ef1657a0912fe620e8ea8dacca9a42e990..8cfb1bcc64b8618a88694ede181328dcd90fff1a 100644
--- a/test/workers/branch/yarn.spec.js
+++ b/test/workers/branch/yarn.spec.js
@@ -18,9 +18,9 @@ describe('generateLockFile', () => {
       stdout: '',
       stderror: '',
     });
-    fs.readFileSync = jest.fn(() => 'package-lock-contents');
+    fs.readFile = jest.fn(() => 'package-lock-contents');
     const lockFile = await yarnHelper.generateLockFile('some-dir', logger);
-    expect(fs.readFileSync.mock.calls.length).toEqual(1);
+    expect(fs.readFile.mock.calls.length).toEqual(1);
     expect(lockFile).toEqual('package-lock-contents');
   });
   it('catches errors', async () => {
@@ -29,11 +29,11 @@ describe('generateLockFile', () => {
       stdout: '',
       stderror: 'some-error',
     });
-    fs.readFileSync = jest.fn(() => {
+    fs.readFile = jest.fn(() => {
       throw new Error('not found');
     });
     const lockFile = await yarnHelper.generateLockFile('some-dir', logger);
-    expect(fs.readFileSync.mock.calls.length).toEqual(1);
+    expect(fs.readFile.mock.calls.length).toEqual(1);
     expect(lockFile).toBe(null);
   });
   it('finds yarn embedded in renovate', async () => {
@@ -48,9 +48,9 @@ describe('generateLockFile', () => {
       stdout: '',
       stderror: '',
     });
-    fs.readFileSync = jest.fn(() => 'package-lock-contents');
+    fs.readFile = jest.fn(() => 'package-lock-contents');
     const lockFile = await yarnHelper.generateLockFile('some-dir', logger);
-    expect(fs.readFileSync.mock.calls.length).toEqual(1);
+    expect(fs.readFile.mock.calls.length).toEqual(1);
     expect(lockFile).toEqual('package-lock-contents');
   });
   it('finds yarn globally', async () => {
@@ -66,9 +66,9 @@ describe('generateLockFile', () => {
       stdout: '',
       stderror: '',
     });
-    fs.readFileSync = jest.fn(() => 'package-lock-contents');
+    fs.readFile = jest.fn(() => 'package-lock-contents');
     const lockFile = await yarnHelper.generateLockFile('some-dir', logger);
-    expect(fs.readFileSync.mock.calls.length).toEqual(1);
+    expect(fs.readFile.mock.calls.length).toEqual(1);
     expect(lockFile).toEqual('package-lock-contents');
   });
   it('uses fallback yarn', async () => {
@@ -86,9 +86,9 @@ describe('generateLockFile', () => {
       stdout: '',
       stderror: '',
     });
-    fs.readFileSync = jest.fn(() => 'package-lock-contents');
+    fs.readFile = jest.fn(() => 'package-lock-contents');
     const lockFile = await yarnHelper.generateLockFile('some-dir', logger);
-    expect(fs.readFileSync.mock.calls.length).toEqual(1);
+    expect(fs.readFile.mock.calls.length).toEqual(1);
     expect(lockFile).toEqual('package-lock-contents');
   });
 });
diff --git a/yarn.lock b/yarn.lock
index f26ac9227f54d95c0dc4dc29c60f1529a6c29224..09d2538daeeab9e1cff4dddeaf0f04b034ae48a1 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -558,7 +558,7 @@ block-stream@*:
   dependencies:
     inherits "~2.0.0"
 
-bluebird@^3.5.0, bluebird@~3.5.0:
+bluebird@^3.3.1, bluebird@^3.5.0, bluebird@~3.5.0:
   version "3.5.1"
   resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9"
 
@@ -3866,7 +3866,7 @@ os-locale@^2.0.0:
     lcid "^1.0.0"
     mem "^1.1.0"
 
-os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.2:
+os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.1, os-tmpdir@~1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
 
@@ -5092,7 +5092,20 @@ timed-out@^4.0.0:
   version "4.0.1"
   resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f"
 
-tmp@0.0.33, tmp@^0.0.33:
+tmp-promise@1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/tmp-promise/-/tmp-promise-1.0.3.tgz#3b450927ab78c6aedca5e628c677f536cae38bc5"
+  dependencies:
+    bluebird "^3.3.1"
+    tmp "0.0.31"
+
+tmp@0.0.31:
+  version "0.0.31"
+  resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.31.tgz#8f38ab9438e17315e5dbd8b3657e8bfb277ae4a7"
+  dependencies:
+    os-tmpdir "~1.0.1"
+
+tmp@^0.0.33:
   version "0.0.33"
   resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
   dependencies: