diff --git a/build.sbt b/build.sbt
index 1bcb710..dc579ab 100644
--- a/build.sbt
+++ b/build.sbt
@@ -1,20 +1,18 @@
-import sbt.Keys._
-
 val gerritApiVersion = "2.13.7"
-
 val pluginName = "analytics"
+val pluginVersion = "1.1-SNAPSHOT"
 
 lazy val root = (project in file("."))
   .settings(
     name := pluginName,
 
-    version := "1.0-SNAPSHOT",
+    version := pluginVersion,
 
     scalaVersion := "2.11.8",
 
     libraryDependencies ++= Seq(
       "io.fabric8" % "gitective-core" % "0.9.19"
-        exclude ("org.eclipse.jgit", "org.eclipse.jgit"),
+        exclude("org.eclipse.jgit", "org.eclipse.jgit"),
 
       "com.google.inject" % "guice" % "3.0" % Provided,
       "com.google.gerrit" % "gerrit-plugin-api" % gerritApiVersion % Provided withSources(),
@@ -36,7 +34,3 @@
     )
   )
 
-
-
-
-
diff --git a/src/main/java/com/googlesource/gerrit/plugins/analytics/CommitInfo.java b/src/main/java/com/googlesource/gerrit/plugins/analytics/CommitInfo.java
deleted file mode 100644
index d7fbd9a..0000000
--- a/src/main/java/com/googlesource/gerrit/plugins/analytics/CommitInfo.java
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright (C) 2016 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.googlesource.gerrit.plugins.analytics;
-
-public class CommitInfo {
-  public final String sha1;
-  public final long date;
-  public final boolean merge;
-
-  public CommitInfo(String sha1, long date, boolean merge) {
-    super();
-    this.sha1 = sha1;
-    this.date = date;
-    this.merge = merge;
-  }
-}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/analytics/ContributorsCommand.java b/src/main/java/com/googlesource/gerrit/plugins/analytics/ContributorsCommand.java
deleted file mode 100644
index 0105ea5..0000000
--- a/src/main/java/com/googlesource/gerrit/plugins/analytics/ContributorsCommand.java
+++ /dev/null
@@ -1,60 +0,0 @@
-// Copyright (C) 2016 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.googlesource.gerrit.plugins.analytics;
-
-import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
-import com.google.gerrit.server.project.ProjectResource;
-import com.google.gerrit.server.project.ProjectsCollection;
-import com.google.gerrit.sshd.CommandMetaData;
-import com.google.gerrit.sshd.SshCommand;
-import com.google.inject.Inject;
-
-import org.kohsuke.args4j.Argument;
-
-import java.io.IOException;
-
-@CommandMetaData(name = "contributors", description = "Extracts the list of contributors to a project")
-public class ContributorsCommand extends SshCommand {
-  private final ProjectsCollection projects;
-  private final ContributorsResource contributors;
-  private final GsonFormatter gsonFmt;
-
-  @Inject
-  public ContributorsCommand(ProjectsCollection projects,
-      ContributorsResource contributors, GsonFormatter gsonFmt) {
-    this.projects = projects;
-    this.contributors = contributors;
-    this.gsonFmt = gsonFmt;
-  }
-
-  @Argument(usage = "project name", metaVar = "PROJECT", required = true)
-  void setProject(String project) throws IllegalArgumentException {
-    try {
-      this.projectRes = projects.parse(project);
-    } catch (UnprocessableEntityException e) {
-      throw new IllegalArgumentException(e.getLocalizedMessage(), e);
-    } catch (IOException e) {
-      throw new IllegalArgumentException(
-          "I/O Error while trying to access project " + project, e);
-    }
-  }
-
-  private ProjectResource projectRes;
-
-  @Override
-  protected void run() throws UnloggedFailure, Failure, Exception {
-    gsonFmt.format(contributors.getStream(projectRes), stdout);
-  }
-}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/analytics/ContributorsResource.java b/src/main/java/com/googlesource/gerrit/plugins/analytics/ContributorsResource.java
deleted file mode 100644
index d9963de..0000000
--- a/src/main/java/com/googlesource/gerrit/plugins/analytics/ContributorsResource.java
+++ /dev/null
@@ -1,72 +0,0 @@
-// 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.analytics;
-
-import com.google.gerrit.extensions.restapi.BinaryResult;
-import com.google.gerrit.extensions.restapi.Response;
-import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.project.ProjectResource;
-import com.google.inject.Inject;
-
-import org.eclipse.jgit.errors.RepositoryNotFoundException;
-import org.eclipse.jgit.lib.Repository;
-
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.PrintWriter;
-import java.util.stream.Stream;
-
-class ContributorsResource implements RestReadView<ProjectResource> {
-  private final GitRepositoryManager repoManager;
-  private final UserSummaryExport userSummary;
-  private final GsonFormatter gsonFmt;
-
-  class JsonStreamedResult<T> extends BinaryResult {
-    private final Stream<T> committers;
-
-    public JsonStreamedResult(Stream<T> committers) {
-      this.committers = committers;
-    }
-
-    @Override
-    public void writeTo(OutputStream os) throws IOException {
-      try (PrintWriter sout = new PrintWriter(os)) {
-        gsonFmt.format(committers, sout);
-      }
-    }
-  }
-
-  @Inject
-  public ContributorsResource(GitRepositoryManager repoManager,
-      UserSummaryExport userSummary, GsonFormatter gsonFmt) {
-    this.repoManager = repoManager;
-    this.userSummary = userSummary;
-    this.gsonFmt = gsonFmt;
-  }
-
-  @Override
-  public Response<BinaryResult> apply(ProjectResource projectRes)
-      throws RepositoryNotFoundException, IOException {
-    return Response.ok(new JsonStreamedResult<>(getStream(projectRes)));
-  }
-
-  public Stream<UserActivitySummary> getStream(ProjectResource projectRes)
-      throws RepositoryNotFoundException, IOException {
-    try (Repository repo = repoManager.openRepository(projectRes.getNameKey())) {
-      return userSummary.getCommittersStream(repo);
-    }
-  }
-}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/analytics/GsonFormatter.java b/src/main/java/com/googlesource/gerrit/plugins/analytics/GsonFormatter.java
deleted file mode 100644
index eecd33b..0000000
--- a/src/main/java/com/googlesource/gerrit/plugins/analytics/GsonFormatter.java
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright (C) 2016 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.googlesource.gerrit.plugins.analytics;
-
-import com.google.gerrit.server.OutputFormat;
-import com.google.gson.Gson;
-import com.google.gson.GsonBuilder;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-
-import java.io.PrintWriter;
-import java.util.stream.Stream;
-
-@Singleton
-public class GsonFormatter {
-  private GsonBuilder gsonBuilder;
-
-  @Inject
-  public GsonFormatter() {
-    gsonBuilder = OutputFormat.JSON_COMPACT.newGsonBuilder();
-  }
-
-  public <T> void format(Stream<T> values, PrintWriter out) {
-    final Gson gson = gsonBuilder.create();
-
-    values.sequential().forEach((T value) -> {
-      gson.toJson(value, out);
-      out.println();
-    });
-  }
-}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/analytics/Module.java b/src/main/java/com/googlesource/gerrit/plugins/analytics/Module.java
deleted file mode 100644
index 3d2f6eb..0000000
--- a/src/main/java/com/googlesource/gerrit/plugins/analytics/Module.java
+++ /dev/null
@@ -1,34 +0,0 @@
-// 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.analytics;
-
-import static com.google.gerrit.server.project.ProjectResource.PROJECT_KIND;
-
-import com.google.gerrit.extensions.restapi.RestApiModule;
-import com.google.inject.AbstractModule;
-
-public class Module extends AbstractModule {
-
-  @Override
-  protected void configure() {
-
-    install(new RestApiModule() {
-      @Override
-      protected void configure() {
-        get(PROJECT_KIND, "contributors").to(ContributorsResource.class);
-      }
-    });
-  }
-}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/analytics/UserActivitySummary.java b/src/main/java/com/googlesource/gerrit/plugins/analytics/UserActivitySummary.java
deleted file mode 100644
index f94d7be..0000000
--- a/src/main/java/com/googlesource/gerrit/plugins/analytics/UserActivitySummary.java
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright (C) 2016 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.googlesource.gerrit.plugins.analytics;
-
-
-import org.eclipse.jgit.lib.ObjectId;
-// import org.gitective.core.stat.UserCommitActivity;
-import org.gitective.core.stat.UserCommitActivity;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class UserActivitySummary {
-  public final String name;
-  public final String email;
-  public final int numCommits;
-  public final List<CommitInfo> commits;
-  public final long lastCommitDate;
-
-
-  public UserActivitySummary(String name, String email, int numCommits,
-      List<CommitInfo> commits, long lastCommitDate) {
-    this.name = name;
-    this.email = email;
-    this.numCommits = numCommits;
-    this.commits = commits;
-    this.lastCommitDate = lastCommitDate;
-  }
-
-  public static UserActivitySummary fromUserActivity(UserCommitActivity uca) {
-    return new UserActivitySummary(uca.getName(), uca.getEmail(),
-        uca.getCount(), getCommits(uca.getIds(), uca.getTimes(),
-            uca.getMerges()), uca.getLatest());
-  }
-
-  private static List<CommitInfo> getCommits(ObjectId[] ids, long[] times,
-      boolean[] merges) {
-    List<CommitInfo> commits = new ArrayList<>(ids.length);
-
-    for (int i = 0; i < ids.length; i++) {
-      commits.add(new CommitInfo(ids[i].name(), times[i], merges[i]));
-    }
-
-    return commits;
-  }
-}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/analytics/UserSummaryExport.java b/src/main/java/com/googlesource/gerrit/plugins/analytics/UserSummaryExport.java
deleted file mode 100644
index 953dc3a..0000000
--- a/src/main/java/com/googlesource/gerrit/plugins/analytics/UserSummaryExport.java
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright (C) 2016 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.googlesource.gerrit.plugins.analytics;
-
-import com.google.inject.Singleton;
-
-import org.eclipse.jgit.lib.Repository;
-import org.gitective.core.CommitFinder;
-import org.gitective.core.stat.AuthorHistogramFilter;
-import org.gitective.core.stat.CommitHistogram;
-import org.gitective.core.stat.CommitHistogramFilter;
-import org.gitective.core.stat.UserCommitActivity;
-
-import java.util.stream.Stream;
-
-@Singleton
-public class UserSummaryExport {
-
-  public Stream<UserActivitySummary> getCommittersStream(Repository repo) {
-    CommitFinder finder = new CommitFinder(repo);
-    CommitHistogramFilter filter = new AuthorHistogramFilter();
-    finder.setFilter(filter).find();
-    CommitHistogram histogram = filter.getHistogram();
-    UserCommitActivity[] authorActivity = histogram.getUserActivity();
-
-    return Stream.of(authorActivity)
-        .parallel()
-        .map(UserActivitySummary::fromUserActivity);
-  }
-}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/analytics/SshModule.java b/src/main/scala/com/googlesource/gerrit/plugins/analytics/CommitInfo.scala
similarity index 70%
rename from src/main/java/com/googlesource/gerrit/plugins/analytics/SshModule.java
rename to src/main/scala/com/googlesource/gerrit/plugins/analytics/CommitInfo.scala
index 7f015f9..d0ac124 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/analytics/SshModule.java
+++ b/src/main/scala/com/googlesource/gerrit/plugins/analytics/CommitInfo.scala
@@ -12,14 +12,6 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.googlesource.gerrit.plugins.analytics;
+package com.googlesource.gerrit.plugins.analytics
 
-import com.google.gerrit.sshd.PluginCommandModule;
-
-public class SshModule extends PluginCommandModule {
-
-  @Override
-  protected void configureCommands() {
-    command(ContributorsCommand.class);
-  }
-}
+case class CommitInfo(val sha1: String, val date: Long, val merge: Boolean)
\ No newline at end of file
diff --git a/src/main/scala/com/googlesource/gerrit/plugins/analytics/ContributorsCommand.scala b/src/main/scala/com/googlesource/gerrit/plugins/analytics/ContributorsCommand.scala
new file mode 100644
index 0000000..a53c632
--- /dev/null
+++ b/src/main/scala/com/googlesource/gerrit/plugins/analytics/ContributorsCommand.scala
@@ -0,0 +1,47 @@
+// Copyright (C) 2016 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.googlesource.gerrit.plugins.analytics
+
+import java.io.IOException
+
+import com.google.gerrit.extensions.restapi.UnprocessableEntityException
+import com.google.gerrit.server.project.{ProjectResource, ProjectsCollection}
+import com.google.gerrit.sshd.{CommandMetaData, SshCommand}
+import com.google.inject.Inject
+import org.kohsuke.args4j.Argument
+
+@CommandMetaData(name = "contributors", description = "Extracts the list of contributors to a project")
+class ContributorsCommand @Inject() (
+  val projects: ProjectsCollection,
+  val contributors: ContributorsResource,
+  val gsonFmt: GsonFormatter) extends SshCommand {
+
+  @Argument(usage = "project name", metaVar = "PROJECT", required = true)
+  def setProject(project: String): Unit = {
+    try {
+      this.projectRes = projects.parse(project)
+    } catch {
+      case e: UnprocessableEntityException =>
+        throw new IllegalArgumentException(e.getLocalizedMessage, e)
+      case e: IOException =>
+        throw new IllegalArgumentException("I/O Error while trying to access project " + project, e)
+    }
+  }
+
+  private var projectRes: ProjectResource = null
+  override protected def run(): Unit = {
+    gsonFmt.format(contributors.get(projectRes), stdout)
+  }
+}
\ No newline at end of file
diff --git a/src/main/scala/com/googlesource/gerrit/plugins/analytics/ContributorsResource.scala b/src/main/scala/com/googlesource/gerrit/plugins/analytics/ContributorsResource.scala
new file mode 100644
index 0000000..3d43a18
--- /dev/null
+++ b/src/main/scala/com/googlesource/gerrit/plugins/analytics/ContributorsResource.scala
@@ -0,0 +1,40 @@
+// Copyright (C) 2016 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.googlesource.gerrit.plugins.analytics
+
+import java.io.{OutputStream, PrintWriter}
+
+import com.google.gerrit.extensions.restapi.{BinaryResult, Response, RestReadView}
+import com.google.gerrit.server.git.GitRepositoryManager
+import com.google.gerrit.server.project.ProjectResource
+import com.google.inject.Inject
+import com.googlesource.gerrit.plugins.analytics.ManagedResource.use
+
+class ContributorsResource @Inject()(val repoManager: GitRepositoryManager,
+                                     val userSummary: UserSummaryExport,
+                                     val gsonFmt: GsonFormatter) extends RestReadView[ProjectResource] {
+
+  private[analytics] class JsonStreamedResult[T](val committers: TraversableOnce[T]) extends BinaryResult {
+    override def writeTo(os: OutputStream) {
+      use(new PrintWriter(os)) { gsonFmt.format(committers, _) }
+    }
+  }
+
+  override def apply(projectRes: ProjectResource): Response[BinaryResult] =
+    Response.ok(new JsonStreamedResult[UserActivitySummary](get(projectRes)))
+
+  def get(projectRes: ProjectResource): TraversableOnce[UserActivitySummary] =
+    use(repoManager.openRepository(projectRes.getNameKey)) { userSummary.getCommitters }
+}
\ No newline at end of file
diff --git a/src/main/scala/com/googlesource/gerrit/plugins/analytics/GsonFormatter.scala b/src/main/scala/com/googlesource/gerrit/plugins/analytics/GsonFormatter.scala
new file mode 100644
index 0000000..d400ad8
--- /dev/null
+++ b/src/main/scala/com/googlesource/gerrit/plugins/analytics/GsonFormatter.scala
@@ -0,0 +1,34 @@
+// Copyright (C) 2016 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.googlesource.gerrit.plugins.analytics
+
+import java.io.PrintWriter
+
+import com.google.gerrit.server.OutputFormat
+import com.google.gson.{Gson, GsonBuilder}
+import com.google.inject.Singleton
+
+@Singleton
+class GsonFormatter {
+  val gsonBuilder: GsonBuilder = OutputFormat.JSON_COMPACT.newGsonBuilder
+
+  def format[T](values: TraversableOnce[T], out: PrintWriter) {
+    val gson: Gson = gsonBuilder.create
+    for (value <- values) {
+      gson.toJson(value, out)
+      out.println()
+    }
+  }
+}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/analytics/SshModule.java b/src/main/scala/com/googlesource/gerrit/plugins/analytics/ManagedResources.scala
similarity index 70%
copy from src/main/java/com/googlesource/gerrit/plugins/analytics/SshModule.java
copy to src/main/scala/com/googlesource/gerrit/plugins/analytics/ManagedResources.scala
index 7f015f9..741f91c 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/analytics/SshModule.java
+++ b/src/main/scala/com/googlesource/gerrit/plugins/analytics/ManagedResources.scala
@@ -12,14 +12,12 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.googlesource.gerrit.plugins.analytics;
+package com.googlesource.gerrit.plugins.analytics
 
-import com.google.gerrit.sshd.PluginCommandModule;
-
-public class SshModule extends PluginCommandModule {
-
-  @Override
-  protected void configureCommands() {
-    command(ContributorsCommand.class);
-  }
+object ManagedResource {
+  def use[A <: { def close(): Unit }, B](resource: A)(code: A ⇒ B): B =
+    try
+      code(resource)
+    finally
+      resource.close()
 }
diff --git a/src/main/scala/com/googlesource/gerrit/plugins/analytics/Module.scala b/src/main/scala/com/googlesource/gerrit/plugins/analytics/Module.scala
new file mode 100644
index 0000000..1c804ad
--- /dev/null
+++ b/src/main/scala/com/googlesource/gerrit/plugins/analytics/Module.scala
@@ -0,0 +1,32 @@
+// Copyright (C) 2016 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.googlesource.gerrit.plugins.analytics
+
+import com.google.gerrit.extensions.restapi.RestApiModule
+import com.google.gerrit.server.project.ProjectResource.PROJECT_KIND
+import com.google.inject.AbstractModule
+
+class Module extends AbstractModule {
+
+  override protected def configure() {
+
+    install(new RestApiModule() {
+
+      override protected def configure() = {
+        get(PROJECT_KIND, "contributors").to(classOf[ContributorsResource])
+      }
+    })
+  }
+}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/analytics/SshModule.java b/src/main/scala/com/googlesource/gerrit/plugins/analytics/SshModule.scala
similarity index 70%
copy from src/main/java/com/googlesource/gerrit/plugins/analytics/SshModule.java
copy to src/main/scala/com/googlesource/gerrit/plugins/analytics/SshModule.scala
index 7f015f9..5995de5 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/analytics/SshModule.java
+++ b/src/main/scala/com/googlesource/gerrit/plugins/analytics/SshModule.scala
@@ -12,14 +12,12 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.googlesource.gerrit.plugins.analytics;
+package com.googlesource.gerrit.plugins.analytics
 
-import com.google.gerrit.sshd.PluginCommandModule;
+import com.google.gerrit.sshd.PluginCommandModule
 
-public class SshModule extends PluginCommandModule {
-
-  @Override
-  protected void configureCommands() {
-    command(ContributorsCommand.class);
+class SshModule extends PluginCommandModule {
+  override protected def configureCommands {
+    command(classOf[ContributorsCommand])
   }
-}
+}
\ No newline at end of file
diff --git a/src/main/scala/com/googlesource/gerrit/plugins/analytics/UserActivitySummary.scala b/src/main/scala/com/googlesource/gerrit/plugins/analytics/UserActivitySummary.scala
new file mode 100644
index 0000000..bde6731
--- /dev/null
+++ b/src/main/scala/com/googlesource/gerrit/plugins/analytics/UserActivitySummary.scala
@@ -0,0 +1,32 @@
+// Copyright (C) 2016 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.googlesource.gerrit.plugins.analytics
+
+import org.eclipse.jgit.lib.ObjectId
+import org.gitective.core.stat.UserCommitActivity
+
+object UserActivitySummary {
+  def fromUserActivity(uca: UserCommitActivity) =
+    UserActivitySummary(uca.getName, uca.getEmail, uca.getCount,
+      getCommits(uca.getIds, uca.getTimes, uca.getMerges), uca.getLatest)
+
+  private def getCommits(ids: Array[ObjectId], times: Array[Long], merges: Array[Boolean]):
+  Array[CommitInfo] = {
+    (ids, times, merges).zipped.map((id, time, merge) => CommitInfo(id.name, time, merge))
+  }
+}
+
+case class UserActivitySummary(name: String, email: String, numCommits: Int,
+                               commits: Array[CommitInfo], lastCommitDate: Long)
\ No newline at end of file
diff --git a/src/main/scala/com/googlesource/gerrit/plugins/analytics/UserSummaryExport.scala b/src/main/scala/com/googlesource/gerrit/plugins/analytics/UserSummaryExport.scala
new file mode 100644
index 0000000..d4a5142
--- /dev/null
+++ b/src/main/scala/com/googlesource/gerrit/plugins/analytics/UserSummaryExport.scala
@@ -0,0 +1,32 @@
+// Copyright (C) 2016 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.googlesource.gerrit.plugins.analytics
+
+import com.google.inject.Singleton
+import org.eclipse.jgit.lib.Repository
+import org.gitective.core.CommitFinder
+import org.gitective.core.stat.AuthorHistogramFilter
+
+@Singleton
+class UserSummaryExport {
+  def getCommitters(repo: Repository): TraversableOnce[UserActivitySummary] = {
+    val finder = new CommitFinder(repo)
+    val filter = new AuthorHistogramFilter
+    finder.setFilter(filter).find
+    val histogram = filter.getHistogram
+    val authorActivity = histogram.getUserActivity
+    authorActivity.par.map(UserActivitySummary.fromUserActivity).toStream
+  }
+}
\ No newline at end of file
