diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
index f24c2bc..dc93112 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
@@ -353,7 +353,7 @@
   }
 
   protected StarlarkSemantics getStarlarkSemantics() {
-    return starlarkSemanticsOptions.toSkylarkSemantics();
+    return starlarkSemanticsOptions.toStarlarkSemantics();
   }
 
   protected PackageValidator getPackageValidator() {
@@ -2034,7 +2034,7 @@
 
     @Override
     public StarlarkSemantics getSkylarkSemantics() {
-      return starlarkSemanticsOptions.toSkylarkSemantics();
+      return starlarkSemanticsOptions.toStarlarkSemantics();
     }
 
     @Override
diff --git a/src/test/java/com/google/devtools/build/lib/blackbox/tests/workspace/BUILD b/src/test/java/com/google/devtools/build/lib/blackbox/tests/workspace/BUILD
index bdaa80a..57ab156 100644
--- a/src/test/java/com/google/devtools/build/lib/blackbox/tests/workspace/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/blackbox/tests/workspace/BUILD
@@ -37,10 +37,10 @@
 )
 
 java_test(
-    name = "BazelEmbeddedSkylarkBlackBoxTest",
+    name = "BazelEmbeddedStarlarkBlackBoxTest",
     timeout = "moderate",
     srcs = [
-        "BazelEmbeddedSkylarkBlackBoxTest.java",
+        "BazelEmbeddedStarlarkBlackBoxTest.java",
         "RepoWithRuleWritingTextGenerator.java",
         "WorkspaceTestUtils.java",
     ],
@@ -91,7 +91,7 @@
     name = "ws_black_box_tests",
     tags = ["black_box_test"],
     tests = [
-        "BazelEmbeddedSkylarkBlackBoxTest",
+        "BazelEmbeddedStarlarkBlackBoxTest",
         "GitRepositoryBlackBoxTest",
         "PatchApiBlackBoxTest",
         "RepoWithRuleWritingTextGeneratorTest",
diff --git a/src/test/java/com/google/devtools/build/lib/blackbox/tests/workspace/BazelEmbeddedSkylarkBlackBoxTest.java b/src/test/java/com/google/devtools/build/lib/blackbox/tests/workspace/BazelEmbeddedStarlarkBlackBoxTest.java
similarity index 97%
rename from src/test/java/com/google/devtools/build/lib/blackbox/tests/workspace/BazelEmbeddedSkylarkBlackBoxTest.java
rename to src/test/java/com/google/devtools/build/lib/blackbox/tests/workspace/BazelEmbeddedStarlarkBlackBoxTest.java
index 6dd37a2..92c8b18 100644
--- a/src/test/java/com/google/devtools/build/lib/blackbox/tests/workspace/BazelEmbeddedSkylarkBlackBoxTest.java
+++ b/src/test/java/com/google/devtools/build/lib/blackbox/tests/workspace/BazelEmbeddedStarlarkBlackBoxTest.java
@@ -36,9 +36,9 @@
 
 /**
  * Test that the embedded Starlark code is compliant with --all_incompatible_changes. To replace
- * bazel_embedded_skylark_test.sh.
+ * bazel_embedded_starlark_test.sh.
  */
-public class BazelEmbeddedSkylarkBlackBoxTest extends AbstractBlackBoxTest {
+public class BazelEmbeddedStarlarkBlackBoxTest extends AbstractBlackBoxTest {
 
   private static final String HELLO_FROM_EXTERNAL_REPOSITORY = "Hello from external repository!";
   private static final String HELLO_FROM_MAIN_REPOSITORY = "Hello from main repository!";
diff --git a/src/test/java/com/google/devtools/build/lib/packages/SkylarkSemanticsConsistencyTest.java b/src/test/java/com/google/devtools/build/lib/packages/StarlarkSemanticsConsistencyTest.java
similarity index 93%
rename from src/test/java/com/google/devtools/build/lib/packages/SkylarkSemanticsConsistencyTest.java
rename to src/test/java/com/google/devtools/build/lib/packages/StarlarkSemanticsConsistencyTest.java
index 74effcb..422eda4 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/SkylarkSemanticsConsistencyTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/StarlarkSemanticsConsistencyTest.java
@@ -44,11 +44,11 @@
  *       StarlarkSemanticsOptions}, or vice versa, then the programmer will either be unable to
  *       implement its behavior, or unable to test it from the command line and add user
  *       documentation. We hope that the programmer notices this on their own.
- *   <li>If {@link StarlarkSemanticsOptions#toSkylarkSemantics} is not updated to set all fields of
+ *   <li>If {@link StarlarkSemanticsOptions#toStarlarkSemantics} is not updated to set all fields of
  *       {@code StarlarkSemantics}, then it will fail immediately because all fields of {@link
  *       StarlarkSemantics.Builder} are mandatory.
  *   <li>To catch a copy/paste error where the wrong field's data is threaded through {@code
- *       toSkylarkSemantics()} or {@code deserialize(...)}, we repeatedly generate matching random
+ *       toStarlarkSemantics()} or {@code deserialize(...)}, we repeatedly generate matching random
  *       instances of the input and expected output objects.
  *   <li>The {@link #checkDefaultsMatch} test ensures that there is no divergence between the
  *       default values of the two classes.
@@ -57,7 +57,7 @@
  * </ul>
  */
 @RunWith(JUnit4.class)
-public class SkylarkSemanticsConsistencyTest {
+public class StarlarkSemanticsConsistencyTest {
 
   private static final int NUM_RANDOM_TRIALS = 10;
 
@@ -71,7 +71,7 @@
       long seed = i;
       StarlarkSemanticsOptions options = buildRandomOptions(new Random(seed));
       StarlarkSemantics semantics = buildRandomSemantics(new Random(seed));
-      StarlarkSemantics semanticsFromOptions = options.toSkylarkSemantics();
+      StarlarkSemantics semanticsFromOptions = options.toStarlarkSemantics();
       assertThat(semanticsFromOptions).isEqualTo(semantics);
     }
   }
@@ -99,16 +99,16 @@
   public void checkDefaultsMatch() {
     StarlarkSemanticsOptions defaultOptions = Options.getDefaults(StarlarkSemanticsOptions.class);
     StarlarkSemantics defaultSemantics = StarlarkSemantics.DEFAULT;
-    StarlarkSemantics semanticsFromOptions = defaultOptions.toSkylarkSemantics();
+    StarlarkSemantics semanticsFromOptions = defaultOptions.toStarlarkSemantics();
     assertThat(semanticsFromOptions).isEqualTo(defaultSemantics);
   }
 
   @Test
   public void canGetBuilderFromInstance() {
     StarlarkSemantics original = StarlarkSemantics.DEFAULT;
-    assertThat(original.internalSkylarkFlagTestCanary()).isFalse();
-    StarlarkSemantics modified = original.toBuilder().internalSkylarkFlagTestCanary(true).build();
-    assertThat(modified.internalSkylarkFlagTestCanary()).isTrue();
+    assertThat(original.internalStarlarkFlagTestCanary()).isFalse();
+    StarlarkSemantics modified = original.toBuilder().internalStarlarkFlagTestCanary(true).build();
+    assertThat(modified.internalStarlarkFlagTestCanary()).isTrue();
   }
 
   /**
@@ -179,7 +179,7 @@
         .experimentalSiblingRepositoryLayout(rand.nextBoolean())
         .experimentalAllowIncrementalRepositoryUpdates(rand.nextBoolean())
         .experimentalBuildSettingApi(rand.nextBoolean())
-        .experimentalCcSkylarkApiEnabledPackages(
+        .experimentalCcStarlarkApiEnabledPackages(
             ImmutableList.of(String.valueOf(rand.nextDouble()), String.valueOf(rand.nextDouble())))
         .experimentalEnableAndroidMigrationApis(rand.nextBoolean())
         .experimentalGoogleLegacyApi(rand.nextBoolean())
@@ -213,7 +213,7 @@
         .incompatibleRequireLinkerInputCcApi(rand.nextBoolean())
         .incompatibleRestrictStringEscapes(rand.nextBoolean())
         .incompatibleUseCcConfigureFromRulesCc(rand.nextBoolean())
-        .internalSkylarkFlagTestCanary(rand.nextBoolean())
+        .internalStarlarkFlagTestCanary(rand.nextBoolean())
         .maxComputationSteps(rand.nextLong())
         .recordRuleInstantiationCallstack(rand.nextBoolean())
         .build();
diff --git a/src/test/java/com/google/devtools/build/lib/packages/WorkspaceFactoryTestHelper.java b/src/test/java/com/google/devtools/build/lib/packages/WorkspaceFactoryTestHelper.java
index 2839948..e59c1f9 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/WorkspaceFactoryTestHelper.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/WorkspaceFactoryTestHelper.java
@@ -123,7 +123,7 @@
     OptionsParser parser =
         OptionsParser.builder().optionsClasses(StarlarkSemanticsOptions.class).build();
     parser.parse(options);
-    return parser.getOptions(StarlarkSemanticsOptions.class).toSkylarkSemantics();
+    return parser.getOptions(StarlarkSemanticsOptions.class).toStarlarkSemantics();
   }
 
 }
diff --git a/src/test/java/com/google/devtools/build/lib/packages/util/PackageFactoryApparatus.java b/src/test/java/com/google/devtools/build/lib/packages/util/PackageFactoryApparatus.java
index 9226164..0a387f7 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/util/PackageFactoryApparatus.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/util/PackageFactoryApparatus.java
@@ -113,7 +113,7 @@
             ? ImmutableList.<String>of()
             : ImmutableList.<String>of(skylarkOption));
     StarlarkSemantics semantics =
-        parser.getOptions(StarlarkSemanticsOptions.class).toSkylarkSemantics();
+        parser.getOptions(StarlarkSemanticsOptions.class).toStarlarkSemantics();
 
     try {
       Package externalPkg =
diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkTest.java b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidStarlarkTest.java
similarity index 99%
rename from src/test/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkTest.java
rename to src/test/java/com/google/devtools/build/lib/rules/android/AndroidStarlarkTest.java
index 144e822..084d22f 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidStarlarkTest.java
@@ -35,7 +35,7 @@
 import org.junit.runners.JUnit4;
 
 @RunWith(JUnit4.class)
-public class AndroidSkylarkTest extends BuildViewTestCase {
+public class AndroidStarlarkTest extends BuildViewTestCase {
 
   private void writeAndroidSplitTransitionTestFiles() throws Exception {
     scratch.file(
diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/BUILD b/src/test/java/com/google/devtools/build/lib/rules/android/BUILD
index 248b694..5cb3f3f3 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/android/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/rules/android/BUILD
@@ -32,8 +32,8 @@
 )
 
 java_test(
-    name = "AndroidSkylarkTest",
-    srcs = ["AndroidSkylarkTest.java"],
+    name = "AndroidStarlarkTest",
+    srcs = ["AndroidStarlarkTest.java"],
     deps = [
         "//src/main/java/com/google/devtools/build/lib:syntax",
         "//src/main/java/com/google/devtools/build/lib/analysis:configured_target",
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/BUILD b/src/test/java/com/google/devtools/build/lib/rules/cpp/BUILD
index 5eea2dc..1f37f10 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/BUILD
@@ -24,7 +24,7 @@
             "CcBinaryThinLtoTest.java",
             "CcCompilationHelperTest.java",
             "CcImportBaseConfiguredTargetTest.java",
-            "CppConfigurationSkylarkTest.java",
+            "CppConfigurationStarlarkTest.java",
             "CppSysrootTest.java",
             "LinkCommandLineTest.java",
             "StarlarkCcCommonTestHelper.java",
@@ -140,8 +140,8 @@
 )
 
 java_test(
-    name = "CppConfigurationSkylarkTest",
-    srcs = ["CppConfigurationSkylarkTest.java"],
+    name = "CppConfigurationStarlarkTest",
+    srcs = ["CppConfigurationStarlarkTest.java"],
     deps = [
         "//src/main/java/com/google/devtools/build/lib:syntax",
         "//src/test/java/com/google/devtools/build/lib/analysis/util",
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/CppConfigurationSkylarkTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/CppConfigurationStarlarkTest.java
similarity index 97%
rename from src/test/java/com/google/devtools/build/lib/rules/cpp/CppConfigurationSkylarkTest.java
rename to src/test/java/com/google/devtools/build/lib/rules/cpp/CppConfigurationStarlarkTest.java
index 47ab85a..ce1c63f 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/CppConfigurationSkylarkTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/CppConfigurationStarlarkTest.java
@@ -25,7 +25,7 @@
 
 /** Tests for C++ fragments in Starlark. */
 @RunWith(JUnit4.class)
-public final class CppConfigurationSkylarkTest extends BuildViewTestCase {
+public final class CppConfigurationStarlarkTest extends BuildViewTestCase {
 
   @Test
   public void testMinimumOsVersion() throws Exception {
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/SkylarkCcToolchainConfigureTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/StarlarkCcToolchainConfigureTest.java
similarity index 94%
rename from src/test/java/com/google/devtools/build/lib/rules/cpp/SkylarkCcToolchainConfigureTest.java
rename to src/test/java/com/google/devtools/build/lib/rules/cpp/StarlarkCcToolchainConfigureTest.java
index e8f5a54..167106a 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/SkylarkCcToolchainConfigureTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/StarlarkCcToolchainConfigureTest.java
@@ -25,7 +25,7 @@
 
 /** Tests for cc autoconfiguration. */
 @RunWith(JUnit4.class)
-public class SkylarkCcToolchainConfigureTest extends EvaluationTestCase {
+public class StarlarkCcToolchainConfigureTest extends EvaluationTestCase {
 
   @Test
   public void testSplitEscaped() throws Exception {
@@ -50,8 +50,8 @@
         .testExpression("split_escaped('a%:', ':')", StarlarkList.of(mu, "a:"));
   }
 
-  private Scenario newTest(String... skylarkOptions) throws IOException {
-    return new Scenario(skylarkOptions)
+  private Scenario newTest(String... starlarkOptions) throws IOException {
+    return new Scenario(starlarkOptions)
         // A mock implementation of Label to be able to parse lib_cc_configure under default
         // Starlark environment (lib_cc_configure is meant to be used from the repository
         // environment).
diff --git a/src/test/java/com/google/devtools/build/lib/rules/java/BUILD b/src/test/java/com/google/devtools/build/lib/rules/java/BUILD
index 6d7b923..cfa252b 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/java/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/rules/java/BUILD
@@ -13,8 +13,8 @@
 )
 
 java_test(
-    name = "JavaInfoSkylarkApiTest",
-    srcs = ["JavaInfoSkylarkApiTest.java"],
+    name = "JavaInfoStarlarkApiTest",
+    srcs = ["JavaInfoStarlarkApiTest.java"],
     deps = [
         "//src/main/java/com/google/devtools/build/lib/analysis:configured_target",
         "//src/main/java/com/google/devtools/build/lib/cmdline",
@@ -55,8 +55,8 @@
 )
 
 java_test(
-    name = "JavaSkylarkApiTest",
-    srcs = ["JavaSkylarkApiTest.java"],
+    name = "JavaStarlarkApiTest",
+    srcs = ["JavaStarlarkApiTest.java"],
     deps = [
         "//src/main/java/com/google/devtools/build/lib:syntax",
         "//src/main/java/com/google/devtools/build/lib/actions",
diff --git a/src/test/java/com/google/devtools/build/lib/rules/java/JavaInfoSkylarkApiTest.java b/src/test/java/com/google/devtools/build/lib/rules/java/JavaInfoStarlarkApiTest.java
similarity index 99%
rename from src/test/java/com/google/devtools/build/lib/rules/java/JavaInfoSkylarkApiTest.java
rename to src/test/java/com/google/devtools/build/lib/rules/java/JavaInfoStarlarkApiTest.java
index 08ca059..6605455 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/java/JavaInfoSkylarkApiTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/java/JavaInfoStarlarkApiTest.java
@@ -32,7 +32,7 @@
 
 /** Tests JavaInfo API for Starlark. */
 @RunWith(JUnit4.class)
-public class JavaInfoSkylarkApiTest extends BuildViewTestCase {
+public class JavaInfoStarlarkApiTest extends BuildViewTestCase {
 
   private static final String HOST_JAVA_RUNTIME_LABEL =
       TestConstants.TOOLS_REPOSITORY + "//tools/jdk:current_host_java_runtime";
diff --git a/src/test/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiTest.java b/src/test/java/com/google/devtools/build/lib/rules/java/JavaStarlarkApiTest.java
similarity index 99%
rename from src/test/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiTest.java
rename to src/test/java/com/google/devtools/build/lib/rules/java/JavaStarlarkApiTest.java
index 2cddf14..24b0ded 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/java/JavaStarlarkApiTest.java
@@ -46,7 +46,7 @@
 
 /** Tests Starlark API for Java rules. */
 @RunWith(JUnit4.class)
-public class JavaSkylarkApiTest extends BuildViewTestCase {
+public class JavaStarlarkApiTest extends BuildViewTestCase {
   private static final String HOST_JAVA_RUNTIME_LABEL =
       TestConstants.TOOLS_REPOSITORY + "//tools/jdk:current_host_java_runtime";
 
@@ -465,7 +465,7 @@
         "  fragments = ['java']",
         ")");
 
-    testAnnotationProcessingInfoIsSkylarkAccessible(
+    testAnnotationProcessingInfoIsStarlarkAccessible(
         /*toBeProcessedRuleName=*/ "java_custom_library",
         /*extraLoad=*/ "load(':custom_rule.bzl', 'java_custom_library')");
   }
@@ -993,7 +993,7 @@
    */
   @Test
   public void testJavaPlugin() throws Exception {
-    testAnnotationProcessingInfoIsSkylarkAccessible(
+    testAnnotationProcessingInfoIsStarlarkAccessible(
         /*toBeProcessedRuleName=*/ "java_library", /*extraLoad=*/ "");
   }
 
@@ -1002,7 +1002,7 @@
    * to use annotation processing itself and has a dep and an export that likewise use annotation
    * processing.
    */
-  private void testAnnotationProcessingInfoIsSkylarkAccessible(
+  private void testAnnotationProcessingInfoIsStarlarkAccessible(
       String toBeProcessedRuleName, String extraLoad) throws Exception {
     scratch.file(
         "java/test/extension.bzl",
@@ -1080,7 +1080,7 @@
   }
 
   @Test
-  public void testJavaProviderFieldsAreSkylarkAccessible() throws Exception {
+  public void testJavaProviderFieldsAreStarlarkAccessible() throws Exception {
     // The Starlark evaluation itself will test that compile_jars and
     // transitive_runtime_jars are returning a list readable by Starlark with
     // the expected number of entries.
@@ -1144,7 +1144,7 @@
   }
 
   @Test
-  public void testSkylarkApiProviderReexported() throws Exception {
+  public void testStarlarkApiProviderReexported() throws Exception {
     scratch.file(
         "java/test/extension.bzl",
         "def impl(ctx):",
@@ -1226,7 +1226,7 @@
   }
 
   @Test
-  public void skylarkJavaToJavaLibraryAttributes() throws Exception {
+  public void starlarkJavaToJavaLibraryAttributes() throws Exception {
     scratch.file(
         "foo/extension.bzl",
         "def _impl(ctx):",
@@ -1267,7 +1267,7 @@
   }
 
   @Test
-  public void skylarkJavaToJavaBinaryAttributes() throws Exception {
+  public void starlarkJavaToJavaBinaryAttributes() throws Exception {
     scratch.file(
         "foo/extension.bzl",
         "def _impl(ctx):",
@@ -1297,7 +1297,7 @@
   }
 
   @Test
-  public void skylarkJavaToJavaImportAttributes() throws Exception {
+  public void starlarkJavaToJavaImportAttributes() throws Exception {
     scratch.file(
         "foo/extension.bzl",
         "def _impl(ctx):",
diff --git a/src/test/java/com/google/devtools/build/lib/rules/java/proto/SkylarkJavaLiteProtoLibraryTest.java b/src/test/java/com/google/devtools/build/lib/rules/java/proto/StarlarkJavaLiteProtoLibraryTest.java
similarity index 98%
rename from src/test/java/com/google/devtools/build/lib/rules/java/proto/SkylarkJavaLiteProtoLibraryTest.java
rename to src/test/java/com/google/devtools/build/lib/rules/java/proto/StarlarkJavaLiteProtoLibraryTest.java
index 659f7e2..7b5464c 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/java/proto/SkylarkJavaLiteProtoLibraryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/java/proto/StarlarkJavaLiteProtoLibraryTest.java
@@ -54,7 +54,7 @@
 
 /** Tests for the Starlark version of java_lite_proto_library rule. */
 @RunWith(JUnit4.class)
-public class SkylarkJavaLiteProtoLibraryTest extends BuildViewTestCase {
+public class StarlarkJavaLiteProtoLibraryTest extends BuildViewTestCase {
   private static final String RULE_DIRECTORY = "tools/build_rules/java_lite_proto_library";
   private ActionsTestUtil actionsTestUtil;
 
@@ -87,7 +87,7 @@
   }
 
   @Before
-  public final void setupSkylarkRule() throws Exception {
+  public final void setupStarlarkRule() throws Exception {
     setStarlarkSemanticsOptions("--incompatible_new_actions_api=false");
 
     File[] files = Runfiles.location(RULE_DIRECTORY).listFiles();
@@ -327,7 +327,7 @@
    * generates.
    */
   @Test
-  public void testJavaProtosExposeSkylarkProviders() throws Exception {
+  public void testJavaProtosExposeStarlarkProviders() throws Exception {
     scratch.file(
         "proto/extensions.bzl",
         "def _impl(ctx):",
@@ -524,7 +524,7 @@
   /** Tests that java_lite_proto_library's aspect exposes a Starlark provider named 'proto_java'. */
   @Test
   @Ignore
-  // TODO(elenairina): Enable this test when proto_java is returned from the aspect in Skylark
+  // TODO(elenairina): Enable this test when proto_java is returned from the aspect in Starlark
   // version of java_lite_proto_library.
   public void testJavaLiteProtoLibraryAspectProviders() throws Exception {
     scratch.file(
diff --git a/src/test/java/com/google/devtools/build/lib/rules/objc/AppleBinarySkylarkApiTest.java b/src/test/java/com/google/devtools/build/lib/rules/objc/AppleBinaryStarlarkApiTest.java
similarity index 97%
rename from src/test/java/com/google/devtools/build/lib/rules/objc/AppleBinarySkylarkApiTest.java
rename to src/test/java/com/google/devtools/build/lib/rules/objc/AppleBinaryStarlarkApiTest.java
index 8ef0654..4318e8b 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/objc/AppleBinarySkylarkApiTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/objc/AppleBinaryStarlarkApiTest.java
@@ -33,7 +33,7 @@
  * using a Starlark stub around the Starlark API.
  */
 @RunWith(JUnit4.class)
-public class AppleBinarySkylarkApiTest extends AppleBinaryTest {
+public class AppleBinaryStarlarkApiTest extends AppleBinaryTest {
 
   static final RuleType RULE_TYPE = new RuleType("apple_binary_skylark") {
     @Override
@@ -44,7 +44,7 @@
     }
 
     @Override
-    public String skylarkLoadPrerequisites() {
+    public String starlarkLoadPrerequisites() {
        return "load('//test_skylark:apple_binary_skylark.bzl', 'apple_binary_skylark')";
     }
   };
diff --git a/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcSkylarkTest.java b/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcStararkTest.java
similarity index 83%
rename from src/test/java/com/google/devtools/build/lib/rules/objc/ObjcSkylarkTest.java
rename to src/test/java/com/google/devtools/build/lib/rules/objc/ObjcStararkTest.java
index fc604ed..4d3db94 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcSkylarkTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcStararkTest.java
@@ -42,7 +42,7 @@
 
 /** Tests for Starlark interaction with the objc_* rules. */
 @RunWith(JUnit4.class)
-public class ObjcSkylarkTest extends ObjcRuleTestCase {
+public class ObjcStararkTest extends ObjcRuleTestCase {
   private void writeObjcSplitTransitionTestFiles() throws Exception {
     scratch.file(
         "examples/rule/apple_rules.bzl",
@@ -93,7 +93,7 @@
   }
 
   @Test
-  public void testSkylarkRuleCanDependOnNativeAppleRule() throws Exception {
+  public void testStarlarkRuleCanDependOnNativeAppleRule() throws Exception {
     scratch.file("examples/rule/BUILD");
     scratch.file(
         "examples/rule/apple_rules.bzl",
@@ -123,14 +123,14 @@
         "    hdrs = ['b.h']",
         ")");
 
-    ConfiguredTarget skylarkTarget = getConfiguredTarget("//examples/apple_skylark:my_target");
-    StructImpl myInfo = getMyInfoFromTarget(skylarkTarget);
-    Depset skylarkLibraries = (Depset) myInfo.getValue("found_libs");
-    Depset skylarkHdrs = (Depset) myInfo.getValue("found_hdrs");
+    ConfiguredTarget starlarkTarget = getConfiguredTarget("//examples/apple_skylark:my_target");
+    StructImpl myInfo = getMyInfoFromTarget(starlarkTarget);
+    Depset starlarkLibraries = (Depset) myInfo.getValue("found_libs");
+    Depset starlarkHdrs = (Depset) myInfo.getValue("found_hdrs");
 
-    assertThat(ActionsTestUtil.baseArtifactNames(skylarkLibraries.getSet(Artifact.class)))
+    assertThat(ActionsTestUtil.baseArtifactNames(starlarkLibraries.getSet(Artifact.class)))
         .contains("liblib.a");
-    assertThat(ActionsTestUtil.baseArtifactNames(skylarkHdrs.getSet(Artifact.class)))
+    assertThat(ActionsTestUtil.baseArtifactNames(starlarkHdrs.getSet(Artifact.class)))
         .contains("b.h");
   }
 
@@ -164,15 +164,15 @@
         "    name = 'dep',",
         ")");
 
-    ConfiguredTarget skylarkTarget = getConfiguredTarget("//test:test");
-    StructImpl myInfo = getMyInfoFromTarget(skylarkTarget);
+    ConfiguredTarget starlarkTarget = getConfiguredTarget("//test:test");
+    StructImpl myInfo = getMyInfoFromTarget(starlarkTarget);
     Depset defineSet = (Depset) myInfo.getValue("define");
 
     assertThat(defineSet.getSet(String.class).toList()).containsExactly("mock_define");
   }
 
   @Test
-  public void testSkylarkProviderRetrievalNoneIfNoProvider() throws Exception {
+  public void testStarlarkProviderRetrievalNoneIfNoProvider() throws Exception {
     scratch.file("examples/rule/BUILD");
     scratch.file(
         "examples/rule/apple_rules.bzl",
@@ -217,7 +217,7 @@
   }
 
   @Test
-  public void testSkylarkProviderCanCheckForExistanceOfObjcProvider() throws Exception {
+  public void testStarlarkProviderCanCheckForExistanceOfObjcProvider() throws Exception {
     scratch.file("examples/rule/BUILD");
     scratch.file(
         "examples/rule/apple_rules.bzl",
@@ -248,8 +248,8 @@
         "    name = 'cc_lib',",
         "    srcs = ['a.cc'],",
         ")");
-    ConfiguredTarget skylarkTarget = getConfiguredTarget("//examples/apple_skylark:my_target");
-    StructImpl myInfo = getMyInfoFromTarget(skylarkTarget);
+    ConfiguredTarget starlarkTarget = getConfiguredTarget("//examples/apple_skylark:my_target");
+    StructImpl myInfo = getMyInfoFromTarget(starlarkTarget);
     boolean ccResult = (boolean) myInfo.getValue("cc_has_provider");
     boolean objcResult = (boolean) myInfo.getValue("objc_has_provider");
     assertThat(ccResult).isFalse();
@@ -257,7 +257,7 @@
   }
 
   @Test
-  public void testSkylarkExportsObjcProviderToNativeRulePreMigration() throws Exception {
+  public void testStarlarkExportsObjcProviderToNativeRulePreMigration() throws Exception {
     scratch.file("examples/rule/BUILD");
     scratch.file(
         "examples/rule/apple_rules.bzl",
@@ -309,7 +309,7 @@
   }
 
   @Test
-  public void testSkylarkExportsObjcProviderToNativeRulePostMigration() throws Exception {
+  public void testStarlarkExportsObjcProviderToNativeRulePostMigration() throws Exception {
     scratch.file("examples/rule/BUILD");
     scratch.file(
         "examples/rule/apple_rules.bzl",
@@ -352,7 +352,7 @@
   }
 
   @Test
-  public void testObjcRuleCanDependOnArbitrarySkylarkRuleThatProvidesObjcPreMigration()
+  public void testObjcRuleCanDependOnArbitraryStarlarkRuleThatProvidesObjcPreMigration()
       throws Exception {
     scratch.file("examples/rule/BUILD");
     scratch.file(
@@ -389,7 +389,7 @@
   }
 
   @Test
-  public void testObjcRuleCanDependOnArbitrarySkylarkRuleThatProvidesObjcPostMigration()
+  public void testObjcRuleCanDependOnArbitraryStarlarkRuleThatProvidesObjcPostMigration()
       throws Exception {
     scratch.file("examples/rule/BUILD");
     scratch.file(
@@ -426,7 +426,7 @@
   }
 
   @Test
-  public void testSkylarkCanAccessAppleConfiguration() throws Exception {
+  public void testStarlarkCanAccessAppleConfiguration() throws Exception {
     scratch.file("examples/rule/BUILD");
     scratch.file(
         "examples/rule/apple_rules.bzl",
@@ -478,8 +478,8 @@
         ")");
 
     useConfiguration("--apple_platform_type=ios", "--cpu=ios_i386", "--xcode_version=7.3");
-    ConfiguredTarget skylarkTarget = getConfiguredTarget("//examples/apple_skylark:my_target");
-    StructImpl myInfo = getMyInfoFromTarget(skylarkTarget);
+    ConfiguredTarget starlarkTarget = getConfiguredTarget("//examples/apple_skylark:my_target");
+    StructImpl myInfo = getMyInfoFromTarget(starlarkTarget);
 
     Object iosCpu = myInfo.getValue("cpu");
     @SuppressWarnings("unchecked")
@@ -529,9 +529,9 @@
         ")");
 
     useConfiguration();
-    ConfiguredTarget skylarkTarget = getConfiguredTarget("//examples/apple_skylark:my_target");
+    ConfiguredTarget starlarkTarget = getConfiguredTarget("//examples/apple_skylark:my_target");
 
-    assertThat(getMyInfoFromTarget(skylarkTarget).getValue("dead_code_report")).isEqualTo("None");
+    assertThat(getMyInfoFromTarget(starlarkTarget).getValue("dead_code_report")).isEqualTo("None");
   }
 
   @Test
@@ -571,13 +571,13 @@
         "dead_code_report(name='dead_code_report')");
 
     useConfiguration("--j2objc_dead_code_report=//examples/apple_skylark:dead_code_report");
-    ConfiguredTarget skylarkTarget = getConfiguredTarget("//examples/apple_skylark:my_target");
+    ConfiguredTarget starlarkTarget = getConfiguredTarget("//examples/apple_skylark:my_target");
 
-    assertThat(getMyInfoFromTarget(skylarkTarget).getValue("dead_code_report")).isEqualTo("bar");
+    assertThat(getMyInfoFromTarget(starlarkTarget).getValue("dead_code_report")).isEqualTo("bar");
   }
 
   @Test
-  public void testSkylarkCanAccessJ2objcTranslationFlags() throws Exception {
+  public void testStarlarkCanAccessJ2objcTranslationFlags() throws Exception {
     scratch.file("examples/rule/BUILD");
     scratch.file(
         "examples/rule/apple_rules.bzl",
@@ -602,16 +602,17 @@
         ")");
 
     useConfiguration("--j2objc_translation_flags=-DTestJ2ObjcFlag");
-    ConfiguredTarget skylarkTarget = getConfiguredTarget("//examples/apple_skylark:my_target");
+    ConfiguredTarget starlarkTarget = getConfiguredTarget("//examples/apple_skylark:my_target");
 
     @SuppressWarnings("unchecked")
-    List<String> flags = (List<String>) getMyInfoFromTarget(skylarkTarget).getValue("j2objc_flags");
+    List<String> flags = (List<String>) getMyInfoFromTarget(starlarkTarget)
+        .getValue("j2objc_flags");
     assertThat(flags).contains("-DTestJ2ObjcFlag");
     assertThat(flags).doesNotContain("-unspecifiedFlag");
   }
 
   @Test
-  public void testSkylarkCanAccessApplePlatformNames() throws Exception {
+  public void testStarlarkCanAccessApplePlatformNames() throws Exception {
     scratch.file("examples/rule/BUILD");
     scratch.file(
         "examples/rule/apple_rules.bzl",
@@ -635,14 +636,14 @@
         ")");
 
     useConfiguration("--cpu=ios_i386");
-    ConfiguredTarget skylarkTarget = getConfiguredTarget("//examples/apple_skylark:my_target");
+    ConfiguredTarget starlarkTarget = getConfiguredTarget("//examples/apple_skylark:my_target");
 
-    Object name = getMyInfoFromTarget(skylarkTarget).getValue("name");
+    Object name = getMyInfoFromTarget(starlarkTarget).getValue("name");
     assertThat(name).isEqualTo("iPhoneSimulator");
   }
 
   @Test
-  public void testSkylarkCanAccessAppleToolchain() throws Exception {
+  public void testStarlarkCanAccessAppleToolchain() throws Exception {
     scratch.file("examples/rule/BUILD");
     scratch.file(
         "examples/rule/apple_rules.bzl",
@@ -671,8 +672,8 @@
         ")");
 
     useConfiguration("--apple_platform_type=ios", "--cpu=ios_i386");
-    ConfiguredTarget skylarkTarget = getConfiguredTarget("//examples/apple_skylark:my_target");
-    StructImpl myInfo = getMyInfoFromTarget(skylarkTarget);
+    ConfiguredTarget starlarkTarget = getConfiguredTarget("//examples/apple_skylark:my_target");
+    StructImpl myInfo = getMyInfoFromTarget(starlarkTarget);
 
     String platformDevFrameworksDir = (String) myInfo.getValue("platform_developer_framework_dir");
     String sdkDir = (String) myInfo.getValue("sdk_dir");
@@ -685,7 +686,7 @@
   }
 
   @Test
-  public void testSkylarkCanAccessSdkAndMinimumOs() throws Exception {
+  public void testStarlarkCanAccessSdkAndMinimumOs() throws Exception {
     scratch.file("examples/rule/BUILD");
     scratch.file(
         "examples/rule/apple_rules.bzl",
@@ -736,8 +737,8 @@
         "--watchos_sdk_version=2.1", "--watchos_minimum_os=2.0",
         "--tvos_sdk_version=3.1", "--tvos_minimum_os=3.0",
         "--macos_sdk_version=4.1");
-    ConfiguredTarget skylarkTarget = getConfiguredTarget("//examples/apple_skylark:my_target");
-    StructImpl myInfo = getMyInfoFromTarget(skylarkTarget);
+    ConfiguredTarget starlarkTarget = getConfiguredTarget("//examples/apple_skylark:my_target");
+    StructImpl myInfo = getMyInfoFromTarget(starlarkTarget);
 
     assertThat(myInfo.getValue("ios_sdk_version")).isEqualTo("1.1");
     assertThat(myInfo.getValue("ios_minimum_os")).isEqualTo("1.0");
@@ -751,8 +752,8 @@
         "--watchos_sdk_version=2.1",
         "--tvos_sdk_version=3.1",
         "--macos_sdk_version=4.1");
-    skylarkTarget = getConfiguredTarget("//examples/apple_skylark:my_target");
-    myInfo = getMyInfoFromTarget(skylarkTarget);
+    starlarkTarget = getConfiguredTarget("//examples/apple_skylark:my_target");
+    myInfo = getMyInfoFromTarget(starlarkTarget);
 
     assertThat(myInfo.getValue("ios_sdk_version")).isEqualTo("1.1");
     assertThat(myInfo.getValue("ios_minimum_os")).isEqualTo("1.1");
@@ -764,7 +765,7 @@
   }
 
   @Test
-  public void testSkylarkCanAccessObjcConfiguration() throws Exception {
+  public void testStarlarkCanAccessObjcConfiguration() throws Exception {
     scratch.file("examples/rule/BUILD");
     scratch.file(
         "examples/rule/objc_rules.bzl",
@@ -805,8 +806,8 @@
         "--ios_simulator_version=8.4",
         "--ios_signing_cert_name='Apple Developer'",
         "--apple_generate_dsym");
-    ConfiguredTarget skylarkTarget = getConfiguredTarget("//examples/objc_skylark:my_target");
-    StructImpl myInfo = getMyInfoFromTarget(skylarkTarget);
+    ConfiguredTarget starlarkTarget = getConfiguredTarget("//examples/objc_skylark:my_target");
+    StructImpl myInfo = getMyInfoFromTarget(starlarkTarget);
 
     @SuppressWarnings("unchecked")
     List<String> copts = (List<String>) myInfo.getValue("copts");
@@ -850,10 +851,10 @@
         "   name='my_target',",
         ")");
 
-    ConfiguredTarget skylarkTarget = getConfiguredTarget("//examples/objc_skylark:my_target");
+    ConfiguredTarget starlarkTarget = getConfiguredTarget("//examples/objc_skylark:my_target");
 
     Object signingCertificateName =
-        getMyInfoFromTarget(skylarkTarget).getValue("signing_certificate_name");
+        getMyInfoFromTarget(starlarkTarget).getValue("signing_certificate_name");
     assertThat(signingCertificateName).isEqualTo("None");
   }
 
@@ -883,10 +884,10 @@
         ")");
 
     useConfiguration("--compilation_mode=dbg");
-    ConfiguredTarget skylarkTarget = getConfiguredTarget("//examples/objc_skylark:my_target");
+    ConfiguredTarget starlarkTarget = getConfiguredTarget("//examples/objc_skylark:my_target");
 
     boolean usesDeviceDebugEntitlements =
-        (boolean) getMyInfoFromTarget(skylarkTarget).getValue("uses_device_debug_entitlements");
+        (boolean) getMyInfoFromTarget(starlarkTarget).getValue("uses_device_debug_entitlements");
     assertThat(usesDeviceDebugEntitlements).isTrue();
   }
 
@@ -918,10 +919,10 @@
     useConfiguration(
         "--compilation_mode=dbg",
         "--nodevice_debug_entitlements");
-    ConfiguredTarget skylarkTarget = getConfiguredTarget("//examples/objc_skylark:my_target");
+    ConfiguredTarget starlarkTarget = getConfiguredTarget("//examples/objc_skylark:my_target");
 
     boolean usesDeviceDebugEntitlements =
-        (boolean) getMyInfoFromTarget(skylarkTarget).getValue("uses_device_debug_entitlements");
+        (boolean) getMyInfoFromTarget(starlarkTarget).getValue("uses_device_debug_entitlements");
     assertThat(usesDeviceDebugEntitlements).isFalse();
   }
 
@@ -951,14 +952,14 @@
         ")");
 
     useConfiguration("--compilation_mode=opt");
-    ConfiguredTarget skylarkTarget = getConfiguredTarget("//examples/objc_skylark:my_target");
+    ConfiguredTarget starlarkTarget = getConfiguredTarget("//examples/objc_skylark:my_target");
 
     boolean usesDeviceDebugEntitlements =
-        (boolean) getMyInfoFromTarget(skylarkTarget).getValue("uses_device_debug_entitlements");
+        (boolean) getMyInfoFromTarget(starlarkTarget).getValue("uses_device_debug_entitlements");
     assertThat(usesDeviceDebugEntitlements).isFalse();
   }
 
-  private ConfiguredTarget createObjcProviderSkylarkTarget(String... implLines) throws Exception {
+  private ConfiguredTarget createObjcProviderStarlarkTarget(String... implLines) throws Exception {
     String[] impl =
         ObjectArrays.concat(
             ObjectArrays.concat("def swift_binary_impl(ctx):", implLines),
@@ -992,9 +993,9 @@
   }
 
   @Test
-  public void testSkylarkCanCreateObjcProviderFromScratch() throws Exception {
-    ConfiguredTarget skylarkTarget =
-        createObjcProviderSkylarkTarget(
+  public void testStarlarkCanCreateObjcProviderFromScratch() throws Exception {
+    ConfiguredTarget starlarkTarget =
+        createObjcProviderStarlarkTarget(
             "   defines = depset(['define1', 'define2'])",
             "   linkopts = depset(['somelinkopt'])",
             "   created_provider = apple_common.new_objc_provider\\",
@@ -1002,11 +1003,11 @@
             "   return [created_provider]");
 
     Iterable<String> foundLinkopts =
-        skylarkTarget.get(ObjcProvider.STARLARK_CONSTRUCTOR).get(ObjcProvider.LINKOPT).toList();
+        starlarkTarget.get(ObjcProvider.STARLARK_CONSTRUCTOR).get(ObjcProvider.LINKOPT).toList();
     Iterable<String> foundDefines =
-        skylarkTarget.get(ObjcProvider.STARLARK_CONSTRUCTOR).define().toList();
+        starlarkTarget.get(ObjcProvider.STARLARK_CONSTRUCTOR).define().toList();
     boolean usesSwift =
-        skylarkTarget.get(ObjcProvider.STARLARK_CONSTRUCTOR).is(ObjcProvider.Flag.USES_SWIFT);
+        starlarkTarget.get(ObjcProvider.STARLARK_CONSTRUCTOR).is(ObjcProvider.Flag.USES_SWIFT);
 
     assertThat(foundLinkopts).containsExactly("somelinkopt");
     assertThat(foundDefines).containsExactly("define1", "define2");
@@ -1014,9 +1015,9 @@
   }
 
   @Test
-  public void testSkylarkCanPassLinkInputsInObjcProvider() throws Exception {
-    ConfiguredTarget skylarkTarget =
-        createObjcProviderSkylarkTarget(
+  public void testStarlarkCanPassLinkInputsInObjcProvider() throws Exception {
+    ConfiguredTarget starlarkTarget =
+        createObjcProviderStarlarkTarget(
             "   file = ctx.actions.declare_file('foo.ast')",
             "   ctx.actions.run_shell(outputs=[file], command='echo')",
             "   link_inputs = depset([file])",
@@ -1025,42 +1026,42 @@
             "   return [created_provider]");
 
     NestedSet<Artifact> foundLinkInputs =
-        skylarkTarget.get(ObjcProvider.STARLARK_CONSTRUCTOR).get(ObjcProvider.LINK_INPUTS);
+        starlarkTarget.get(ObjcProvider.STARLARK_CONSTRUCTOR).get(ObjcProvider.LINK_INPUTS);
     assertThat(ActionsTestUtil.baseArtifactNames(foundLinkInputs)).contains("foo.ast");
   }
 
   @Test
-  public void testSkylarkCanPassUsesSwiftFlag() throws Exception {
-    ConfiguredTarget skylarkTarget =
-        createObjcProviderSkylarkTarget(
+  public void testStarlarkCanPassUsesSwiftFlag() throws Exception {
+    ConfiguredTarget starlarkTarget =
+        createObjcProviderStarlarkTarget(
             "   created_provider = apple_common.new_objc_provider(uses_swift=True)",
             "   return [created_provider]");
 
     boolean usesSwift =
-        skylarkTarget.get(ObjcProvider.STARLARK_CONSTRUCTOR).is(ObjcProvider.Flag.USES_SWIFT);
+        starlarkTarget.get(ObjcProvider.STARLARK_CONSTRUCTOR).is(ObjcProvider.Flag.USES_SWIFT);
 
     assertThat(usesSwift).isTrue();
   }
 
   @Test
-  public void testSkylarkCanCreateObjcProviderWithDefines() throws Exception {
-    ConfiguredTarget skylarkTarget =
-        createObjcProviderSkylarkTarget(
+  public void testStarlarkCanCreateObjcProviderWithDefines() throws Exception {
+    ConfiguredTarget starlarkTarget =
+        createObjcProviderStarlarkTarget(
             "   define = depset(['def1', 'def2', 'def3'])",
             "   created_provider = apple_common.new_objc_provider\\",
             "(define=define)",
             "   return [created_provider]");
 
     Iterable<String> foundDefines =
-        skylarkTarget.get(ObjcProvider.STARLARK_CONSTRUCTOR).define().toList();
+        starlarkTarget.get(ObjcProvider.STARLARK_CONSTRUCTOR).define().toList();
 
     assertThat(foundDefines).containsExactly("def1", "def2", "def3");
   }
 
   @Test
-  public void testSkylarkCanCreateObjcProviderWithHeaders() throws Exception {
-    ConfiguredTarget skylarkTarget =
-        createObjcProviderSkylarkTarget(
+  public void testStarlarkCanCreateObjcProviderWithHeaders() throws Exception {
+    ConfiguredTarget starlarkTarget =
+        createObjcProviderStarlarkTarget(
             "   hdr1 = ctx.actions.declare_file('hdr1')",
             "   hdr2 = ctx.actions.declare_file('hdr2')",
             "   ctx.actions.run_shell(outputs=[hdr1, hdr2], command='echo')",
@@ -1070,22 +1071,22 @@
             "   return [created_provider]");
 
     Iterable<Artifact> foundHeaders =
-        skylarkTarget.get(ObjcProvider.STARLARK_CONSTRUCTOR).header().toList();
+        starlarkTarget.get(ObjcProvider.STARLARK_CONSTRUCTOR).header().toList();
 
     assertThat(ActionsTestUtil.baseArtifactNames(foundHeaders)).containsExactly("hdr1", "hdr2");
   }
 
   @Test
-  public void testSkylarkCanCreateObjcProviderWithIncludePathFragments() throws Exception {
-    ConfiguredTarget skylarkTarget =
-        createObjcProviderSkylarkTarget(
+  public void testStarlarkCanCreateObjcProviderWithIncludePathFragments() throws Exception {
+    ConfiguredTarget starlarkTarget =
+        createObjcProviderStarlarkTarget(
             "   includes = depset(['path1', 'path_dir/path2', 'path_dir1/path_dir2/path3'])",
             "   created_provider = apple_common.new_objc_provider\\",
             "(include=includes)",
             "   return [created_provider]");
 
     Iterable<PathFragment> foundIncludes =
-        skylarkTarget.get(ObjcProvider.STARLARK_CONSTRUCTOR).include();
+        starlarkTarget.get(ObjcProvider.STARLARK_CONSTRUCTOR).include();
 
     assertThat(foundIncludes)
         .containsExactly(
@@ -1095,32 +1096,32 @@
   }
 
   @Test
-  public void testSkylarkCanCreateObjcProviderWithFrameworkIncludes() throws Exception {
-    ConfiguredTarget skylarkTarget =
-        createObjcProviderSkylarkTarget(
+  public void testStarlarkCanCreateObjcProviderWithFrameworkIncludes() throws Exception {
+    ConfiguredTarget starlarkTarget =
+        createObjcProviderStarlarkTarget(
             "   includes = depset(['path1/foo.framework', 'path_dir/path2/bar.framework'])",
             "   created_provider = apple_common.new_objc_provider\\",
             "(framework_search_paths=includes)",
             "   return [created_provider]");
 
     Iterable<PathFragment> foundIncludes =
-        skylarkTarget.get(ObjcProvider.STARLARK_CONSTRUCTOR).frameworkInclude();
+        starlarkTarget.get(ObjcProvider.STARLARK_CONSTRUCTOR).frameworkInclude();
 
     assertThat(foundIncludes)
         .containsExactly(PathFragment.create("path1"), PathFragment.create("path_dir/path2"));
   }
 
   @Test
-  public void testSkylarkCanCreateObjcProviderWithSystemIncludes() throws Exception {
-    ConfiguredTarget skylarkTarget =
-        createObjcProviderSkylarkTarget(
+  public void testStarlarkCanCreateObjcProviderWithSystemIncludes() throws Exception {
+    ConfiguredTarget starlarkTarget =
+        createObjcProviderStarlarkTarget(
             "   includes = depset(['path1', 'path_dir/path2', 'path_dir1/path_dir2/path3'])",
             "   created_provider = apple_common.new_objc_provider\\",
             "(include_system=includes)",
             "   return [created_provider]");
 
     Iterable<PathFragment> foundIncludes =
-        skylarkTarget.get(ObjcProvider.STARLARK_CONSTRUCTOR).systemInclude();
+        starlarkTarget.get(ObjcProvider.STARLARK_CONSTRUCTOR).systemInclude();
 
     assertThat(foundIncludes)
         .containsExactly(
@@ -1130,16 +1131,16 @@
   }
 
   @Test
-  public void testSkylarkCanCreateObjcProviderWithQuoteIncludes() throws Exception {
-    ConfiguredTarget skylarkTarget =
-        createObjcProviderSkylarkTarget(
+  public void testStarlarkCanCreateObjcProviderWithQuoteIncludes() throws Exception {
+    ConfiguredTarget starlarkTarget =
+        createObjcProviderStarlarkTarget(
             "   includes = depset(['path1', 'path_dir/path2', 'path_dir1/path_dir2/path3'])",
             "   created_provider = apple_common.new_objc_provider\\",
             "(iquote=includes)",
             "   return [created_provider]");
 
     Iterable<PathFragment> foundIncludes =
-        skylarkTarget.get(ObjcProvider.STARLARK_CONSTRUCTOR).quoteInclude();
+        starlarkTarget.get(ObjcProvider.STARLARK_CONSTRUCTOR).quoteInclude();
 
     assertThat(foundIncludes)
         .containsExactly(
@@ -1149,10 +1150,10 @@
   }
 
   @Test
-  public void testSkylarkCanCreateObjcProviderWithStrictDepsPreMigration() throws Exception {
+  public void testStarlarkCanCreateObjcProviderWithStrictDepsPreMigration() throws Exception {
     useConfiguration("--incompatible_objc_compile_info_migration=false");
-    ConfiguredTarget skylarkTarget =
-        createObjcProviderSkylarkTarget(
+    ConfiguredTarget starlarkTarget =
+        createObjcProviderStarlarkTarget(
             "   strict_includes = depset(['path1'])",
             "   propagated_includes = depset(['path2'])",
             "   strict_provider = apple_common.new_objc_provider\\",
@@ -1161,10 +1162,10 @@
             "(include=propagated_includes, direct_dep_providers=[strict_provider])",
             "   return [created_provider]");
 
-    ObjcProvider skylarkProvider = skylarkTarget.get(ObjcProvider.STARLARK_CONSTRUCTOR);
-    assertThat(skylarkProvider.include())
+    ObjcProvider starlarkProvider = starlarkTarget.get(ObjcProvider.STARLARK_CONSTRUCTOR);
+    assertThat(starlarkProvider.include())
         .containsExactly(PathFragment.create("path1"), PathFragment.create("path2"));
-    assertThat(skylarkProvider.getStrictDependencyIncludes())
+    assertThat(starlarkProvider.getStrictDependencyIncludes())
         .containsExactly(PathFragment.create("path1"));
 
     scratch.file(
@@ -1178,24 +1179,24 @@
         "   deps = [':direct_dep']",
         ")");
 
-    ObjcProvider skylarkProviderDirectDepender =
+    ObjcProvider starlarkProviderDirectDepender =
         getConfiguredTarget("//examples/objc_skylark2:direct_dep")
             .get(ObjcProvider.STARLARK_CONSTRUCTOR);
-    assertThat(skylarkProviderDirectDepender.include())
+    assertThat(starlarkProviderDirectDepender.include())
         .containsExactly(PathFragment.create("path2"));
 
-    ObjcProvider skylarkProviderIndirectDepender =
+    ObjcProvider starlarkProviderIndirectDepender =
         getConfiguredTarget("//examples/objc_skylark2:indirect_dep")
             .get(ObjcProvider.STARLARK_CONSTRUCTOR);
-    assertThat(skylarkProviderIndirectDepender.include())
+    assertThat(starlarkProviderIndirectDepender.include())
         .containsExactly(PathFragment.create("path2"));
   }
 
   @Test
-  public void testSkylarkCanCreateObjcProviderWithStrictDepsPostMigration() throws Exception {
+  public void testStarlarkCanCreateObjcProviderWithStrictDepsPostMigration() throws Exception {
     useConfiguration("--incompatible_objc_compile_info_migration=true");
-    ConfiguredTarget skylarkTarget =
-        createObjcProviderSkylarkTarget(
+    ConfiguredTarget starlarkTarget =
+        createObjcProviderStarlarkTarget(
             "   strict_includes = depset(['path1'])",
             "   propagated_includes = depset(['path2'])",
             "   strict_provider = apple_common.new_objc_provider\\",
@@ -1204,10 +1205,10 @@
             "(include=propagated_includes, direct_dep_providers=[strict_provider])",
             "   return [created_provider]");
 
-    ObjcProvider skylarkProvider = skylarkTarget.get(ObjcProvider.STARLARK_CONSTRUCTOR);
-    assertThat(skylarkProvider.include())
+    ObjcProvider starlarkProvider = starlarkTarget.get(ObjcProvider.STARLARK_CONSTRUCTOR);
+    assertThat(starlarkProvider.include())
         .containsExactly(PathFragment.create("path1"), PathFragment.create("path2"));
-    assertThat(skylarkProvider.getStrictDependencyIncludes())
+    assertThat(starlarkProvider.getStrictDependencyIncludes())
         .containsExactly(PathFragment.create("path1"));
 
     scratch.file(
@@ -1217,23 +1218,23 @@
         "   deps = ['//examples/objc_skylark:my_target']",
         ")");
 
-    ObjcProvider skylarkProviderDirectDepender =
+    ObjcProvider starlarkProviderDirectDepender =
         getConfiguredTarget("//examples/objc_skylark2:direct_dep")
             .get(ObjcProvider.STARLARK_CONSTRUCTOR);
-    assertThat(skylarkProviderDirectDepender.include()).isEmpty();
+    assertThat(starlarkProviderDirectDepender.include()).isEmpty();
   }
 
   @Test
-  public void testSkylarkCanCreateObjcProviderWithStrictDepsDirectly() throws Exception {
-    ConfiguredTarget skylarkTarget =
-        createObjcProviderSkylarkTarget(
+  public void testStarlarkCanCreateObjcProviderWithStrictDepsDirectly() throws Exception {
+    ConfiguredTarget starlarkTarget =
+        createObjcProviderStarlarkTarget(
             "   strict_includes = depset(['path'])",
             "   created_provider = apple_common.new_objc_provider\\",
             "(strict_include=strict_includes)",
             "   return [created_provider]");
 
-    ObjcProvider skylarkProvider = skylarkTarget.get(ObjcProvider.STARLARK_CONSTRUCTOR);
-    assertThat(skylarkProvider.getStrictDependencyIncludes())
+    ObjcProvider starlarkProvider = starlarkTarget.get(ObjcProvider.STARLARK_CONSTRUCTOR);
+    assertThat(starlarkProvider.getStrictDependencyIncludes())
         .containsExactly(PathFragment.create("path"));
 
     scratch.file(
@@ -1243,19 +1244,19 @@
         "   deps = ['//examples/objc_skylark:my_target']",
         ")");
 
-    ObjcProvider skylarkProviderDirectDepender =
+    ObjcProvider starlarkProviderDirectDepender =
         getConfiguredTarget("//examples/objc_skylark2:direct_dep")
             .get(ObjcProvider.STARLARK_CONSTRUCTOR);
-    assertThat(skylarkProviderDirectDepender.getStrictDependencyIncludes()).isEmpty();
+    assertThat(starlarkProviderDirectDepender.getStrictDependencyIncludes()).isEmpty();
   }
 
   @Test
-  public void testSkylarkStrictDepsDoesNotSupportDefine() throws Exception {
+  public void testStarlarkStrictDepsDoesNotSupportDefine() throws Exception {
     AssertionError e =
         assertThrows(
             AssertionError.class,
             () ->
-                createObjcProviderSkylarkTarget(
+                createObjcProviderStarlarkTarget(
                     "   strict_defines = depset(['def1'])",
                     "   strict_provider = apple_common.new_objc_provider\\",
                     "(define=strict_defines)",
@@ -1268,12 +1269,12 @@
   }
 
   @Test
-  public void testSkylarkStrictDepsDoesNotSupportLinkopt() throws Exception {
+  public void testStarlarkStrictDepsDoesNotSupportLinkopt() throws Exception {
     AssertionError e =
         assertThrows(
             AssertionError.class,
             () ->
-                createObjcProviderSkylarkTarget(
+                createObjcProviderStarlarkTarget(
                     "   strict_linkopts = depset(['opt1'])",
                     "   strict_provider = apple_common.new_objc_provider\\",
                     "(linkopt=strict_linkopts)",
@@ -1286,9 +1287,9 @@
   }
 
   @Test
-  public void testSkylarkCanCreateObjcProviderFromObjcProvider() throws Exception {
-    ConfiguredTarget skylarkTarget =
-        createObjcProviderSkylarkTarget(
+  public void testStarlarkCanCreateObjcProviderFromObjcProvider() throws Exception {
+    ConfiguredTarget starlarkTarget =
+        createObjcProviderStarlarkTarget(
             "   dep = ctx.attr.deps[0]",
             "   define = depset(['define_from_impl'])",
             "   created_provider = apple_common.new_objc_provider\\",
@@ -1296,18 +1297,18 @@
             "   return [created_provider]");
 
     Iterable<String> foundStrings =
-        skylarkTarget.get(ObjcProvider.STARLARK_CONSTRUCTOR).define().toList();
+        starlarkTarget.get(ObjcProvider.STARLARK_CONSTRUCTOR).define().toList();
 
     assertThat(foundStrings).containsExactly("define_from_dep", "define_from_impl");
   }
 
   @Test
-  public void testSkylarkErrorOnBadObjcProviderInputKey() throws Exception {
+  public void testStarlarkErrorOnBadObjcProviderInputKey() throws Exception {
     AssertionError e =
         assertThrows(
             AssertionError.class,
             () ->
-                createObjcProviderSkylarkTarget(
+                createObjcProviderStarlarkTarget(
                     "   created_provider = apple_common.new_objc_provider(foo=depset(['bar']))",
                     "   return created_provider"));
     assertThat(e)
@@ -1316,24 +1317,24 @@
   }
 
   @Test
-  public void testSkylarkErrorOnNonSetObjcProviderInputValue() throws Exception {
+  public void testStarlarkErrorOnNonSetObjcProviderInputValue() throws Exception {
     AssertionError e =
         assertThrows(
             AssertionError.class,
             () ->
-                createObjcProviderSkylarkTarget(
+                createObjcProviderStarlarkTarget(
                     "   created_provider = apple_common.new_objc_provider(library='bar')",
                     "   return created_provider"));
     assertThat(e).hasMessageThat().contains("for library, got string, want a depset of File");
   }
 
   @Test
-  public void testSkylarkErrorOnObjcProviderInputValueWrongSetType() throws Exception {
+  public void testStarlarkErrorOnObjcProviderInputValueWrongSetType() throws Exception {
     AssertionError e =
         assertThrows(
             AssertionError.class,
             () ->
-                createObjcProviderSkylarkTarget(
+                createObjcProviderStarlarkTarget(
                     "   created_provider = apple_common.new_objc_provider(library=depset(['bar']))",
                     "   return created_provider"));
     assertThat(e)
@@ -1342,12 +1343,12 @@
   }
 
   @Test
-  public void testSkylarkErrorOnNonIterableObjcProviderProviderValue() throws Exception {
+  public void testStarlarkErrorOnNonIterableObjcProviderProviderValue() throws Exception {
     AssertionError e =
         assertThrows(
             AssertionError.class,
             () ->
-                createObjcProviderSkylarkTarget(
+                createObjcProviderStarlarkTarget(
                     "   created_provider = apple_common.new_objc_provider(providers='bar')",
                     "   return created_provider"));
     assertThat(e)
@@ -1356,12 +1357,12 @@
   }
 
   @Test
-  public void testSkylarkErrorOnBadIterableObjcProviderProviderValue() throws Exception {
+  public void testStarlarkErrorOnBadIterableObjcProviderProviderValue() throws Exception {
     AssertionError e =
         assertThrows(
             AssertionError.class,
             () ->
-                createObjcProviderSkylarkTarget(
+                createObjcProviderStarlarkTarget(
                     "   created_provider = apple_common.new_objc_provider(providers=['bar'])",
                     "   return created_provider"));
     assertThat(e)
@@ -1400,13 +1401,13 @@
         "   name = 'lib',",
         "   srcs = ['a.m'],",
         ")");
-    ConfiguredTarget skylarkTarget = getConfiguredTarget("//examples/apple_skylark:my_target");
-    Depset emptyValue = (Depset) getMyInfoFromTarget(skylarkTarget).getValue("empty_value");
+    ConfiguredTarget starlarkTarget = getConfiguredTarget("//examples/apple_skylark:my_target");
+    Depset emptyValue = (Depset) getMyInfoFromTarget(starlarkTarget).getValue("empty_value");
     assertThat(emptyValue.toList()).isEmpty();
   }
 
   @Test
-  public void testSkylarkCanAccessSdkFrameworks() throws Exception {
+  public void testStarlarkCanAccessSdkFrameworks() throws Exception {
     scratch.file("examples/rule/BUILD");
     scratch.file(
         "examples/rule/apple_rules.bzl",
@@ -1436,14 +1437,14 @@
         "    deps = [':lib'],",
         ")");
 
-    ConfiguredTarget skylarkTarget = getConfiguredTarget("//examples/apple_skylark:my_target");
+    ConfiguredTarget starlarkTarget = getConfiguredTarget("//examples/apple_skylark:my_target");
 
-    Depset sdkFrameworks = (Depset) getMyInfoFromTarget(skylarkTarget).getValue("sdk_frameworks");
+    Depset sdkFrameworks = (Depset) getMyInfoFromTarget(starlarkTarget).getValue("sdk_frameworks");
     assertThat(sdkFrameworks.toList()).containsAtLeast("Accelerate", "GLKit");
   }
 
   @Test
-  public void testSkylarkCanAccessAndUseApplePlatformTypes() throws Exception {
+  public void testStarlarkCanAccessAndUseApplePlatformTypes() throws Exception {
     scratch.file("examples/rule/BUILD");
     scratch.file(
         "examples/rule/apple_rules.bzl",
@@ -1473,8 +1474,8 @@
         "--ios_multi_cpus=arm64,armv7",
         "--watchos_cpus=armv7k",
         "--tvos_cpus=arm64");
-    ConfiguredTarget skylarkTarget = getConfiguredTarget("//examples/apple_skylark:my_target");
-    StructImpl myInfo = getMyInfoFromTarget(skylarkTarget);
+    ConfiguredTarget starlarkTarget = getConfiguredTarget("//examples/apple_skylark:my_target");
+    StructImpl myInfo = getMyInfoFromTarget(starlarkTarget);
 
     Object iosPlatform = myInfo.getValue("ios_platform");
     Object watchosPlatform = myInfo.getValue("watchos_platform");
@@ -1510,9 +1511,9 @@
 
     useConfiguration(
         "--ios_multi_cpus=arm64,armv7");
-    ConfiguredTarget skylarkTarget = getConfiguredTarget("//examples/apple_skylark:my_target");
+    ConfiguredTarget starlarkTarget = getConfiguredTarget("//examples/apple_skylark:my_target");
 
-    Boolean isDevice = (Boolean) getMyInfoFromTarget(skylarkTarget).getValue("is_device");
+    Boolean isDevice = (Boolean) getMyInfoFromTarget(starlarkTarget).getValue("is_device");
     assertThat(isDevice).isTrue();
   }
 
@@ -1539,21 +1540,21 @@
         "    name = 'my_target',",
         ")");
 
-    ConfiguredTarget skylarkTarget = getConfiguredTarget("//examples/apple_skylark:my_target");
+    ConfiguredTarget starlarkTarget = getConfiguredTarget("//examples/apple_skylark:my_target");
 
-    Boolean isDevice = (Boolean) getMyInfoFromTarget(skylarkTarget).getValue("is_device");
+    Boolean isDevice = (Boolean) getMyInfoFromTarget(starlarkTarget).getValue("is_device");
     assertThat(isDevice).isFalse();
   }
 
   @Test
-  public void testSkylarkWithRunMemleaksEnabled() throws Exception {
+  public void testStarlarkWithRunMemleaksEnabled() throws Exception {
     useConfiguration("--ios_memleaks");
-    checkSkylarkRunMemleaksWithExpectedValue(true);
+    checkStarlarkRunMemleaksWithExpectedValue(true);
   }
 
   @Test
-  public void testSkylarkWithRunMemleaksDisabled() throws Exception {
-    checkSkylarkRunMemleaksWithExpectedValue(false);
+  public void testStarlarkWithRunMemleaksDisabled() throws Exception {
+    checkStarlarkRunMemleaksWithExpectedValue(false);
   }
 
   @Test
@@ -1578,9 +1579,9 @@
         "    name = 'my_target',",
         ")");
 
-    ConfiguredTarget skylarkTarget = getConfiguredTarget("//examples/apple_skylark:my_target");
+    ConfiguredTarget starlarkTarget = getConfiguredTarget("//examples/apple_skylark:my_target");
 
-    DottedVersion version = (DottedVersion) getMyInfoFromTarget(skylarkTarget).getValue("version");
+    DottedVersion version = (DottedVersion) getMyInfoFromTarget(starlarkTarget).getValue("version");
     assertThat(version).isEqualTo(DottedVersion.fromString("5.4"));
   }
 
@@ -1619,7 +1620,7 @@
    * of retrieving ObjcProvider.
    */
   @Test
-  public void testObjcProviderSkylarkConstructor() throws Exception {
+  public void testObjcProviderStarlarkConstructor() throws Exception {
     scratch.file("examples/rule/BUILD");
     scratch.file(
         "examples/rule/apple_rules.bzl",
@@ -1646,8 +1647,8 @@
         "    hdrs = ['a.h']",
         ")");
 
-    ConfiguredTarget skylarkTarget = getConfiguredTarget("//examples/apple_skylark:my_target");
-    assertThat(skylarkTarget.get(ObjcProvider.STARLARK_CONSTRUCTOR)).isNotNull();
+    ConfiguredTarget starlarkTarget = getConfiguredTarget("//examples/apple_skylark:my_target");
+    assertThat(starlarkTarget.get(ObjcProvider.STARLARK_CONSTRUCTOR)).isNotNull();
   }
 
   @Test
@@ -1656,8 +1657,8 @@
     writeObjcSplitTransitionTestFiles();
 
     useConfiguration("--ios_multi_cpus=armv7,arm64");
-    ConfiguredTarget skylarkTarget = getConfiguredTarget("//examples/apple_skylark:my_target");
-    StructImpl myInfo = getMyInfoFromTarget(skylarkTarget);
+    ConfiguredTarget starlarkTarget = getConfiguredTarget("//examples/apple_skylark:my_target");
+    StructImpl myInfo = getMyInfoFromTarget(starlarkTarget);
     ObjcProvider armv7Objc =
         ((StarlarkInfo) myInfo.getValue("ios_armv7")).getValue("objc", ObjcProvider.class);
     ObjcProvider arm64Objc =
@@ -1676,8 +1677,8 @@
     writeObjcSplitTransitionTestFiles();
 
     useConfiguration("--ios_multi_cpus=armv7,arm64,armv7");
-    ConfiguredTarget skylarkTarget = getConfiguredTarget("//examples/apple_skylark:my_target");
-    StructImpl myInfo = getMyInfoFromTarget(skylarkTarget);
+    ConfiguredTarget starlarkTarget = getConfiguredTarget("//examples/apple_skylark:my_target");
+    StructImpl myInfo = getMyInfoFromTarget(starlarkTarget);
     ObjcProvider armv7Objc =
         ((StarlarkInfo) myInfo.getValue("ios_armv7")).getValue("objc", ObjcProvider.class);
     ObjcProvider arm64Objc =
@@ -1696,8 +1697,8 @@
     writeObjcSplitTransitionTestFiles();
 
     useConfiguration("--cpu=ios_arm64");
-    ConfiguredTarget skylarkTarget = getConfiguredTarget("//examples/apple_skylark:my_target");
-    StructImpl myInfo = getMyInfoFromTarget(skylarkTarget);
+    ConfiguredTarget starlarkTarget = getConfiguredTarget("//examples/apple_skylark:my_target");
+    StructImpl myInfo = getMyInfoFromTarget(starlarkTarget);
     ObjcProvider arm64Objc =
         ((StarlarkInfo) myInfo.getValue("ios_arm64")).getValue("objc", ObjcProvider.class);
     assertThat(arm64Objc).isNotNull();
@@ -1705,7 +1706,7 @@
         .contains("ios_arm64");
   }
 
-  private void checkSkylarkRunMemleaksWithExpectedValue(boolean expectedValue) throws Exception {
+  private void checkStarlarkRunMemleaksWithExpectedValue(boolean expectedValue) throws Exception {
     scratch.file("examples/rule/BUILD");
     scratch.file(
         "examples/rule/apple_rules.bzl",
@@ -1725,9 +1726,9 @@
         "    name = 'my_target',",
         ")");
 
-    ConfiguredTarget skylarkTarget = getConfiguredTarget("//examples/apple_skylark:my_target");
+    ConfiguredTarget starlarkTarget = getConfiguredTarget("//examples/apple_skylark:my_target");
 
-    boolean runMemleaks = (boolean) getMyInfoFromTarget(skylarkTarget).getValue("run_memleaks");
+    boolean runMemleaks = (boolean) getMyInfoFromTarget(starlarkTarget).getValue("run_memleaks");
     assertThat(runMemleaks).isEqualTo(expectedValue);
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/rules/objc/RuleType.java b/src/test/java/com/google/devtools/build/lib/rules/objc/RuleType.java
index 72dc3fb..ab19fea 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/objc/RuleType.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/objc/RuleType.java
@@ -157,7 +157,7 @@
       Scratch scratch, String... checkSpecificAttrs)
       throws IOException {
     String target = target(scratch, packageDir, targetName, checkSpecificAttrs);
-    scratch.file(packageDir + "/BUILD", skylarkLoadPrerequisites() + "\n" + target);
+    scratch.file(packageDir + "/BUILD", starlarkLoadPrerequisites() + "\n" + target);
     return target;
   }
 
@@ -168,7 +168,7 @@
    * <p>Subclasses of {@link RuleType} should override this method if using the rule requires
    * Starlark files to be loaded.
    */
-  public String skylarkLoadPrerequisites() {
+  public String starlarkLoadPrerequisites() {
     return "";
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorTest.java b/src/test/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorTest.java
index 7c4281b..5903414 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorTest.java
@@ -105,7 +105,7 @@
   private SequentialBuildDriver driver;
   private TestManagedDirectoriesKnowledge managedDirectoriesKnowledge;
   private RecordingDifferencer differencer;
-  private TestStarlarkRepositoryFunction testSkylarkRepositoryFunction;
+  private TestStarlarkRepositoryFunction testStarlarkRepositoryFunction;
   private Path rootPath;
 
   @Before
@@ -120,14 +120,14 @@
     managedDirectoriesKnowledge = new TestManagedDirectoriesKnowledge();
     DownloadManager downloader = Mockito.mock(DownloadManager.class);
     RepositoryFunction localRepositoryFunction = new LocalRepositoryFunction();
-    testSkylarkRepositoryFunction =
+    testStarlarkRepositoryFunction =
         new TestStarlarkRepositoryFunction(rootPath, downloader, managedDirectoriesKnowledge);
     ImmutableMap<String, RepositoryFunction> repositoryHandlers =
         ImmutableMap.of(LocalRepositoryRule.NAME, localRepositoryFunction);
     delegatorFunction =
         new RepositoryDelegatorFunction(
             repositoryHandlers,
-            testSkylarkRepositoryFunction,
+            testStarlarkRepositoryFunction,
             new AtomicBoolean(true),
             ImmutableMap::of,
             directories,
@@ -333,20 +333,20 @@
 
     loadRepo("repo1");
 
-    assertThat(testSkylarkRepositoryFunction.isFetchCalled()).isTrue();
-    testSkylarkRepositoryFunction.reset();
+    assertThat(testStarlarkRepositoryFunction.isFetchCalled()).isTrue();
+    testStarlarkRepositoryFunction.reset();
 
     loadRepo("repo1");
     // Nothing changed, fetch does not happen.
-    assertThat(testSkylarkRepositoryFunction.isFetchCalled()).isFalse();
-    testSkylarkRepositoryFunction.reset();
+    assertThat(testStarlarkRepositoryFunction.isFetchCalled()).isFalse();
+    testStarlarkRepositoryFunction.reset();
 
     // Delete managed directory, fetch should happen again.
     Path managedDirectory = rootPath.getRelative("dir1");
     managedDirectory.deleteTree();
     loadRepo("repo1");
-    assertThat(testSkylarkRepositoryFunction.isFetchCalled()).isTrue();
-    testSkylarkRepositoryFunction.reset();
+    assertThat(testStarlarkRepositoryFunction.isFetchCalled()).isTrue();
+    testStarlarkRepositoryFunction.reset();
 
     // Change managed directories declaration, fetch should happen.
     // NB: we are making sure that managed directories exist to check only the declaration changes
@@ -362,14 +362,14 @@
             RepositoryName.create("@repo1")));
     loadRepo("repo1");
 
-    assertThat(testSkylarkRepositoryFunction.isFetchCalled()).isTrue();
-    testSkylarkRepositoryFunction.reset();
+    assertThat(testStarlarkRepositoryFunction.isFetchCalled()).isTrue();
+    testStarlarkRepositoryFunction.reset();
 
     managedDirectoriesKnowledge.setManagedDirectories(ImmutableMap.of());
     loadRepo("repo1");
 
-    assertThat(testSkylarkRepositoryFunction.isFetchCalled()).isTrue();
-    testSkylarkRepositoryFunction.reset();
+    assertThat(testStarlarkRepositoryFunction.isFetchCalled()).isTrue();
+    testStarlarkRepositoryFunction.reset();
   }
 
   private void loadRepo(String strippedRepoName) throws InterruptedException {
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/SkylarkFileContentHashTests.java b/src/test/java/com/google/devtools/build/lib/skyframe/StarlarkFileContentHashTests.java
similarity index 98%
rename from src/test/java/com/google/devtools/build/lib/skyframe/SkylarkFileContentHashTests.java
rename to src/test/java/com/google/devtools/build/lib/skyframe/StarlarkFileContentHashTests.java
index 0f2b9ee..013b9dc 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/SkylarkFileContentHashTests.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/StarlarkFileContentHashTests.java
@@ -45,7 +45,7 @@
  * the imports of their respective definition SkylarkEnvironments.
  */
 @RunWith(JUnit4.class)
-public class SkylarkFileContentHashTests extends BuildViewTestCase {
+public class StarlarkFileContentHashTests extends BuildViewTestCase {
 
   @Before
   public final void createFiles() throws Exception  {
diff --git a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkActionProviderTest.java b/src/test/java/com/google/devtools/build/lib/skylark/StarlarkActionProviderTest.java
similarity index 99%
rename from src/test/java/com/google/devtools/build/lib/skylark/SkylarkActionProviderTest.java
rename to src/test/java/com/google/devtools/build/lib/skylark/StarlarkActionProviderTest.java
index 3df8e8b..36f7e00 100644
--- a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkActionProviderTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skylark/StarlarkActionProviderTest.java
@@ -38,7 +38,7 @@
 
 /** Tests for the Starlark-accessible actions provider on rule configured targets. */
 @RunWith(JUnit4.class)
-public class SkylarkActionProviderTest extends AnalysisTestCase {
+public class StarlarkActionProviderTest extends AnalysisTestCase {
 
   @Test
   public void aspectGetsActionProviderForNativeRule() throws Exception {
diff --git a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkAnnotationContractTest.java b/src/test/java/com/google/devtools/build/lib/skylark/StarlarkAnnotationContractTest.java
similarity index 96%
rename from src/test/java/com/google/devtools/build/lib/skylark/SkylarkAnnotationContractTest.java
rename to src/test/java/com/google/devtools/build/lib/skylark/StarlarkAnnotationContractTest.java
index 26ffb9e..36b699c 100644
--- a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkAnnotationContractTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skylark/StarlarkAnnotationContractTest.java
@@ -33,7 +33,7 @@
  * don't have access to the full set of information that the java reflection API has.
  */
 @RunWith(JUnit4.class)
-public class SkylarkAnnotationContractTest {
+public class StarlarkAnnotationContractTest {
 
   // Common prefix of packages in bazel that may have classes that implement or extend a
   // Starlark type.
@@ -46,7 +46,7 @@
    * <p>If this test fails, it indicates the following error scenario:
    *
    * <p>Suppose class A is a subclass of both B and C, where B and C are annotated with {@link
-   * StarlarkBuiltin} annotations (and are thus considered "skylark types"). If B is not a subclass
+   * StarlarkBuiltin} annotations (and are thus considered "Starlark types"). If B is not a subclass
    * of C (nor visa versa), then it's impossible to resolve whether A is of type B or if A is of
    * type C. It's both! The way to resolve this is usually to have A be its own type (annotated with
    * {@link StarlarkBuiltin}), and thus have the explicit type of A be semantically "B and C".
diff --git a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkIntegrationTest.java b/src/test/java/com/google/devtools/build/lib/skylark/StarlarkIntegrationTest.java
similarity index 99%
rename from src/test/java/com/google/devtools/build/lib/skylark/SkylarkIntegrationTest.java
rename to src/test/java/com/google/devtools/build/lib/skylark/StarlarkIntegrationTest.java
index 5aaeeb6..298b6d8 100644
--- a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkIntegrationTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skylark/StarlarkIntegrationTest.java
@@ -73,7 +73,7 @@
 
 /** Integration tests for Starlark. */
 @RunWith(JUnit4.class)
-public class SkylarkIntegrationTest extends BuildViewTestCase {
+public class StarlarkIntegrationTest extends BuildViewTestCase {
   protected boolean keepGoing() {
     return false;
   }
@@ -2973,7 +2973,7 @@
 
   /** Starlark integration test that forces inlining. */
   @RunWith(JUnit4.class)
-  public static class SkylarkIntegrationTestsWithInlineCalls extends SkylarkIntegrationTest {
+  public static class StarlarkIntegrationTestsWithInlineCalls extends StarlarkIntegrationTest {
 
     @Before
     public final void initializeLookupFunctions() throws Exception {
diff --git a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/SkylarkCallableProcessorTest.java b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/SkylarkCallableProcessorTest.java
index c2921cb..7778017 100644
--- a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/SkylarkCallableProcessorTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/SkylarkCallableProcessorTest.java
@@ -139,7 +139,7 @@
   @Test
   public void testSkylarkInfoBeforeParams() throws Exception {
     assertAbout(javaSource())
-        .that(getFile("SkylarkInfoBeforeParams.java"))
+        .that(getFile("StarlarkInfoBeforeParams.java"))
         .processedWith(new SkylarkCallableProcessor())
         .failsToCompile()
         .withErrorContaining(
diff --git a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/DoesntImplementSkylarkValue.java b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/DoesntImplementSkylarkValue.java
index cb4be56..e9d84c1 100644
--- a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/DoesntImplementSkylarkValue.java
+++ b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/DoesntImplementSkylarkValue.java
@@ -16,7 +16,7 @@
 
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 
-/** A SkylarkCallable-annotated method whose class doesn't implement StarlarkValue. */
+/** A StarlarkCallable-annotated method whose class doesn't implement StarlarkValue. */
 class DoesntImplementSkylarkValue {
   @SkylarkCallable(name = "x", documented = false)
   public Object x() {
diff --git a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/SkylarkInfoBeforeParams.java b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/StarlarkInfoBeforeParams.java
similarity index 89%
rename from src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/SkylarkInfoBeforeParams.java
rename to src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/StarlarkInfoBeforeParams.java
index d07a7e7..5284a4b 100644
--- a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/SkylarkInfoBeforeParams.java
+++ b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/StarlarkInfoBeforeParams.java
@@ -20,9 +20,9 @@
 import com.google.devtools.build.lib.syntax.StarlarkValue;
 
 /**
- * Test case for a SkylarkCallable method which specifies StarlarkThread before other parameters.
+ * Test case for a StarlarkCallable method which specifies StarlarkThread before other parameters.
  */
-public class SkylarkInfoBeforeParams implements StarlarkValue {
+public class StarlarkInfoBeforeParams implements StarlarkValue {
 
   @SkylarkCallable(
       name = "skylark_info_wrong_order",
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/util/EvaluationTestCase.java b/src/test/java/com/google/devtools/build/lib/syntax/util/EvaluationTestCase.java
index 7c37350..0203bfe 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/util/EvaluationTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/util/EvaluationTestCase.java
@@ -92,7 +92,7 @@
    */
   public final void setSemantics(String... options) throws OptionsParsingException {
     StarlarkSemantics semantics =
-        Options.parse(StarlarkSemanticsOptions.class, options).getOptions().toSkylarkSemantics();
+        Options.parse(StarlarkSemanticsOptions.class, options).getOptions().toStarlarkSemantics();
 
     // Re-initialize the thread with the new semantics.
     this.thread = newStarlarkThread(semantics);
