diff --git a/lib/config/templates/default/pr-title.hbs b/lib/config/templates/default/pr-title.hbs
index 002c01227effc1ce2b7ad8bac207e22f06612def..8565257e77425bbad06d166ac1001a6386fc7903 100644
--- a/lib/config/templates/default/pr-title.hbs
+++ b/lib/config/templates/default/pr-title.hbs
@@ -1 +1 @@
-{{semanticPrefix}}{{#if isPin}}Pin{{else}}{{#if isRollback}}Roll back{{else}}Update{{/if}}{{/if}} dependency {{depName}} to {{#if isRange}}{{newVersion}}{{else}}{{#if isMajor}}v{{newVersionMajor}}.x{{else}}v{{newVersion}}{{/if}}{{/if}}
+{{semanticPrefix}}{{#if isPin}}Pin{{else}}{{#if isRollback}}Roll back{{else}}Update{{/if}}{{/if}} dependency {{depName}} to {{#if isRange}}{{newVersion}}{{else}}{{#if isMajor}}v{{newVersionMajor}}{{else}}v{{newVersion}}{{/if}}{{/if}}
diff --git a/lib/workers/branch/index.js b/lib/workers/branch/index.js
index 04aba4e90b2607b31e94107bd46416e5030d6022..dcbb653383e357e961957ef1e9a79666e8eefbed 100644
--- a/lib/workers/branch/index.js
+++ b/lib/workers/branch/index.js
@@ -216,8 +216,13 @@ async function ensureBranch(config) {
 
 async function processBranchUpgrades(branchUpgrades, errors, warnings) {
   logger = branchUpgrades.logger || logger;
-  logger.trace({ config: branchUpgrades }, 'processBranchUpgrades');
   const config = { ...branchUpgrades };
+  logger = logger.child({
+    repository: config.repository,
+    branch: config.branchName,
+  });
+  config.logger = logger;
+  logger.trace({ config: branchUpgrades }, 'processBranchUpgrades');
   // Check schedule
   if (
     config.schedule &&
@@ -228,23 +233,25 @@ async function processBranchUpgrades(branchUpgrades, errors, warnings) {
     return;
   }
 
-  logger = logger.child({
-    repository: config.repository,
-    branch: config.branchName,
-  });
-  config.logger = logger;
-
   const packageNames = config.upgrades.map(upgrade => upgrade.depName);
   logger.info(`Branch has ${packageNames.length} upgrade(s): ${packageNames}`);
 
   try {
-    if (
-      // Groups and lock file maintenance should set this to true
-      config.recreateClosed === false &&
-      (await config.api.checkForClosedPr(config.branchName, config.prTitle))
-    ) {
-      logger.info(`Skipping branch as matching closed PR already existed`);
-      return;
+    // Groups and lock file maintenance should set this to true
+    if (config.recreateClosed === false) {
+      if (
+        // Check for current PR title format
+        await config.api.checkForClosedPr(config.branchName, config.prTitle)
+      ) {
+        return;
+      }
+      // Check for legacy PR title format
+      const legacyPrTitle = config.prTitle
+        .replace(/to v(\d+)$/, 'to version $1.x') // Major
+        .replace(/to v(\d+)/, 'to version $1'); // Non-major
+      if (await config.api.checkForClosedPr(config.branchName, legacyPrTitle)) {
+        return;
+      }
     }
     const branchCreated = await module.exports.ensureBranch(config);
     if (branchCreated) {
diff --git a/test/workers/branch/__snapshots__/index.spec.js.snap b/test/workers/branch/__snapshots__/index.spec.js.snap
index 4f8e01e72babb430f49b2a79308b42a83101f1d4..48df282e6c8d4d3d2d9039bb8569683f13eae4a7 100644
--- a/test/workers/branch/__snapshots__/index.spec.js.snap
+++ b/test/workers/branch/__snapshots__/index.spec.js.snap
@@ -43,3 +43,29 @@ Object {
   ],
 }
 `;
+
+exports[`workers/branch processBranchUpgrades(upgrades) returns if legacy closed major PR found 1`] = `
+Array [
+  Array [
+    "renovate/a-2.x",
+    "Upgrade a to v2",
+  ],
+  Array [
+    "renovate/a-2.x",
+    "Upgrade a to version 2.x",
+  ],
+]
+`;
+
+exports[`workers/branch processBranchUpgrades(upgrades) returns if legacy closed minor PR found 1`] = `
+Array [
+  Array [
+    "renovate/a-2.x",
+    "Upgrade a to v2.1.0",
+  ],
+  Array [
+    "renovate/a-2.x",
+    "Upgrade a to version 2.1.0",
+  ],
+]
+`;
diff --git a/test/workers/branch/index.spec.js b/test/workers/branch/index.spec.js
index 3e52d0d9fe2b4e098918a37ec80d7b3aee1bec9c..71b63d618e875bf2d9baec65656287b4b2cd143a 100644
--- a/test/workers/branch/index.spec.js
+++ b/test/workers/branch/index.spec.js
@@ -367,6 +367,24 @@ describe('workers/branch', () => {
       await branchWorker.processBranchUpgrades(config);
       expect(branchWorker.ensureBranch.mock.calls.length).toBe(0);
     });
+    it('returns if legacy closed major PR found', async () => {
+      config.branchName = 'renovate/a-2.x';
+      config.prTitle = 'Upgrade a to v2';
+      config.api.checkForClosedPr.mockReturnValueOnce(false);
+      config.api.checkForClosedPr.mockReturnValueOnce(true);
+      await branchWorker.processBranchUpgrades(config);
+      expect(branchWorker.ensureBranch.mock.calls.length).toBe(0);
+      expect(config.api.checkForClosedPr.mock.calls).toMatchSnapshot();
+    });
+    it('returns if legacy closed minor PR found', async () => {
+      config.branchName = 'renovate/a-2.x';
+      config.prTitle = 'Upgrade a to v2.1.0';
+      config.api.checkForClosedPr.mockReturnValueOnce(false);
+      config.api.checkForClosedPr.mockReturnValueOnce(true);
+      await branchWorker.processBranchUpgrades(config);
+      expect(branchWorker.ensureBranch.mock.calls.length).toBe(0);
+      expect(config.api.checkForClosedPr.mock.calls).toMatchSnapshot();
+    });
     it('does not return immediately if recreateClosed true', async () => {
       config.api.checkForClosedPr.mockReturnValue(true);
       config.recreateClosed = true;
diff --git a/test/workers/package/__snapshots__/index.spec.js.snap b/test/workers/package/__snapshots__/index.spec.js.snap
index 981e41f6c29d2359f3abe5898d2709da76e3ac3b..bf15efd7038d8c1cb2591d075b45f611e2b813ad 100644
--- a/test/workers/package/__snapshots__/index.spec.js.snap
+++ b/test/workers/package/__snapshots__/index.spec.js.snap
@@ -195,7 +195,7 @@ Please make sure the following warnings are safe to ignore:
 
 This {{#if isGitHub}}PR{{else}}MR{{/if}} has been generated by [Renovate Bot](https://renovateapp.com).",
     "prCreation": "immediate",
-    "prTitle": "{{semanticPrefix}}{{#if isPin}}Pin{{else}}{{#if isRollback}}Roll back{{else}}Update{{/if}}{{/if}} dependency {{depName}} to {{#if isRange}}{{newVersion}}{{else}}{{#if isMajor}}v{{newVersionMajor}}.x{{else}}v{{newVersion}}{{/if}}{{/if}}",
+    "prTitle": "{{semanticPrefix}}{{#if isPin}}Pin{{else}}{{#if isRollback}}Roll back{{else}}Update{{/if}}{{/if}} dependency {{depName}} to {{#if isRange}}{{newVersion}}{{else}}{{#if isMajor}}v{{newVersionMajor}}{{else}}v{{newVersion}}{{/if}}{{/if}}",
     "rebaseStalePrs": false,
     "recreateClosed": false,
     "repoIsOnboarded": true,