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/pom.xml b/pom.xml
new file mode 100644
index 0000000..edde056
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,131 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+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/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.googlesource.gerrit.plugins.hooks.jira</groupId>
+  <artifactId>hooks-jira</artifactId>
+  <version>1.0-SNAPSHOT</version>
+  <packaging>jar</packaging>
+
+  <name>hooks-jira</name>
+  <url>http://maven.apache.org</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    <Gerrit-ApiType>plugin</Gerrit-ApiType>
+    <Gerrit-ApiVersion>2.5-SNAPSHOT</Gerrit-ApiVersion>
+  </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-jar-plugin</artifactId>
+        <version>2.4</version>
+        <configuration>
+          <archive>
+            <manifestEntries>
+              <Implementation-Vendor>Gerrit Code Review</Implementation-Vendor>
+              <Implementation-URL>http://code.google.com/p/gerrit/</Implementation-URL>
+
+              <Implementation-Title>Plugin ${project.artifactId}</Implementation-Title>
+              <Implementation-Version>${project.version}</Implementation-Version>
+
+              <Gerrit-ApiType>${Gerrit-ApiType}</Gerrit-ApiType>
+              <Gerrit-ApiVersion>${Gerrit-ApiVersion}</Gerrit-ApiVersion>
+            </manifestEntries>
+          </archive>
+        </configuration>
+      </plugin>
+
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-shade-plugin</artifactId>
+        <version>1.7</version>
+        <executions>
+          <execution>
+            <phase>package</phase>
+            <goals>
+              <goal>shade</goal>
+            </goals>
+            <configuration>
+              <artifactSet>
+                <excludes>
+                  <exclude>com.google.gerrit:*</exclude>
+                  <exclude>org.slf4j:*</exclude>
+                  <exclude>com.google.guava:*</exclude>
+                </excludes>
+              </artifactSet>
+              <transformers>
+                <transformer
+                  implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
+                  <manifestEntries>
+                    <Implementation-Vendor>Gerrit Code Review</Implementation-Vendor>
+                    <Implementation-URL>http://code.google.com/p/gerrit/</Implementation-URL>
+
+                    <Implementation-Title>Plugin ${project.artifactId}</Implementation-Title>
+                    <Implementation-Version>${project.version}</Implementation-Version>
+
+                    <Gerrit-ApiType>${Gerrit-ApiType}</Gerrit-ApiType>
+                    <Gerrit-ApiVersion>${Gerrit-ApiVersion}</Gerrit-ApiVersion>
+                  </manifestEntries>
+                </transformer>
+              </transformers>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <version>4.10</version>
+      <scope>test</scope>
+    </dependency>
+
+    <dependency>
+      <groupId>com.google.gerrit</groupId>
+      <artifactId>gerrit-${Gerrit-ApiType}-api</artifactId>
+      <version>${Gerrit-ApiVersion}</version>
+      <scope>provided</scope>
+    </dependency>
+
+    <dependency>
+      <groupId>com.google.guava</groupId>
+      <artifactId>guava</artifactId>
+      <version>r05</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-api</artifactId>
+      <version>1.6.5</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.xmlrpc</groupId>
+      <artifactId>xmlrpc-client</artifactId>
+      <version>3.1</version>
+    </dependency>
+
+  </dependencies>
+</project>
diff --git a/src/main/java/com/googlesource/gerrit/plugins/hooks/jira/JiraClient.java b/src/main/java/com/googlesource/gerrit/plugins/hooks/jira/JiraClient.java
new file mode 100644
index 0000000..be362b6
--- /dev/null
+++ b/src/main/java/com/googlesource/gerrit/plugins/hooks/jira/JiraClient.java
@@ -0,0 +1,73 @@
+// 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.
+package com.googlesource.gerrit.plugins.hooks.jira;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import org.apache.xmlrpc.XmlRpcException;
+import org.apache.xmlrpc.client.XmlRpcClient;
+import org.apache.xmlrpc.client.XmlRpcClientConfigImpl;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.gerrit.extensions.annotations.Listen;
+import com.google.gerrit.extensions.events.LifecycleListener;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+@Listen
+@Singleton
+public class JiraClient implements LifecycleListener {
+  private static Logger log = LoggerFactory.getLogger(JiraClient.class);
+
+  private final String username;
+  private final String password;
+  private final XmlRpcClientConfigImpl rpcConfig;
+  private final XmlRpcClient rpcClient;
+
+  @Inject
+  public JiraClient(JiraPluginConfig config) throws MalformedURLException {
+    this(config.rpcUrl, config.username, config.password);
+  }
+
+  public JiraClient(final String rpcUrl, final String username,
+      final String password) throws MalformedURLException {
+    this.username = username;
+    this.password = password;
+    rpcConfig = new XmlRpcClientConfigImpl();
+    rpcConfig.setServerURL(new URL(rpcUrl));
+    rpcClient = new XmlRpcClient();
+    rpcClient.setConfig(rpcConfig);
+  }
+
+  public JiraClientSession newSession() throws XmlRpcException {
+    return new JiraClientSession(this.rpcClient, (String) rpcClient.execute(
+        "jira1.login", new Object[] {username, password}));
+  }
+
+  public void start() {
+      try {
+        JiraClientSession session = newSession();
+        session.close();
+      } catch (XmlRpcException e) {
+        log.error("Cannot validate Jira configuration and connectivity", e);
+        throw new RuntimeException(e);
+      }
+  }
+
+  public void stop() {
+  }
+
+}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/hooks/jira/JiraClientSession.java b/src/main/java/com/googlesource/gerrit/plugins/hooks/jira/JiraClientSession.java
new file mode 100644
index 0000000..daa078d
--- /dev/null
+++ b/src/main/java/com/googlesource/gerrit/plugins/hooks/jira/JiraClientSession.java
@@ -0,0 +1,36 @@
+// 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.
+package com.googlesource.gerrit.plugins.hooks.jira;
+
+import org.apache.xmlrpc.XmlRpcException;
+import org.apache.xmlrpc.client.XmlRpcClient;
+
+public class JiraClientSession {
+  private final XmlRpcClient rpc;
+  private String sessionId;
+  
+  public JiraClientSession(XmlRpcClient rpc, String sessionId) {
+    this.rpc = rpc;
+    this.sessionId = sessionId;
+  }
+
+  public void addComment(String matched, String comment) throws XmlRpcException {
+    rpc.execute("jira1.addComment", new String[] { sessionId, matched, comment });
+  }
+
+  public void close() {
+    // Do not really know at the moment if there should be something to release
+    // on the Jira side. Cannot find at the moment a "logout" XML-RPC API for this.
+  }
+}
\ No newline at end of file
diff --git a/src/main/java/com/googlesource/gerrit/plugins/hooks/jira/JiraPluginConfig.java b/src/main/java/com/googlesource/gerrit/plugins/hooks/jira/JiraPluginConfig.java
new file mode 100644
index 0000000..6a08875
--- /dev/null
+++ b/src/main/java/com/googlesource/gerrit/plugins/hooks/jira/JiraPluginConfig.java
@@ -0,0 +1,92 @@
+// 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.
+package com.googlesource.gerrit.plugins.hooks.jira;
+
+import java.io.File;
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import org.eclipse.jgit.api.errors.InvalidConfigurationException;
+import org.eclipse.jgit.lib.Config;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.base.Objects;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.config.SitePath;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+@Singleton
+public class JiraPluginConfig {
+  private static final Logger log = LoggerFactory.getLogger(JiraPluginConfig.class);
+
+  private final Config config;
+  private final File gerritSite;
+
+  public final String username;
+  public final String password;
+  public final String rpcUrl;
+  public final File gitBasePath;
+  public final String issueRegex;
+  public final String gitwebUrl;
+
+  @Inject
+  public JiraPluginConfig(@GerritServerConfig Config gerritConfig,
+      @SitePath File gerritSitePath) throws InvalidConfigurationException, MalformedURLException {
+    this.config = gerritConfig;
+    this.gerritSite = gerritSitePath;
+    this.username = getStringConfig("username");
+    this.password = getStringConfig("password");
+    this.rpcUrl = getStringConfig("rpcUrl");
+    this.gitBasePath =
+        new File(gerritSite, getStringConfigWithDefault("gerrit", "basePath", "git"));
+    this.issueRegex =
+        getStringConfigWithDefault("commentLink", "jira", "match",
+            "(\\[[a-zA-Z0-9]*-[0-9]*\\])");
+    this.gitwebUrl = getGitwebUrl(gerritConfig);
+  }
+
+  private String getGitwebUrl(Config gerritConfig) throws MalformedURLException {
+    String webUrl = gerritConfig.getString("gitweb", null, "url");
+    if (webUrl == null) {
+      if (gerritConfig.getString("gitweb", null, "cgi") != null) {
+        String canonicalUrl =
+            gerritConfig.getString("gerrit", null, "canonicalWebUrl");
+        webUrl = new URL(new URL(canonicalUrl), "gitweb").toExternalForm();
+      }
+    }
+    return webUrl;
+  }
+
+  private String getStringConfigWithDefault(String section, String key,
+      String defaultValue) {
+    return Objects.firstNonNull(config.getString(section, null, key),
+        defaultValue);
+  }
+
+  private String getStringConfigWithDefault(String section, String subsection,
+      String key, String defaultValue) {
+    return Objects.firstNonNull(config.getString(section, subsection, key),
+        defaultValue);
+  }
+
+  private String getStringConfig(String name) throws InvalidConfigurationException {
+    String value = config.getString("jira", null, name);
+    if (value == null)
+      throw new InvalidConfigurationException(
+          "Missing required configuration parameter jira." + name);
+    return value;
+  }
+}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/hooks/jira/RefUpdated.java b/src/main/java/com/googlesource/gerrit/plugins/hooks/jira/RefUpdated.java
new file mode 100644
index 0000000..964bb43
--- /dev/null
+++ b/src/main/java/com/googlesource/gerrit/plugins/hooks/jira/RefUpdated.java
@@ -0,0 +1,149 @@
+// 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.
+
+package com.googlesource.gerrit.plugins.hooks.jira;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.apache.xmlrpc.XmlRpcException;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.lib.RepositoryBuilder;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.gerrit.extensions.annotations.Listen;
+import com.google.gerrit.extensions.events.GitReferenceUpdatedListener;
+import com.google.gerrit.reviewdb.client.Project.NameKey;
+import com.google.gerrit.server.git.LocalDiskRepositoryManager;
+import com.google.inject.Inject;
+
+@Listen
+class RefUpdated implements GitReferenceUpdatedListener {
+  private static final Logger log = LoggerFactory
+      .getLogger(GitReferenceUpdatedListener.class);
+
+  private final JiraClient jiraRpc;
+  private final File gitDir;
+  private final LocalDiskRepositoryManager repositoryManager;
+  private Pattern commentPattern;
+  private Pattern issuePattern = Pattern.compile("[A-Z][A-Z]+-[1-9][0-9]*");
+  private String gitwebUrl;
+
+  @Inject
+  RefUpdated(final JiraClient jiraRpc, JiraPluginConfig config,
+      LocalDiskRepositoryManager repositoryManager) {
+    this.jiraRpc = jiraRpc;
+    this.gitDir = config.gitBasePath;
+    this.commentPattern = Pattern.compile(config.issueRegex);
+    this.gitwebUrl = config.gitwebUrl;
+    this.repositoryManager = repositoryManager;
+  }
+
+  public void onGitReferenceUpdated(Event event) {
+    Repository repo;
+    try {
+      repo =
+          repositoryManager.openRepository(new NameKey(event.getProjectName()));
+    } catch (IOException e) {
+      log.error("Cannot open Gerrit Project " + event.getProjectName(), e);
+      return;
+    }
+
+    try {
+      RevWalk revWalk = new RevWalk(repo);
+      JiraClientSession jira;
+      try {
+        jira = jiraRpc.newSession();
+      } catch (XmlRpcException e) {
+        log.error("Cannot open a new session to Jira", e);
+        return;
+      }
+
+      try {
+        for (Update u : event.getUpdates()) {
+          String newObjId = u.getNewObjectId();
+          if (newObjId == null) {
+            continue;
+          }
+
+          RevCommit commit;
+          try {
+            commit = revWalk.parseCommit(ObjectId.fromString(newObjId));
+          } catch (Exception e) {
+            log.error("Unable to parse commit object " + newObjId
+                + ": skipping to next update event", e);
+            continue;
+          }
+
+          process(jira, event.getProjectName(), u.getRefName(), commit);
+        }
+      } finally {
+        jira.close();
+      }
+    } finally {
+      repo.close();
+    }
+  }
+
+  private void process(JiraClientSession jira, String projectName,
+      String refName, RevCommit commit) {
+    String commitMsg = commit.getFullMessage();
+    Matcher matcher = commentPattern.matcher(commitMsg);
+    while (matcher.find()) {
+      String matched = matcher.group();
+      try {
+        addComment(jira, matched, projectName, refName, commit);
+      } catch (XmlRpcException e) {
+        log.error("Unable to add new comment to Jira issue " + matched, e);
+      }
+    }
+  }
+
+  private void addComment(JiraClientSession jira, String commentMatch,
+      String projectName, String refName, RevCommit commit)
+      throws XmlRpcException {
+    Matcher matcher = issuePattern.matcher(commentMatch);
+    if (!matcher.find()) {
+      return;
+    }
+
+    jira.addComment(matcher.group(), getComment(projectName, refName, commit));
+  }
+
+  private String getComment(String projectName, String refName, RevCommit commit) {
+    String commitId = commit.getName();
+    String comment =
+        String.format("Git commit: %s\n" + "Branch: %s\n" + "Author: %s\n"
+            + "Committer: %s\n" + "%s", commitId, refName,
+            getIdentity(commit.getAuthorIdent()),
+            getIdentity(commit.getCommitterIdent()), commit.getFullMessage());
+    if (gitwebUrl != null) {
+      comment =
+          String.format("%s\n%s?p=%s.git;a=commit;h=%s", comment, gitwebUrl,
+              projectName, commitId);
+    }
+    return comment;
+  }
+
+  private String getIdentity(PersonIdent ident) {
+    return String.format("%s <%s>", ident.getName(), ident.getEmailAddress());
+  }
+}
diff --git a/src/main/resources/Documentation/config.md b/src/main/resources/Documentation/config.md
new file mode 100644
index 0000000..2a763e3
--- /dev/null
+++ b/src/main/resources/Documentation/config.md
@@ -0,0 +1,40 @@
+Plugin @PLUGIN@
+===============
+
+This plugin allows to associate Jira issues to Git commits thanks to
+the Gerrit listener interface.
+
+Comment links
+----------------
+
+Git commits are associated to Jira issues reusing the existing Gerrit
+commitLink configuration to extract the issue ID from commit comments.
+
+Example:
+
+    [commentLink "Jira"]
+    match = (\\[[A-Z][A-Z]+-[1-9][0-9]*\\])
+    html = "<a href=\"http://myjira.com/browse/$1\">$1</a>"
+
+Once a Git commit with a comment link is detected, the Jira issue ID
+is extracted and a new comment added to the issue, pointing back to
+the original Git commit.
+
+Jira connectivity
+----------------
+
+In order for Gerrit to connect to Jira, XML-RPC url and credentials
+are required in your gerrit.config / secure.config under the [jira] section.
+
+Example:
+
+    [jira]
+    username=jirauser
+    passsword=jirapass
+    rpcUrl=http://myjira.com/rpc/xmlrpc
+
+GitWeb integration
+----------------
+
+When Gerrit gitweb is configured, an additional direct link from Jira to GitWeb
+will be created, pointing exactly to the Git commit ID containing the Jira issue ID.
