diff --git a/lib/manager/common.ts b/lib/manager/common.ts
index 1cb67931e68cba04e7c0f5fe0687674f3842ff8c..57f36f7453c781cb0c4e49ef918f1a3eb5650fba 100644
--- a/lib/manager/common.ts
+++ b/lib/manager/common.ts
@@ -158,6 +158,7 @@ export interface PackageDependency<T = Record<string, any>> extends Package<T> {
   digestOneAndOnly?: boolean;
   displayFrom?: string;
   displayTo?: string;
+  fixedVersion?: string;
   fromVersion?: string;
   lockedVersion?: string;
   propSource?: string;
diff --git a/lib/util/cache/repository/index.ts b/lib/util/cache/repository/index.ts
index 0612ab0dc690dc776d6dc983618a9df56a62fd81..9258fbc2ded9e3bbdc2aef0e562ba23b78b2d9ca 100644
--- a/lib/util/cache/repository/index.ts
+++ b/lib/util/cache/repository/index.ts
@@ -11,7 +11,30 @@ export interface BaseBranchCache {
   packageFiles: PackageFile[]; // extract result
 }
 
+export interface BranchUpgradeCache {
+  currentDigest?: string;
+  currentValue?: string;
+  datasource?: string;
+  depName?: string;
+  fixedVersion?: string;
+  fromVersion?: string;
+  lookupName?: string;
+  newDigest?: string;
+  newValue?: string;
+  toVersion?: string;
+}
+
+export interface BranchCache {
+  automerge: boolean;
+  branchName: string;
+  isModified: boolean;
+  prNo: number | null;
+  sha: string | null;
+  upgrades: BranchUpgradeCache[];
+}
+
 export interface Cache {
+  branches?: BranchCache[];
   repository?: string;
   init?: RepoInitConfig;
   scan?: Record<string, BaseBranchCache>;
diff --git a/lib/workers/repository/cache.ts b/lib/workers/repository/cache.ts
new file mode 100644
index 0000000000000000000000000000000000000000..932571f61ee74d7d4436d0a6d324a62f79f69c75
--- /dev/null
+++ b/lib/workers/repository/cache.ts
@@ -0,0 +1,67 @@
+/* istanbul ignore file */
+
+import { logger } from '../../logger';
+import { platform } from '../../platform';
+import {
+  BranchCache,
+  BranchUpgradeCache,
+  getCache,
+} from '../../util/cache/repository';
+import { getBranchCommit, isBranchModified } from '../../util/git';
+import { BranchConfig, BranchUpgradeConfig } from '../common';
+
+function generateBranchUpgradeCache(
+  upgrade: BranchUpgradeConfig
+): BranchUpgradeCache {
+  const {
+    datasource,
+    depName,
+    lookupName,
+    fixedVersion,
+    fromVersion,
+    toVersion,
+    currentDigest,
+    newDigest,
+  } = upgrade;
+  return {
+    datasource,
+    depName,
+    lookupName,
+    fixedVersion,
+    fromVersion,
+    toVersion,
+    currentDigest,
+    newDigest,
+  };
+}
+
+async function generateBranchCache(branch: BranchConfig): Promise<BranchCache> {
+  const { branchName } = branch;
+  try {
+    const sha = getBranchCommit(branchName) || null;
+    let prNo = null;
+    if (sha) {
+      const branchPr = await platform.getBranchPr(branchName);
+      if (branchPr) {
+        prNo = branchPr.number;
+      }
+    }
+    const automerge = !!branch.automerge;
+    const isModified = await isBranchModified(branchName);
+    const upgrades: BranchUpgradeCache[] = branch.upgrades
+      ? branch.upgrades.map(generateBranchUpgradeCache)
+      : [];
+    return { branchName, sha, prNo, automerge, isModified, upgrades };
+  } catch (err) {
+    logger.error({ err, branchName }, 'Error generating branch cache');
+    return null;
+  }
+}
+
+export async function setBranchCache(branches: BranchConfig[]): Promise<void> {
+  const branchCache: BranchCache[] = [];
+  for (const branch of branches) {
+    branchCache.push(await generateBranchCache(branch));
+  }
+  getCache().branches = branchCache.filter(Boolean);
+}
diff --git a/lib/workers/repository/index.ts b/lib/workers/repository/index.ts
index 07c297529aee37764e05a14598f18675cc833e5e..97a97dabc19aa418579250c672d14b9b1742f0ae 100644
--- a/lib/workers/repository/index.ts
+++ b/lib/workers/repository/index.ts
@@ -3,6 +3,7 @@ import { RenovateConfig } from '../../config';
 import { logger, setMeta } from '../../logger';
 import { deleteLocalFile } from '../../util/fs';
 import { addSplit, getSplits, splitInit } from '../../util/split';
+import { setBranchCache } from './cache';
 import { ensureMasterIssue } from './dependency-dashboard';
 import handleError from './error';
 import { finaliseRepo } from './finalise';
@@ -41,6 +42,7 @@ export async function renovateRepository(
     await ensureOnboardingPr(config, packageFiles, branches);
     const res = await updateRepo(config, branches);
     addSplit('update');
+    await setBranchCache(branches);
     if (res !== 'automerged') {
       await ensureMasterIssue(config, branches);
     }