diff --git a/.buckconfig b/.buckconfig
index 74511c1..0941191 100644
--- a/.buckconfig
+++ b/.buckconfig
@@ -1,5 +1,5 @@
 [alias]
-  ci = //:verify-status
+  verify-status = //:verify-status
   plugin = //:verify-status
 
 [java]
diff --git a/.gitignore b/.gitignore
index aa42023..5e2d355 100644
--- a/.gitignore
+++ b/.gitignore
@@ -9,4 +9,5 @@
 /local.properties
 *.pyc
 .buckversion
+.watchmanconfig
 /bucklets
diff --git a/pom.xml b/pom.xml
index 1199a53..239386f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -88,6 +88,23 @@
           </execution>
         </executions>
       </plugin>
+ 
+ <!--
+ Maven IT tests is failing so commenting out for now.
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-failsafe-plugin</artifactId>
+        <version>2.19.1</version>
+        <executions>
+          <execution>
+            <goals>
+              <goal>integration-test</goal>
+              <goal>verify</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+-->
 
     </plugins>
   </build>
@@ -111,6 +128,24 @@
       <version>2.7.0</version>
       <scope>provided</scope>
     </dependency>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <version>4.11</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>com.google.truth</groupId>
+      <artifactId>truth</artifactId>
+      <version>0.27</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>com.google.gerrit</groupId>
+      <artifactId>gerrit-acceptance-framework</artifactId>
+      <version>${Gerrit-ApiVersion}</version>
+      <scope>test</scope>
+    </dependency>
   </dependencies>
 
   <repositories>
diff --git a/src/main/java/com/googlesource/gerrit/plugins/verifystatus/PostVerification.java b/src/main/java/com/googlesource/gerrit/plugins/verifystatus/PostVerification.java
index 2c623f0..4cee0af 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/verifystatus/PostVerification.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/verifystatus/PostVerification.java
@@ -201,7 +201,7 @@
    */
   private void checkPermission() throws PermissionDeniedException {
     CapabilityControl ctl = userProvider.get().getCapabilities();
-    if (!ctl.canPerform(pluginName + "-" + SaveReportCapability.ID)) {
+    if (!ctl.canPerform(SaveReportCapability.getName(pluginName))) {
       throw new PermissionDeniedException(String.format(
           "%s does not have \"%s\" capability.",
           userProvider.get().getUserName(),
diff --git a/src/main/java/com/googlesource/gerrit/plugins/verifystatus/SaveReportCapability.java b/src/main/java/com/googlesource/gerrit/plugins/verifystatus/SaveReportCapability.java
index 7d94f1a..994c555 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/verifystatus/SaveReportCapability.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/verifystatus/SaveReportCapability.java
@@ -23,4 +23,8 @@
   public String getDescription() {
     return "Save Verification Report";
   }
+
+  public static String getName(String pluginName) {
+    return pluginName + "-" + ID;
+  }
 }
diff --git a/src/main/resources/Documentation/build.md b/src/main/resources/Documentation/build.md
index 59264f2..b3a336a 100644
--- a/src/main/resources/Documentation/build.md
+++ b/src/main/resources/Documentation/build.md
@@ -10,7 +10,7 @@
 The standalone build mode is recommended, as this mode doesn't require
 the Gerrit tree to exist locally.
 
-
+### Build standalone
 
 Clone bucklets library:
 
@@ -48,6 +48,13 @@
   buck-out/gen/@PLUGIN@.jar
 ```
 
+To execute the tests run:
+
+```
+  buck test
+```
+
+### Build in Gerrit tree
 
 Clone or link this plugin to the plugins directory of Gerrit's source
 tree, and issue the command:
@@ -68,6 +75,12 @@
   ./tools/eclipse/project.py
 ```
 
+To execute the tests run:
+
+```
+  buck test --include @PLUGIN@
+```
+
 Maven
 -----
 
diff --git a/src/test/java/com/googlesource/gerrit/plugins/verifystatus/VerifyStatusIT.java b/src/test/java/com/googlesource/gerrit/plugins/verifystatus/VerifyStatusIT.java
new file mode 100644
index 0000000..0550ffd
--- /dev/null
+++ b/src/test/java/com/googlesource/gerrit/plugins/verifystatus/VerifyStatusIT.java
@@ -0,0 +1,174 @@
+// Copyright (C) 2016 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.
+
+package com.googlesource.gerrit.plugins.verifystatus;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
+
+import com.google.common.collect.Iterables;
+import com.google.gerrit.acceptance.PluginDaemonTest;
+import com.google.gerrit.acceptance.PushOneCommit.Result;
+import com.google.gerrit.acceptance.RestResponse;
+import com.google.gson.reflect.TypeToken;
+import com.google.gwtorm.jdbc.SimpleDataSource;
+
+import com.googlesource.gerrit.plugins.verifystatus.common.VerificationInfo;
+import com.googlesource.gerrit.plugins.verifystatus.common.VerifyInput;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import java.sql.Connection;
+import java.sql.Statement;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+
+public class VerifyStatusIT extends PluginDaemonTest {
+  private final static String TABLE = "PATCH_SET_VERIFICATIONS";
+  private static final String CREATE_TABLE =
+      "CREATE       TABLE IF NOT EXISTS " + TABLE + " (" +
+      "VALUE        SMALLINT DEFAULT 0 NOT NULL," +
+      "GRANTED      TIMESTAMP NOT NULL," +
+      "URL          VARCHAR(255)," +
+      "REPORTER     VARCHAR(255)," +
+      "COMMENT      VARCHAR(255)," +
+      "CATEGORY     VARCHAR(255)," +
+      "DURATION     VARCHAR(255)," +
+      "ABSTAIN      CHAR(1) DEFAULT 'N' NOT NULL," +
+      "NAME         VARCHAR(255)," +
+      "CHANGE_ID    INTEGER DEFAULT 0 NOT NULL," +
+      "PATCH_SET_ID INTEGER DEFAULT 0 NOT NULL," +
+      "JOB_ID       VARCHAR(255) DEFAULT '' NOT NULL)";
+  private static final String DELETE_TABLE =
+      "DELETE FROM " + TABLE;
+
+  @Override
+  protected void beforeTestServerStarts() throws Exception {
+    String url = "jdbc:h2:mem:TestCiDB;DB_CLOSE_DELAY=-1";
+    Properties p = new Properties();
+    p.setProperty("driver", "org.h2.Driver");
+    p.setProperty("url", url);
+    setPluginConfigString("dbType", "h2");
+    setPluginConfigString("dbUrl", url);
+
+    SimpleDataSource sds = new SimpleDataSource(p);
+    try (Connection c = sds.getConnection();
+        Statement s = c.createStatement()) {
+      s.executeUpdate(CREATE_TABLE);
+      // run the tests with the clean database
+      s.execute(DELETE_TABLE);
+    }
+  }
+
+  @Before
+  public void setUp() throws Exception {
+    allowGlobalCapabilities(REGISTERED_USERS,
+        SaveReportCapability.getName(pluginName));
+  }
+
+  @Test
+  public void noVerificationTest() throws Exception {
+    Result c = createChange();
+    Map<String, VerificationInfo> infos = getVerifications(c);
+    assertThat(infos).hasSize(0);
+  }
+
+  @Test
+  public void verificationOneTest() throws Exception {
+    VerifyInput in = new VerifyInput();
+    in.verifications = new HashMap<>();
+    VerificationInfo i = new VerificationInfo();
+    i.name = "job42";
+    i.value = 1;
+    i.reporter = "zuul@openstack.org";
+    i.comment = "Test CI";
+    i.url = "url";
+    i.category = "bar";
+    i.duration = "1h 30min";
+    in.verifications.put("foo", i);
+
+    Result c = createChange();
+    String endPoint = url(c);
+    RestResponse r = adminRestSession.post(endPoint, in);
+    r.assertNoContent();
+
+    Map<String, VerificationInfo> infos = getVerifications(c);
+    assertThat(infos).hasSize(1);
+    assertVerification(Iterables.getOnlyElement(infos.values()), i);
+  }
+
+  @Test
+  public void verificationTwoTest() throws Exception {
+    VerifyInput in = new VerifyInput();
+    in.verifications = new HashMap<>();
+    VerificationInfo i = new VerificationInfo();
+    i.name = "job43";
+    i.value = 1;
+    i.reporter = "zuul@openstack.org";
+    i.comment = "Test CI";
+    i.url = "url";
+    i.category = "bar";
+    i.duration = "1h 30min";
+    in.verifications.put(i.name, i);
+
+    VerificationInfo j = new VerificationInfo();
+    j = new VerificationInfo();
+    j.name = "job44";
+    j.value = -1;
+    j.reporter = "zuul@openstack.org";
+    j.comment = "Test CI";
+    j.url = "url";
+    j.category = "bar";
+    j.duration = "1h 30min";
+    in.verifications.put(j.name, j);
+
+    Result c = createChange();
+    String endPoint = url(c);
+    RestResponse r = adminRestSession.post(endPoint, in);
+    r.assertNoContent();
+
+    Map<String, VerificationInfo> infos = getVerifications(c);
+    assertThat(infos).hasSize(2);
+  }
+
+  private Map<String, VerificationInfo> getVerifications(Result c)
+      throws Exception {
+    String endPoint = url(c);
+    RestResponse r = adminRestSession.get(endPoint);
+    r.assertOK();
+
+    return newGson().fromJson(r.getReader(),
+        new TypeToken<Map<String, VerificationInfo>>() {}.getType());
+  }
+
+  private String url(Result c) throws Exception {
+    return "/changes/" +
+        c.getChangeId() +
+        "/revisions/" +
+        c.getPatchSetId().get() +
+        "/verify-status~verifications";
+  }
+
+  private static void assertVerification(VerificationInfo r,
+      VerificationInfo e) {
+    assertThat(r.value).isEqualTo(e.value);
+    assertThat(r.reporter).isEqualTo(e.reporter);
+    assertThat(r.comment).isEqualTo(e.comment);
+    assertThat(r.url).isEqualTo(e.url);
+    assertThat(r.category).isEqualTo(e.category);
+    assertThat(r.duration).isEqualTo(e.duration);
+  }
+}
