diff --git a/javatests/com/google/gerrit/acceptance/api/change/PluginFieldsIT.java b/javatests/com/google/gerrit/acceptance/api/change/PluginFieldsIT.java
index 9ab730c..d5089ff 100644
--- a/javatests/com/google/gerrit/acceptance/api/change/PluginFieldsIT.java
+++ b/javatests/com/google/gerrit/acceptance/api/change/PluginFieldsIT.java
@@ -26,31 +26,31 @@
   // No tests for /detail via the extension API, since the extension API doesn't have that method.
 
   @Test
-  public void queryChangeApiWithNullAttribute() throws Exception {
+  public void queryChangeWithNullAttribute() throws Exception {
     getChangeWithNullAttribute(
         id -> pluginInfoFromSingletonList(gApi.changes().query(id.toString()).get()));
   }
 
   @Test
-  public void getChangeApiWithNullAttribute() throws Exception {
+  public void getChangeWithNullAttribute() throws Exception {
     getChangeWithNullAttribute(
         id -> pluginInfoFromChangeInfo(gApi.changes().id(id.toString()).get()));
   }
 
   @Test
-  public void queryChangeApiWithSimpleAttribute() throws Exception {
+  public void queryChangeWithSimpleAttribute() throws Exception {
     getChangeWithSimpleAttribute(
         id -> pluginInfoFromSingletonList(gApi.changes().query(id.toString()).get()));
   }
 
   @Test
-  public void getChangeApiWithSimpleAttribute() throws Exception {
+  public void getChangeWithSimpleAttribute() throws Exception {
     getChangeWithSimpleAttribute(
         id -> pluginInfoFromChangeInfo(gApi.changes().id(id.toString()).get()));
   }
 
   @Test
-  public void queryChangeApiWithOption() throws Exception {
+  public void queryChangeWithOption() throws Exception {
     getChangeWithOption(
         id -> pluginInfoFromSingletonList(gApi.changes().query(id.toString()).get()),
         (id, opts) ->
@@ -59,7 +59,7 @@
   }
 
   @Test
-  public void getChangeApiWithOption() throws Exception {
+  public void getChangeWithOption() throws Exception {
     getChangeWithOption(
         id -> pluginInfoFromChangeInfo(gApi.changes().id(id.get()).get()),
         (id, opts) -> pluginInfoFromChangeInfo(gApi.changes().id(id.get()).get(opts)));
@@ -75,7 +75,7 @@
   }
 
   @Test
-  public void getChangeApiWithSimpleAttributeWithExplicitExport() throws Exception {
+  public void getChangeWithSimpleAttributeWithExplicitExport() throws Exception {
     // For backwards compatibility with old plugins, allow modules to bind into the
     // DynamicSet<ChangeAttributeFactory> as if it were a DynamicMap. We only need one variant of
     // this test to prove that the mapping works.
diff --git a/javatests/com/google/gerrit/acceptance/rest/change/PluginFieldsIT.java b/javatests/com/google/gerrit/acceptance/rest/change/PluginFieldsIT.java
index 6388fe9..75f096e 100644
--- a/javatests/com/google/gerrit/acceptance/rest/change/PluginFieldsIT.java
+++ b/javatests/com/google/gerrit/acceptance/rest/change/PluginFieldsIT.java
@@ -33,62 +33,59 @@
   private static final Gson GSON = OutputFormat.JSON.newGson();
 
   @Test
-  public void queryChangeRestWithNullAttribute() throws Exception {
+  public void queryChangeWithNullAttribute() throws Exception {
     getChangeWithNullAttribute(
-        id -> pluginInfoFromSingletonListRest(adminRestSession.get(changeQueryUrl(id))));
+        id -> pluginInfoFromSingletonList(adminRestSession.get(changeQueryUrl(id))));
   }
 
   @Test
-  public void getChangeRestWithNullAttribute() throws Exception {
+  public void getChangeWithNullAttribute() throws Exception {
+    getChangeWithNullAttribute(id -> pluginInfoFromChangeInfo(adminRestSession.get(changeUrl(id))));
+  }
+
+  @Test
+  public void getChangeDetailWithNullAttribute() throws Exception {
     getChangeWithNullAttribute(
-        id -> pluginInfoFromChangeInfoRest(adminRestSession.get(changeUrl(id))));
+        id -> pluginInfoFromChangeInfo(adminRestSession.get(changeDetailUrl(id))));
   }
 
   @Test
-  public void getChangeDetailRestWithNullAttribute() throws Exception {
-    getChangeWithNullAttribute(
-        id -> pluginInfoFromChangeInfoRest(adminRestSession.get(changeDetailUrl(id))));
-  }
-
-  @Test
-  public void queryChangeRestWithSimpleAttribute() throws Exception {
+  public void queryChangeWithSimpleAttribute() throws Exception {
     getChangeWithSimpleAttribute(
-        id -> pluginInfoFromSingletonListRest(adminRestSession.get(changeQueryUrl(id))));
+        id -> pluginInfoFromSingletonList(adminRestSession.get(changeQueryUrl(id))));
   }
 
   @Test
-  public void getChangeRestWithSimpleAttribute() throws Exception {
+  public void getChangeWithSimpleAttribute() throws Exception {
     getChangeWithSimpleAttribute(
-        id -> pluginInfoFromChangeInfoRest(adminRestSession.get(changeUrl(id))));
+        id -> pluginInfoFromChangeInfo(adminRestSession.get(changeUrl(id))));
   }
 
   @Test
-  public void getChangeDetailRestWithSimpleAttribute() throws Exception {
+  public void getChangeDetailWithSimpleAttribute() throws Exception {
     getChangeWithSimpleAttribute(
-        id -> pluginInfoFromChangeInfoRest(adminRestSession.get(changeDetailUrl(id))));
+        id -> pluginInfoFromChangeInfo(adminRestSession.get(changeDetailUrl(id))));
   }
 
   @Test
-  public void queryChangeRestWithOption() throws Exception {
+  public void queryChangeWithOption() throws Exception {
     getChangeWithOption(
-        id -> pluginInfoFromSingletonListRest(adminRestSession.get(changeQueryUrl(id))),
-        (id, opts) ->
-            pluginInfoFromSingletonListRest(adminRestSession.get(changeQueryUrl(id, opts))));
+        id -> pluginInfoFromSingletonList(adminRestSession.get(changeQueryUrl(id))),
+        (id, opts) -> pluginInfoFromSingletonList(adminRestSession.get(changeQueryUrl(id, opts))));
   }
 
   @Test
-  public void getChangeRestWithOption() throws Exception {
+  public void getChangeWithOption() throws Exception {
     getChangeWithOption(
-        id -> pluginInfoFromChangeInfoRest(adminRestSession.get(changeUrl(id))),
-        (id, opts) -> pluginInfoFromChangeInfoRest(adminRestSession.get(changeUrl(id, opts))));
+        id -> pluginInfoFromChangeInfo(adminRestSession.get(changeUrl(id))),
+        (id, opts) -> pluginInfoFromChangeInfo(adminRestSession.get(changeUrl(id, opts))));
   }
 
   @Test
-  public void getChangeDetailRestWithOption() throws Exception {
+  public void getChangeDetailWithOption() throws Exception {
     getChangeWithOption(
-        id -> pluginInfoFromChangeInfoRest(adminRestSession.get(changeDetailUrl(id))),
-        (id, opts) ->
-            pluginInfoFromChangeInfoRest(adminRestSession.get(changeDetailUrl(id, opts))));
+        id -> pluginInfoFromChangeInfo(adminRestSession.get(changeDetailUrl(id))),
+        (id, opts) -> pluginInfoFromChangeInfo(adminRestSession.get(changeDetailUrl(id, opts))));
   }
 
   private String changeQueryUrl(Change.Id id) {
@@ -136,7 +133,7 @@
   }
 
   @Nullable
-  private static List<MyInfo> pluginInfoFromSingletonListRest(RestResponse res) throws Exception {
+  private static List<MyInfo> pluginInfoFromSingletonList(RestResponse res) throws Exception {
     res.assertOK();
 
     // Don't deserialize to ChangeInfo directly, since that would treat the plugins field as
@@ -148,7 +145,7 @@
   }
 
   @Nullable
-  private List<MyInfo> pluginInfoFromChangeInfoRest(RestResponse res) throws Exception {
+  private List<MyInfo> pluginInfoFromChangeInfo(RestResponse res) throws Exception {
     res.assertOK();
 
     // Don't deserialize to ChangeInfo directly, since that would treat the plugins field as
diff --git a/javatests/com/google/gerrit/acceptance/ssh/PluginChangeFieldsIT.java b/javatests/com/google/gerrit/acceptance/ssh/PluginChangeFieldsIT.java
index d196c5a..8b1fb43 100644
--- a/javatests/com/google/gerrit/acceptance/ssh/PluginChangeFieldsIT.java
+++ b/javatests/com/google/gerrit/acceptance/ssh/PluginChangeFieldsIT.java
@@ -40,23 +40,22 @@
   private static final Gson GSON = OutputStreamQuery.GSON;
 
   @Test
-  public void queryChangeSshWithNullAttribute() throws Exception {
+  public void queryChangeWithNullAttribute() throws Exception {
     getChangeWithNullAttribute(
-        id -> pluginInfoFromSingletonListSsh(adminSshSession.exec(changeQueryCmd(id))));
+        id -> pluginInfoFromSingletonList(adminSshSession.exec(changeQueryCmd(id))));
   }
 
   @Test
-  public void queryChangeSshWithSimpleAttribute() throws Exception {
+  public void queryChangeWithSimpleAttribute() throws Exception {
     getChangeWithSimpleAttribute(
-        id -> pluginInfoFromSingletonListSsh(adminSshSession.exec(changeQueryCmd(id))));
+        id -> pluginInfoFromSingletonList(adminSshSession.exec(changeQueryCmd(id))));
   }
 
   @Test
-  public void queryChangeSshWithOption() throws Exception {
+  public void queryChangeWithOption() throws Exception {
     getChangeWithOption(
-        id -> pluginInfoFromSingletonListSsh(adminSshSession.exec(changeQueryCmd(id))),
-        (id, opts) ->
-            pluginInfoFromSingletonListSsh(adminSshSession.exec(changeQueryCmd(id, opts))));
+        id -> pluginInfoFromSingletonList(adminSshSession.exec(changeQueryCmd(id))),
+        (id, opts) -> pluginInfoFromSingletonList(adminSshSession.exec(changeQueryCmd(id, opts))));
   }
 
   private String changeQueryCmd(Change.Id id) {
@@ -73,7 +72,7 @@
   }
 
   @Nullable
-  private static List<MyInfo> pluginInfoFromSingletonListSsh(String sshOutput) throws Exception {
+  private static List<MyInfo> pluginInfoFromSingletonList(String sshOutput) throws Exception {
     List<Map<String, Object>> changeAttrs = new ArrayList<>();
     for (String line : CharStreams.readLines(new StringReader(sshOutput))) {
       // Don't deserialize to ChangeAttribute directly, since that would treat the plugins field as
