diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..3d41d01
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,4 @@
+target
+*.iml
+*.ipr
+.idea
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..11069ed
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,201 @@
+                              Apache License
+                        Version 2.0, January 2004
+                     http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+   "License" shall mean the terms and conditions for use, reproduction,
+   and distribution as defined by Sections 1 through 9 of this document.
+
+   "Licensor" shall mean the copyright owner or entity authorized by
+   the copyright owner that is granting the License.
+
+   "Legal Entity" shall mean the union of the acting entity and all
+   other entities that control, are controlled by, or are under common
+   control with that entity. For the purposes of this definition,
+   "control" means (i) the power, direct or indirect, to cause the
+   direction or management of such entity, whether by contract or
+   otherwise, or (ii) ownership of fifty percent (50%) or more of the
+   outstanding shares, or (iii) beneficial ownership of such entity.
+
+   "You" (or "Your") shall mean an individual or Legal Entity
+   exercising permissions granted by this License.
+
+   "Source" form shall mean the preferred form for making modifications,
+   including but not limited to software source code, documentation
+   source, and configuration files.
+
+   "Object" form shall mean any form resulting from mechanical
+   transformation or translation of a Source form, including but
+   not limited to compiled object code, generated documentation,
+   and conversions to other media types.
+
+   "Work" shall mean the work of authorship, whether in Source or
+   Object form, made available under the License, as indicated by a
+   copyright notice that is included in or attached to the work
+   (an example is provided in the Appendix below).
+
+   "Derivative Works" shall mean any work, whether in Source or Object
+   form, that is based on (or derived from) the Work and for which the
+   editorial revisions, annotations, elaborations, or other modifications
+   represent, as a whole, an original work of authorship. For the purposes
+   of this License, Derivative Works shall not include works that remain
+   separable from, or merely link (or bind by name) to the interfaces of,
+   the Work and Derivative Works thereof.
+
+   "Contribution" shall mean any work of authorship, including
+   the original version of the Work and any modifications or additions
+   to that Work or Derivative Works thereof, that is intentionally
+   submitted to Licensor for inclusion in the Work by the copyright owner
+   or by an individual or Legal Entity authorized to submit on behalf of
+   the copyright owner. For the purposes of this definition, "submitted"
+   means any form of electronic, verbal, or written communication sent
+   to the Licensor or its representatives, including but not limited to
+   communication on electronic mailing lists, source code control systems,
+   and issue tracking systems that are managed by, or on behalf of, the
+   Licensor for the purpose of discussing and improving the Work, but
+   excluding communication that is conspicuously marked or otherwise
+   designated in writing by the copyright owner as "Not a Contribution."
+
+   "Contributor" shall mean Licensor and any individual or Legal Entity
+   on behalf of whom a Contribution has been received by Licensor and
+   subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   copyright license to reproduce, prepare Derivative Works of,
+   publicly display, publicly perform, sublicense, and distribute the
+   Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   (except as stated in this section) patent license to make, have made,
+   use, offer to sell, sell, import, and otherwise transfer the Work,
+   where such license applies only to those patent claims licensable
+   by such Contributor that are necessarily infringed by their
+   Contribution(s) alone or by combination of their Contribution(s)
+   with the Work to which such Contribution(s) was submitted. If You
+   institute patent litigation against any entity (including a
+   cross-claim or counterclaim in a lawsuit) alleging that the Work
+   or a Contribution incorporated within the Work constitutes direct
+   or contributory patent infringement, then any patent licenses
+   granted to You under this License for that Work shall terminate
+   as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the
+   Work or Derivative Works thereof in any medium, with or without
+   modifications, and in Source or Object form, provided that You
+   meet the following conditions:
+
+   (a) You must give any other recipients of the Work or
+       Derivative Works a copy of this License; and
+
+   (b) You must cause any modified files to carry prominent notices
+       stating that You changed the files; and
+
+   (c) You must retain, in the Source form of any Derivative Works
+       that You distribute, all copyright, patent, trademark, and
+       attribution notices from the Source form of the Work,
+       excluding those notices that do not pertain to any part of
+       the Derivative Works; and
+
+   (d) If the Work includes a "NOTICE" text file as part of its
+       distribution, then any Derivative Works that You distribute must
+       include a readable copy of the attribution notices contained
+       within such NOTICE file, excluding those notices that do not
+       pertain to any part of the Derivative Works, in at least one
+       of the following places: within a NOTICE text file distributed
+       as part of the Derivative Works; within the Source form or
+       documentation, if provided along with the Derivative Works; or,
+       within a display generated by the Derivative Works, if and
+       wherever such third-party notices normally appear. The contents
+       of the NOTICE file are for informational purposes only and
+       do not modify the License. You may add Your own attribution
+       notices within Derivative Works that You distribute, alongside
+       or as an addendum to the NOTICE text from the Work, provided
+       that such additional attribution notices cannot be construed
+       as modifying the License.
+
+   You may add Your own copyright statement to Your modifications and
+   may provide additional or different license terms and conditions
+   for use, reproduction, or distribution of Your modifications, or
+   for any such Derivative Works as a whole, provided Your use,
+   reproduction, and distribution of the Work otherwise complies with
+   the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise,
+   any Contribution intentionally submitted for inclusion in the Work
+   by You to the Licensor shall be under the terms and conditions of
+   this License, without any additional terms or conditions.
+   Notwithstanding the above, nothing herein shall supersede or modify
+   the terms of any separate license agreement you may have executed
+   with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade
+   names, trademarks, service marks, or product names of the Licensor,
+   except as required for reasonable and customary use in describing the
+   origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or
+   agreed to in writing, Licensor provides the Work (and each
+   Contributor provides its Contributions) on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+   implied, including, without limitation, any warranties or conditions
+   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+   PARTICULAR PURPOSE. You are solely responsible for determining the
+   appropriateness of using or redistributing the Work and assume any
+   risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory,
+   whether in tort (including negligence), contract, or otherwise,
+   unless required by applicable law (such as deliberate and grossly
+   negligent acts) or agreed to in writing, shall any Contributor be
+   liable to You for damages, including any direct, indirect, special,
+   incidental, or consequential damages of any character arising as a
+   result of this License or out of the use or inability to use the
+   Work (including but not limited to damages for loss of goodwill,
+   work stoppage, computer failure or malfunction, or any and all
+   other commercial damages or losses), even if such Contributor
+   has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing
+   the Work or Derivative Works thereof, You may choose to offer,
+   and charge a fee for, acceptance of support, warranty, indemnity,
+   or other liability obligations and/or rights consistent with this
+   License. However, in accepting such obligations, You may act only
+   on Your own behalf and on Your sole responsibility, not on behalf
+   of any other Contributor, and only if You agree to indemnify,
+   defend, and hold each Contributor harmless for any liability
+   incurred by, or claims asserted against, such Contributor by reason
+   of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+   To apply the Apache License to your work, attach the following
+   boilerplate notice, with the fields enclosed by brackets "[]"
+   replaced with your own identifying information. (Don't include
+   the brackets!)  The text should be enclosed in the appropriate
+   comment syntax for the file format. We also recommend that a
+   file or class name and description of purpose be included on the
+   same "printed page" as the copyright notice for easier
+   identification within third-party archives.
+
+Copyright [yyyy] [name of copyright owner]
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..cb75eb5
--- /dev/null
+++ b/README.md
@@ -0,0 +1,45 @@
+# Gerrit OWNERS Plugin
+
+This plugin provides a Prolog predicate `add_owner_approval/3` that appends `label('Owner-Approval', need(_))` to a provided list.
+
+Owner approval is determined based on OWNERS files located in the same repository. They are resolved against the state present in the existing master branch.
+
+The OWNERS files are represented by the following YAML structure:
+
+```yaml
+inherited: true
+owners:
+- user-a@example.com
+- user-b@example.com
+```
+
+This translates to inheriting owner email address from any parent OWNER files and to allow `user-a@example.com` and `user-b@example.com` to approve the change.
+
+The plugin analyzes the latest patch set by looking at each patch and building an OWNERS hierarchy. It stops once it finds an OWNERS file that has “inherited” set to false (by default it’s true.)
+
+For example, imagine the following tree:
+
+```
+/OWNERS
+/example/src/main/OWNERS
+/example/src/main/java/com/example/foo/Foo.java
+/example/src/main/resources/config.properties
+/example/src/test/OWNERS
+/example/src/test/java/com/example/foo/FooTest.java
+```
+
+If you submit a patch set that changes `/example/src/main/java/com/example/foo/Foo.java` then the plugin will first open `/example/src/main/OWNERS` and if inherited is set to true combine it with the owners listed in `/OWNERS`.
+
+If for each patch there is a reviewer who gave a `Code-Review +2` then the plugin will not add any labels,
+otherwise it will add `label('Owner-Approval', need(_))`.
+
+Here’s a sample rules.pl that uses this predicate to enable the submit rule.
+
+```prolog
+submit_rule(S) :-
+  gerrit:default_submit(D),
+  D =.. [submit | Ds],
+  gerrit:get_commit_labels(L),
+  gerrit_owners:add_owner_approval(L, Ds, A),
+  S =.. [submit | A].
+```
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..d93c53e
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,148 @@
+<!--
+Copyright (C) 2012 The Android Open Source Project
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.vmware</groupId>
+  <artifactId>gerrit-owners</artifactId>
+  <packaging>jar</packaging>
+  <version>1.0-SNAPSHOT</version>
+  <name>gerrit-owners</name>
+
+  <properties>
+    <Gerrit-ApiType>plugin</Gerrit-ApiType>
+    <Gerrit-ApiVersion>2.7-SNAPSHOT</Gerrit-ApiVersion>
+  </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-jar-plugin</artifactId>
+        <version>2.4</version>
+      </plugin>
+
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <version>2.3.2</version>
+        <configuration>
+          <source>1.6</source>
+          <target>1.6</target>
+          <encoding>UTF-8</encoding>
+        </configuration>
+      </plugin>
+
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-shade-plugin</artifactId>
+        <configuration>
+          <createDependencyReducedPom>false</createDependencyReducedPom>
+          <promoteTransitiveDependencies>true</promoteTransitiveDependencies>
+          <artifactSet>
+            <excludes>
+              <exclude>com.gerritforge:*</exclude>
+              <exclude>com.google.gerrit:*</exclude>
+              <exclude>org.bouncycastle:*</exclude>
+              <exclude>org.slf4j:*</exclude>
+              <exclude>com.google.guava:*</exclude>
+              <exclude>org.eclipse.jgit:*</exclude>
+              <exclude>wsdl4j:wsdl4j:*</exclude>
+            </excludes>
+          </artifactSet>
+          <transformers>
+            <transformer
+                implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
+              <manifestEntries>
+                <Implementation-Vendor>VMware, Inc.</Implementation-Vendor>
+                <Implementation-URL>http://github.com/vadims/gerrit-owners</Implementation-URL>
+                <Implementation-Title>${Gerrit-ApiType} ${project.artifactId}</Implementation-Title>
+                <Implementation-Version>${project.version}</Implementation-Version>
+                <Gerrit-ApiType>${Gerrit-ApiType}</Gerrit-ApiType>
+                <Gerrit-ApiVersion>${project.version}</Gerrit-ApiVersion>
+              </manifestEntries>
+            </transformer>
+          </transformers>
+        </configuration>
+        <executions>
+          <execution>
+            <phase>package</phase>
+            <goals>
+              <goal>shade</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>com.google.gerrit</groupId>
+      <artifactId>gerrit-${Gerrit-ApiType}-api</artifactId>
+      <version>${Gerrit-ApiVersion}</version>
+      <scope>provided</scope>
+    </dependency>
+
+    <dependency>
+      <groupId>com.googlecode.prolog-cafe</groupId>
+      <artifactId>PrologCafe</artifactId>
+      <version>1.3</version>
+      <scope>provided</scope>
+    </dependency>
+
+    <dependency>
+      <groupId>org.gitective</groupId>
+      <artifactId>gitective-core</artifactId>
+      <version>0.9.9</version>
+    </dependency>
+
+    <dependency>
+      <groupId>com.fasterxml.jackson.core</groupId>
+      <artifactId>jackson-core</artifactId>
+      <version>2.2.0</version>
+    </dependency>
+
+    <dependency>
+      <groupId>com.fasterxml.jackson.core</groupId>
+      <artifactId>jackson-databind</artifactId>
+      <version>2.2.0</version>
+    </dependency>
+
+    <dependency>
+      <groupId>com.fasterxml.jackson.dataformat</groupId>
+      <artifactId>jackson-dataformat-yaml</artifactId>
+      <version>2.1.4</version>
+    </dependency>
+
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <version>4.8.1</version>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+  <repositories>
+    <repository>
+      <id>gerrit-api-repository</id>
+      <url>https://gerrit-api.commondatastorage.googleapis.com/snapshot/</url>
+    </repository>
+  </repositories>
+</project>
diff --git a/src/main/java/com/vmware/gerrit/owners/OwnerPredicateProvider.java b/src/main/java/com/vmware/gerrit/owners/OwnerPredicateProvider.java
new file mode 100644
index 0000000..1d9b722
--- /dev/null
+++ b/src/main/java/com/vmware/gerrit/owners/OwnerPredicateProvider.java
@@ -0,0 +1,17 @@
+/*
+ * Copyright (c) 2013 VMware, Inc. All Rights Reserved.
+ */
+package com.vmware.gerrit.owners;
+
+
+import com.google.common.collect.ImmutableSet;
+import com.google.gerrit.extensions.annotations.Listen;
+import com.google.gerrit.rules.PredicateProvider;
+
+@Listen
+public class OwnerPredicateProvider implements PredicateProvider {
+  @Override
+  public ImmutableSet<String> getPackages() {
+    return ImmutableSet.of("gerrit_owners");
+  }
+}
diff --git a/src/main/java/com/vmware/gerrit/owners/OwnersConfig.java b/src/main/java/com/vmware/gerrit/owners/OwnersConfig.java
new file mode 100644
index 0000000..29baa7c
--- /dev/null
+++ b/src/main/java/com/vmware/gerrit/owners/OwnersConfig.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2013 VMware, Inc. All Rights Reserved.
+ */
+package com.vmware.gerrit.owners;
+
+import java.util.Set;
+
+/**
+ * OWNERS file model.
+ * <p/>
+ * Used for de-serializing the OWNERS files.
+ */
+public class OwnersConfig {
+  /**
+   * Flag for marking that this OWNERS file inherits from the parent OWNERS.
+   */
+  private boolean inherited = true;
+
+  /**
+   * Set of OWNER email addresses.
+   */
+  private Set<String> owners;
+
+  public boolean isInherited() {
+    return inherited;
+  }
+
+  public void setInherited(boolean inherited) {
+    this.inherited = inherited;
+  }
+
+  public Set<String> getOwners() {
+    return owners;
+  }
+
+  public void setOwners(Set<String> owners) {
+    this.owners = owners;
+  }
+}
diff --git a/src/main/java/com/vmware/gerrit/owners/PathOwnersEntry.java b/src/main/java/com/vmware/gerrit/owners/PathOwnersEntry.java
new file mode 100644
index 0000000..236446b
--- /dev/null
+++ b/src/main/java/com/vmware/gerrit/owners/PathOwnersEntry.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2013 VMware, Inc. All Rights Reserved.
+ */
+package com.vmware.gerrit.owners;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+
+public class PathOwnersEntry {
+  private String ownersPath;
+  private Set<String> owners;
+
+  public PathOwnersEntry() {
+    owners = new HashSet<String>();
+  }
+
+  public String getOwnersPath() {
+    return ownersPath;
+  }
+
+  public void setOwnersPath(String ownersPath) {
+    this.ownersPath = ownersPath;
+  }
+
+  public Set<String> getOwners() {
+    return owners;
+  }
+
+  public void addOwners(Collection<String> owners) {
+    this.owners.addAll(owners);
+  }
+}
diff --git a/src/main/java/com/vmware/gerrit/owners/PathOwnersStoredValue.java b/src/main/java/com/vmware/gerrit/owners/PathOwnersStoredValue.java
new file mode 100644
index 0000000..56e986b
--- /dev/null
+++ b/src/main/java/com/vmware/gerrit/owners/PathOwnersStoredValue.java
@@ -0,0 +1,135 @@
+/*
+ * Copyright (c) 2013 VMware, Inc. All Rights Reserved.
+ */
+package com.vmware.gerrit.owners;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
+import com.google.common.collect.HashMultimap;
+import com.google.common.collect.SetMultimap;
+import com.google.gerrit.reviewdb.client.Patch;
+import com.google.gerrit.rules.StoredValue;
+import com.google.gerrit.rules.StoredValues;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.patch.PatchList;
+import com.google.gerrit.server.patch.PatchListEntry;
+import com.googlecode.prolog_cafe.lang.Prolog;
+import org.eclipse.jgit.lib.Repository;
+import org.gitective.core.BlobUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Path Owners Stored Value.
+ * <p/>
+ * Cached by the Prolog Engine across rule evaluation. Provides a mapping of OWNERS file referenced by the commit to
+ * a set of emails contained in the OWNERS file.
+ */
+public class PathOwnersStoredValue extends StoredValue<SetMultimap<String, String>> {
+  private static final Logger log = LoggerFactory.getLogger(IdentifiedUser.class);
+
+  @Override
+  protected SetMultimap<String, String> createValue(Prolog engine) {
+    PatchList patchList = StoredValues.PATCH_LIST.get(engine);
+    List<PatchListEntry> patches = patchList.getPatches();
+    Set<String> paths = new HashSet<String>();
+    for (PatchListEntry patch : patches) {
+      // Ignore commit message
+      if (!patch.getNewName().equals("/COMMIT_MSG")) {
+        paths.add(patch.getNewName());
+
+        // If a file was moved then we need approvals for old and new path
+        if (patch.getChangeType() == Patch.ChangeType.RENAMED) {
+          paths.add(patch.getOldName());
+        }
+      }
+    }
+
+    Repository repository = StoredValues.REPOSITORY.get(engine);
+    return getOwners(repository, paths);
+  }
+
+  private SetMultimap<String, String> getOwners(Repository repository, Set<String> paths) {
+    SetMultimap<String, String> result = HashMultimap.create();
+    Map<String, PathOwnersEntry> entries = new HashMap<String, PathOwnersEntry>();
+
+    PathOwnersEntry rootEntry = new PathOwnersEntry();
+    OwnersConfig rootConfig = getOwners(repository, "OWNERS");
+    if (rootConfig != null) {
+      rootEntry.setOwnersPath("OWNERS");
+      rootEntry.addOwners(rootConfig.getOwners());
+    }
+
+    for (String path : paths) {
+      String[] parts = path.split("/");
+
+      PathOwnersEntry currentEntry = rootEntry;
+      StringBuilder builder = new StringBuilder();
+
+      // Iterate through the parent paths, not including the file name itself
+      for (int i = 0, partsLength = parts.length - 1; i < partsLength; i++) {
+        String part = parts[i];
+        builder.append(part).append("/");
+        String partial = builder.toString();
+
+        // Skip if we already parsed this path
+        if (!entries.containsKey(partial)) {
+          String ownersPath = partial + "OWNERS";
+          OwnersConfig config = getOwners(repository, ownersPath);
+          if (config != null) {
+            PathOwnersEntry entry = new PathOwnersEntry();
+            entry.setOwnersPath(ownersPath);
+            entry.addOwners(config.getOwners());
+
+            if (config.isInherited()) {
+              entry.addOwners(currentEntry.getOwners());
+            }
+
+            currentEntry = entry;
+          }
+
+          entries.put(partial, currentEntry);
+        } else {
+          currentEntry = entries.get(partial);
+        }
+      }
+
+      // Only add the path to the OWNERS file to reduce the number of entries in the result
+      if (currentEntry.getOwnersPath() != null) {
+        result.putAll(currentEntry.getOwnersPath(), currentEntry.getOwners());
+      }
+    }
+
+    return result;
+  }
+
+  /**
+   * Returns the parsed OwnersConfig file for the given path if it exists.
+   *
+   * @param repository git repo
+   * @param ownersPath path to OWNERS file in the git repo
+   * @return config or null if it doesn't exist
+   */
+  private OwnersConfig getOwners(Repository repository, String ownersPath) {
+    String owners = BlobUtils.getContent(repository, "master", ownersPath);
+
+    if (owners != null) {
+      ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
+      try {
+        return mapper.readValue(owners, OwnersConfig.class);
+      } catch (IOException e) {
+        log.warn("Invalid OWNERS file: {}", ownersPath, e);
+        return null;
+      }
+    }
+
+    return null;
+  }
+}
diff --git a/src/main/java/gerrit_owners/PRED_$init_0.java b/src/main/java/gerrit_owners/PRED_$init_0.java
new file mode 100644
index 0000000..221df95
--- /dev/null
+++ b/src/main/java/gerrit_owners/PRED_$init_0.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (c) 2013 VMware, Inc. All Rights Reserved.
+ */
+package gerrit_owners;
+
+import com.googlecode.prolog_cafe.lang.Operation;
+import com.googlecode.prolog_cafe.lang.Predicate;
+import com.googlecode.prolog_cafe.lang.Prolog;
+import com.googlecode.prolog_cafe.lang.PrologException;
+
+/**
+ * Prolog gerrit_owners predicate initialization.
+ */
+public class PRED_$init_0 extends Predicate.P1 {
+
+  public PRED_$init_0(Operation n) {
+    cont = n;
+  }
+
+  @Override
+  public Operation exec(Prolog engine) throws PrologException {
+    engine.setB0();
+    return cont;
+  }
+}
diff --git a/src/main/java/gerrit_owners/PRED_add_owner_approval_3.java b/src/main/java/gerrit_owners/PRED_add_owner_approval_3.java
new file mode 100644
index 0000000..40cc6aa
--- /dev/null
+++ b/src/main/java/gerrit_owners/PRED_add_owner_approval_3.java
@@ -0,0 +1,175 @@
+/*
+ * Copyright (c) 2013 VMware, Inc. All Rights Reserved.
+ */
+package gerrit_owners;
+
+import com.vmware.gerrit.owners.PathOwnersStoredValue;
+
+import com.google.common.collect.SetMultimap;
+import com.google.common.collect.Sets;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.rules.PrologEnvironment;
+import com.google.gerrit.rules.StoredValues;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.inject.util.Providers;
+import com.googlecode.prolog_cafe.lang.IntegerTerm;
+import com.googlecode.prolog_cafe.lang.ListTerm;
+import com.googlecode.prolog_cafe.lang.Operation;
+import com.googlecode.prolog_cafe.lang.Predicate;
+import com.googlecode.prolog_cafe.lang.Prolog;
+import com.googlecode.prolog_cafe.lang.PrologException;
+import com.googlecode.prolog_cafe.lang.StructureTerm;
+import com.googlecode.prolog_cafe.lang.SymbolTerm;
+import com.googlecode.prolog_cafe.lang.Term;
+import com.googlecode.prolog_cafe.lang.VariableTerm;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Predicate for add_owner_approval/3.
+ * <p/>
+ * Adds OWNERS file approval checks.
+ */
+public class PRED_add_owner_approval_3 extends Predicate.P3 {
+
+  private static final SymbolTerm CODE_REVIEW = SymbolTerm.intern("Code-Review");
+
+  private static final SymbolTerm OWNER_APPROVAL = SymbolTerm.intern("Owner-Approval");
+
+  // Cached path owners.
+  private static PathOwnersStoredValue PATH_OWNERS = new PathOwnersStoredValue();
+
+  public PRED_add_owner_approval_3(Term a1, Term a2, Term a3, Operation n) {
+    arg1 = a1;
+    arg2 = a2;
+    arg3 = a3;
+    cont = n;
+  }
+
+  @Override
+  public Operation exec(Prolog engine) throws PrologException {
+    engine.setB0();
+
+    SetMultimap<String, String> pathOwners = PATH_OWNERS.get(engine);
+
+    Term a1 = arg1.dereference();
+    Term a2 = arg2.dereference();
+    Term a3 = arg3.dereference();
+
+    if (!a3.isVariable()) {
+      return engine.fail();
+    }
+
+    Set<String> emails;
+    if (a1.isList()) {
+      emails = getReviewerEmails(engine, (ListTerm) a1);
+    } else {
+      emails = Collections.emptySet();
+    }
+
+    if (!isOwnerApproved(pathOwners, emails)) {
+      a2 = appendLabel(a2, "need", new VariableTerm(engine));
+    }
+
+    ((VariableTerm) a3).bind(a2, engine.trail);
+
+    return cont;
+  }
+
+  /**
+   * Append commit label.
+   *
+   * @param list     commit labels list
+   * @param status   ok, need, maybe, etc.
+   * @param userTerm commit label user
+   * @return resulting list
+   */
+  private ListTerm appendLabel(Term list, String status, Term userTerm) {
+    StructureTerm label = new StructureTerm("label", OWNER_APPROVAL, new StructureTerm(status, userTerm));
+    return new ListTerm(label, list);
+  }
+
+  /**
+   * Returns if the change has been approved by owners.
+   *
+   * @param pathOwners     map of paths to a set of owners for the path
+   * @param reviewerEmails set of reviewer emails who gave a CR +2
+   * @return true iff all the paths were approved
+   */
+  private boolean isOwnerApproved(SetMultimap<String, String> pathOwners, Set<String> reviewerEmails) {
+    for (String path : pathOwners.keySet()) {
+      Set<String> requiredReviewers = pathOwners.get(path);
+      Sets.SetView<String> intersection = Sets.intersection(requiredReviewers, reviewerEmails);
+      if (intersection.isEmpty()) {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  /**
+   * Returns a set of all the reviewer emails that gave a CR +2.
+   *
+   * @param engine prolog engine
+   * @param list   commit labels list
+   * @return set of reviewer emails
+   */
+  private static Set<String> getReviewerEmails(Prolog engine, ListTerm list) {
+    StructureTerm codeReviewTerm = new StructureTerm("label", CODE_REVIEW, new IntegerTerm(2));
+    VariableTerm userIdTerm = new VariableTerm();
+    StructureTerm userTerm = new StructureTerm("user", userIdTerm);
+    StructureTerm commitLabelTerm = new StructureTerm("commit_label", codeReviewTerm, userTerm);
+
+    Set<String> result = new HashSet<String>();
+    while (true) {
+      StructureTerm term = (StructureTerm) list.car();
+      if (commitLabelTerm.unify(term, engine.trail)) {
+        int userId = ((IntegerTerm) userIdTerm.dereference()).intValue();
+        IdentifiedUser user = getUser(engine, userId);
+        result.addAll(user.getEmailAddresses());
+        userIdTerm.undo();
+      }
+
+      if (list.cdr().isList()) {
+        list = (ListTerm) list.cdr();
+      } else {
+        return result;
+      }
+    }
+  }
+
+  /**
+   * Get user from cache or ReviewDb by id.
+   *
+   * @param engine prolog engine
+   * @param id     user id
+   * @return user that matches the given id
+   */
+  private static IdentifiedUser getUser(Prolog engine, int id) {
+    Map<Account.Id, IdentifiedUser> cache = StoredValues.USERS.get(engine);
+    Account.Id accountId = new Account.Id(id);
+    IdentifiedUser user = cache.get(accountId);
+    if (user == null) {
+      ReviewDb db = StoredValues.REVIEW_DB.getOrNull(engine);
+      IdentifiedUser.GenericFactory userFactory = userFactory(engine);
+      IdentifiedUser who;
+      if (db != null) {
+        who = userFactory.create(Providers.of(db), accountId);
+      } else {
+        who = userFactory.create(accountId);
+      }
+      cache.put(accountId, who);
+      user = who;
+    }
+    return user;
+  }
+
+  private static IdentifiedUser.GenericFactory userFactory(Prolog engine) {
+    PrologEnvironment env = (PrologEnvironment) engine.control;
+    return env.getInjector().getInstance(IdentifiedUser.GenericFactory.class);
+  }
+}
