diff --git a/src/main/java/com/googlesource/gerrit/plugins/hooks/its/ItsConfig.java b/src/main/java/com/googlesource/gerrit/plugins/hooks/its/ItsConfig.java
index 83ed535..89bccf4 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/hooks/its/ItsConfig.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/hooks/its/ItsConfig.java
@@ -52,19 +52,19 @@
   public boolean isEnabled(Event event) {
     if (event instanceof PatchSetCreatedEvent) {
       PatchSetCreatedEvent e = (PatchSetCreatedEvent) event;
-      return isEnabled(e.change.project, e.change.branch);
+      return isEnabled(e.change.project, e.getRefName());
     } else if (event instanceof CommentAddedEvent) {
       CommentAddedEvent e = (CommentAddedEvent) event;
-      return isEnabled(e.change.project, e.change.branch);
+      return isEnabled(e.change.project, e.getRefName());
     } else if (event instanceof ChangeMergedEvent) {
       ChangeMergedEvent e = (ChangeMergedEvent) event;
-      return isEnabled(e.change.project, e.change.branch);
+      return isEnabled(e.change.project, e.getRefName());
     } else if (event instanceof ChangeAbandonedEvent) {
       ChangeAbandonedEvent e = (ChangeAbandonedEvent) event;
-      return isEnabled(e.change.project, e.change.branch);
+      return isEnabled(e.change.project, e.getRefName());
     } else if (event instanceof ChangeRestoredEvent) {
       ChangeRestoredEvent e = (ChangeRestoredEvent) event;
-      return isEnabled(e.change.project, e.change.branch);
+      return isEnabled(e.change.project, e.getRefName());
     } else if (event instanceof RefUpdatedEvent) {
       RefUpdatedEvent e = (RefUpdatedEvent) event;
       return isEnabled(e.refUpdate.project, e.refUpdate.refName);
@@ -74,7 +74,7 @@
     }
   }
 
-  public boolean isEnabled(String project, String branch) {
+  public boolean isEnabled(String project, String refName) {
     ProjectState projectState = projectCache.get(new Project.NameKey(project));
     if (projectState == null) {
       log.error("Failed to check if " + pluginName + " is enabled for project "
@@ -86,17 +86,17 @@
       PluginConfig parentCfg =
           pluginCfgFactory.getFromProjectConfig(parentState, pluginName);
       if ("enforced".equals(parentCfg.getString("enabled"))
-          && isEnabledForBranch(parentState, branch)) {
+          && isEnabledForBranch(parentState, refName)) {
         return true;
       }
     }
 
     return pluginCfgFactory.getFromProjectConfigWithInheritance(
         projectState, pluginName).getBoolean("enabled", false)
-        && isEnabledForBranch(projectState, branch);
+        && isEnabledForBranch(projectState, refName);
   }
 
-  private boolean isEnabledForBranch(ProjectState project, String branch) {
+  private boolean isEnabledForBranch(ProjectState project, String refName) {
     String[] refPatterns =
         pluginCfgFactory.getFromProjectConfigWithInheritance(project,
             pluginName).getStringList("branch");
@@ -104,14 +104,14 @@
       return true;
     }
     for (String refPattern : refPatterns) {
-      if (RefConfigSection.isValid(refPattern) && match(branch, refPattern)) {
+      if (RefConfigSection.isValid(refPattern) && match(refName, refPattern)) {
         return true;
       }
     }
     return false;
   }
 
-  private boolean match(String branch, String refPattern) {
-    return RefPatternMatcher.getMatcher(refPattern).match(branch, null);
+  private boolean match(String refName, String refPattern) {
+    return RefPatternMatcher.getMatcher(refPattern).match(refName, null);
   }
 }
diff --git a/src/main/resources/Documentation/config-common.md b/src/main/resources/Documentation/config-common.md
index 4ad3c97..13720b4 100644
--- a/src/main/resources/Documentation/config-common.md
+++ b/src/main/resources/Documentation/config-common.md
@@ -90,7 +90,7 @@
 
 The issue tracker system integration can be limited to specific
 branches by setting `plugin.@PLUGIN@.branch`. The branches may be
-configured using explicit branch names, ref patterns, or regular
+configured using explicit ref names, ref patterns, or regular
 expressions. Multiple branches may be specified.
 
 E.g. to limit the issue tracker system integration to the `master`
diff --git a/src/test/java/com/googlesource/gerrit/plugins/hooks/its/ItsConfigTest.java b/src/test/java/com/googlesource/gerrit/plugins/hooks/its/ItsConfigTest.java
new file mode 100644
index 0000000..72d229c
--- /dev/null
+++ b/src/test/java/com/googlesource/gerrit/plugins/hooks/its/ItsConfigTest.java
@@ -0,0 +1,145 @@
+// Copyright (C) 2015 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.hooks.its;
+
+import static org.easymock.EasyMock.expect;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.config.PluginConfig;
+import com.google.gerrit.server.config.PluginConfigFactory;
+import com.google.gerrit.server.data.ChangeAttribute;
+import com.google.gerrit.server.events.PatchSetCreatedEvent;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectState;
+
+import org.easymock.EasyMockSupport;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.ArrayList;
+
+public class ItsConfigTest {
+  private EasyMockSupport easyMock;
+  private String pluginName = "its-base";
+  private PluginConfig pluginConfig;
+  private PluginConfig pluginConfigWithInheritance;
+  private ItsConfig itsConfig;
+  private PatchSetCreatedEvent pscEvent;
+
+  @Before
+  public void setup() {
+    easyMock = new EasyMockSupport();
+    ProjectCache projectCache = easyMock.createNiceMock(ProjectCache.class);
+    PluginConfigFactory pluginCfgFactory = easyMock.createNiceMock(PluginConfigFactory.class);
+    ProjectState projectState = easyMock.createNiceMock(ProjectState.class);
+    pluginConfig = easyMock.createNiceMock(PluginConfig.class);
+    pluginConfigWithInheritance = easyMock.createNiceMock(PluginConfig.class);
+    itsConfig = new ItsConfig(pluginName, projectCache, pluginCfgFactory);
+
+    pscEvent = new PatchSetCreatedEvent();
+    pscEvent.change = new ChangeAttribute();
+    pscEvent.change.project = "testProject";
+    pscEvent.change.branch = "testBranch";
+    ArrayList<ProjectState> listProjectState = new ArrayList<>(1);
+    listProjectState.add(projectState);
+
+    expect(projectCache.get(new Project.NameKey("testProject"))).andReturn(
+        projectState).once();
+    expect(projectState.treeInOrder()).andReturn(listProjectState);
+    expect(pluginCfgFactory.getFromProjectConfig(projectState, pluginName))
+    .andStubReturn(pluginConfig);
+    expect(
+        pluginCfgFactory.getFromProjectConfigWithInheritance(projectState,
+            pluginName)).andStubReturn(pluginConfigWithInheritance);
+  }
+
+  @Test
+  public void testEnforcedWithRegex() {
+    String[] refPatterns = {"^refs/heads/test.*"};
+    setUpEnforced(refPatterns);
+
+    assertTrue(itsConfig.isEnabled(pscEvent));
+    easyMock.verifyAll();
+  }
+
+  @Test
+  public void testEnforcedWithExact() {
+    String[] refPatterns = {"refs/heads/testBranch"};
+    setUpEnforced(refPatterns);
+
+    assertTrue(itsConfig.isEnabled(pscEvent));
+    easyMock.verifyAll();
+  }
+
+  @Test
+  public void testEnforcedForAll() {
+    String[] refPatterns = new String[0];
+    setUpEnforced(refPatterns);
+
+    assertTrue(itsConfig.isEnabled(pscEvent));
+    easyMock.verifyAll();
+  }
+
+  @Test
+  public void testEnabledWithRegex() {
+    String[] refPatterns = {"^refs/heads/test.*"};
+    setUpEnabled(refPatterns);
+
+    assertTrue(itsConfig.isEnabled(pscEvent));
+    easyMock.verifyAll();
+  }
+
+  @Test
+  public void testEnabledWithExact() {
+    String[] refPatterns = {"refs/heads/testBranch"};
+    setUpEnabled(refPatterns);
+
+    assertTrue(itsConfig.isEnabled(pscEvent));
+    easyMock.verifyAll();
+  }
+
+  @Test
+  public void testDisabled() {
+    String[] refPatterns = {"refs/heads/testBranch1"};
+    setUpEnabled(refPatterns);
+
+    assertFalse(itsConfig.isEnabled(pscEvent));
+    easyMock.verifyAll();
+  }
+
+  @Test
+  public void testInvalidPattern() {
+    String[] refPatterns = {"testBranch"};
+    setUpEnabled(refPatterns);
+
+    assertFalse(itsConfig.isEnabled(pscEvent));
+    easyMock.verifyAll();
+  }
+
+  private void setUpEnforced(String[] refPatterns) {
+    expect(pluginConfig.getString("enabled")).andReturn("enforced").once();
+    expect(pluginConfigWithInheritance.getStringList("branch")).andReturn(refPatterns);
+    easyMock.replayAll();
+  }
+
+  private void setUpEnabled(String[] refPatterns) {
+    expect(pluginConfig.getString("enabled")).andReturn("true");
+    expect(pluginConfigWithInheritance.getBoolean("enabled", false)).andReturn(true);
+    expect(pluginConfigWithInheritance.getStringList("branch")).andReturn(refPatterns);
+    easyMock.replayAll();
+  }
+}
