diff --git a/owners-autoassign/src/main/java/com/vmware/gerrit/owners/common/GitRefListener.java b/owners-autoassign/src/main/java/com/vmware/gerrit/owners/common/GitRefListener.java
index baecfbd..907469d 100644
--- a/owners-autoassign/src/main/java/com/vmware/gerrit/owners/common/GitRefListener.java
+++ b/owners-autoassign/src/main/java/com/vmware/gerrit/owners/common/GitRefListener.java
@@ -99,8 +99,8 @@
         Change change = reviewDb.changes().get(id);
         PatchList patchList = getPatchList(event, change);
         if (patchList != null) {
-          PathOwners owners = new PathOwners(accounts,
-              repository, patchList);
+          PathOwners owners =
+              new PathOwners(accounts, repository, change.getDest().get(), patchList);
           Set<Account.Id> allReviewers = Sets.newHashSet();
           allReviewers.addAll(owners.get().values());
           for(Matcher matcher: owners.getMatchers().values()) {
diff --git a/owners-common/src/main/java/com/vmware/gerrit/owners/common/PathOwners.java b/owners-common/src/main/java/com/vmware/gerrit/owners/common/PathOwners.java
index ca79883..17d6fdd 100644
--- a/owners-common/src/main/java/com/vmware/gerrit/owners/common/PathOwners.java
+++ b/owners-common/src/main/java/com/vmware/gerrit/owners/common/PathOwners.java
@@ -62,15 +62,13 @@
 
   private Map<String, Set<Id>> fileOwners;
 
-  public PathOwners(Accounts accounts,
-      Repository repository,
-      PatchList patchList) {
+  public PathOwners(Accounts accounts, Repository repository, String branch, PatchList patchList) {
     this.repository = repository;
     this.patchList = patchList;
     this.parser = new ConfigurationParser(accounts);
     this.accounts = accounts;
 
-    OwnersMap map = fetchOwners();
+    OwnersMap map = fetchOwners(branch);
     owners = Multimaps.unmodifiableSetMultimap(map.getPathOwners());
     matchers = map.getMatchers();
     fileOwners = map.getFileOwners();
@@ -98,12 +96,12 @@
    *
    * @return A structure containing matchers paths to owners
    */
-  private OwnersMap fetchOwners() {
+  private OwnersMap fetchOwners(String branch) {
     OwnersMap ownersMap = new OwnersMap();
     try {
       String rootPath = "OWNERS";
       PathOwnersEntry rootEntry =
-          getOwnersConfig(rootPath).map(
+          getOwnersConfig(rootPath, branch).map(
               conf -> new PathOwnersEntry(rootPath, conf, accounts, Collections
                   .emptySet())).orElse(new PathOwnersEntry());
 
@@ -111,8 +109,7 @@
       Map<String, PathOwnersEntry> entries = new HashMap<>();
       PathOwnersEntry currentEntry = null;
       for (String path : modifiedPaths) {
-        currentEntry =
-            resolvePathEntry(path, rootEntry, entries);
+        currentEntry = resolvePathEntry(path, branch, rootEntry, entries);
 
         // add owners to file for matcher predicates
         ownersMap.addFileOwners(path,currentEntry.getOwners());
@@ -157,8 +154,8 @@
     }
   }
 
-  private PathOwnersEntry resolvePathEntry(String path,
-      PathOwnersEntry rootEntry, Map<String, PathOwnersEntry> entries)
+  private PathOwnersEntry resolvePathEntry(
+      String path, String branch, PathOwnersEntry rootEntry, Map<String, PathOwnersEntry> entries)
       throws IOException {
     String[] parts = path.split("/");
     PathOwnersEntry currentEntry = rootEntry;
@@ -176,7 +173,7 @@
         currentEntry = entries.get(partial);
       } else {
         String ownersPath = partial + "OWNERS";
-        Optional<OwnersConfig> conf = getOwnersConfig(ownersPath);
+        Optional<OwnersConfig> conf = getOwnersConfig(ownersPath, branch);
         currentEntry =
             conf.map(
                 c -> new PathOwnersEntry(ownersPath, c, accounts, currentOwners))
@@ -221,9 +218,9 @@
    * @return config or null if it doesn't exist
    * @throws IOException
    */
-  private Optional<OwnersConfig> getOwnersConfig(String ownersPath)
+  private Optional<OwnersConfig> getOwnersConfig(String ownersPath, String branch)
       throws IOException {
-    return getBlobAsBytes(repository, "master", ownersPath).flatMap(
-        bytes -> parser.getOwnersConfig(bytes));
+    return getBlobAsBytes(repository, branch, ownersPath)
+        .flatMap(bytes -> parser.getOwnersConfig(bytes));
   }
 }
diff --git a/owners-common/src/test/java/com/vmware/gerrit/owners/common/Config.java b/owners-common/src/test/java/com/vmware/gerrit/owners/common/Config.java
index 499b152..8048391 100644
--- a/owners-common/src/test/java/com/vmware/gerrit/owners/common/Config.java
+++ b/owners-common/src/test/java/com/vmware/gerrit/owners/common/Config.java
@@ -30,6 +30,7 @@
 
 import com.google.common.base.Charsets;
 import com.google.gerrit.reviewdb.client.Patch;
+import com.google.gerrit.reviewdb.client.RefNames;
 import com.google.gerrit.reviewdb.server.ReviewDb;
 import com.google.gerrit.server.patch.PatchList;
 import com.google.gerrit.server.patch.PatchListEntry;
@@ -41,6 +42,7 @@
   protected PatchList patchList;
   protected ConfigurationParser parser;
   protected TestAccounts accounts = new TestAccounts();
+  protected String branch = "master";
 
   public void setup() throws Exception {
     PowerMock.mockStatic(JgitWrapper.class);
@@ -89,8 +91,7 @@
     return parser.getOwnersConfig(string.getBytes(Charsets.UTF_8));
   }
 
-  public String createConfig(boolean inherited, String[] owners,
-      MatcherConfig... matchers) {
+  public String createConfig(boolean inherited, String[] owners, MatcherConfig... matchers) {
     StringBuilder sb = new StringBuilder();
     sb.append("inherited: " + inherited + "\n");
     if (owners.length > 0) {
diff --git a/owners-common/src/test/java/com/vmware/gerrit/owners/common/PathOwnersTest.java b/owners-common/src/test/java/com/vmware/gerrit/owners/common/PathOwnersTest.java
index fea518e..cb33518 100644
--- a/owners-common/src/test/java/com/vmware/gerrit/owners/common/PathOwnersTest.java
+++ b/owners-common/src/test/java/com/vmware/gerrit/owners/common/PathOwnersTest.java
@@ -49,7 +49,7 @@
     creatingPatchList(Arrays.asList("classic/file.txt"));
     replayAll();
 
-    PathOwners owners = new PathOwners(accounts, repository, patchList);
+    PathOwners owners = new PathOwners(accounts, repository, branch, patchList);
     Set<Account.Id> ownersSet = owners.get().get("classic/OWNERS");
     assertEquals(2, ownersSet.size());
     assertTrue(ownersSet.contains(USER_A_ID));
@@ -65,7 +65,7 @@
     creatingPatchList(Arrays.asList("classic/file.txt"));
     replayAll();
 
-    PathOwners owners2 = new PathOwners(accounts, repository, patchList);
+    PathOwners owners2 = new PathOwners(accounts, repository, branch, patchList);
     Set<Account.Id> ownersSet2 = owners2.get().get("classic/OWNERS");
 
     // in this case we are inheriting the acct3 from /OWNERS
diff --git a/owners-common/src/test/java/com/vmware/gerrit/owners/common/RegexTest.java b/owners-common/src/test/java/com/vmware/gerrit/owners/common/RegexTest.java
index 68a7cae..f06edb7 100644
--- a/owners-common/src/test/java/com/vmware/gerrit/owners/common/RegexTest.java
+++ b/owners-common/src/test/java/com/vmware/gerrit/owners/common/RegexTest.java
@@ -144,7 +144,7 @@
     replayAll();
 
     // function under test
-    PathOwners owners = new PathOwners(accounts, repository, patchList);
+    PathOwners owners = new PathOwners(accounts, repository, branch, patchList);
 
     // assertions on classic owners
     Set<Account.Id> ownersSet = owners.get().get("project/OWNERS");
@@ -242,7 +242,7 @@
     creatingPatch("project/file.sql", "another.txt");
     replayAll();
 
-    PathOwners owners = new PathOwners(accounts, repository, patchList);
+    PathOwners owners = new PathOwners(accounts, repository, branch, patchList);
 
     Set<String> ownedFiles = owners.getFileOwners().keySet();
     assertThat(ownedFiles).containsExactly("project/file.sql");
diff --git a/owners/src/main/java/com/vmware/gerrit/owners/OwnersStoredValues.java b/owners/src/main/java/com/vmware/gerrit/owners/OwnersStoredValues.java
index 19092af..9c2e27f 100644
--- a/owners/src/main/java/com/vmware/gerrit/owners/OwnersStoredValues.java
+++ b/owners/src/main/java/com/vmware/gerrit/owners/OwnersStoredValues.java
@@ -42,14 +42,16 @@
       return;
     }
     log.info("Initializing OwnerStoredValues");
-    PATH_OWNERS = new StoredValue<PathOwners>() {
-      @Override
-      protected PathOwners createValue(Prolog engine) {
-        PatchList patchList = StoredValues.PATCH_LIST.get(engine);
-        Repository repository = StoredValues.REPOSITORY.get(engine);
-        return new PathOwners(accounts, repository, patchList);
-      }
-    };
+    PATH_OWNERS =
+        new StoredValue<PathOwners>() {
+          @Override
+          protected PathOwners createValue(Prolog engine) {
+            PatchList patchList = StoredValues.PATCH_LIST.get(engine);
+            Repository repository = StoredValues.REPOSITORY.get(engine);
+            String branch = StoredValues.getChange(engine).getDest().get();
+            return new PathOwners(accounts, repository, branch, patchList);
+          }
+        };
   }
 
   private OwnersStoredValues() {
