diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..f3f0d6b
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,7 @@
+/target
+/.classpath
+/.project
+/.settings/org.maven.ide.eclipse.prefs
+/.settings/org.eclipse.m2e.core.prefs
+/.settings/org.eclipse.core.resources.prefs
+/.settings/org.eclipse.jdt.core.prefs
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..96228a3
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+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.
+-->
+<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.googlesource.gerrit.plugins.reviewnotes</groupId>
+  <artifactId>reviewnotes</artifactId>
+  <packaging>jar</packaging>
+  <version>1.0-SNAPSHOT</version>
+  <name>reviewnotes</name>
+
+  <properties>
+    <Gerrit-ApiType>plugin</Gerrit-ApiType>
+    <Gerrit-ApiVersion>2.6-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>
+              <Gerrit-Module>com.googlesource.gerrit.plugins.reviewnotes.ReviewNotesModule</Gerrit-Module>
+              <Gerrit-SshModule>com.googlesource.gerrit.plugins.reviewnotes.SshModule</Gerrit-SshModule>
+
+              <Implementation-Vendor>Gerrit Code Review</Implementation-Vendor>
+              <Implementation-URL>http://code.google.com/p/gerrit/</Implementation-URL>
+
+              <Implementation-Title>${Gerrit-ApiType} ${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-compiler-plugin</artifactId>
+        <version>2.3.2</version>
+        <configuration>
+          <source>1.6</source>
+          <target>1.6</target>
+          <encoding>UTF-8</encoding>
+        </configuration>
+      </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>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/googlesource/gerrit/plugins/reviewnotes/CreateReviewNotes.java b/src/main/java/com/googlesource/gerrit/plugins/reviewnotes/CreateReviewNotes.java
new file mode 100644
index 0000000..2041ee5
--- /dev/null
+++ b/src/main/java/com/googlesource/gerrit/plugins/reviewnotes/CreateReviewNotes.java
@@ -0,0 +1,263 @@
+// 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.reviewnotes;
+
+import java.io.IOException;
+import java.util.List;
+
+import javax.annotation.Nullable;
+
+import org.eclipse.jgit.api.errors.ConcurrentRefUpdateException;
+import org.eclipse.jgit.errors.IncorrectObjectTypeException;
+import org.eclipse.jgit.errors.MissingObjectException;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.NullProgressMonitor;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectInserter;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.ProgressMonitor;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.notes.NoteMap;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.gerrit.common.data.ApprovalType;
+import com.google.gerrit.common.data.ApprovalTypes;
+import com.google.gerrit.reviewdb.client.ApprovalCategory;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.PatchSetApproval;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RevId;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.GerritPersonIdent;
+import com.google.gerrit.server.account.AccountCache;
+import com.google.gerrit.server.config.AnonymousCowardName;
+import com.google.gerrit.server.config.CanonicalWebUrl;
+import com.google.gerrit.server.git.NotesBranchUtil;
+import com.google.gwtorm.server.OrmException;
+import com.google.gwtorm.server.ResultSet;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+
+class CreateReviewNotes {
+
+  private static final Logger log =
+      LoggerFactory.getLogger(CreateReviewNotes.class);
+
+  interface Factory {
+    CreateReviewNotes create(ReviewDb reviewDb, Project.NameKey project,
+        Repository git);
+  }
+
+  private static final String REFS_NOTES_REVIEW = "refs/notes/review";
+
+  private final PersonIdent gerritServerIdent;
+  private final AccountCache accountCache;
+  private final String anonymousCowardName;
+  private final ApprovalTypes approvalTypes;
+  private final NotesBranchUtil.Factory notesBranchUtilFactory;
+  private final String canonicalWebUrl;
+  private final ReviewDb reviewDb;
+  private final Project.NameKey project;
+  private final Repository git;
+
+  private ObjectInserter inserter;
+  private NoteMap reviewNotes;
+  private StringBuilder message;
+
+  @Inject
+  CreateReviewNotes(@GerritPersonIdent final PersonIdent gerritIdent,
+      final AccountCache accountCache,
+      final @AnonymousCowardName String anonymousCowardName,
+      ApprovalTypes approvalTypes,
+      final NotesBranchUtil.Factory notesBranchUtilFactory,
+      final @Nullable @CanonicalWebUrl String canonicalWebUrl,
+      final @Assisted ReviewDb reviewDb,
+      final @Assisted Project.NameKey project,
+      final @Assisted Repository git) {
+    this.gerritServerIdent = gerritIdent;
+    this.accountCache = accountCache;
+    this.anonymousCowardName = anonymousCowardName;
+    this.approvalTypes = approvalTypes;
+    this.notesBranchUtilFactory = notesBranchUtilFactory;
+    this.canonicalWebUrl = canonicalWebUrl;
+    this.reviewDb = reviewDb;
+    this.project = project;
+    this.git = git;
+  }
+
+  void createNotes(String branch, ObjectId oldObjectId, ObjectId newObjectId,
+      ProgressMonitor monitor) throws OrmException, IOException {
+    RevWalk rw = new RevWalk(git);
+    try {
+      rw.markStart(rw.parseCommit(newObjectId));
+      markUninteresting(git, branch, rw, oldObjectId);
+    } catch (Exception e) {
+      log.error(e.getMessage(), e);
+      return;
+    }
+
+    if (monitor == null) {
+      monitor = NullProgressMonitor.INSTANCE;
+    }
+
+    try {
+      for (RevCommit c : rw) {
+        ObjectId content = createNoteContent(branch, c);
+        if (content != null) {
+          monitor.update(1);
+          getNotes().set(c, content);
+          getMessage().append("* ").append(c.getShortMessage()).append("\n");
+        }
+      }
+    } finally {
+      rw.release();
+    }
+  }
+
+  void createNotes(List<Change> changes, ProgressMonitor monitor)
+      throws OrmException, IOException {
+    RevWalk rw = new RevWalk(git);
+    try {
+      if (monitor == null) {
+        monitor = NullProgressMonitor.INSTANCE;
+      }
+
+      NoteMap notes = NoteMap.newEmptyMap();
+      for (Change c : changes) {
+        monitor.update(1);
+        PatchSet ps = reviewDb.patchSets().get(c.currentPatchSetId());
+        ObjectId commitId = ObjectId.fromString(ps.getRevision().get());
+        notes.set(commitId,
+            createNoteContent(c.getDest().get(), rw.parseCommit(commitId)));
+      }
+    } finally {
+      rw.release();
+    }
+  }
+
+  void commitNotes() throws IOException, ConcurrentRefUpdateException {
+    try {
+      if (reviewNotes == null) {
+        return;
+      }
+
+      message.insert(0, "Update notes for submitted changes\n\n");
+      notesBranchUtilFactory.create(project, git, inserter)
+          .commitAllNotes(reviewNotes, REFS_NOTES_REVIEW, gerritServerIdent,
+              message.toString());
+    } finally {
+      if (inserter != null) {
+        inserter.release();
+      }
+    }
+  }
+
+  private void markUninteresting(Repository git, String branch, RevWalk rw,
+      ObjectId oldObjectId) {
+    for (final Ref r : git.getAllRefs().values()) {
+      try {
+        if (r.getName().equals(branch)) {
+          if (!ObjectId.zeroId().equals(oldObjectId)) {
+            // For the updated branch the oldObjectId is the tip of uninteresting
+            // commit history
+            rw.markUninteresting(rw.parseCommit(oldObjectId));
+          }
+        } else if (r.getName().startsWith(Constants.R_HEADS)
+            || r.getName().startsWith(Constants.R_TAGS)) {
+          rw.markUninteresting(rw.parseCommit(r.getObjectId()));
+        }
+      } catch (IncorrectObjectTypeException e) {
+        // skip if not parseable as a commit
+      } catch (MissingObjectException e) {
+        // skip if not parseable as a commit
+      } catch (IOException e) {
+        // skip if not parseable as a commit
+      }
+    }
+  }
+
+  private ObjectId createNoteContent(String branch, RevCommit c)
+      throws OrmException, IOException {
+    List<PatchSet> patches = reviewDb.patchSets().byRevision(new RevId(c.name()))
+        .toList();
+    HeaderFormatter fmt =
+        new HeaderFormatter(gerritServerIdent.getTimeZone(), anonymousCowardName);
+    if (patches.isEmpty()) {
+      return null; // TODO: createNoCodeReviewNote(branch, c, fmt);
+    } else if (patches.size() == 1) {
+      createCodeReviewNote(branch, patches.get(0), fmt);
+    } else {
+      log.error("Cannot create review note:"
+          + " more than one patch set found for the commit " + c.name());
+      return null;
+    }
+    return getInseter().insert(Constants.OBJ_BLOB, fmt.toString().getBytes("UTF-8"));
+  }
+
+  private void createCodeReviewNote(String branch, PatchSet ps,
+      HeaderFormatter fmt) throws OrmException {
+    ResultSet<PatchSetApproval> approvals =
+        reviewDb.patchSetApprovals().byPatchSet(ps.getId());
+    PatchSetApproval submit = null;
+    for (PatchSetApproval a : approvals) {
+      if (a.getValue() == 0) {
+        // Ignore 0 values.
+      } else if (ApprovalCategory.SUBMIT.equals(a.getCategoryId())) {
+        submit = a;
+      } else {
+        ApprovalType type = approvalTypes.byId(a.getCategoryId());
+        if (type != null) {
+          fmt.appendApproval(type.getCategory(), a.getValue(),
+              accountCache.get(a.getAccountId()).getAccount());
+        }
+      }
+    }
+    if (submit != null) {
+      fmt.appendSubmittedBy(accountCache.get(submit.getAccountId()).getAccount());
+      fmt.appendSubmittedAt(submit.getGranted());
+    }
+    if (canonicalWebUrl != null) {
+      fmt.appendReviewedOn(canonicalWebUrl, ps.getId().getParentKey());
+    }
+    fmt.appendProject(project.get());
+    fmt.appendBranch(branch);
+  }
+
+  private ObjectInserter getInseter() {
+    if (inserter == null) {
+      inserter = git.newObjectInserter();
+    }
+    return inserter;
+  }
+
+  private NoteMap getNotes() {
+    if (reviewNotes == null) {
+      reviewNotes = NoteMap.newEmptyMap();
+    }
+    return reviewNotes;
+  }
+
+  private StringBuilder getMessage() {
+    if (message == null) {
+      message = new StringBuilder();
+    }
+    return message;
+  }
+}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/reviewnotes/ExportReviewNotes.java b/src/main/java/com/googlesource/gerrit/plugins/reviewnotes/ExportReviewNotes.java
new file mode 100644
index 0000000..770520a
--- /dev/null
+++ b/src/main/java/com/googlesource/gerrit/plugins/reviewnotes/ExportReviewNotes.java
@@ -0,0 +1,190 @@
+// 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.reviewnotes;
+
+import java.io.IOException;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.eclipse.jgit.api.errors.ConcurrentRefUpdateException;
+import org.eclipse.jgit.errors.RepositoryNotFoundException;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.lib.TextProgressMonitor;
+import org.eclipse.jgit.lib.ThreadSafeProgressMonitor;
+import org.eclipse.jgit.util.BlockList;
+import org.kohsuke.args4j.Option;
+
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.sshd.SshCommand;
+import com.google.gwtorm.server.OrmException;
+import com.google.gwtorm.server.SchemaFactory;
+import com.google.inject.Inject;
+
+/** Export review notes for all submitted changes in all projects. */
+public class ExportReviewNotes extends SshCommand {
+  @Option(name = "--threads", usage = "Number of concurrent threads to run")
+  private int threads = 2;
+
+  @Inject
+  private GitRepositoryManager gitManager;
+
+  @Inject
+  private SchemaFactory<ReviewDb> database;
+
+  @Inject
+  private CreateReviewNotes.Factory reviewNotesFactory;
+
+  private Map<Project.NameKey, List<Change>> changes;
+  private ThreadSafeProgressMonitor monitor;
+
+  @Override
+  protected void run() throws Failure, InterruptedException {
+    if (threads <= 0) {
+      threads = 1;
+    }
+
+    List<Change> allChangeList = allChanges();
+    monitor = new ThreadSafeProgressMonitor(new TextProgressMonitor(stdout));
+    monitor.beginTask("Scanning changes", allChangeList.size());
+    changes = cluster(allChangeList);
+    allChangeList = null;
+
+    monitor.startWorkers(threads);
+    for (int tid = 0; tid < threads; tid++) {
+      new Worker().start();
+    }
+    monitor.waitForCompletion();
+    monitor.endTask();
+  }
+
+  private List<Change> allChanges() {
+    ReviewDb db = null;
+    try {
+      db = database.open();
+      return db.changes().all().toList();
+    } catch (OrmException e) {
+      stderr.print("Cannot read changes from database " + e.getMessage());
+      return Collections.emptyList();
+    } finally {
+      if (db != null) {
+        db.close();
+      }
+    }
+  }
+
+  private Map<Project.NameKey, List<Change>> cluster(List<Change> changes) {
+    HashMap<Project.NameKey, List<Change>> m =
+        new HashMap<Project.NameKey, List<Change>>();
+    for (Change change : changes) {
+      if (change.getStatus() == Change.Status.MERGED) {
+        List<Change> l = m.get(change.getProject());
+        if (l == null) {
+          l = new BlockList<Change>();
+          m.put(change.getProject(), l);
+        }
+        l.add(change);
+      } else {
+        monitor.update(1);
+      }
+    }
+    return m;
+  }
+
+  private void export(ReviewDb db, Project.NameKey project, List<Change> changes)
+      throws IOException, OrmException, InterruptedException {
+    final Repository git;
+    try {
+      git = gitManager.openRepository(project);
+    } catch (RepositoryNotFoundException e) {
+      return;
+    }
+    try {
+      CreateReviewNotes crn = reviewNotesFactory.create(db, project, git);
+      crn.createNotes(changes, monitor);
+      crn.commitNotes();
+    } catch (ConcurrentRefUpdateException e) {
+      stderr.print(e.getMessage());
+    } finally {
+      git.close();
+    }
+  }
+
+  private Map.Entry<Project.NameKey, List<Change>> next() {
+    synchronized (changes) {
+      if (changes.isEmpty()) {
+        return null;
+      }
+
+      final Project.NameKey name = changes.keySet().iterator().next();
+      final List<Change> list = changes.remove(name);
+      return new Map.Entry<Project.NameKey, List<Change>>() {
+        @Override
+        public Project.NameKey getKey() {
+          return name;
+        }
+
+        @Override
+        public List<Change> getValue() {
+          return list;
+        }
+
+        @Override
+        public List<Change> setValue(List<Change> value) {
+          throw new UnsupportedOperationException();
+        }
+      };
+    }
+  }
+
+  private class Worker extends Thread {
+    @Override
+    public void run() {
+      ReviewDb db;
+      try {
+        db = database.open();
+      } catch (OrmException e) {
+        stderr.print(e.getMessage());
+        return;
+      }
+      try {
+        for (;;) {
+          Entry<Project.NameKey, List<Change>> next = next();
+          if (next != null) {
+            try {
+              export(db, next.getKey(), next.getValue());
+            } catch (IOException e) {
+              stderr.print(e.getMessage());
+            } catch (OrmException e) {
+              stderr.print(e.getMessage());
+            } catch (InterruptedException e) {
+              stderr.print(e.getMessage());
+            }
+          } else {
+            break;
+          }
+        }
+      } finally {
+        monitor.endWorker();
+        db.close();
+      }
+    }
+  }
+}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/reviewnotes/HeaderFormatter.java b/src/main/java/com/googlesource/gerrit/plugins/reviewnotes/HeaderFormatter.java
new file mode 100644
index 0000000..72a29d2
--- /dev/null
+++ b/src/main/java/com/googlesource/gerrit/plugins/reviewnotes/HeaderFormatter.java
@@ -0,0 +1,113 @@
+// 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.reviewnotes;
+
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.ApprovalCategory;
+import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.reviewdb.client.Change;
+
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.Locale;
+import java.util.TimeZone;
+
+/**
+ * Formatters for code review note headers.
+ * <p>
+ * This class provides a builder like interface for building the content of a
+ * code review note. After instantiation, call as many as necessary
+ * <code>append...(...)</code> methods and, at the end, call the
+ * {@link #toString()} method to get the built note content.
+ */
+class HeaderFormatter {
+
+  private final DateFormat rfc2822DateFormatter;
+  private final String anonymousCowardName;
+  private final StringBuilder sb = new StringBuilder();
+
+  HeaderFormatter(TimeZone tz, String anonymousCowardName) {
+    rfc2822DateFormatter =
+        new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss Z", Locale.US);
+    rfc2822DateFormatter.setCalendar(Calendar.getInstance(tz, Locale.US));
+    this.anonymousCowardName = anonymousCowardName;
+  }
+
+  void appendChangeId(Change.Key changeKey) {
+    sb.append("Change-Id: ").append(changeKey.get()).append("\n");
+  }
+
+  void appendApproval(ApprovalCategory category,
+      short value, Account user) {
+    sb.append(category.getLabelName());
+    sb.append(value < 0 ? "-" : "+").append(Math.abs(value)).append(": ");
+    appendUserData(user);
+    sb.append("\n");
+  }
+
+  private void appendUserData(Account user) {
+    boolean needSpace = false;
+    boolean wroteData = false;
+
+    if (user.getFullName() != null && ! user.getFullName().isEmpty()) {
+      sb.append(user.getFullName());
+      needSpace = true;
+      wroteData = true;
+    }
+
+    if (user.getPreferredEmail() != null && ! user.getPreferredEmail().isEmpty()) {
+      if (needSpace) {
+        sb.append(" ");
+      }
+      sb.append("<").append(user.getPreferredEmail()).append(">");
+      wroteData = true;
+    }
+
+    if (!wroteData) {
+      sb.append(anonymousCowardName).append(" #").append(user.getId());
+    }
+  }
+
+  void appendProject(String projectName) {
+    sb.append("Project: ").append(projectName).append("\n");
+  }
+
+  void appendBranch(String branch) {
+    sb.append("Branch: ").append(branch).append("\n");
+  }
+
+  void appendSubmittedBy(Account user) {
+    sb.append("Submitted-by: ");
+    appendUserData(user);
+    sb.append("\n");
+  }
+
+  void appendSubmittedAt(Date date) {
+    sb.append("Submitted-at: ").append(rfc2822DateFormatter.format(date))
+        .append("\n");
+  }
+
+  void appendReviewedOn(String canonicalWebUrl, Change.Id changeId) {
+    sb.append("Reviewed-on: ").append(canonicalWebUrl).append(changeId.get())
+        .append("\n");
+  }
+
+  @Override
+  public String toString() {
+    return sb.toString();
+  }
+}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/reviewnotes/RefUpdateListener.java b/src/main/java/com/googlesource/gerrit/plugins/reviewnotes/RefUpdateListener.java
new file mode 100644
index 0000000..8dca4ad
--- /dev/null
+++ b/src/main/java/com/googlesource/gerrit/plugins/reviewnotes/RefUpdateListener.java
@@ -0,0 +1,104 @@
+// 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.reviewnotes;
+
+import java.io.IOException;
+
+import org.eclipse.jgit.api.errors.ConcurrentRefUpdateException;
+import org.eclipse.jgit.errors.RepositoryNotFoundException;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Repository;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.gerrit.extensions.events.GitReferenceUpdatedListener;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gwtorm.server.OrmException;
+import com.google.gwtorm.server.SchemaFactory;
+import com.google.inject.Inject;
+
+class RefUpdateListener implements GitReferenceUpdatedListener {
+
+  private static final Logger log =
+      LoggerFactory.getLogger(RefUpdateListener.class);
+
+  private final CreateReviewNotes.Factory reviewNotesFactory;
+  private final SchemaFactory<ReviewDb> schema;
+  private final GitRepositoryManager repoManager;
+
+  @Inject
+  RefUpdateListener(final CreateReviewNotes.Factory reviewNotesFactory,
+      final SchemaFactory<ReviewDb> schema,
+      final GitRepositoryManager repoManager) {
+    this.reviewNotesFactory = reviewNotesFactory;
+    this.schema = schema;
+    this.repoManager = repoManager;
+  }
+
+  @Override
+  public void onGitReferenceUpdated(Event e) {
+    Project.NameKey projectName = new Project.NameKey(e.getProjectName());
+    Repository git;
+    try {
+      git = repoManager.openRepository(projectName);
+    } catch (RepositoryNotFoundException x) {
+      log.error(x.getMessage(), x);
+      return;
+    } catch (IOException x) {
+      log.error(x.getMessage(), x);
+      return;
+    }
+
+    ReviewDb reviewDb;
+    try {
+
+      try {
+        reviewDb = schema.open();
+      } catch (OrmException x) {
+        log.error(x.getMessage(), x);
+        return;
+      }
+
+      try {
+        CreateReviewNotes crn = reviewNotesFactory.create(
+            reviewDb, projectName, git);
+        for (Update u : e.getUpdates()) {
+          if (!u.getRefName().startsWith("refs/heads/")) {
+            continue;
+          }
+          crn.createNotes(u.getRefName(),
+              ObjectId.fromString(u.getOldObjectId()),
+              ObjectId.fromString(u.getNewObjectId()),
+              null);
+        }
+        crn.commitNotes();
+      } catch (OrmException x) {
+        log.error(x.getMessage(), x);
+      } catch (IOException x) {
+        log.error(x.getMessage(), x);
+      } catch (ConcurrentRefUpdateException x) {
+        log.error(x.getMessage(), x);
+      } finally {
+        reviewDb.close();
+      }
+
+    } finally {
+      git.close();
+    }
+
+  }
+}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/reviewnotes/ReviewNotesModule.java b/src/main/java/com/googlesource/gerrit/plugins/reviewnotes/ReviewNotesModule.java
new file mode 100644
index 0000000..a2d4f79
--- /dev/null
+++ b/src/main/java/com/googlesource/gerrit/plugins/reviewnotes/ReviewNotesModule.java
@@ -0,0 +1,29 @@
+// 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.reviewnotes;
+
+import com.google.gerrit.extensions.events.GitReferenceUpdatedListener;
+import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.inject.AbstractModule;
+import com.google.inject.assistedinject.FactoryModuleBuilder;
+
+public class ReviewNotesModule extends AbstractModule {
+  @Override
+  protected void configure() {
+    DynamicSet.bind(binder(), GitReferenceUpdatedListener.class)
+        .to(RefUpdateListener.class);
+    install(new FactoryModuleBuilder().build(CreateReviewNotes.Factory.class));
+  }
+}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/reviewnotes/SshModule.java b/src/main/java/com/googlesource/gerrit/plugins/reviewnotes/SshModule.java
new file mode 100644
index 0000000..62457b0
--- /dev/null
+++ b/src/main/java/com/googlesource/gerrit/plugins/reviewnotes/SshModule.java
@@ -0,0 +1,24 @@
+// 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.reviewnotes;
+
+import com.google.gerrit.sshd.PluginCommandModule;
+
+class SshModule extends PluginCommandModule {
+  @Override
+  protected void configureCommands() {
+    command("export").to(ExportReviewNotes.class);
+  }
+}
diff --git a/src/main/resources/Documentation/cmd-export.md b/src/main/resources/Documentation/cmd-export.md
new file mode 100644
index 0000000..0c06c7e
--- /dev/null
+++ b/src/main/resources/Documentation/cmd-export.md
@@ -0,0 +1,47 @@
+@PLUGIN@ export
+===============
+
+NAME
+----
+@PLUGIN@ export - Export successful reviews to [refs/notes/review](refs-notes-review.html)
+
+SYNOPSIS
+--------
+```
+ssh -p @SSH_PORT@ @SSH_HOST@ @PLUGIN@ export
+  [--threads <N>]
+```
+
+DESCRIPTION
+-----------
+Scans every submitted change and creates an initial notes
+branch detailing the previous submission information for
+each merged change.
+
+This task can take quite some time, but can run in the background
+concurrently to the server if the database is MySQL or PostgreSQL.
+If the database is H2, this task must be run by itself.
+
+ACCESS
+------
+Caller must be a member of the privileged 'Administrators' group.
+
+OPTIONS
+-------
+
+`--threads <N>`
+: Number of concurrent threads to run. By default 2.
+
+CONTEXT
+-------
+This command can only be run on a server which has direct
+connectivity to the metadata database, and local access to the
+managed Git repositories.
+
+EXAMPLES
+--------
+To generate all review information:
+
+```
+  $ java -jar gerrit.war ExportReviewNotes -d site_path --threads 16
+```
diff --git a/src/main/resources/Documentation/refs-notes-review.md b/src/main/resources/Documentation/refs-notes-review.md
new file mode 100644
index 0000000..a504025
--- /dev/null
+++ b/src/main/resources/Documentation/refs-notes-review.md
@@ -0,0 +1,97 @@
+The refs/notes/review namespace
+===============================
+
+Summary
+-------
+
+`refs/notes/review` is a special reference that this plugin creates on
+repositories to store information about code reviews.
+
+When a repository is cloned from Gerrit, the `refs/notes/review` reference is
+not included by default.  It has to be manually fetched:
+
+```
+  $ git fetch origin refs/notes/review:refs/notes/review
+```
+
+It is also possible to [configure git][1] to always to always fetch
+`refs/notes/review`:
+
+```
+  $ git config --add remote.origin.fetch refs/notes/review:refs/notes/review
+  $ git fetch
+```
+
+[1]: http://www.kernel.org/pub/software/scm/git/docs/git-config.html
+
+When `refs/notes/review` is fetched on a repository, the review notes
+information can be included in the git log output:
+
+```
+   $ git log --show-notes=review
+```
+
+Content of refs/notes/review
+----------------------------
+
+For each commit, this plugin stores the following review information in
+`refs/notes/review`:
+
+### Submitted-by
+
+The name and email address of the Gerrit user that submitted the change in
+[RFC 2822][2] format.
+
+[2]: http://www.ietf.org/rfc/rfc2822.txt
+
+```
+  Submitted-by: Random J Developer <random@developer.example.org>
+```
+
+### Submitted-at
+
+The time the commit was submitted in RFC 2822 time stamp format.
+
+```
+  Submitted-at: Mon, 25 Jun 2012 16:15:57 +0200
+```
+
+### Reviewed-on
+
+The URL to the change on the Gerrit server.
+
+```
+  Reviewed-on: http://path.to.gerrit/12345
+```
+
+### Review Labels and Scores
+
+Review label and score, and the name and email address of the Gerrit user that
+gave it in RFC 2822 format:
+
+```
+  Code-Review+2: A. N. Other <another@developer.example.org>
+  Verified+1: A. N. Other <another@developer.example.org>
+```
+
+Commonly used review labels are "Code-Review" and "Verified", but any label
+configured in Gerrit can be included.
+
+All review labels and scores present on the change at the time of submit are
+included.
+
+### Project
+
+The name of the project in which the commit was made.
+
+```
+  Project: kernel/common
+```
+
+### Branch
+
+The name of the branch on which the commit was made.
+
+```
+  Branch: refs/heads/master
+```
