diff --git a/lib/workers/branch/index.js b/lib/workers/branch/index.js
index 16ff277b07f3efd4560cb5e21933bec8b0dc5485..2a6d29bc36aac3385ac7846a8de15521ee1eb34e 100644
--- a/lib/workers/branch/index.js
+++ b/lib/workers/branch/index.js
@@ -141,6 +141,12 @@ async function processBranch(branchConfig) {
     }
 
     const committedFiles = await commitFilesToBranch(config);
+    if (config.type === 'lockFileMaintenance' && !config.committedFiles) {
+      logger.debug(
+        'Deleting lock file maintenance branch as master lock file no longer needs updating'
+      );
+      return 'delete';
+    }
     if (!(committedFiles || branchExists)) {
       return 'no-work';
     }
diff --git a/lib/workers/repository/cleanup.js b/lib/workers/repository/cleanup.js
index 58ee07637a545279fa264757fb2226ce186e8f78..e3adeeb3b10becbef084895509eae42866479efe 100644
--- a/lib/workers/repository/cleanup.js
+++ b/lib/workers/repository/cleanup.js
@@ -4,15 +4,22 @@ module.exports = {
 
 async function pruneStaleBranches(config) {
   // TODO: try/catch
-  const { branchList } = config;
+  let { branchList } = config;
+  const deletedBranches = config.deletedBranches || [];
   logger.debug('Removing any stale branches');
   logger.trace({ config }, `pruneStaleBranches`);
   logger.debug(`config.repoIsOnboarded=${config.repoIsOnboarded}`);
-  if (!config.branchList) {
+  if (!branchList) {
     logger.debug('No branchList');
     return;
   }
-  logger.debug({ branchList }, 'branchList');
+  logger.debug(
+    { branchList, deletedBranches },
+    'branchList and deletedBranches'
+  );
+  branchList = branchList.filter(
+    branchName => !deletedBranches.includes(branchName)
+  );
   let renovateBranches = await platform.getAllRenovateBranches(
     config.branchPrefix
   );
@@ -22,7 +29,10 @@ async function pruneStaleBranches(config) {
   }
   logger.debug({ branchList, renovateBranches });
   const lockFileBranch = `${config.branchPrefix}lock-file-maintenance`;
-  if (renovateBranches.includes(lockFileBranch)) {
+  if (
+    renovateBranches.includes(lockFileBranch) &&
+    !deletedBranches.includes(lockFileBranch)
+  ) {
     logger.debug('Checking lock file branch');
     const pr = await platform.getBranchPr(lockFileBranch);
     if (pr && pr.isUnmergeable) {
diff --git a/lib/workers/repository/write.js b/lib/workers/repository/write.js
index 109c7272a8e8e7928cb38aeef88a41f785e7882d..0fef225a260c0f2f0b8c6b487e1c9ff772631c5a 100644
--- a/lib/workers/repository/write.js
+++ b/lib/workers/repository/write.js
@@ -49,6 +49,8 @@ async function writeUpdates(config) {
       prsRemaining < concurrentRemaining ? prsRemaining : concurrentRemaining;
   }
   try {
+    // eslint-disable-next-line no-param-reassign
+    config.deletedBranches = [];
     for (const branch of branches) {
       const res = await branchWorker.processBranch({
         ...branch,
@@ -59,6 +61,13 @@ async function writeUpdates(config) {
         // Stop procesing other branches because base branch has been changed
         return res;
       }
+      if (res === 'delete') {
+        logger.debug(
+          { branch: branch.branchName },
+          'Adding branch to deletedBranches list'
+        );
+        config.deletedBranches.push(branch.branchName);
+      }
       prsRemaining -= res === 'pr-created' ? 1 : 0;
     }
     return 'done';
diff --git a/test/workers/branch/index.spec.js b/test/workers/branch/index.spec.js
index 5a504983455762d77bd42d6e4f36f6f1f076a327..6d684b2ab73ba69d039af72d37bd3240e4ae23a9 100644
--- a/test/workers/branch/index.spec.js
+++ b/test/workers/branch/index.spec.js
@@ -142,6 +142,18 @@ describe('workers/branch', () => {
       platform.branchExists.mockReturnValueOnce(false);
       expect(await branchWorker.processBranch(config)).toEqual('no-work');
     });
+    it('returns delete if existing lock file maintenace is pointless', async () => {
+      manager.getUpdatedPackageFiles.mockReturnValueOnce({
+        updatedPackageFiles: [],
+      });
+      lockFiles.getUpdatedLockFiles.mockReturnValueOnce({
+        lockFileError: false,
+        updatedLockFiles: [],
+      });
+      config.type = 'lockFileMaintenance';
+      platform.branchExists.mockReturnValueOnce(false);
+      expect(await branchWorker.processBranch(config)).toEqual('delete');
+    });
     it('returns if branch automerged', async () => {
       manager.getUpdatedPackageFiles.mockReturnValueOnce({
         updatedPackageFiles: [{}],
diff --git a/test/workers/repository/cleanup.spec.js b/test/workers/repository/cleanup.spec.js
index 4f2e1327977cbb84226f80dc3e5ae776f3c222a3..1d77b4ee849575efdeb2559490d304c64feacb02 100644
--- a/test/workers/repository/cleanup.spec.js
+++ b/test/workers/repository/cleanup.spec.js
@@ -51,6 +51,18 @@ describe('workers/repository/cleanup', () => {
       expect(platform.getAllRenovateBranches.mock.calls).toHaveLength(1);
       expect(platform.deleteBranch.mock.calls).toHaveLength(1);
     });
+    it('deletes lock file maintenance if should be deleted', async () => {
+      config.branchList = ['renovate/lock-file-maintenance'];
+      config.deletedBranches = ['renovate/lock-file-maintenance'];
+      platform.getAllRenovateBranches.mockReturnValueOnce([
+        'renovate/lock-file-maintenance',
+      ]);
+      await cleanup.pruneStaleBranches(config, [
+        'renovate/lock-file-maintenance',
+      ]);
+      expect(platform.getAllRenovateBranches.mock.calls).toHaveLength(1);
+      expect(platform.deleteBranch.mock.calls).toHaveLength(1);
+    });
     it('calls delete only once', async () => {
       config.branchList = ['renovate/lock-file-maintenance'];
       platform.getAllRenovateBranches.mockReturnValueOnce([
diff --git a/test/workers/repository/write.spec.js b/test/workers/repository/write.spec.js
index f695164caad26a40cdcb5c5e9e8dc0cbd583487a..00f8b604c02e5b466630505a45a874bcad9c8cf7 100644
--- a/test/workers/repository/write.spec.js
+++ b/test/workers/repository/write.spec.js
@@ -45,12 +45,13 @@ describe('workers/repository/write', () => {
       expect(branchWorker.processBranch.mock.calls).toHaveLength(1);
     });
     it('stops after automerge', async () => {
-      config.branches = [{}, {}, {}];
+      config.branches = [{}, {}, {}, {}];
       branchWorker.processBranch.mockReturnValueOnce('created');
+      branchWorker.processBranch.mockReturnValueOnce('delete');
       branchWorker.processBranch.mockReturnValueOnce('automerged');
       const res = await writeUpdates(config);
       expect(res).toEqual('automerged');
-      expect(branchWorker.processBranch.mock.calls).toHaveLength(2);
+      expect(branchWorker.processBranch.mock.calls).toHaveLength(3);
     });
   });
 });