diff --git a/src/test/scala/com/googlesource/gerrit/plugins/analytics/common/BotLikeExtractorImplSpec.scala b/src/test/scala/com/googlesource/gerrit/plugins/analytics/common/BotLikeExtractorImplSpec.scala
index dedab3b..e9f9c7a 100644
--- a/src/test/scala/com/googlesource/gerrit/plugins/analytics/common/BotLikeExtractorImplSpec.scala
+++ b/src/test/scala/com/googlesource/gerrit/plugins/analytics/common/BotLikeExtractorImplSpec.scala
@@ -15,10 +15,10 @@
 package com.googlesource.gerrit.plugins.analytics.common
 
 import com.googlesource.gerrit.plugins.analytics.AnalyticsConfig
-import com.googlesource.gerrit.plugins.analytics.test.GitTestCase
+import com.googlesource.gerrit.plugins.analytics.test.GerritTestDaemon
 import org.scalatest.{FlatSpec, Matchers}
 
-class BotLikeExtractorImplSpec extends FlatSpec with Matchers with GitTestCase {
+class BotLikeExtractorImplSpec extends FlatSpec with Matchers with GerritTestDaemon {
 
   behavior of "isBotLike"
 
@@ -29,7 +29,6 @@
       "some/path/AFile.xml",
       "some/path/AnotherFile.xml"
     )).shouldBe(true)
-
   }
 
   it should "return false when at least one file does not match bot-like identifiers" in {
@@ -39,18 +38,15 @@
       "some/path/AFile.xml",
       "some/path/AnotherFile.someExtension"
     )).shouldBe(false)
-
   }
 
   it should "return false when no bot-like identifiers have been provided" in {
     val extractor = newBotLikeExtractorImpl(List.empty)
 
     extractor.isBotLike(Set("some/path/anyFile")).shouldBe(false)
-
   }
 
   private def newBotLikeExtractorImpl(botLikeRegexps: List[String]) = new BotLikeExtractorImpl(new AnalyticsConfig(null, null) {
     override lazy val botlikeFilenameRegexps = botLikeRegexps
   })
-
 }
diff --git a/src/test/scala/com/googlesource/gerrit/plugins/analytics/common/BranchesExtractorSpec.scala b/src/test/scala/com/googlesource/gerrit/plugins/analytics/common/BranchesExtractorSpec.scala
index 7a15b22..07909ff 100644
--- a/src/test/scala/com/googlesource/gerrit/plugins/analytics/common/BranchesExtractorSpec.scala
+++ b/src/test/scala/com/googlesource/gerrit/plugins/analytics/common/BranchesExtractorSpec.scala
@@ -1,29 +1,28 @@
 package com.googlesource.gerrit.plugins.analytics.common
 
-import com.googlesource.gerrit.plugins.analytics.test.GitTestCase
-import org.eclipse.jgit.internal.storage.file.FileRepository
+import com.google.gerrit.acceptance.UseLocalDisk
+import com.googlesource.gerrit.plugins.analytics.test.GerritTestDaemon
 import org.scalatest.{FlatSpec, Matchers}
 
-class BranchesExtractorSpec extends FlatSpec with Matchers with GitTestCase {
-  def commitsBranches = new BranchesExtractor(new FileRepository(testRepo))
+@UseLocalDisk
+class BranchesExtractorSpec extends FlatSpec with Matchers with GerritTestDaemon {
+  def commitsBranches = new BranchesExtractor(testFileRepository.getRepository)
 
   behavior of "branchesOfCommit"
 
   it should "extract one branch for a commit existing only in one branch" in {
-    add("file", "content")
-    branch("feature/branch")
-    val commit = add("fileOnBranch", "content2")
+    testFileRepository.commitFile("file", "content")
+    testFileRepository.branch("feature/branch", "master")
+    val commit = testFileRepository.commitFile("fileOnBranch", "content2", branch = "feature/branch")
 
-    commitsBranches.branchesOfCommit(commit.getId) shouldBe Set("feature/branch")
-
+    commitsBranches.branchesOfCommit(commit) shouldBe Set("feature/branch")
   }
 
   it should "extract two branches for a commit existing in two different branches" in {
-    val commit = add("file", "content")
-    branch("feature/branch")
-    add("fileOnBranch", "content2")
+    val commit = testFileRepository.commitFile("file", "content")
+    testFileRepository.branch("feature/branch", "master")
+    testFileRepository.commitFile("fileOnBranch", "content2", branch = "feature/branch")
 
-    commitsBranches.branchesOfCommit(commit.getId) shouldBe Set("feature/branch", "master")
-
+    commitsBranches.branchesOfCommit(commit) shouldBe Set("feature/branch", "master")
   }
 }
diff --git a/src/test/scala/com/googlesource/gerrit/plugins/analytics/common/TestUtils.scala b/src/test/scala/com/googlesource/gerrit/plugins/analytics/common/TestUtils.scala
index cef628e..525d3c3 100644
--- a/src/test/scala/com/googlesource/gerrit/plugins/analytics/common/TestUtils.scala
+++ b/src/test/scala/com/googlesource/gerrit/plugins/analytics/common/TestUtils.scala
@@ -1,14 +1,13 @@
 package com.googlesource.gerrit.plugins.analytics.common
 
-import com.googlesource.gerrit.plugins.analytics.test.GitTestCase
+import org.eclipse.jgit.internal.storage.file.FileRepository
 import org.gitective.core.CommitFinder
 
 trait TestUtils {
-  self: GitTestCase =>
 
-  def aggregateBy(strategy: AggregationStrategy): Array[AggregatedUserCommitActivity] = {
+  def aggregateBy(strategy: AggregationStrategy)(implicit testRepository: FileRepository): Array[AggregatedUserCommitActivity] = {
     val filter = new AggregatedHistogramFilterByDates(aggregationStrategy = strategy)
-    new CommitFinder(testRepo).setFilter(filter).find
+    new CommitFinder(testRepository).setFilter(filter).find
     filter.getHistogram.getAggregatedUserActivity
   }
 
diff --git a/src/test/scala/com/googlesource/gerrit/plugins/analytics/common/UserActivityHistogramTest.scala b/src/test/scala/com/googlesource/gerrit/plugins/analytics/common/UserActivityHistogramSpec.scala
similarity index 69%
rename from src/test/scala/com/googlesource/gerrit/plugins/analytics/common/UserActivityHistogramTest.scala
rename to src/test/scala/com/googlesource/gerrit/plugins/analytics/common/UserActivityHistogramSpec.scala
index 282d29f..7dbe121 100644
--- a/src/test/scala/com/googlesource/gerrit/plugins/analytics/common/UserActivityHistogramTest.scala
+++ b/src/test/scala/com/googlesource/gerrit/plugins/analytics/common/UserActivityHistogramSpec.scala
@@ -14,24 +14,23 @@
 
 package com.googlesource.gerrit.plugins.analytics.common
 
+import com.google.gerrit.acceptance.UseLocalDisk
 import com.googlesource.gerrit.plugins.analytics.common.AggregationStrategy.EMAIL_YEAR
-import com.googlesource.gerrit.plugins.analytics.test.GitTestCase
-import org.eclipse.jgit.internal.storage.file.FileRepository
+import com.googlesource.gerrit.plugins.analytics.test.GerritTestDaemon
 import org.scalatest.{FlatSpec, Matchers}
 
-class UserActivityHistogramTest extends FlatSpec with Matchers with GitTestCase {
+@UseLocalDisk
+class UserActivityHistogramSpec extends FlatSpec with Matchers with GerritTestDaemon {
 
   "UserActivityHistogram" should "return no activities" in {
-    val repo = new FileRepository(testRepo)
     val filter = new AggregatedHistogramFilterByDates(aggregationStrategy = EMAIL_YEAR)
-    new UserActivityHistogram().get(repo, filter) should have size 0
+    new UserActivityHistogram().get(testFileRepository.getRepository, filter) should have size 0
   }
 
   it should "aggregate to one activity" in {
-    val repo = new FileRepository(testRepo)
-    add("test.txt", "content")
+    testFileRepository.commitFile("test.txt", "content")
     val filter = new AggregatedHistogramFilterByDates(aggregationStrategy = EMAIL_YEAR)
-    new UserActivityHistogram().get(repo, filter) should have size 1
+    new UserActivityHistogram().get(testFileRepository.getRepository, filter) should have size 1
   }
 
 }
diff --git a/src/test/scala/com/googlesource/gerrit/plugins/analytics/test/AggregatedHistogramFilterByDatesSpec.scala b/src/test/scala/com/googlesource/gerrit/plugins/analytics/test/AggregatedHistogramFilterByDatesSpec.scala
index 4e0895e..3128b2c 100644
--- a/src/test/scala/com/googlesource/gerrit/plugins/analytics/test/AggregatedHistogramFilterByDatesSpec.scala
+++ b/src/test/scala/com/googlesource/gerrit/plugins/analytics/test/AggregatedHistogramFilterByDatesSpec.scala
@@ -16,22 +16,22 @@
 
 import java.util.Date
 
+import com.google.gerrit.acceptance.UseLocalDisk
 import com.googlesource.gerrit.plugins.analytics.common.AggregationStrategy.EMAIL
 import com.googlesource.gerrit.plugins.analytics.common.{AggregatedHistogramFilterByDates, BranchesExtractor}
-import org.eclipse.jgit.internal.storage.file.FileRepository
 import org.eclipse.jgit.lib.PersonIdent
 import org.gitective.core.CommitFinder
 import org.scalatest.{BeforeAndAfterEach, FlatSpec, Matchers}
 
-class AggregatedHistogramFilterByDatesSpec extends FlatSpec with GitTestCase with BeforeAndAfterEach with Matchers {
-
+@UseLocalDisk
+class AggregatedHistogramFilterByDatesSpec extends FlatSpec with GerritTestDaemon with BeforeAndAfterEach with Matchers {
 
   "Author history filter" should
     "select one commit without intervals restriction" in {
 
-    add("file.txt", "some content")
+    testFileRepository.commitFile("file.txt", "some content")
     val filter = new AggregatedHistogramFilterByDates()
-    new CommitFinder(testRepo).setFilter(filter).find
+    new CommitFinder(fileRepository).setFilter(filter).find
 
     val userActivity = filter.getHistogram.getUserActivity
     filter.getHistogram.getUserActivity should have size 1
@@ -42,16 +42,16 @@
   }
 
   it should "select only the second of two commits based on the start timestamp" in {
-    val firstCommitTs = add("file.txt", "some content")
-      .getCommitterIdent.getWhen.getTime
+    val firstCommit = testFileRepository.commitFile("file.txt", "some content")
+    val firstCommitTs = firstCommit.getCommitterIdent.getWhen.getTime
     val person = newPersonIdent("Second person", "second@company.com", new Date(firstCommitTs + 1000L))
-    val secondCommitTs = add("file.txt", "other content", author = person, committer = person)
-      .getCommitterIdent.getWhen.getTime
+    val secondCommit = testFileRepository.commitFile("file.txt", "other content", author = person, committer = person)
+    val secondCommitTs = secondCommit.getCommitterIdent.getWhen.getTime
 
     secondCommitTs should be > firstCommitTs
 
     val filter = new AggregatedHistogramFilterByDates(from = Some(secondCommitTs))
-    new CommitFinder(testRepo).setFilter(filter).find
+    new CommitFinder(fileRepository).setFilter(filter).find
 
     val userActivity = filter.getHistogram.getUserActivity
     userActivity should have size 1
@@ -64,15 +64,15 @@
 
   it should "select only the first of two commits based on the end timestamp" in {
     val person = newPersonIdent("First person", "first@company.com")
-    val firstCommitTs = add("file.txt", "some content", author = person, committer = person)
+    val firstCommitTs = testFileRepository.commitFile("file.txt", "some content", author = person, committer = person)
       .getCommitterIdent.getWhen.getTime
-    val secondCommitTs = add("file.txt", "other content", committer = new PersonIdent(committer, new Date(firstCommitTs + 1000L)))
+    val secondCommitTs = testFileRepository.commitFile("file.txt", "other content", committer = new PersonIdent(committer, new Date(firstCommitTs + 1000L)))
       .getCommitterIdent.getWhen.getTime
 
     secondCommitTs should be > firstCommitTs
 
     val filter = new AggregatedHistogramFilterByDates(to = Some(secondCommitTs))
-    new CommitFinder(testRepo).setFilter(filter).find
+    new CommitFinder(fileRepository).setFilter(filter).find
 
     val userActivity = filter.getHistogram.getUserActivity
     userActivity should have size 1
@@ -84,19 +84,19 @@
   }
 
   it should "select only one middle commit out of three based on interval from/to timestamp" in {
-    val firstCommitTs = add("file.txt", "some content")
+    val firstCommitTs = testFileRepository.commitFile("file.txt", "some content")
       .getCommitterIdent.getWhen.getTime
     val person = newPersonIdent("Middle person", "middle@company.com", new Date(firstCommitTs + 1000L))
-    val middleCommitTs = add("file.txt", "other content", author = person, committer = person)
+    val middleCommitTs = testFileRepository.commitFile("file.txt", "other content", author = person, committer = person)
       .getCommitterIdent.getWhen.getTime
-    val lastCommitTs = add("file.text", "yet other content", committer = new PersonIdent(committer, new Date(middleCommitTs + 1000L)))
+    val lastCommitTs = testFileRepository.commitFile("file.text", "yet other content", committer = new PersonIdent(committer, new Date(middleCommitTs + 1000L)))
       .getCommitterIdent.getWhen.getTime
 
     middleCommitTs should be > firstCommitTs
     lastCommitTs should be > middleCommitTs
 
     val filter = new AggregatedHistogramFilterByDates(from = Some(middleCommitTs), to = Some(lastCommitTs))
-    new CommitFinder(testRepo).setFilter(filter).find
+    new CommitFinder(fileRepository).setFilter(filter).find
 
     val userActivity = filter.getHistogram.getUserActivity
     userActivity should have size 1
@@ -108,16 +108,16 @@
   }
 
   it should "aggregate commits of the same user separately when they are in different branches and branchesExtractor is set" in {
-    val repo = new FileRepository(testRepo)
-    add("file1.txt", "add file1.txt to master branch")
-    branch("another/branch")
-    add("file2.txt", "add file2.txt to another/branch")
+    testFileRepository.commitFile("file1.txt", "add file1.txt to master branch")
+    testFileRepository.branch("another/branch", "master")
+    testFileRepository.commitFile("file2.txt", "add file2.txt to another/branch", branch = "another/branch")
+
     val filter = new AggregatedHistogramFilterByDates(
       aggregationStrategy=EMAIL,
-      branchesExtractor = Some(new BranchesExtractor(repo))
+      branchesExtractor = Some(new BranchesExtractor(fileRepository))
     )
 
-    new CommitFinder(testRepo).setFilter(filter).find
+    new CommitFinder(fileRepository).setFilter(filter).find
     val userActivity = filter.getHistogram.getUserActivity
 
     userActivity should have size 2
diff --git a/src/test/scala/com/googlesource/gerrit/plugins/analytics/test/AggregationSpec.scala b/src/test/scala/com/googlesource/gerrit/plugins/analytics/test/AggregationSpec.scala
index 6725b7e..c3d2087 100644
--- a/src/test/scala/com/googlesource/gerrit/plugins/analytics/test/AggregationSpec.scala
+++ b/src/test/scala/com/googlesource/gerrit/plugins/analytics/test/AggregationSpec.scala
@@ -16,16 +16,20 @@
 
 import java.util.Date
 
+import com.google.gerrit.acceptance.UseLocalDisk
 import com.googlesource.gerrit.plugins.analytics.common.AggregationStrategy._
 import com.googlesource.gerrit.plugins.analytics.common.DateConversions.isoStringToLongDate
 import com.googlesource.gerrit.plugins.analytics.common.TestUtils
 import org.eclipse.jgit.revwalk.RevCommit
 import org.scalatest.{FlatSpec, Inspectors, Matchers}
 
-class AggregationSpec extends FlatSpec with Matchers with GitTestCase with TestUtils with Inspectors {
+@UseLocalDisk
+class AggregationSpec extends FlatSpec with Matchers with GerritTestDaemon with TestUtils with Inspectors {
 
-  def commitAtDate(committer: String, when: String, content: String): RevCommit =
-    commit(committer, "afile.txt", content, new Date(isoStringToLongDate(when)))
+  def commitAtDate(committer: String, when: String, content: String): RevCommit = {
+    val personIdent = newPersonIdent(committer, committer, new Date(isoStringToLongDate(when)))
+    testFileRepository.commitFile("somefile", content, committer = personIdent, author = personIdent)
+  }
 
   "AggregatedHistogramFilter by email and year" should "aggregate two commits from the same author the same year" in {
     commitAtDate("john", "2017-08-01", "first commit")
diff --git a/src/test/scala/com/googlesource/gerrit/plugins/analytics/test/CommitStatisticsCommentLinkSpec.scala b/src/test/scala/com/googlesource/gerrit/plugins/analytics/test/CommitStatisticsCommentLinkSpec.scala
index 2900e69..d263577 100644
--- a/src/test/scala/com/googlesource/gerrit/plugins/analytics/test/CommitStatisticsCommentLinkSpec.scala
+++ b/src/test/scala/com/googlesource/gerrit/plugins/analytics/test/CommitStatisticsCommentLinkSpec.scala
@@ -14,13 +14,15 @@
 
 package com.googlesource.gerrit.plugins.analytics.test
 
+import com.google.gerrit.acceptance.UseLocalDisk
 import com.google.gerrit.extensions.api.projects.CommentLinkInfo
 import com.googlesource.gerrit.plugins.analytics.IssueInfo
 import com.googlesource.gerrit.plugins.analytics.common.{CommitsStatistics, Statistics}
-import org.eclipse.jgit.internal.storage.file.FileRepository
+import org.eclipse.jgit.lib.Repository
 import org.scalatest.{FlatSpec, Inside, Matchers}
 
-class CommitStatisticsCommentLinkSpec extends FlatSpec with GitTestCase with Matchers with Inside {
+@UseLocalDisk
+class CommitStatisticsCommentLinkSpec extends FlatSpec with GerritTestDaemon with Matchers with Inside {
 
   def createCommentLinkInfo(pattern: String, link: Option[String] = None, html: Option[String] = None) = {
     val info = new CommentLinkInfo
@@ -30,7 +32,7 @@
     info
   }
 
-  class TestEnvironment(val repo: FileRepository = new FileRepository(testRepo),
+  class TestEnvironment(val repo: Repository = fileRepository,
                         val commentLinks: List[CommentLinkInfo] = List(
                           createCommentLinkInfo(pattern = "(bug\\s+#?)(\\d+)",
                             link = Some("http://bugs.example.com/show_bug.cgi?id=$2")),
@@ -41,39 +43,37 @@
   }
 
   it should "collect no commentslink if no matching" in new TestEnvironment {
-    val nocomments = commit("user", "file1.txt", "content1")
+    val nocomments = testFileRepository.commitFile("file1.txt", "content1")
 
     inside(stats.forCommits(nocomments)) {
       case List(s: CommitsStatistics) =>
         s.issues should have size 0
     }
-
   }
   it should "collect simple bugzilla comments" in new TestEnvironment {
-    val simpleComment = commit("user", "file1.txt", "content2", message =
-      Some("this solves bug #23"))
+    val simpleComment = testFileRepository.commitFile("file1.txt", "content2", message =
+      "this solves bug #23")
 
     inside(stats.forCommits(simpleComment)) {
       case List(s: CommitsStatistics) =>
         s.issues should have size 1
         s.issues should contain(IssueInfo("bug #23", "http://bugs.example.com/show_bug.cgi?id=23"))
     }
-
   }
   it should "collect simple track link" in new TestEnvironment {
-    val simpleTrackComment = commit("user", "file1.txt", "content3", message
-      = Some("this solves Bug: 1234"))
+    val simpleTrackComment = testFileRepository.commitFile("file1.txt", "content3", message
+      = "this solves Bug: 1234")
 
     inside(stats.forCommits(simpleTrackComment)) {
       case List(s: CommitsStatistics) =>
         s.issues should have size 1
         s.issues should contain(IssueInfo("Bug: 1234", "Bug: <a href=\"http://trak.example.com/1234\">1234</a>"))
     }
-
   }
+
   it should "collect multiple links" in new TestEnvironment {
-    val multipleComments = commit("user", "file1.txt", "content4", message =
-      Some("this solves bug 12 and Bug: 23"))
+    val multipleComments = testFileRepository.commitFile("file1.txt", "content4", message =
+      "this solves bug 12 and Bug: 23")
 
     inside(stats.forCommits(multipleComments)) {
       case List(s: CommitsStatistics) =>
@@ -82,7 +82,5 @@
           IssueInfo("Bug: 23", "Bug: <a href=\"http://trak.example.com/23\">23</a>")
         )
     }
-
   }
-
 }
diff --git a/src/test/scala/com/googlesource/gerrit/plugins/analytics/test/CommitStatisticsSpec.scala b/src/test/scala/com/googlesource/gerrit/plugins/analytics/test/CommitStatisticsSpec.scala
index 332c724..4b56f7c 100644
--- a/src/test/scala/com/googlesource/gerrit/plugins/analytics/test/CommitStatisticsSpec.scala
+++ b/src/test/scala/com/googlesource/gerrit/plugins/analytics/test/CommitStatisticsSpec.scala
@@ -14,21 +14,21 @@
 
 package com.googlesource.gerrit.plugins.analytics.test
 
+import com.google.gerrit.acceptance.UseLocalDisk
 import com.googlesource.gerrit.plugins.analytics.CommitInfo
 import com.googlesource.gerrit.plugins.analytics.common.{CommitsStatistics, Statistics}
-import org.eclipse.jgit.internal.storage.file.FileRepository
 import org.scalatest.{FlatSpec, Inside, Matchers}
 
-class CommitStatisticsSpec extends FlatSpec with GitTestCase with Matchers with Inside {
-
+@UseLocalDisk
+class CommitStatisticsSpec extends FlatSpec with GerritTestDaemon with Matchers with Inside {
 
   class TestEnvironment {
-    val repo = new FileRepository(testRepo)
+    val repo = fileRepository
     val stats = new Statistics(repo, TestBotLikeExtractor)
   }
 
   "CommitStatistics" should "stats a single file added" in new TestEnvironment {
-    val change = commit("user", "file1.txt", "line1\nline2")
+    val change = testFileRepository.commitFile("file1.txt", "line1\nline2")
 
     inside(stats.forCommits(change)) { case List(s: CommitsStatistics) =>
       s.numFiles should be(1)
@@ -54,12 +54,12 @@
   }
 
   it should "stats multiple files added" in new TestEnvironment {
-    val initial = commit("user", "file1.txt", "line1\nline2\n")
-    val second = add(testRepo,
+    val initial = testFileRepository.commitFile("file1.txt", "line1\nline2\n")
+    val second = testFileRepository.commitFiles(
       List(
         "file1.txt" -> "line1\n",
         "file2.txt" -> "line1\nline2\n"
-      ), "second commit")
+      ), message = "second commit")
 
     inside(stats.forCommits(second)) { case List(s: CommitsStatistics) =>
       s.numFiles should be(2)
@@ -69,8 +69,8 @@
   }
 
   it should "stats lines eliminated" in new TestEnvironment {
-    val initial = commit("user", "file1.txt", "line1\nline2\nline3")
-    val second = commit("user", "file1.txt", "line1\n")
+    val initial = testFileRepository.commitFile( "file1.txt", "line1\nline2\nline3")
+    val second = testFileRepository.commitFile( "file1.txt", "line1\n")
     inside(stats.forCommits(second)) { case List(s: CommitsStatistics) =>
       s.numFiles should be(1)
       s.addedLines should be(0)
@@ -79,17 +79,17 @@
   }
 
   it should "stats a Seq[RevCommit]" in new TestEnvironment {
-    val initial = add(testRepo,
+    val initial = testFileRepository.commitFiles(
       List(
         "file1.txt" -> "line1\n",
         "file3.txt" -> "line1\nline2\n"),
-      "first commit")
+      message = "first commit")
 
-    val second = add(testRepo,
+    val second = testFileRepository.commitFiles(
       List(
         "file1.txt" -> "line1a\n",
         "file2.txt" -> "line1\nline2\n"),
-      "second commit")
+      message = "second commit")
 
     inside(stats.forCommits(initial, second)) { case List(nonMergeStats: CommitsStatistics) =>
       nonMergeStats.numFiles should be(4)
@@ -100,7 +100,7 @@
   }
 
   it should "return zero value stats if the commit does not include any file" in new TestEnvironment {
-    val emptyCommit = add(testRepo, List.empty, "Empty commit")
+    val emptyCommit = testFileRepository.commitFiles(List.empty, message = "Empty commit")
     inside(stats.forCommits(emptyCommit)) { case List(stats) =>
       stats.numFiles should be(0)
       stats.addedLines should be(0)
@@ -109,13 +109,15 @@
   }
 
   it should "split merge commits and non-merge commits" in new TestEnvironment {
-    val firstNonMerge = commit("user", "file1.txt", "line1\nline2\n")
-    val merge = mergeCommit("user", "file1.txt", "line1\nline2\nline3")
-    val nonMerge = add(testRepo,
+    val clonedRepo = testFileRepository.gitClone
+    val firstNonMerge = clonedRepo.commitFile("file1.txt", "line1\nline2\n")
+    val merge = clonedRepo.mergeCommitFile("file1.txt", "line1\nline2\nline3")
+    val nonMerge = clonedRepo.commitFiles(
       List(
         "file1.txt" -> "line1\n",
         "file2.txt" -> "line1\nline2\n"),
-      "second commit")
+      message = "second commit")
+    clonedRepo.push
 
     inside(stats.forCommits(firstNonMerge, merge.getNewHead, nonMerge)) {
       case List(nonMergeStats, mergeStats) =>
diff --git a/src/test/scala/com/googlesource/gerrit/plugins/analytics/test/GerritTestDaemon.scala b/src/test/scala/com/googlesource/gerrit/plugins/analytics/test/GerritTestDaemon.scala
new file mode 100644
index 0000000..6e6f457
--- /dev/null
+++ b/src/test/scala/com/googlesource/gerrit/plugins/analytics/test/GerritTestDaemon.scala
@@ -0,0 +1,146 @@
+// Copyright (C) 2017 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.test
+
+import java.io.File
+import java.util.{Date, UUID}
+
+import com.google.gerrit.acceptance.{AbstractDaemonTest, GitUtil}
+import com.google.gerrit.reviewdb.client.Project
+import org.eclipse.jgit.api.MergeCommand.FastForwardMode
+import org.eclipse.jgit.api.{Git, MergeResult}
+import org.eclipse.jgit.internal.storage.file.FileRepository
+import org.eclipse.jgit.junit.TestRepository
+import org.eclipse.jgit.lib._
+import org.eclipse.jgit.merge.MergeStrategy
+import org.eclipse.jgit.revwalk.RevCommit
+import org.gitective.core.CommitUtils
+import org.junit.runner.Description
+import org.junit.runners.model.Statement
+import org.scalatest._
+
+trait GerritTestDaemon extends BeforeAndAfterEach {
+  self: Suite =>
+
+  type TestFileRepository = TestRepository[FileRepository]
+
+  val daemonTest = GerritTestDaemon
+
+  protected abstract override def runTest(testName: String, args: Args): Status = {
+    var status: Status = FailedStatus
+    val runLambda = () => super.runTest(testName, args)
+
+    daemonTest.testRunner.apply(new Statement() {
+      override def evaluate(): Unit = {
+        status = runLambda.apply()
+      }
+    }, Description.createTestDescription(getClass.getName, testName)).evaluate()
+
+    status
+  }
+
+  var testFileRepository: TestFileRepository = _
+
+  implicit var fileRepository: FileRepository = _
+
+  protected lazy val author = newPersonIdent("Test Author", "author@test.com")
+
+  protected lazy val committer = newPersonIdent("Test Committer", "committer@test.com")
+
+  def newPersonIdent(name: String = "Test Person", email: String = "person@test.com", ts: Date = new Date()) =
+    new PersonIdent(new PersonIdent(name, email), ts)
+
+  override def beforeEach {
+    fileRepository = daemonTest.getRepository(
+      daemonTest.newProject(testSpecificRepositoryName))
+
+    testFileRepository = GitUtil.newTestRepository(fileRepository)
+  }
+
+  private def testSpecificRepositoryName = "git-test-case-" + UUID.randomUUID().toString
+
+  implicit class PimpedGitRepository(repo: TestFileRepository) {
+
+    def branch(name: String, startPoint: String): Ref =
+      repo.git.branchCreate.setName(name).setStartPoint(startPoint).call
+
+    def gitClone: TestFileRepository = {
+      val TmpDir = System.getProperty("java.io.tmpdir")
+      val clonedRepository = Git.cloneRepository
+        .setDirectory(new File(s"$TmpDir/${testSpecificRepositoryName}_clone"))
+        .setURI(repo.getRepository.getDirectory.toURI.toString)
+        .call()
+        .getRepository.asInstanceOf[FileRepository]
+
+      GitUtil.newTestRepository(clonedRepository)
+    }
+
+    def commitFile(path: String, content: String, author: PersonIdent = author, committer: PersonIdent = committer, branch: String = Constants.MASTER, message: String = ""): RevCommit =
+      repo.branch(branch).commit()
+        .add(path, content)
+        .author(author)
+        .committer(committer)
+        .message(message)
+        .create
+
+    def commitFiles(files: Iterable[(String, String)], author: PersonIdent = author, committer: PersonIdent = committer, branch: String = Constants.MASTER, message: String = ""): RevCommit = {
+      val commit = repo.branch(branch).commit()
+        .author(author)
+        .committer(committer)
+        .message(message)
+
+      files.foldLeft(commit) {
+        (commit, fileAndContent) => commit.add(fileAndContent._1, fileAndContent._2)
+      }.create()
+    }
+
+    def mergeCommitFile(fileName: String, content: String, author: PersonIdent = author, committer: PersonIdent = committer): MergeResult = {
+      val currentBranch = repo.getRepository.getFullBranch
+      val tmpBranch = repo.branch("tmp", currentBranch)
+      try {
+        repo.commitFile(fileName, content, branch = tmpBranch.getName, author = author, committer = committer)
+        repo.mergeBranch(tmpBranch.getName, withCommit = true)
+      } finally {
+        repo.git.branchDelete().setBranchNames(tmpBranch.getName).setForce(true).call.get(0)
+      }
+    }
+
+    def mergeBranch(branch: String, withCommit: Boolean, message: String = "merging branch"): MergeResult = {
+      repo.git.merge.setStrategy(MergeStrategy.RESOLVE)
+        .include(CommitUtils.getRef(repo.getRepository, branch))
+        .setCommit(withCommit)
+        .setFastForward(FastForwardMode.NO_FF)
+        .setMessage(message)
+        .call
+    }
+
+    def push =
+      repo.git.push.setPushAll.call
+  }
+}
+
+object GerritTestDaemon extends AbstractDaemonTest {
+  baseConfig = new Config()
+
+  def newProject(nameSuffix: String) = {
+    resourcePrefix = ""
+    super.createProject(nameSuffix, allProjects, false)
+  }
+
+  def getRepository(projectName: Project.NameKey): FileRepository =
+    repoManager.openRepository(projectName).asInstanceOf[FileRepository]
+
+  def adminAuthor = admin.getIdent
+}
\ No newline at end of file
diff --git a/src/test/scala/com/googlesource/gerrit/plugins/analytics/test/GitTestCase.scala b/src/test/scala/com/googlesource/gerrit/plugins/analytics/test/GitTestCase.scala
deleted file mode 100644
index c7a3850..0000000
--- a/src/test/scala/com/googlesource/gerrit/plugins/analytics/test/GitTestCase.scala
+++ /dev/null
@@ -1,432 +0,0 @@
-//
-// Copyright (c) 2011 Kevin Sawicki <kevinsawicki@gmail.com>
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to
-// deal in the Software without restriction, including without limitation the
-// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-// sell copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-// IN THE SOFTWARE.
-//
-// Copyright (C) 2017 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.test
-
-import java.io.{File, PrintWriter}
-import java.nio.file.Files
-import java.text.MessageFormat
-import java.util.Date
-
-import com.googlesource.gerrit.plugins.analytics.common.DateConversions.isoStringToLongDate
-import com.googlesource.gerrit.plugins.analytics.common.ManagedResource.use
-import org.eclipse.jgit.api.MergeCommand.FastForwardMode
-import org.eclipse.jgit.api.{Git, MergeResult}
-import org.eclipse.jgit.api.errors.GitAPIException
-import org.eclipse.jgit.lib.{Constants, PersonIdent, Ref}
-import org.eclipse.jgit.merge.MergeStrategy
-import org.eclipse.jgit.notes.Note
-import org.eclipse.jgit.revwalk.RevCommit
-import org.gitective.core.CommitUtils
-import org.scalatest.{BeforeAndAfterEach, Suite}
-import com.googlesource.gerrit.plugins.analytics.common.DateConversions._
-
-
-/**
-  * Base test case with utilities for common Git operations performed during
-  * testing
-  */
-trait GitTestCase extends BeforeAndAfterEach {
-  self: Suite =>
-  /**
-    * Test repository .git directory
-    */
-  protected var testRepo: File = null
-
-  /**
-    * Author used for commits
-    */
-  protected val author = new PersonIdent("Test Author", "author@test.com")
-
-  def newPersonIdent(name: String = "Test Person", email: String = "person@test.com", ts: Date = new Date()) =
-    new PersonIdent(new PersonIdent(name, email), ts)
-
-  /**
-    * Committer used for commits
-    */
-  protected val committer = new PersonIdent("Test Committer", "committer@test.com")
-
-  /**
-    * Set up method that initializes git repository
-    *
-    *
-    */
-
-  override def beforeEach = {
-    testRepo = initRepo
-  }
-
-  /**
-    * Initialize a new repo in a new directory
-    *
-    * @return created .git folder
-    * @throws GitAPIException
-    */
-  protected def initRepo: File = {
-    val dir = Files.createTempDirectory(threadSpecificDirectoryPrefix).toFile
-    Git.init.setDirectory(dir).setBare(false).call
-    val repo = new File(dir, Constants.DOT_GIT)
-    assert(repo.exists)
-    repo.deleteOnExit()
-    repo
-  }
-
-  private def threadSpecificDirectoryPrefix =
-    "git-test-case-" + Thread.currentThread().getName.replaceAll("~[0-9a-zA-Z]", "_") + System.nanoTime
-
-  /**
-    * Create branch with name and checkout
-    *
-    * @param name
-    * @return branch ref
-    *
-    */
-  protected def branch(name: String): Ref = branch(testRepo, name)
-
-  /**
-    * Delete branch with name
-    *
-    * @param name
-    * @return branch ref
-    *
-    */
-  protected def deleteBranch(name: String): String = deleteBranch(testRepo, name)
-
-  /**
-    * Create branch with name and checkout
-    *
-    * @param repo
-    * @param name
-    * @return branch ref
-    *
-    */
-  protected def branch(repo: File, name: String): Ref = {
-    use(Git.open(repo)) { git =>
-      git.branchCreate.setName(name).call
-      checkout(repo, name)
-    }
-  }
-
-  /**
-    * Delete branch with name
-    *
-    * @param repo
-    * @param name
-    * @return branch ref
-    *
-    */
-  protected def deleteBranch(repo: File, name: String): String = {
-    use(Git.open(repo)) { git =>
-      git.branchDelete().setBranchNames(name).setForce(true).call.get(0)
-    }
-  }
-
-  /**
-    * Checkout branch
-    *
-    * @param name
-    * @return branch ref
-    *
-    */
-  protected def checkout(name: String): Ref = checkout(testRepo, name)
-
-  /**
-    * Checkout branch
-    *
-    * @param repo
-    * @param name
-    * @return branch ref
-    *
-    */
-  @throws[Exception]
-  protected def checkout(repo: File, name: String): Ref = {
-    use(Git.open(repo)) { git =>
-      git.checkout.setName(name).call
-    }
-  } ensuring(_ != null, "Unable to checkout result")
-
-  /**
-    * Create tag with name
-    *
-    * @param name
-    * @return tag ref
-    *
-    */
-  protected def tag(name: String): Ref = tag(testRepo, name)
-
-  /**
-    * Create tag with name
-    *
-    * @param repo
-    * @param name
-    * @return tag ref
-    *
-    */
-  protected def tag(repo: File, name: String): Ref = {
-    use(Git.open(repo)) { git =>
-      git.tag.setName(name).setMessage(name).call
-      git.getRepository.getTags.get(name)
-    }
-  } ensuring(_ != null, s"Unable to tag file $name")
-
-  /**
-    * Add file to test repository
-    *
-    * @param path
-    * @param content
-    * @return commit
-    *
-    */
-  protected def add(path: String, content: String, author: PersonIdent = author, committer: PersonIdent = committer): RevCommit = add(testRepo, path, content, author, committer)
-
-  /**
-    * Add file to test repository
-    *
-    * @param repo
-    * @param path
-    * @param content
-    * @return commit
-    *
-    */
-  protected def add(repo: File, path: String, content: String, author: PersonIdent, committer: PersonIdent): RevCommit = {
-    val message = MessageFormat.format("Committing {0} at {1}", path, new Date)
-    add(repo, path, content, message, author, committer)
-  }
-
-
-  /**
-    * Add file to test repository
-    *
-    * @param repo
-    * @param path
-    * @param content
-    * @param message
-    * @return commit
-    *
-    */
-  protected def add(repo: File, path: String, content: String, message: String, author: PersonIdent, committer: PersonIdent): RevCommit = {
-    val file = new File(repo.getParentFile, path)
-    if (!file.getParentFile.exists) assert(file.getParentFile.mkdirs)
-    if (!file.exists) assert(file.createNewFile)
-
-    val writer = new PrintWriter(file)
-    try
-      writer.print(Option(content).fold("")(identity))
-    finally writer.close()
-
-    use(Git.open(repo)) { git =>
-      git.add.addFilepattern(path).call
-      git.commit.setOnly(path).setMessage(message).setAuthor(author).setCommitter(committer).call
-    }
-  }  ensuring (_ != null, s"Unable to commit addition of path $path")
-
-  /**
-    * Move file in test repository
-    *
-    * @param from
-    * @param to
-    * @return commit
-    *
-    */
-  protected def mv(from: String, to: String): RevCommit = mv(testRepo, from, to, MessageFormat.format("Moving {0} to {1} at {2}", from, to, new Date))
-
-  /**
-    * Move file in test repository
-    *
-    * @param from
-    * @param to
-    * @param message
-    * @return commit
-    *
-    */
-  protected def mv(from: String, to: String, message: String): RevCommit = mv(testRepo, from, to, message)
-
-  /**
-    * Move file in test repository
-    *
-    * @param repo
-    * @param from
-    * @param to
-    * @param message
-    * @return commit
-    *
-    */
-  protected def mv(repo: File, from: String, to: String, message: String): RevCommit = {
-    val file = new File(repo.getParentFile, from)
-    file.renameTo(new File(repo.getParentFile, to))
-
-    use(Git.open(testRepo)) { git =>
-      git.rm.addFilepattern(from)
-      git.add.addFilepattern(to).call
-      git.commit.setAll(true).setMessage(message).setAuthor(author).setCommitter(committer).call
-    }
-  } ensuring (_ != null, "Unable to commit MV operation")
-
-  /**
-    * Add files to test repository
-    *
-    * @param contents iterable of file names and associated content
-    * @return commit
-    *
-    */
-  protected def add(contents: Iterable[(String, String)]): RevCommit = add(testRepo, contents, "Committing multiple files")
-
-  /**
-    * Add files to test repository
-    *
-    * @param repo
-    * @param contents iterable of file names and associated content
-    * @param message
-    * @return commit
-    *
-    */
-  protected def add(repo: File, contents: Iterable[(String, String)], message: String): RevCommit = {
-    use(Git.open(testRepo)) { git =>
-      var i = 0
-      contents.foreach { case (path, content) =>
-        val file = new File(repo.getParentFile, path)
-        if (!file.getParentFile.exists) require(file.getParentFile.mkdirs, s"Cannot create parent dir '${file.getParent}'")
-        if (!file.exists) require(file.createNewFile, s"Cannot create file '$file'")
-        val writer = new PrintWriter(file)
-        try
-          writer.print(content)
-        finally writer.close()
-        git.add.addFilepattern(path).call
-      }
-
-      git.commit.setMessage(message).setAuthor(author).setCommitter(committer).call
-    }
-  } ensuring (_ != null, "Unable to commit content addition")
-
-  /**
-    * Merge given branch into current branch
-    *
-    * @param branch
-    * @return result
-    *
-    */
-  protected def mergeBranch(branch: String, withCommit: Boolean): MergeResult = {
-    use(Git.open(testRepo)) { git =>
-      git.merge.setStrategy(MergeStrategy.RESOLVE).include(CommitUtils.getRef(git.getRepository, branch)).setCommit(withCommit).setFastForward(FastForwardMode.NO_FF).setMessage(s"merging branch $branch").call
-    }
-  }
-
-    /**
-    * Merge ref into current branch
-    *
-    * @param ref
-    * @return result
-    *
-    */
-  protected def merge(ref: String): MergeResult = {
-    use(Git.open(testRepo)) { git =>
-      git.merge.setStrategy(MergeStrategy.RESOLVE).include(CommitUtils.getCommit(git.getRepository, ref)).call
-    }
-  }
-
-  /**
-    * Add note to latest commit with given content
-    *
-    * @param content
-    * @return note
-    *
-    */
-  protected def note(content: String): Note = note(content, "commits")
-
-  /**
-    * Add note to latest commit with given content
-    *
-    * @param content
-    * @param ref
-    * @return note
-    *
-    */
-  protected def note(content: String, ref: String): Note = {
-    use(Git.open(testRepo)) { git =>
-      git.notesAdd.setMessage(content).setNotesRef(Constants.R_NOTES + ref).setObjectId(CommitUtils.getHead(git.getRepository)).call
-    }
-  } ensuring (_ != null, "Unable to add note")
-
-  /**
-    * Delete and commit file at path
-    *
-    * @param path
-    * @return commit
-    *
-    */
-  protected def delete(path: String): RevCommit = {
-    val message = MessageFormat.format("Committing {0} at {1}", path, new Date)
-    use(Git.open(testRepo)) { git =>
-      git.rm.addFilepattern(path).call
-      git.commit.setOnly(path).setMessage(message).setAuthor(author).setCommitter(committer).call
-    }
-  } ensuring (_ != null, "Unable to commit delete operation")
-
-  /**
-    * commit specified content into a file, as committer
-    *
-    * @param committer - the author of this commit
-    * @param fileName - the name of the file
-    * @param content - the content of the file
-    * @param when - the date of the commit
-    * @return RevCommit
-    *
-    */
-  protected def commit(committer: String, fileName: String, content: String, when: Date = new Date(), message: Option[String] = None): RevCommit = {
-    val person = newPersonIdent(committer, committer, when)
-    add(testRepo, fileName, content, author = person, committer = author, message = message.getOrElse("** no message **"))
-  }
-
-  /**
-    * commit specified content into a file, as committer and merge into current branch
-    *
-    * @param committer - the author of this commit
-    * @param fileName - the name of the file
-    * @param content - the content of the file
-    * @return MergeResult
-    *
-    */
-  protected def mergeCommit(committer: String, fileName: String, content: String): MergeResult = {
-    val currentBranch = Git.open(testRepo).getRepository.getBranch
-    val tmpBranch = branch(testRepo, "tmp")
-    try {
-      commit(committer, fileName, content)
-      checkout(currentBranch)
-      mergeBranch(tmpBranch.getName, withCommit = true)
-    } finally {
-      deleteBranch(testRepo, tmpBranch.getName)
-    }
-  }
-}
\ No newline at end of file
diff --git a/src/test/scala/com/googlesource/gerrit/plugins/analytics/test/UserActivitySummarySpec.scala b/src/test/scala/com/googlesource/gerrit/plugins/analytics/test/UserActivitySummarySpec.scala
index de4d2f2..a783290 100644
--- a/src/test/scala/com/googlesource/gerrit/plugins/analytics/test/UserActivitySummarySpec.scala
+++ b/src/test/scala/com/googlesource/gerrit/plugins/analytics/test/UserActivitySummarySpec.scala
@@ -1,39 +1,45 @@
 package com.googlesource.gerrit.plugins.analytics.test
 
+import com.google.gerrit.acceptance.UseLocalDisk
 import com.googlesource.gerrit.plugins.analytics.UserActivitySummary
 import com.googlesource.gerrit.plugins.analytics.common.AggregationStrategy.EMAIL
 import com.googlesource.gerrit.plugins.analytics.common.{Statistics, TestUtils}
-import org.eclipse.jgit.internal.storage.file.FileRepository
+import org.eclipse.jgit.lib.Repository
 import org.scalatest.{FlatSpec, Matchers}
 
-class UserActivitySummarySpec extends FlatSpec with GitTestCase with TestUtils with Matchers {
+@UseLocalDisk
+class UserActivitySummarySpec extends FlatSpec with GerritTestDaemon with TestUtils with Matchers {
 
   "numCommits" should "count only comments filtered by their merge status" in {
     val personEmail = "aCommitter@aCompany.com"
 
     // we want merge and non-merge commits to be authored by same person, so that they can be aggregated together
-    val repo = getRepoOwnedByPerson(personEmail)
+    val cloneRepo = testFileRepository.gitClone
+    getRepoOwnedByPerson(personEmail, repo = cloneRepo)
 
-    commit(personEmail, fileName="aFile.txt", content="some content")
-    mergeCommit(personEmail, fileName = "anotherFile.txt", content="some other content")
+    val personIdent = newPersonIdent("aPerson", personEmail)
+    cloneRepo.commitFile("aFile.txt", "some content", committer = personIdent, author = personIdent)
+    cloneRepo.mergeCommitFile("anotherFile.txt", "some other content", author = personIdent, committer = personIdent)
+    cloneRepo.push
+
     val aggregatedCommits = aggregateBy(EMAIL)
+    val summary = UserActivitySummary.apply(new Statistics(fileRepository, TestBotLikeExtractor))(aggregatedCommits.head)
 
-    val List(nonMergeSummary, mergeSummary) = UserActivitySummary.apply(new Statistics(repo, TestBotLikeExtractor))(aggregatedCommits.head)
+    val nonMergeSummary = summary.head
+    val mergeSummary = summary.drop(1).head
 
     nonMergeSummary.numCommits should be(2)
     mergeSummary.numCommits should be(1)
   }
 
-  def getRepoOwnedByPerson(email: String = author.getEmailAddress): FileRepository = {
-    val repo = new FileRepository(testRepo)
-
-    val conf = repo.getConfig
+  def getRepoOwnedByPerson(email: String = author.getEmailAddress, repo: TestFileRepository = testFileRepository): Repository = {
+    val conf = repo.getRepository.getConfig
     conf.load()
     conf.setString("user", null, "name", email)
     conf.setString("user", null, "email", email)
     conf.save()
 
-    repo
+    repo.getRepository
   }
 
 }
