diff --git a/docs/configuration.md b/docs/configuration.md
index c069bdf5778ff92ba9c001db64ac1fdd55351e0d..b96fb23ab9b62836b3a31080537869193fafa729 100644
--- a/docs/configuration.md
+++ b/docs/configuration.md
@@ -51,24 +51,25 @@ module.exports = {
 ```
 $ renovate --help
 
-  Usage: renovate [options] [repositories...]
+Usage: renovate [options] [repositories...]
 
-  Options:
+Options:
 
-    -h, --help                  output usage information
-    -d, --dep-types <list>      List of dependency types
-    -i, --ignore-deps <list>    List of dependencies to ignore
-    -b, --labels <list>         List of labels to apply
-    -l, --log-level <level>     Log Level
-    -p, --package-files <list>  List of package.json file names
-    -r, --recreate-prs          Recreate PRs if previously closed
-    -t, --token <token>         GitHub Auth Token
+  -h, --help                               output usage information
+  -d, --dep-types <list>                   List of dependency types
+  -i, --ignore-deps <list>                 List of dependencies to ignore
+  -b, --labels <list>                      List of labels to apply
+  -l, --log-level <level>                  Log Level
+  -p, --package-files <list>               List of package.json file names
+  -r, --recreate-closed <true/false>       Recreate PR even if same was previously closed
+  -r, --recreate-unmergeable <true/false>  Recreate PR if existing branch is unmergeable
+  -t, --token <token>                      GitHub Auth Token
 
-  Examples:
+Examples:
 
-    $ renovate --token abc123 singapore/lint-condo
-    $ renovate --token abc123 -l verbose singapore/lint-condo
-    $ renovate --token abc123 singapore/lint-condo singapore/package-test
+  $ renovate --token abc123 singapore/lint-condo
+  $ renovate --token abc123 -l verbose singapore/lint-condo
+  $ renovate --token abc123 singapore/lint-condo singapore/package-test
 ```
 
 ### package.json
@@ -95,6 +96,7 @@ Obviously, you can't set repository or package file location with this method.
 | Dependency Types | Sections of package.json to renovate | `dependencies`, `devDependencies`, `optionalDependencies` | `depTypes` | `RENOVATE_DEP_TYPES` | `--dep-types` |
 | Ignore Dependencies | Dependencies to be ignored |  | `ignoreDeps` | `RENOVATE_IGNORE_DEPS` | `--ignore-deps` |
 | Labels | Labels to add to Pull Requests |  | `labels` | `RENOVATE_LABELS` | `--labels` |
-| Recreate PRs | Create New PRs even if same ones were previously closed | `false` | `recreatePrs` | `RENOVATE_RECREATE_PRS` | `--recreate-prs` |
+| Recreate Closed | Create New PR even if same one was previously closed | `false` | `recreateClosed` | `RENOVATE_RECREATE_CLOSED` | `--recreate-closed` |
+| Recreate Unmergeable | Close and recreate PR if existing one is unmergeable | `true` | `recreateUnmergeable` | `RENOVATE_RECREATE_UNMERGEABLE` | `--recreate-unmergeable` |
 | Log Level | Log Level | `info` | `logLevel` | `LOG_LEVEL` | `--log-level` |
 | Templates | String templates for commit, branch and PR | Multiple | `templates` |  |  |
diff --git a/docs/design-decisions.md b/docs/design-decisions.md
index 79ce00a199f93908444ff68ffb656b2e81ebce0f..8edd4d4eaab41b6249d7ae9219a841e4d3f03294 100644
--- a/docs/design-decisions.md
+++ b/docs/design-decisions.md
@@ -25,7 +25,8 @@ The following options apply per-package file:
 - Dependency Types
 - Ignored Dependencies
 - Labels
-- Recreate PRs
+- Recreate Closed
+- Recreate Unmergeable
 
 The following options apply per-repository:
 
@@ -75,6 +76,8 @@ Note: Branch names are configurable using the `templates` field.
 By default, the script does not create a new PR if it finds an identical one already closed. This allows users to close unwelcome upgrade PRs and worry about them being recreated every run. Typically this is most useful for major upgrades.
 This option is configurable.
 
+The script does however close and create a replacement PR if the previous one was in an unmergeable state. It skips this though if additional edits have been made to the branch by someone else. This option is also configurable.
+
 ## Range handling
 
 `renovate` always pins dependencies, instead of updating ranges. Even if the project is using tilde ranges, why not pin them for consistency if you're also using `renovate` every day?
diff --git a/lib/api/github.js b/lib/api/github.js
index aabe33b4ac93f110cf4551d63cfe559836b0f331..1cd1392b160383c364860af566ce5abc35f3743c 100644
--- a/lib/api/github.js
+++ b/lib/api/github.js
@@ -7,6 +7,8 @@ module.exports = {
   initRepo,
   // Branch
   createBranch,
+  deleteBranch,
+  getBranchPr,
   // issue
   addLabels,
   // PR
@@ -66,6 +68,21 @@ function createBranch(branchName) {
   });
 }
 
+function deleteBranch(branchName) {
+  return ghGot.delete(`repos/${config.repoName}/git/refs/heads/${branchName}`);
+}
+
+function getBranchPr(branchName) {
+  const gotString = `repos/${config.repoName}/pulls?` +
+    `state=open&base=${config.defaultBranch}&head=${config.owner}:${branchName}`;
+  return ghGot(gotString).then((res) => {
+    if (res.body.length) {
+      return res.body[0];
+    }
+    return null;
+  });
+}
+
 // Issue
 
 function addLabels(issueNo, labels) {
@@ -98,15 +115,9 @@ function createPr(branchName, title, body) {
     .then(res => res.body);
 }
 
-function getPr(branchName) {
-  const gotString = `repos/${config.repoName}/pulls?` +
-    `state=open&base=${config.defaultBranch}&head=${config.owner}:${branchName}`;
-  return ghGot(gotString).then((res) => {
-    if (res.body.length) {
-      return res.body[0];
-    }
-    return null;
-  });
+function getPr(prNo) {
+  return ghGot(`repos/${config.repoName}/pulls/${prNo}`)
+  .then(res => res.body);
 }
 
 function updatePr(prNo, title, body) {
diff --git a/lib/config/cli.js b/lib/config/cli.js
index 3f41b2e9879a6b415c4d0db14770ef4a30c94791..d9837f9ab5192d58dca5bd82185eaf572feaf58e 100644
--- a/lib/config/cli.js
+++ b/lib/config/cli.js
@@ -10,7 +10,8 @@ program
   .option('-b, --labels <list>', 'List of labels to apply', list)
   .option('-l, --log-level <level>', 'Log Level')
   .option('-p, --package-files <list>', 'List of package.json file names', list)
-  .option('-r, --recreate-prs', 'Recreate PRs if previously closed')
+  .option('-r, --recreate-closed <true/false>', 'Recreate PR even if same was previously closed')
+  .option('-r, --recreate-unmergeable <true/false>', 'Recreate PR if existing branch is unmergeable')
   .option('-t, --token <token>', 'GitHub Auth Token')
   .on('--help', () => {
     /* eslint-disable no-console */
@@ -52,8 +53,11 @@ if (program.packageFiles) {
     process.exit(1);
   }
 }
-if (program.recreatePrs) {
-  config.recreatePrs = true;
+if (program.recreateClosed) {
+  config.recreateClosed = program.recreateClosed;
+}
+if (program.recreateUnmergeable) {
+  config.recreateUnmergeable = program.recreateUnmergeable;
 }
 if (program.token) {
   config.token = program.token;
diff --git a/lib/config/default.js b/lib/config/default.js
index e74a7e7a4b3a93c08c8b2e44a02cf6370e70b1ad..334d632500284a08c7bc92a49634b7b1a31b6eb8 100644
--- a/lib/config/default.js
+++ b/lib/config/default.js
@@ -17,7 +17,8 @@ ${params.changelog}`,
     prTitleMinor: params => `Update dependency ${params.depName} to version ${params.newVersion}`,
     prTitlePin: params => `Pin dependency ${params.depName} to version ${params.newVersion}`,
   },
-  recreatePrs: false,
+  recreateClosed: false,
+  recreateUnmergeable: true,
 };
 
 logger.debug(`Default config = ${JSON.stringify(config)}`);
diff --git a/lib/config/env.js b/lib/config/env.js
index 3fd24a6bd02006579c8edbabde719439adce03a4..99fcaea07dd6884c8c9fd3bd8047143aa73773f6 100644
--- a/lib/config/env.js
+++ b/lib/config/env.js
@@ -29,13 +29,23 @@ if (process.env.RENOVATE_IGNORE_DEPS) {
 if (process.env.RENOVATE_LABELS) {
   config.labels = list(process.env.RENOVATE_LABELS);
 }
-if (process.env.RENOVATE_RECREATE_PRS) {
-  if (process.env.RENOVATE_RECREATE_PRS === 'true') {
-    config.recreatePrs = true;
-  } else if (process.env.RENOVATE_RECREATE_PRS === 'false') {
-    config.recreatePrs = false;
+if (process.env.RENOVATE_RECREATE_CLOSED) {
+  if (process.env.RENOVATE_RECREATE_CLOSED === 'true') {
+    config.recreateClosed = true;
+  } else if (process.env.RENOVATE_RECREATE_CLOSED === 'false') {
+    config.recreateClosed = false;
   } else {
-    logger.error('RENOVATE_RECREATE_PRS must be true or false');
+    logger.error('RENOVATE_RECREATE_CLOSED must be true or false');
+    process.exit(1);
+  }
+}
+if (process.env.RENOVATE_RECREATE_UNMERGEABLE) {
+  if (process.env.RENOVATE_RECREATE_UNMERGEABLE === 'true') {
+    config.recreateUnmergeable = true;
+  } else if (process.env.RENOVATE_RECREATE_UNMERGEABLE === 'false') {
+    config.recreateUnmergeable = false;
+  } else {
+    logger.error('RENOVATE_RECREATE_UNMERGEABLE must be true or false');
     process.exit(1);
   }
 }
diff --git a/lib/worker.js b/lib/worker.js
index 7619b256939fe89f6754a22d07408dc89c51bf4d..3f7c7937171c8d7af7c5146986b524ed1a0e9d06 100644
--- a/lib/worker.js
+++ b/lib/worker.js
@@ -85,27 +85,7 @@ function processUpgradesSequentially(upgrades) {
   // 2. Edge case collision of branch name, e.g. dependency also listed as dev dependency
   return upgrades.reduce(
     (promise, upgrade) => promise
-      .then(() => getChangelog(upgrade))
-      .then(updateDependency), Promise.resolve());
-}
-
-function getChangelog(upgrade) {
-  if (!upgrade.workingVersion || upgrade.workingVersion === upgrade.newVersion) {
-    return Object.assign(upgrade, { changelog: '' });
-  }
-  const semverString = `>${upgrade.workingVersion} <=${upgrade.newVersion}`;
-  let log = '';
-  logger.debug(`semverString: ${semverString}`);
-  return changelog.generate(upgrade.depName, semverString)
-    .then(changelog.markdown)
-    .then((res) => {
-      log = res;
-      return logger.silly(`${upgrade.depName} ${upgrade.newVersion} changelog: ${res}`);
-    })
-    .catch((error) => {
-      logger.verbose(`getChangelog error: ${error}`);
-    })
-    .then(() => Object.assign(upgrade, { changelog: log }));
+      .then(() => updateDependency(upgrade)), Promise.resolve());
 }
 
 function updateDependency(upgrade) {
@@ -130,26 +110,77 @@ function updateDependency(upgrade) {
   }
   const commitMessage = commitFunction(upgrade);
   const prTitle = prFunction(upgrade);
-  const prBody = config.templates.prBody(upgrade);
+
+  return checkForUnmergeablePr()
+  .then(ensureBranch)
+  .then(ensureCommit)
+  .then(getChangelog)
+  .then(log => ensurePr(log))
+  .catch((error) => {
+    if (error === 'PR exists') {
+      logger.verbose(`Skipping ${depName} upgrade as matching closed PR already existed`);
+    } else {
+      logger.error(`Error updating dependency ${depName}: ${error}`);
+    }
+    // Don't throw here - we don't want to stop the other renovations
+  });
 
   // Check if same PR already existed and skip if so
   // This allows users to close an unwanted upgrade PR and not worry about seeing it raised again
-  return github.checkForClosedPr(branchName, prTitle).then((prExisted) => {
-    if (prExisted && config.recreatePrs === false) {
-      logger.verbose(`${depName}: Skipping due to existing PR found.`);
+  function checkForClosedPr() {
+    if (config.recreateClosed) {
+      logger.debug(`${depName}: Skipping closed PR check`);
       return Promise.resolve();
     }
-    return ensureAll();
-  });
-  function ensureAll() {
-    return ensureBranch()
-    .then(ensureCommit)
-    .then(ensurePr)
-    .catch((error) => {
-      logger.error(`Error updating dependency ${depName}:  ${error}`);
-      // Don't throw here - we don't want to stop the other renovations
+    logger.debug(`${depName}: Checking for closed PR`);
+    return github.checkForClosedPr(branchName, prTitle).then((prExisted) => {
+      logger.debug(`Closed PR existed: ${prExisted}`);
+      if (prExisted) {
+        return Promise.reject('PR exists');
+      }
+      return Promise.resolve();
+    });
+  }
+
+  function getBranchPr() {
+    return github.getBranchPr(branchName)
+    .then((branchPr) => {
+      if (branchPr) {
+        logger.debug(`Found open PR for ${branchName}`);
+        return github.getPr(branchPr.number);
+      }
+      logger.debug(`Didn't find open PR for ${branchName}`);
+      return null;
+    });
+  }
+
+  function deleteUnmergeablePr(pr) {
+    return github.updatePr(pr.number, `${pr.title} (unmergeable)`)
+      .then(() => github.deleteBranch(branchName));
+  }
+
+  function checkForUnmergeablePr() {
+    return getBranchPr()
+    .then((pr) => {
+      if (pr) {
+        logger.debug(`checkForUnmergeablePr found PR #${pr.number}`);
+        if (pr.mergeable === false) {
+          logger.debug(`Existing PR ${pr.number} is not mergeable`);
+          if (pr.additions * pr.deletions === 1) {
+            // No other changes except ours
+            logger.verbose(`Deleting branch ${branchName}`);
+            // Rename PR and then delete the branch
+            return deleteUnmergeablePr(pr);
+          }
+          logger.verbose(`Not deleting branch ${branchName} because it has additional changes`);
+        }
+        return Promise.resolve();
+      }
+      // If no open PR exists then check for any closed one
+      return checkForClosedPr();
     });
   }
+
   function ensureBranch() {
     // Save an API call by attempting to create branch without checking for existence first
     return github.createBranch(branchName).catch((error) => {
@@ -193,8 +224,37 @@ function updateDependency(upgrade) {
     });
   }
 
+  function getChangelog() {
+    if (!upgrade.workingVersion || upgrade.workingVersion === upgrade.newVersion) {
+      return Object.assign(upgrade, { changelog: '' });
+    }
+    const semverString = `>${upgrade.workingVersion} <=${upgrade.newVersion}`;
+    let log = '';
+    logger.debug(`semverString: ${semverString}`);
+    return changelog.generate(upgrade.depName, semverString)
+      .then(changelog.markdown)
+      .then((res) => {
+        log = res;
+        return logger.silly(`${upgrade.depName} ${upgrade.newVersion} changelog: ${res}`);
+      })
+      .catch((error) => {
+        logger.verbose(`getChangelog error: ${error}`);
+      })
+      .then(() => Object.assign(upgrade, { changelog: log }));
+  }
+
   // Ensures that PR exists with matching title/body
-  function ensurePr() {
+  function ensurePr(upgradeWithChangeLog) {
+    logger.debug('Ensuring PR');
+
+    const prBody = config.templates.prBody(upgradeWithChangeLog);
+
+    return github.getBranchPr(branchName)
+    .then(processExistingPr)
+    .catch((error) => {
+      logger.error(`${depName} failed to ensure PR: ${error}`);
+    });
+
     // Create PR based on current state
     function createPr() {
       return github.createPr(branchName, prTitle, prBody).then((newPr) => {
@@ -204,6 +264,7 @@ function updateDependency(upgrade) {
     }
     // Update PR based on current state
     function updatePr(existingPr) {
+      logger.debug(`updatePr: ${existingPr.number}`);
       return github.updatePr(existingPr.number, prTitle, prBody).then(() => {
         logger.info(`${depName}: Updated PR #${existingPr.number}`);
         return Promise.resolve();
@@ -212,10 +273,12 @@ function updateDependency(upgrade) {
     // Process a returned PR
     function processExistingPr(existingPr) {
       if (!existingPr) {
+        logger.debug(`Didn't find existing PR for branch ${branchName}`);
         // We need to create a new PR
         return createPr().then(prNo => addLabels(prNo));
       }
       // Check if existing PR needs updating
+      logger.debug(`processExistingPr: ${existingPr.number}`);
       if (existingPr.title === prTitle && existingPr.body === prBody) {
         logger.verbose(`${depName}: PR #${existingPr.number} already up-to-date`);
         return Promise.resolve();
@@ -232,11 +295,5 @@ function updateDependency(upgrade) {
       }
       return github.addLabels(prNo, config.labels);
     }
-
-    return github.getPr(branchName)
-    .then(processExistingPr)
-    .catch((error) => {
-      logger.error(`${depName} failed to ensure PR: ${error}`);
-    });
   }
 }
diff --git a/readme.md b/readme.md
index a9867ad9387bffaf39e2fdb5c5d906aa82eb8e54..fd8f98bbd5e31b9c3ad847e5095ba6266c2040d1 100644
--- a/readme.md
+++ b/readme.md
@@ -31,24 +31,25 @@ This token needs to be configured via file, environment variable, or CLI. See [d
 ```
 $ renovate --help
 
-  Usage: renovate [options] [repositories...]
+Usage: renovate [options] [repositories...]
 
-  Options:
+Options:
 
-    -h, --help                  output usage information
-    -d, --dep-types <list>      List of dependency types
-    -i, --ignore-deps <list>    List of dependencies to ignore
-    -b, --labels <list>         List of labels to apply
-    -l, --log-level <level>     Log Level
-    -p, --package-files <list>  List of package.json file names
-    -r, --recreate-prs          Recreate PRs if previously closed
-    -t, --token <token>         GitHub Auth Token
+  -h, --help                               output usage information
+  -d, --dep-types <list>                   List of dependency types
+  -i, --ignore-deps <list>                 List of dependencies to ignore
+  -b, --labels <list>                      List of labels to apply
+  -l, --log-level <level>                  Log Level
+  -p, --package-files <list>               List of package.json file names
+  -r, --recreate-closed <true/false>       Recreate PR even if same was previously closed
+  -r, --recreate-unmergeable <true/false>  Recreate PR if existing branch is unmergeable
+  -t, --token <token>                      GitHub Auth Token
 
-  Examples:
+Examples:
 
-    $ renovate --token abc123 singapore/lint-condo
-    $ renovate --token abc123 -l verbose singapore/lint-condo
-    $ renovate --token abc123 singapore/lint-condo singapore/package-test
+  $ renovate --token abc123 singapore/lint-condo
+  $ renovate --token abc123 -l verbose singapore/lint-condo
+  $ renovate --token abc123 singapore/lint-condo singapore/package-test
 ```
 
 ## Deployment