diff --git a/java/com/google/gerrit/server/group/db/GroupsUpdate.java b/java/com/google/gerrit/server/group/db/GroupsUpdate.java
index a3aae83..f10409e 100644
--- a/java/com/google/gerrit/server/group/db/GroupsUpdate.java
+++ b/java/com/google/gerrit/server/group/db/GroupsUpdate.java
@@ -43,7 +43,6 @@
 import com.google.gerrit.server.account.GroupIncludeCache;
 import com.google.gerrit.server.audit.AuditService;
 import com.google.gerrit.server.config.AllUsersName;
-import com.google.gerrit.server.config.GerritServerConfig;
 import com.google.gerrit.server.config.GerritServerId;
 import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
 import com.google.gerrit.server.git.GitRepositoryManager;
@@ -69,7 +68,6 @@
 import java.util.concurrent.TimeUnit;
 import org.eclipse.jgit.errors.ConfigInvalidException;
 import org.eclipse.jgit.lib.BatchRefUpdate;
-import org.eclipse.jgit.lib.Config;
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.lib.PersonIdent;
 import org.eclipse.jgit.lib.Repository;
@@ -114,7 +112,6 @@
   private final GroupsMigration groupsMigration;
   private final GitReferenceUpdated gitRefUpdated;
   private final RetryHelper retryHelper;
-  private final boolean reviewDbUpdatesAreBlocked;
 
   @Inject
   GroupsUpdate(
@@ -131,7 +128,6 @@
       @GerritPersonIdent PersonIdent serverIdent,
       MetaDataUpdate.InternalFactory metaDataUpdateInternalFactory,
       GroupsMigration groupsMigration,
-      @GerritServerConfig Config config,
       GitReferenceUpdated gitRefUpdated,
       RetryHelper retryHelper,
       @Assisted @Nullable IdentifiedUser currentUser) {
@@ -152,7 +148,6 @@
         getMetaDataUpdateFactory(
             metaDataUpdateInternalFactory, currentUser, serverIdent, auditLogFormatter);
     authorIdent = getAuthorIdent(serverIdent, currentUser);
-    reviewDbUpdatesAreBlocked = config.getBoolean("user", null, "blockReviewDbGroupUpdates", false);
   }
 
   private static MetaDataUpdateFactory getMetaDataUpdateFactory(
@@ -276,7 +271,6 @@
   private InternalGroup createGroupInReviewDb(
       ReviewDb db, InternalGroupCreation groupCreation, InternalGroupUpdate groupUpdate)
       throws OrmException {
-    checkIfReviewDbUpdatesAreBlocked();
 
     AccountGroupName gn = new AccountGroupName(groupCreation.getNameKey(), groupCreation.getId());
     // first insert the group name to validate that the group name hasn't
@@ -316,8 +310,6 @@
 
   private UpdateResult updateGroupInReviewDb(
       ReviewDb db, AccountGroup group, InternalGroupUpdate groupUpdate) throws OrmException {
-    checkIfReviewDbUpdatesAreBlocked();
-
     AccountGroup.NameKey originalName = group.getNameKey();
     applyUpdate(group, groupUpdate);
     AccountGroup.NameKey updatedName = group.getNameKey();
@@ -637,12 +629,6 @@
     result.getDeletedSubgroups().forEach(groupIncludeCache::evictParentGroupsOf);
   }
 
-  private void checkIfReviewDbUpdatesAreBlocked() throws OrmException {
-    if (reviewDbUpdatesAreBlocked) {
-      throw new OrmException("Updates to groups in ReviewDb are blocked");
-    }
-  }
-
   private void dispatchAuditEventsOnGroupCreation(InternalGroup createdGroup) {
     if (currentUser == null) {
       return;
diff --git a/javatests/com/google/gerrit/acceptance/api/group/GroupRebuilderIT.java b/javatests/com/google/gerrit/acceptance/api/group/GroupRebuilderIT.java
index bfe01ef..6da8bab 100644
--- a/javatests/com/google/gerrit/acceptance/api/group/GroupRebuilderIT.java
+++ b/javatests/com/google/gerrit/acceptance/api/group/GroupRebuilderIT.java
@@ -85,13 +85,11 @@
   @Test
   public void basicGroupProperties() throws Exception {
     GroupInfo createdGroup = gApi.groups().create(name("group")).get();
-    try (BlockReviewDbUpdatesForGroups ctx = new BlockReviewDbUpdatesForGroups()) {
-      GroupBundle reviewDbBundle =
-          bundleFactory.fromReviewDb(db, new AccountGroup.Id(createdGroup.groupId));
-      deleteGroupRefs(reviewDbBundle);
+    GroupBundle reviewDbBundle =
+        bundleFactory.fromReviewDb(db, new AccountGroup.Id(createdGroup.groupId));
+    deleteGroupRefs(reviewDbBundle);
 
-      assertMigratedCleanly(rebuild(reviewDbBundle), reviewDbBundle);
-    }
+    assertMigratedCleanly(rebuild(reviewDbBundle), reviewDbBundle);
   }
 
   @Test
@@ -109,53 +107,51 @@
       gApi.groups().id(group1.id).addGroups(group2.id, SystemGroupBackend.REGISTERED_USERS.get());
     }
 
-    try (BlockReviewDbUpdatesForGroups ctx = new BlockReviewDbUpdatesForGroups()) {
-      GroupBundle reviewDbBundle =
-          bundleFactory.fromReviewDb(db, new AccountGroup.Id(group1.groupId));
-      deleteGroupRefs(reviewDbBundle);
+    GroupBundle reviewDbBundle =
+        bundleFactory.fromReviewDb(db, new AccountGroup.Id(group1.groupId));
+    deleteGroupRefs(reviewDbBundle);
 
-      GroupBundle noteDbBundle = rebuild(reviewDbBundle);
-      assertMigratedCleanly(noteDbBundle, reviewDbBundle);
+    GroupBundle noteDbBundle = rebuild(reviewDbBundle);
+    assertMigratedCleanly(noteDbBundle, reviewDbBundle);
 
-      ImmutableList<CommitInfo> log = log(group1);
-      assertThat(log).hasSize(4);
+    ImmutableList<CommitInfo> log = log(group1);
+    assertThat(log).hasSize(4);
 
-      assertThat(log.get(0)).message().isEqualTo("Create group");
-      assertThat(log.get(0)).author().name().isEqualTo(serverIdent.get().getName());
-      assertThat(log.get(0)).author().email().isEqualTo(serverIdent.get().getEmailAddress());
-      assertThat(log.get(0)).author().date().isEqualTo(noteDbBundle.group().getCreatedOn());
-      assertThat(log.get(0)).author().tz().isEqualTo(serverIdent.get().getTimeZoneOffset());
-      assertThat(log.get(0)).committer().isEqualTo(log.get(0).author);
+    assertThat(log.get(0)).message().isEqualTo("Create group");
+    assertThat(log.get(0)).author().name().isEqualTo(serverIdent.get().getName());
+    assertThat(log.get(0)).author().email().isEqualTo(serverIdent.get().getEmailAddress());
+    assertThat(log.get(0)).author().date().isEqualTo(noteDbBundle.group().getCreatedOn());
+    assertThat(log.get(0)).author().tz().isEqualTo(serverIdent.get().getTimeZoneOffset());
+    assertThat(log.get(0)).committer().isEqualTo(log.get(0).author);
 
-      assertThat(log.get(1))
-          .message()
-          .isEqualTo("Update group\n\nAdd: Administrator <" + admin.id + "@" + serverId + ">");
-      assertThat(log.get(1)).author().name().isEqualTo(admin.fullName);
-      assertThat(log.get(1)).author().email().isEqualTo(admin.id + "@" + serverId);
-      assertThat(log.get(1)).committer().hasSameDateAs(log.get(1).author);
+    assertThat(log.get(1))
+        .message()
+        .isEqualTo("Update group\n\nAdd: Administrator <" + admin.id + "@" + serverId + ">");
+    assertThat(log.get(1)).author().name().isEqualTo(admin.fullName);
+    assertThat(log.get(1)).author().email().isEqualTo(admin.id + "@" + serverId);
+    assertThat(log.get(1)).committer().hasSameDateAs(log.get(1).author);
 
-      assertThat(log.get(2))
-          .message()
-          .isEqualTo(
-              "Update group\n"
-                  + "\n"
-                  + ("Add: User <" + user.id + "@" + serverId + ">\n")
-                  + ("Add: User2 <" + user2.id + "@" + serverId + ">"));
-      assertThat(log.get(2)).author().name().isEqualTo(admin.fullName);
-      assertThat(log.get(2)).author().email().isEqualTo(admin.id + "@" + serverId);
-      assertThat(log.get(2)).committer().hasSameDateAs(log.get(2).author);
+    assertThat(log.get(2))
+        .message()
+        .isEqualTo(
+            "Update group\n"
+                + "\n"
+                + ("Add: User <" + user.id + "@" + serverId + ">\n")
+                + ("Add: User2 <" + user2.id + "@" + serverId + ">"));
+    assertThat(log.get(2)).author().name().isEqualTo(admin.fullName);
+    assertThat(log.get(2)).author().email().isEqualTo(admin.id + "@" + serverId);
+    assertThat(log.get(2)).committer().hasSameDateAs(log.get(2).author);
 
-      assertThat(log.get(3))
-          .message()
-          .isEqualTo(
-              "Update group\n"
-                  + "\n"
-                  + ("Add-group: " + group2.name + " <" + group2.id + ">\n")
-                  + ("Add-group: Registered Users <global:Registered-Users>"));
-      assertThat(log.get(3)).author().name().isEqualTo(admin.fullName);
-      assertThat(log.get(3)).author().email().isEqualTo(admin.id + "@" + serverId);
-      assertThat(log.get(3)).committer().hasSameDateAs(log.get(3).author);
-    }
+    assertThat(log.get(3))
+        .message()
+        .isEqualTo(
+            "Update group\n"
+                + "\n"
+                + ("Add-group: " + group2.name + " <" + group2.id + ">\n")
+                + ("Add-group: Registered Users <global:Registered-Users>"));
+    assertThat(log.get(3)).author().name().isEqualTo(admin.fullName);
+    assertThat(log.get(3)).author().email().isEqualTo(admin.id + "@" + serverId);
+    assertThat(log.get(3)).committer().hasSameDateAs(log.get(3).author);
   }
 
   @Test
@@ -236,19 +232,4 @@
     assertThat(commitDates).named("commit timestamps for %s", result).isOrdered();
     return result.build();
   }
-
-  private class BlockReviewDbUpdatesForGroups implements AutoCloseable {
-    BlockReviewDbUpdatesForGroups() {
-      blockReviewDbUpdates(true);
-    }
-
-    @Override
-    public void close() throws Exception {
-      blockReviewDbUpdates(false);
-    }
-
-    private void blockReviewDbUpdates(boolean block) {
-      cfg.setBoolean("user", null, "blockReviewDbGroupUpdates", block);
-    }
-  }
 }
diff --git a/javatests/com/google/gerrit/acceptance/api/group/GroupsIT.java b/javatests/com/google/gerrit/acceptance/api/group/GroupsIT.java
index 8aa03a4..0e5da12 100644
--- a/javatests/com/google/gerrit/acceptance/api/group/GroupsIT.java
+++ b/javatests/com/google/gerrit/acceptance/api/group/GroupsIT.java
@@ -32,7 +32,6 @@
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
 import static java.util.stream.Collectors.toList;
 
-import com.google.common.base.Throwables;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
 import com.google.common.util.concurrent.AtomicLongMap;
@@ -66,7 +65,6 @@
 import com.google.gerrit.extensions.restapi.BadRequestException;
 import com.google.gerrit.extensions.restapi.ResourceConflictException;
 import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
-import com.google.gerrit.extensions.restapi.RestApiException;
 import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
 import com.google.gerrit.extensions.restapi.Url;
 import com.google.gerrit.reviewdb.client.Account;
@@ -89,7 +87,6 @@
 import com.google.gerrit.server.util.MagicBranch;
 import com.google.gerrit.testing.ConfigSuite;
 import com.google.gerrit.testing.TestTimeUtil;
-import com.google.gwtorm.server.OrmException;
 import com.google.inject.Inject;
 import java.io.IOException;
 import java.lang.annotation.Retention;
@@ -1200,38 +1197,6 @@
   }
 
   @Test
-  @Sandboxed
-  public void blockReviewDbUpdatesOnGroupCreation() throws Exception {
-    assume().that(groupsInNoteDb()).isFalse();
-    try (AutoCloseable ctx = createBlockReviewDbGroupUpdatesContext()) {
-      gApi.groups().create(name("foo"));
-      fail("Expected RestApiException: Updates to groups in ReviewDb are blocked");
-    } catch (RestApiException e) {
-      assertWriteGroupToReviewDbBlockedException(e);
-    }
-  }
-
-  @Test
-  @Sandboxed
-  public void blockReviewDbUpdatesOnGroupUpdate() throws Exception {
-    assume().that(groupsInNoteDb()).isFalse();
-    String group1 = gApi.groups().create(name("foo")).get().id;
-    String group2 = gApi.groups().create(name("bar")).get().id;
-    try (AutoCloseable ctx = createBlockReviewDbGroupUpdatesContext()) {
-      gApi.groups().id(group1).addGroups(group2);
-      fail("Expected RestApiException: Updates to groups in ReviewDb are blocked");
-    } catch (RestApiException e) {
-      assertWriteGroupToReviewDbBlockedException(e);
-    }
-  }
-
-  private void assertWriteGroupToReviewDbBlockedException(Exception e) throws Exception {
-    Throwable t = Throwables.getRootCause(e);
-    assertThat(t).isInstanceOf(OrmException.class);
-    assertThat(t.getMessage()).isEqualTo("Updates to groups in ReviewDb are blocked");
-  }
-
-  @Test
   @IgnoreGroupInconsistencies
   public void stalenessChecker() throws Exception {
     assume().that(readGroupsFromNoteDb()).isTrue();
@@ -1527,16 +1492,6 @@
     return groupsInNoteDb() && cfg.getBoolean(SECTION_NOTE_DB, GROUPS.key(), READ, false);
   }
 
-  private AutoCloseable createBlockReviewDbGroupUpdatesContext() {
-    cfg.setBoolean("user", null, "blockReviewDbGroupUpdates", true);
-    return new AutoCloseable() {
-      @Override
-      public void close() {
-        cfg.setBoolean("user", null, "blockReviewDbGroupUpdates", false);
-      }
-    };
-  }
-
   @Target({METHOD})
   @Retention(RUNTIME)
   private @interface IgnoreGroupInconsistencies {}
