diff --git a/hooks-its/src/test/java/com/googlesource/gerrit/plugins/hooks/util/IssueExtractorTest.java b/hooks-its/src/test/java/com/googlesource/gerrit/plugins/hooks/util/IssueExtractorTest.java
new file mode 100644
index 0000000..f1290ea
--- /dev/null
+++ b/hooks-its/src/test/java/com/googlesource/gerrit/plugins/hooks/util/IssueExtractorTest.java
@@ -0,0 +1,192 @@
+// Copyright (C) 2013 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.util;
+
+import static org.easymock.EasyMock.expect;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.eclipse.jgit.lib.Config;
+
+import com.google.gerrit.server.config.FactoryModule;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import com.googlesource.gerrit.plugins.hooks.its.ItsName;
+import com.googlesource.gerrit.plugins.hooks.testutil.LoggingMockingTestCase;
+
+public class IssueExtractorTest extends LoggingMockingTestCase {
+  private Injector injector;
+  private Config serverConfig;
+
+  public void testPatternNullMatch() {
+    IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);
+
+    expect(serverConfig.getString("commentLink", "ItsTestName", "match"))
+        .andReturn(null).atLeastOnce();
+
+    replayMocks();
+
+    assertNull("Pattern for null match is not null",
+        issueExtractor.getPattern());
+  }
+
+  public void testPattern() {
+    IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);
+
+    expect(serverConfig.getString("commentLink", "ItsTestName", "match"))
+        .andReturn("TestPattern").atLeastOnce();
+
+    replayMocks();
+
+    assertEquals("Expected and generated pattern are not equal",
+        "TestPattern", issueExtractor.getPattern().pattern());
+  }
+
+  public void testIssueIdsNullPattern() {
+    IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);
+
+    expect(serverConfig.getString("commentLink", "ItsTestName", "match"))
+        .andReturn(null).atLeastOnce();
+
+    replayMocks();
+
+    String ret[] = issueExtractor.getIssueIds("Test");
+    assertEquals("Number of found ids do not match", 0, ret.length);
+  }
+
+  public void testIssueIdsNoMatch() {
+    IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);
+    expect(serverConfig.getString("commentLink", "ItsTestName", "match"))
+        .andReturn("bug#(\\d+)").atLeastOnce();
+
+    replayMocks();
+
+    String ret[] = issueExtractor.getIssueIds("Test");
+    assertEquals("Number of found ids do not match", 0, ret.length);
+
+    assertLogMessageContains("Matching");
+  }
+
+  public void testIssueIdsFullMatch() {
+    IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);
+    expect(serverConfig.getString("commentLink", "ItsTestName", "match"))
+        .andReturn("bug#(\\d+)").atLeastOnce();
+
+    replayMocks();
+
+    String ret[] = issueExtractor.getIssueIds("bug#4711");
+    assertEquals("Number of found ids do not match", 1, ret.length);
+    assertEquals("First found issue id do not match", "4711", ret[0]);
+
+    assertLogMessageContains("Matching");
+  }
+
+  public void testIssueIdsMatch() {
+    IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);
+    expect(serverConfig.getString("commentLink", "ItsTestName", "match"))
+        .andReturn("bug#(\\d+)").atLeastOnce();
+
+    replayMocks();
+
+    String ret[] = issueExtractor.getIssueIds("Foo bug#4711 bar");
+    assertEquals("Number of found ids do not match", 1, ret.length);
+    assertEquals("Found issue id does not match", "4711", ret[0]);
+
+    assertLogMessageContains("Matching");
+  }
+
+  public void testIssueIdsGrouplessMatch() {
+    IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);
+    expect(serverConfig.getString("commentLink", "ItsTestName", "match"))
+        .andReturn("bug#\\d+").atLeastOnce();
+
+    replayMocks();
+
+    String ret[] = issueExtractor.getIssueIds("Foo bug#4711 bar");
+    assertEquals("Number of found ids do not match", 1, ret.length);
+    assertEquals("Found issue id does not match", "bug#4711", ret[0]);
+
+    assertLogMessageContains("Matching");
+  }
+
+  public void testIssueIdsMultiGroupMatch() {
+    IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);
+    expect(serverConfig.getString("commentLink", "ItsTestName", "match"))
+        .andReturn("bug#(\\d)(\\d+)").atLeastOnce();
+
+    replayMocks();
+
+    String ret[] = issueExtractor.getIssueIds("Foo bug#4711 bar");
+    assertEquals("Number of found ids do not match", 1, ret.length);
+    assertEquals("Found issue id does not match", "4", ret[0]);
+
+    assertLogMessageContains("Matching");
+  }
+
+  public void testIssueIdsMulipleMatches() {
+    IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);
+    expect(serverConfig.getString("commentLink", "ItsTestName", "match"))
+        .andReturn("bug#(\\d+)").atLeastOnce();
+
+    replayMocks();
+
+    String ret[] = issueExtractor.getIssueIds("Foo bug#4711 bug#42 bar bug#123");
+    assertEquals("Number of found ids do not match", 3, ret.length);
+    List<String> retList = Arrays.asList(ret);
+    assertTrue("4711 not among the extracted ids", retList.contains("4711"));
+    assertTrue("42 not among the extracted ids", retList.contains("42"));
+    assertTrue("123 not among the extracted ids", retList.contains("123"));
+
+    assertLogMessageContains("Matching");
+  }
+
+  public void testIssueIdsMulipleMatchesWithDuplicates() {
+    IssueExtractor issueExtractor = injector.getInstance(IssueExtractor.class);
+    expect(serverConfig.getString("commentLink", "ItsTestName", "match"))
+        .andReturn("bug#(\\d+)").atLeastOnce();
+
+    replayMocks();
+
+    String ret[] = issueExtractor.getIssueIds("Foo bug#4711 bug#42 bar\n" +
+        "bug#123 baz bug#42");
+    assertEquals("Number of found ids do not match", 3, ret.length);
+    List<String> retList = Arrays.asList(ret);
+    assertTrue("4711 not among the extracted ids", retList.contains("4711"));
+    assertTrue("42 not among the extracted ids", retList.contains("42"));
+    assertTrue("123 not among the extracted ids", retList.contains("123"));
+
+    assertLogMessageContains("Matching");
+  }
+
+  @Override
+  public void setUp() throws Exception {
+    super.setUp();
+
+    injector = Guice.createInjector(new TestModule());
+  }
+
+  private class TestModule extends FactoryModule {
+    @Override
+    protected void configure() {
+      bind(String.class).annotatedWith(ItsName.class)
+          .toInstance("ItsTestName");
+
+      serverConfig = createMock(Config.class);
+      bind(Config.class).annotatedWith(GerritServerConfig.class)
+          .toInstance(serverConfig);
+    }
+  }
+}
\ No newline at end of file
