diff --git a/src/main/java/com/googlesource/gerrit/plugins/quota/FetchAndPushEventCreator.java b/src/main/java/com/googlesource/gerrit/plugins/quota/FetchAndPushEventCreator.java
deleted file mode 100644
index fd41c4b..0000000
--- a/src/main/java/com/googlesource/gerrit/plugins/quota/FetchAndPushEventCreator.java
+++ /dev/null
@@ -1,60 +0,0 @@
-// Copyright (C) 2014 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.quota;
-
-import com.google.gerrit.extensions.events.UsageDataPublishedListener.Event;
-import com.google.gerrit.extensions.events.UsageDataPublishedListener.MetaData;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.project.ProjectCache;
-import com.google.inject.Singleton;
-
-@Singleton
-public class FetchAndPushEventCreator implements UsageDataEventCreator {
-
-  static final MetaData PUSH_COUNT = new MetaDataImpl("pushCount", "", "",
-      "number of pushes to the repository since the last event");
-
-  static final MetaData FETCH_COUNT = new MetaDataImpl("fetchCount", "", "",
-      "number of fetches from the repository since the last event");
-
-  private final ProjectCache projectCache;
-  private final PersistentCounter counts;
-  private final MetaData metaData;
-
-  public FetchAndPushEventCreator(ProjectCache projectCache, PersistentCounter counts,
-      MetaData metaData) {
-        this.projectCache = projectCache;
-        this.counts = counts;
-        this.metaData = metaData;
-  }
-
-  @Override
-  public String getName() {
-    return metaData.getName();
-  }
-
-  @Override
-  public Event create() {
-    UsageDataEvent event = new UsageDataEvent(metaData);
-    for (Project.NameKey p : projectCache.all()) {
-      long currentCount = counts.getAndReset(p);
-      if (currentCount != 0) {
-        event.addData(currentCount, p.get());
-      }
-    }
-    return event;
-  }
-
-}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/quota/FetchAndPushListener.java b/src/main/java/com/googlesource/gerrit/plugins/quota/FetchAndPushListener.java
deleted file mode 100644
index 8ac2f9b..0000000
--- a/src/main/java/com/googlesource/gerrit/plugins/quota/FetchAndPushListener.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package com.googlesource.gerrit.plugins.quota;
-
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.inject.Inject;
-import com.google.inject.name.Named;
-
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.transport.PostReceiveHook;
-import org.eclipse.jgit.transport.PreUploadHook;
-import org.eclipse.jgit.transport.ReceiveCommand;
-import org.eclipse.jgit.transport.ReceivePack;
-import org.eclipse.jgit.transport.ServiceMayNotContinueException;
-import org.eclipse.jgit.transport.UploadPack;
-
-import java.util.Collection;
-
-public class FetchAndPushListener implements PostReceiveHook, PreUploadHook {
-
-  private final ProjectNameResolver projectNameResolver;
-  private final PersistentCounter fetchCounts;
-  private final PersistentCounter pushCounts;
-
-  @Inject
-  public FetchAndPushListener(@Named(PersistentCounter.FETCH) PersistentCounter fetchCounts,
-      @Named(PersistentCounter.PUSH) PersistentCounter pushCounts,
-      ProjectNameResolver projectNameResolver) {
-    this.fetchCounts = fetchCounts;
-    this.pushCounts = pushCounts;
-    this.projectNameResolver = projectNameResolver;
-  }
-
-  @Override
-  public void onBeginNegotiateRound(UploadPack up,
-      Collection<? extends ObjectId> wants, int cntOffered)
-      throws ServiceMayNotContinueException {
-  }
-
-  @Override
-  public void onEndNegotiateRound(UploadPack up,
-      Collection<? extends ObjectId> wants, int cntCommon, int cntNotFound,
-      boolean ready) throws ServiceMayNotContinueException {
-  }
-
-  @Override
-  public void onSendPack(UploadPack up, Collection<? extends ObjectId> wants,
-      Collection<? extends ObjectId> haves)
-      throws ServiceMayNotContinueException {
-    Project.NameKey project =
-        projectNameResolver.projectName(up.getRepository());
-    fetchCounts.increment(project);
-  }
-
-  @Override
-  public void onPostReceive(ReceivePack rp, Collection<ReceiveCommand> commands) {
-    Project.NameKey project =
-        projectNameResolver.projectName(rp.getRepository());
-    pushCounts.increment(project);
-  }
-
-}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/quota/Module.java b/src/main/java/com/googlesource/gerrit/plugins/quota/Module.java
index 1b0867a..df4c996 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/quota/Module.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/quota/Module.java
@@ -26,7 +26,6 @@
 import com.google.inject.internal.UniqueAnnotations;
 
 import org.eclipse.jgit.transport.PostReceiveHook;
-import org.eclipse.jgit.transport.PreUploadHook;
 
 class Module extends AbstractModule {
 
@@ -38,10 +37,6 @@
         .to(MaxRepositorySizeQuota.class);
     DynamicSet.bind(binder(), PostReceiveHook.class)
         .to(MaxRepositorySizeQuota.class);
-    DynamicSet.bind(binder(), PostReceiveHook.class)
-        .to(FetchAndPushListener.class);
-    DynamicSet.bind(binder(), PreUploadHook.class)
-        .to(FetchAndPushListener.class);
     DynamicSet.setOf(binder(), UsageDataEventCreator.class);
     install(MaxRepositorySizeQuota.module());
     install(PersistentCounter.module());
diff --git a/src/main/java/com/googlesource/gerrit/plugins/quota/PersistentCounter.java b/src/main/java/com/googlesource/gerrit/plugins/quota/PersistentCounter.java
index b3c22df..bf665cc 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/quota/PersistentCounter.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/quota/PersistentCounter.java
@@ -5,64 +5,17 @@
 import com.google.gerrit.extensions.registration.DynamicSet;
 import com.google.gerrit.reviewdb.client.Project;
 import com.google.gerrit.server.cache.CacheModule;
-import com.google.gerrit.server.project.ProjectCache;
-import com.google.inject.Key;
 import com.google.inject.Module;
-import com.google.inject.Provides;
 import com.google.inject.Singleton;
-import com.google.inject.TypeLiteral;
-import com.google.inject.name.Named;
-import com.google.inject.name.Names;
 
-import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicLong;
 
 class PersistentCounter {
-  public static final String FETCH = "FETCH_COUNTS";
-  public static final String PUSH = "PUSH_COUNTS";
-
   static Module module() {
     return new CacheModule() {
       protected void configure() {
-        persist(FETCH, Project.NameKey.class, AtomicLong.class).loader(
-            Loader.class).expireAfterWrite(Integer.MAX_VALUE, TimeUnit.DAYS);
-        persist(PUSH, Project.NameKey.class, AtomicLong.class).loader(
-            Loader.class).expireAfterWrite(Integer.MAX_VALUE, TimeUnit.DAYS);
-        DynamicSet.bind(binder(), UsageDataEventCreator.class).to(creatorKey(FETCH));
-        DynamicSet.bind(binder(), UsageDataEventCreator.class).to(creatorKey(PUSH));
         DynamicSet.bind(binder(), UsageDataEventCreator.class).to(RepoSizeEventCreator.class);
       }
-
-      private Key<UsageDataEventCreator> creatorKey(String kind) {
-        Key<UsageDataEventCreator> pushCreatorKey =
-            Key.get(new TypeLiteral<UsageDataEventCreator>() {},
-                Names.named(kind));
-        return pushCreatorKey;
-      }
-
-      @Provides @Singleton @Named(FETCH)
-      PersistentCounter provideFetchCounter(
-          @Named(FETCH) LoadingCache<Project.NameKey, AtomicLong> counts) {
-        return new PersistentCounter(counts);
-      }
-
-      @Provides @Singleton @Named(PUSH)
-      PersistentCounter providePushCounter(
-          @Named(PUSH) LoadingCache<Project.NameKey, AtomicLong> counts) {
-        return new PersistentCounter(counts);
-      }
-
-      @Provides @Singleton @Named(FETCH)
-      UsageDataEventCreator provideFetchEventCreator(ProjectCache projectCache,
-          @Named(FETCH) PersistentCounter counts) {
-        return new FetchAndPushEventCreator(projectCache, counts, FetchAndPushEventCreator.FETCH_COUNT);
-      }
-
-      @Provides @Singleton @Named(PUSH)
-      UsageDataEventCreator providePushEventCreator(ProjectCache projectCache,
-          @Named(PUSH) PersistentCounter counts) {
-        return new FetchAndPushEventCreator(projectCache, counts, FetchAndPushEventCreator.PUSH_COUNT);
-      }
     };
   }
 
diff --git a/src/main/resources/Documentation/about.md b/src/main/resources/Documentation/about.md
index 05641d9..5091958 100644
--- a/src/main/resources/Documentation/about.md
+++ b/src/main/resources/Documentation/about.md
@@ -9,5 +9,5 @@
 * Maximum number of projects in a namespace
 * The maximum total file size of a repository in a namespace
 
-The measured repository sizes and the number of fetches and pushes
-can be published periodically to registered UsageDataPublishedListeners.
+The measured repository sizes can be published periodically to registered
+UsageDataPublishedListeners.
diff --git a/src/test/java/com/googlesource/gerrit/plugins/quota/PublisherExceptionTest.java b/src/test/java/com/googlesource/gerrit/plugins/quota/PublisherExceptionTest.java
index dbe03f8..f79079f 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/quota/PublisherExceptionTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/quota/PublisherExceptionTest.java
@@ -86,7 +86,7 @@
     expect(creator.create()).andStubThrow(ex);
 
     UsageDataEventCreator good = createMock(UsageDataEventCreator.class);
-    Event data = new UsageDataEvent(FetchAndPushEventCreator.FETCH_COUNT);
+    Event data = new UsageDataEvent(null);
     expect(good.create()).andStubReturn(data);
     creators.add(good);
 
@@ -103,7 +103,7 @@
   @Test
   public void testExceptionInListenerIsLogged() {
     RuntimeException ex = new RuntimeException();
-    Event data = new UsageDataEvent(FetchAndPushEventCreator.FETCH_COUNT);
+    Event data = new UsageDataEvent(null);
     expect(creator.create()).andStubReturn(data);
 
     listener.onUsageDataPublished(data);
@@ -123,7 +123,7 @@
   @Test
   public void testIsPropagatedToGoodListener() {
     RuntimeException ex = new RuntimeException();
-    Event data = new UsageDataEvent(FetchAndPushEventCreator.FETCH_COUNT);
+    Event data = new UsageDataEvent(null);
     expect(creator.create()).andStubReturn(data);
 
     listener.onUsageDataPublished(data);
diff --git a/src/test/java/com/googlesource/gerrit/plugins/quota/PublisherTest.java b/src/test/java/com/googlesource/gerrit/plugins/quota/PublisherTest.java
index 077b056..fd41489 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/quota/PublisherTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/quota/PublisherTest.java
@@ -30,11 +30,11 @@
 
   @Test
   public void testAllEventsPropagatedToListener() throws Exception {
-    Event e1 = new UsageDataEvent(FetchAndPushEventCreator.FETCH_COUNT);
+    Event e1 = new UsageDataEvent(null);
     UsageDataEventCreator c1 = createMock(UsageDataEventCreator.class);
     expect(c1.create()).andStubReturn(e1);
 
-    Event e2 = new UsageDataEvent(FetchAndPushEventCreator.PUSH_COUNT);
+    Event e2 = new UsageDataEvent(null);
     UsageDataEventCreator c2 = createMock(UsageDataEventCreator.class);
     expect(c2.create()).andStubReturn(e2);
 
@@ -61,7 +61,7 @@
 
   @Test
   public void testEventPropagatedToAllListeners() throws Exception {
-    Event event = new UsageDataEvent(FetchAndPushEventCreator.FETCH_COUNT);
+    Event event = new UsageDataEvent(null);
     UsageDataEventCreator creator = createMock(UsageDataEventCreator.class);
     expect(creator.create()).andStubReturn(event);
     DynamicSet<UsageDataEventCreator> creators = DynamicSet.emptySet();
