diff --git a/src/test/java/com/google/devtools/build/lib/BUILD b/src/test/java/com/google/devtools/build/lib/BUILD
index bdcc604..c13b844 100644
--- a/src/test/java/com/google/devtools/build/lib/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/BUILD
@@ -1502,8 +1502,10 @@
         ":guava_junit_truth",
         ":packages_testutil",
         "//src/main/java/com/google/devtools/build/lib:build-base",
+        "//src/main/java/com/google/devtools/build/lib:packages-internal",
         "//src/main/java/com/google/devtools/build/lib:proto-rules",
         "//src/main/java/com/google/devtools/build/lib/actions",
+        "//src/main/java/com/google/devtools/build/lib/cmdline",
         "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/proto",
         "//src/main/java/com/google/devtools/build/lib/vfs",
     ],
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/ConfigurableAttributesTest.java b/src/test/java/com/google/devtools/build/lib/analysis/ConfigurableAttributesTest.java
index 6a3e402..f07a0cb 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/ConfigurableAttributesTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/ConfigurableAttributesTest.java
@@ -1000,7 +1000,7 @@
         "      output=ctx.outputs.out_file,",
         "      content=ctx.attr.string_value,",
         "  )",
-        "  return struct()",
+        "  return []",
         "",
         "def _derived_value(string_value):",
         "  return Label(\"//test:%s\" % string_value)",
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/actions/SpawnActionTest.java b/src/test/java/com/google/devtools/build/lib/analysis/actions/SpawnActionTest.java
index 6fa0285..9d77d04 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/actions/SpawnActionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/actions/SpawnActionTest.java
@@ -442,12 +442,14 @@
         "testrule(name='b')");
     scratch.file(
         "a/def.bzl",
+        "MyInfo = provider()",
         "def _aspect_impl(target, ctx):",
         "  f = ctx.actions.declare_file('foo.txt')",
         "  ctx.actions.run_shell(outputs = [f], command = 'echo foo > \"$1\"')",
-        "  return struct(output=f)",
+        "  return MyInfo(output=f)",
         "def _rule_impl(ctx):",
-        "  return struct(files=depset([artifact.output for artifact in ctx.attr.deps]))",
+        "  return DefaultInfo(",
+        "      files=depset([artifact[MyInfo].output for artifact in ctx.attr.deps]))",
         "aspect1 = aspect(_aspect_impl, attr_aspects=['deps'], ",
         "    attrs = {'parameter': attr.string(values = ['param_value'])})",
         "testrule = rule(_rule_impl, attrs = { ",
diff --git a/src/test/java/com/google/devtools/build/lib/pkgcache/CompileOneDependencyTransformerTest.java b/src/test/java/com/google/devtools/build/lib/pkgcache/CompileOneDependencyTransformerTest.java
index 1c6c59f..68607a9 100644
--- a/src/test/java/com/google/devtools/build/lib/pkgcache/CompileOneDependencyTransformerTest.java
+++ b/src/test/java/com/google/devtools/build/lib/pkgcache/CompileOneDependencyTransformerTest.java
@@ -70,7 +70,7 @@
         "foo/rule.bzl",
         "def _impl(ctx):",
         "  ctx.actions.do_nothing(mnemonic='Mnemonic')",
-        "  return struct()",
+        "  return []",
         "crule_without_srcs = rule(",
         "  _impl,",
         "  attrs = { ",
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/AndroidSkylarkTest.java
index e208591..395da5c 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/AndroidSkylarkTest.java
@@ -17,14 +17,19 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import com.google.common.collect.ArrayListMultimap;
+import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ListMultimap;
 import com.google.devtools.build.lib.analysis.ConfiguredTarget;
 import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
 import com.google.devtools.build.lib.cmdline.Label;
+import com.google.devtools.build.lib.packages.Provider;
+import com.google.devtools.build.lib.packages.SkylarkProvider;
+import com.google.devtools.build.lib.packages.StructImpl;
 import com.google.devtools.build.lib.packages.util.BazelMockAndroidSupport;
 import com.google.devtools.build.lib.syntax.Runtime;
 import java.util.List;
 import java.util.Map;
+import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -35,8 +40,9 @@
   private void writeAndroidSplitTransitionTestFiles() throws Exception  {
     scratch.file(
         "test/skylark/my_rule.bzl",
+        "load('//myinfo:myinfo.bzl', 'MyInfo')",
         "def impl(ctx): ",
-        "  return struct(",
+        "  return MyInfo(",
         "    split_attr_deps = ctx.split_attr.deps,",
         "    split_attr_dep = ctx.split_attr.dep,",
         "    k8_deps = ctx.split_attr.deps.get('k8', None),",
@@ -57,6 +63,20 @@
         "cc_binary(name = 'main2', srcs = ['main2.c'])");
   }
 
+  @Before
+  public void setupMyInfo() throws Exception {
+    scratch.file("myinfo/myinfo.bzl", "MyInfo = provider()");
+
+    scratch.file("myinfo/BUILD");
+  }
+
+  private StructImpl getMyInfoFromTarget(ConfiguredTarget configuredTarget) throws Exception {
+    Provider.Key key =
+        new SkylarkProvider.SkylarkKey(
+            Label.parseAbsolute("//myinfo:myinfo.bzl", ImmutableMap.of()), "MyInfo");
+    return (StructImpl) configuredTarget.get(key);
+  }
+
   @Test
   public void testAndroidSplitTransition() throws Exception {
     getAnalysisMock().ccSupport().setupCcToolchainConfigForCpu(mockToolsConfig, "armeabi-v7a");
@@ -64,6 +84,7 @@
 
     useConfiguration("--fat_apk_cpu=k8,armeabi-v7a");
     ConfiguredTarget target = getConfiguredTarget("//test/skylark:test");
+    StructImpl myInfo = getMyInfoFromTarget(target);
 
     // Check that ctx.split_attr.deps has this structure:
     // {
@@ -72,7 +93,7 @@
     // }
     @SuppressWarnings("unchecked")
     Map<String, List<ConfiguredTarget>> splitDeps =
-        (Map<String, List<ConfiguredTarget>>) target.get("split_attr_deps");
+        (Map<String, List<ConfiguredTarget>>) myInfo.getValue("split_attr_deps");
     assertThat(splitDeps).containsKey("k8");
     assertThat(splitDeps).containsKey("armeabi-v7a");
     assertThat(splitDeps.get("k8")).hasSize(2);
@@ -91,7 +112,7 @@
     // }
     @SuppressWarnings("unchecked")
     Map<String, ConfiguredTarget> splitDep =
-        (Map<String, ConfiguredTarget>) target.get("split_attr_dep");
+        (Map<String, ConfiguredTarget>) myInfo.getValue("split_attr_dep");
     assertThat(splitDep).containsKey("k8");
     assertThat(splitDep).containsKey("armeabi-v7a");
     assertThat(getConfiguration(splitDep.get("k8")).getCpu()).isEqualTo("k8");
@@ -100,7 +121,7 @@
     // The regular ctx.attr.deps should be a single list with all the branches of the split merged
     // together (i.e. for aspects).
     @SuppressWarnings("unchecked")
-    List<ConfiguredTarget> attrDeps = (List<ConfiguredTarget>) target.get("attr_deps");
+    List<ConfiguredTarget> attrDeps = (List<ConfiguredTarget>) myInfo.getValue("attr_deps");
     assertThat(attrDeps).hasSize(4);
     ListMultimap<String, Object> attrDepsMap = ArrayListMultimap.create();
     for (ConfiguredTarget ct : attrDeps) {
@@ -112,7 +133,7 @@
     // Check that even though my_rule.dep is defined as a single label, ctx.attr.dep is still a list
     // with multiple ConfiguredTarget objects because of the two different CPUs.
     @SuppressWarnings("unchecked")
-    List<ConfiguredTarget> attrDep = (List<ConfiguredTarget>) target.get("attr_dep");
+    List<ConfiguredTarget> attrDep = (List<ConfiguredTarget>) myInfo.getValue("attr_dep");
     assertThat(attrDep).hasSize(2);
     ListMultimap<String, Object> attrDepMap = ArrayListMultimap.create();
     for (ConfiguredTarget ct : attrDep) {
@@ -123,7 +144,7 @@
 
     // Check that the deps were correctly accessed from within Skylark.
     @SuppressWarnings("unchecked")
-    List<ConfiguredTarget> k8Deps = (List<ConfiguredTarget>) target.get("k8_deps");
+    List<ConfiguredTarget> k8Deps = (List<ConfiguredTarget>) myInfo.getValue("k8_deps");
     assertThat(k8Deps).hasSize(2);
     assertThat(getConfiguration(k8Deps.get(0)).getCpu()).isEqualTo("k8");
     assertThat(getConfiguration(k8Deps.get(1)).getCpu()).isEqualTo("k8");
@@ -141,7 +162,8 @@
 
     @SuppressWarnings("unchecked")
     Map<Object, List<ConfiguredTarget>> splitDeps =
-        (Map<Object, List<ConfiguredTarget>>) target.get("split_attr_deps");
+        (Map<Object, List<ConfiguredTarget>>)
+            getMyInfoFromTarget(target).getValue("split_attr_deps");
 
     String cpu = "armeabi-v7a";
     assertThat(splitDeps.get(cpu)).hasSize(2);
@@ -158,7 +180,8 @@
 
     @SuppressWarnings("unchecked")
     Map<Object, List<ConfiguredTarget>> splitDeps =
-        (Map<Object, List<ConfiguredTarget>>) target.get("split_attr_deps");
+        (Map<Object, List<ConfiguredTarget>>)
+            getMyInfoFromTarget(target).getValue("split_attr_deps");
 
     // Split transition isn't in effect, so the deps are compiled normally (i.e. using --cpu).
     assertThat(splitDeps.get(Runtime.NONE)).hasSize(2);
@@ -170,8 +193,9 @@
   public void testAndroidSdkConfigurationField() throws Exception {
     scratch.file(
         "foo_library.bzl",
+        "load('//myinfo:myinfo.bzl', 'MyInfo')",
         "def _impl(ctx):",
-        "  return struct(foo = ctx.attr._android_sdk.label)",
+        "  return MyInfo(foo = ctx.attr._android_sdk.label)",
         "foo_library = rule(implementation = _impl,",
         "    attrs = { '_android_sdk': attr.label(default = configuration_field(",
         "        fragment = 'android', name = 'android_sdk_label'))},",
@@ -183,6 +207,8 @@
         "foo_library(name = 'lib')");
     useConfiguration("--android_sdk=//:new_sdk");
     ConfiguredTarget ct = getConfiguredTarget("//:lib");
-    assertThat(ct.get("foo")).isEqualTo(Label.parseAbsoluteUnchecked("//:new_sdk"));
+
+    assertThat(getMyInfoFromTarget(ct).getValue("foo"))
+        .isEqualTo(Label.parseAbsoluteUnchecked("//:new_sdk"));
   }
 }
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 ff7f702..6344cda 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
@@ -34,6 +34,7 @@
     srcs = ["AndroidSkylarkTest.java"],
     deps = [
         "//src/main/java/com/google/devtools/build/lib:build-base",
+        "//src/main/java/com/google/devtools/build/lib:packages-internal",
         "//src/main/java/com/google/devtools/build/lib:syntax",
         "//src/main/java/com/google/devtools/build/lib/cmdline",
         "//src/test/java/com/google/devtools/build/lib:analysis_testutil",
diff --git a/src/test/java/com/google/devtools/build/lib/rules/apple/SwiftConfigurationTest.java b/src/test/java/com/google/devtools/build/lib/rules/apple/SwiftConfigurationTest.java
index c0d31e0..f4c515d 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/apple/SwiftConfigurationTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/apple/SwiftConfigurationTest.java
@@ -16,9 +16,15 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import com.google.common.collect.ImmutableMap;
 import com.google.devtools.build.lib.analysis.ConfiguredTarget;
 import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
+import com.google.devtools.build.lib.cmdline.Label;
+import com.google.devtools.build.lib.packages.Provider;
+import com.google.devtools.build.lib.packages.SkylarkProvider;
+import com.google.devtools.build.lib.packages.StructImpl;
 import java.util.List;
+import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -26,14 +32,29 @@
 /** Tests for Skylark interface to SwiftConfiguration. */
 @RunWith(JUnit4.class)
 public class SwiftConfigurationTest extends BuildViewTestCase {
+  @Before
+  public void setupMyInfo() throws Exception {
+    scratch.file("myinfo/myinfo.bzl", "MyInfo = provider()");
+
+    scratch.file("myinfo/BUILD");
+  }
+
+  private StructImpl getMyInfoFromTarget(ConfiguredTarget configuredTarget) throws Exception {
+    Provider.Key key =
+        new SkylarkProvider.SkylarkKey(
+            Label.parseAbsolute("//myinfo:myinfo.bzl", ImmutableMap.of()), "MyInfo");
+    return (StructImpl) configuredTarget.get(key);
+  }
+
   @Test
   public void testSkylarkApi() throws Exception {
     scratch.file("examples/rule/BUILD");
     scratch.file(
         "examples/rule/apple_rules.bzl",
+        "load('//myinfo:myinfo.bzl', 'MyInfo')",
         "def swift_binary_impl(ctx):",
         "   copts = ctx.fragments.swift.copts()",
-        "   return struct(",
+        "   return MyInfo(",
         "      copts=copts,",
         "   )",
         "swift_binary = rule(",
@@ -54,7 +75,7 @@
     ConfiguredTarget skylarkTarget = getConfiguredTarget("//examples/swift_skylark:my_target");
 
     @SuppressWarnings("unchecked")
-    List<String> copts = (List<String>) skylarkTarget.get("copts");
+    List<String> copts = (List<String>) getMyInfoFromTarget(skylarkTarget).getValue("copts");
 
     assertThat(copts).containsAllOf("foo", "bar");
   }
@@ -64,9 +85,10 @@
     scratch.file("examples/rule/BUILD");
     scratch.file(
         "examples/rule/apple_rules.bzl",
+        "load('//myinfo:myinfo.bzl', 'MyInfo')",
         "def swift_binary_impl(ctx):",
         "   copts = ctx.fragments.swift.copts()",
-        "   return struct(",
+        "   return MyInfo(",
         "      copts=copts,",
         "   )",
         "swift_binary = rule(",
@@ -86,7 +108,7 @@
         getConfiguredTarget("//examples/swift_skylark:my_target", getHostConfiguration());
 
     @SuppressWarnings("unchecked")
-    List<String> copts = (List<String>) target.get("copts");
+    List<String> copts = (List<String>) getMyInfoFromTarget(target).getValue("copts");
 
     assertThat(copts).doesNotContain("foo");
     assertThat(copts).containsAllOf("bar", "baz");
diff --git a/src/test/java/com/google/devtools/build/lib/rules/apple/XcodeVersionTest.java b/src/test/java/com/google/devtools/build/lib/rules/apple/XcodeVersionTest.java
index 060c01a..663674d 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/apple/XcodeVersionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/apple/XcodeVersionTest.java
@@ -16,9 +16,14 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import com.google.common.collect.ImmutableMap;
 import com.google.devtools.build.lib.analysis.ConfiguredTarget;
 import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget;
 import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
+import com.google.devtools.build.lib.cmdline.Label;
+import com.google.devtools.build.lib.packages.Provider;
+import com.google.devtools.build.lib.packages.SkylarkProvider;
+import com.google.devtools.build.lib.packages.StructImpl;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -34,6 +39,7 @@
     scratch.file("examples/rule/BUILD");
     scratch.file(
         "examples/rule/apple_rules.bzl",
+        "MyInfo = provider()",
         "def my_rule_impl(ctx):",
         "   xcode_properties = ctx.attr.xcode[apple_common.XcodeProperties]",
         "   xcode_version = xcode_properties.xcode_version",
@@ -41,7 +47,7 @@
         "   watchos_version = xcode_properties.default_watchos_sdk_version",
         "   tvos_version = xcode_properties.default_tvos_sdk_version",
         "   macos_version = xcode_properties.default_macos_sdk_version",
-        "   return struct(",
+        "   return MyInfo(",
         "       xcode_version=xcode_version,",
         "       ios_version=ios_version,",
         "       watchos_version=watchos_version,",
@@ -72,11 +78,15 @@
 
     RuleConfiguredTarget skylarkTarget =
         (RuleConfiguredTarget) getConfiguredTarget("//examples/apple_skylark:my_target");
-    assertThat((String) skylarkTarget.get("xcode_version")).isEqualTo("8");
-    assertThat((String) skylarkTarget.get("ios_version")).isEqualTo("9.0");
-    assertThat((String) skylarkTarget.get("watchos_version")).isEqualTo("9.1");
-    assertThat((String) skylarkTarget.get("tvos_version")).isEqualTo("9.2");
-    assertThat((String) skylarkTarget.get("macos_version")).isEqualTo("9.3");
+    Provider.Key key =
+        new SkylarkProvider.SkylarkKey(
+            Label.parseAbsolute("//examples/rule:apple_rules.bzl", ImmutableMap.of()), "MyInfo");
+    StructImpl myInfo = (StructImpl) skylarkTarget.get(key);
+    assertThat((String) myInfo.getValue("xcode_version")).isEqualTo("8");
+    assertThat((String) myInfo.getValue("ios_version")).isEqualTo("9.0");
+    assertThat((String) myInfo.getValue("watchos_version")).isEqualTo("9.1");
+    assertThat((String) myInfo.getValue("tvos_version")).isEqualTo("9.2");
+    assertThat((String) myInfo.getValue("macos_version")).isEqualTo("9.3");
   }
 
   @Test
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/SkylarkJavaLiteProtoLibraryTest.java
index d57016f..9d96f2c 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/SkylarkJavaLiteProtoLibraryTest.java
@@ -22,6 +22,7 @@
 
 import com.google.common.base.Function;
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
 import com.google.common.eventbus.EventBus;
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.actions.util.ActionsTestUtil;
@@ -29,7 +30,11 @@
 import com.google.devtools.build.lib.analysis.ExtraActionArtifactsProvider;
 import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
 import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
+import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
+import com.google.devtools.build.lib.packages.Provider;
+import com.google.devtools.build.lib.packages.SkylarkProvider;
+import com.google.devtools.build.lib.packages.StructImpl;
 import com.google.devtools.build.lib.rules.java.JavaCompilationArgsProvider;
 import com.google.devtools.build.lib.rules.java.JavaCompileAction;
 import com.google.devtools.build.lib.rules.java.JavaInfo;
@@ -529,15 +534,16 @@
   public void testJavaLiteProtoLibraryAspectProviders() throws Exception {
     scratch.file(
         "x/aspect.bzl",
+        "MyInfo = provider()",
         "def _foo_aspect_impl(target,ctx):",
         "  proto_found = hasattr(target, 'proto_java')",
         "  if hasattr(ctx.rule.attr, 'deps'):",
         "    for dep in ctx.rule.attr.deps:",
         "      proto_found = proto_found or dep.proto_found",
-        "  return struct(proto_found = proto_found)",
+        "  return MyInfo(proto_found = proto_found)",
         "foo_aspect = aspect(_foo_aspect_impl, attr_aspects = ['deps'])",
         "def _foo_rule_impl(ctx):",
-        "  return struct(result = ctx.attr.dep.proto_found)",
+        "  return MyInfo(result = ctx.attr.dep.proto_found)",
         "foo_rule = rule(_foo_rule_impl, attrs = { 'dep' : attr.label(aspects = [foo_aspect])})");
     scratch.file(
         "x/BUILD",
@@ -548,7 +554,11 @@
         "proto_library(name = 'foo_proto', srcs = ['foo.proto'], java_lib = ':lib')",
         "foo_rule(name = 'foo_rule', dep = 'foo_java_proto')");
     ConfiguredTarget target = getConfiguredTarget("//x:foo_rule");
-    Boolean result = (Boolean) target.get("result");
+    Provider.Key key =
+        new SkylarkProvider.SkylarkKey(
+            Label.parseAbsolute("//x:aspect.bzl", ImmutableMap.of()), "MyInfo");
+    StructImpl myInfo = (StructImpl) target.get(key);
+    Boolean result = (Boolean) myInfo.getValue("result");
 
     // "yes" means that "proto_java" was found on the proto_library + java_proto_library aspect.
     assertThat(result).isTrue();
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/AppleBinarySkylarkApiTest.java
index 8b5a627..087ac58 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/AppleBinarySkylarkApiTest.java
@@ -59,11 +59,13 @@
         "test_skylark/apple_binary_skylark.bzl",
         "def apple_binary_skylark_impl(ctx):",
         "  binary_output = apple_common.link_multi_arch_binary(ctx=ctx)",
-        "  return struct(",
-        "      files=depset([binary_output.binary_provider.binary]),",
-        "      output_groups=binary_output.output_groups,",
-        "      providers=[binary_output.binary_provider, binary_output.debug_outputs_provider],",
-        "  )",
+        "  return [",
+        "      DefaultInfo(",
+        "          files=depset([binary_output.binary_provider.binary])),",
+        "      OutputGroupInfo(**binary_output.output_groups),",
+        "      binary_output.binary_provider,",
+        "      binary_output.debug_outputs_provider",
+        "  ]",
         "apple_binary_skylark = rule(",
         "    apple_binary_skylark_impl,",
         "    attrs = {",
diff --git a/src/test/java/com/google/devtools/build/lib/rules/objc/AppleStaticLibraryTest.java b/src/test/java/com/google/devtools/build/lib/rules/objc/AppleStaticLibraryTest.java
index 751e9cf..6eb8ab6 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/objc/AppleStaticLibraryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/objc/AppleStaticLibraryTest.java
@@ -641,9 +641,7 @@
         "   dep_provider = ctx.attr.proxy[apple_common.AppleStaticLibrary]",
         "   my_provider = apple_common.AppleStaticLibrary(archive = dep_provider.archive,",
         "       objc = dep_provider.objc)",
-        "   return struct(",
-        "      providers = [my_provider]",
-        "   )",
+        "   return [my_provider]",
         "",
         "skylark_static_lib = rule(",
         "  implementation = skylark_static_lib_impl,",
@@ -681,9 +679,7 @@
         "   dep_provider = ctx.attr.proxy[apple_common.AppleStaticLibrary]",
         "   my_provider = apple_common.AppleStaticLibrary(archive = dep_provider.archive,",
         "       objc = dep_provider.objc, foo = 'bar')",
-        "   return struct(",
-        "      providers = [my_provider]",
-        "   )",
+        "   return [my_provider]",
         "",
         "skylark_static_lib = rule(",
         "  implementation = skylark_static_lib_impl,",
diff --git a/src/test/java/com/google/devtools/build/lib/rules/objc/BazelJ2ObjcLibraryTest.java b/src/test/java/com/google/devtools/build/lib/rules/objc/BazelJ2ObjcLibraryTest.java
index a773056..c466cd1 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/objc/BazelJ2ObjcLibraryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/objc/BazelJ2ObjcLibraryTest.java
@@ -951,7 +951,7 @@
         "examples/fake_rule.bzl",
         "def _fake_rule_impl(ctx):",
         "  myProvider = ctx.attr.deps[0][JavaInfo]",
-        "  return struct(providers = [myProvider])",
+        "  return myProvider",
         "",
         "fake_rule = rule(",
         "  implementation = _fake_rule_impl,",
diff --git a/src/test/java/com/google/devtools/build/lib/rules/proto/BazelProtoInfoStarlarkTest.java b/src/test/java/com/google/devtools/build/lib/rules/proto/BazelProtoInfoStarlarkTest.java
index 72eb674..2f22ae2 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/proto/BazelProtoInfoStarlarkTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/proto/BazelProtoInfoStarlarkTest.java
@@ -16,10 +16,15 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import com.google.common.collect.ImmutableMap;
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.actions.util.ActionsTestUtil;
 import com.google.devtools.build.lib.analysis.ConfiguredTarget;
 import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
+import com.google.devtools.build.lib.cmdline.Label;
+import com.google.devtools.build.lib.packages.Provider;
+import com.google.devtools.build.lib.packages.SkylarkProvider;
+import com.google.devtools.build.lib.packages.StructImpl;
 import com.google.devtools.build.lib.packages.util.MockProtoSupport;
 import com.google.devtools.build.lib.skylarkbuildapi.proto.ProtoModuleApi;
 import org.junit.Before;
@@ -34,17 +39,27 @@
   public void setUp() throws Exception {
     useConfiguration("--proto_compiler=//proto:compiler"); // TODO check do we need that.
     scratch.file("proto/BUILD", "licenses(['notice'])", "exports_files(['compiler'])");
+    scratch.file("myinfo/myinfo.bzl", "MyInfo = provider()");
+    scratch.file("myinfo/BUILD");
     MockProtoSupport.setup(mockToolsConfig);
   }
 
+  private StructImpl getMyInfoFromTarget(ConfiguredTarget configuredTarget) throws Exception {
+    Provider.Key key =
+        new SkylarkProvider.SkylarkKey(
+            Label.parseAbsolute("//myinfo:myinfo.bzl", ImmutableMap.of()), "MyInfo");
+    return (StructImpl) configuredTarget.get(key);
+  }
+
   @Test
   public void testLegacyProviderCanBeDisabled() throws Exception {
     useConfiguration("--incompatible_disable_legacy_proto_provider");
     scratch.file(
         "foo/test.bzl",
+        "load('//myinfo:myinfo.bzl', 'MyInfo')",
         "def _impl(ctx):",
         "  provider = ctx.attr.dep.proto", // NB: This is the legacy provider
-        "  return struct(direct_sources=provider.direct_sources)",
+        "  return MyInfo(direct_sources=provider.direct_sources)",
         "test = rule(implementation = _impl, attrs = {'dep': attr.label()})");
 
     scratch.file(
@@ -62,14 +77,15 @@
   public void testProtoCommon() throws Exception {
     scratch.file(
         "foo/test.bzl",
+        "load('//myinfo:myinfo.bzl', 'MyInfo')",
         "def _impl(ctx):",
-        "  return struct(proto_common=proto_common)",
+        "  return MyInfo(proto_common=proto_common)",
         "test = rule(implementation = _impl, attrs = {})");
 
     scratch.file("foo/BUILD", "load(':test.bzl', 'test')", "test(name='test')");
 
     ConfiguredTarget test = getConfiguredTarget("//foo:test");
-    Object protoCommon = test.get("proto_common");
+    Object protoCommon = getMyInfoFromTarget(test).getValue("proto_common");
     assertThat(protoCommon).isInstanceOf(ProtoModuleApi.class);
   }
 
@@ -78,9 +94,10 @@
     useConfiguration("--incompatible_disable_legacy_proto_provider");
     scratch.file(
         "foo/test.bzl",
+        "load('//myinfo:myinfo.bzl', 'MyInfo')",
         "def _impl(ctx):",
         "  provider = ctx.attr.dep[ProtoInfo]", // NB: This is the modern provider
-        "  return struct(direct_sources=provider.direct_sources)",
+        "  return MyInfo(direct_sources=provider.direct_sources)",
         "test = rule(implementation = _impl, attrs = {'dep': attr.label()})");
 
     scratch.file(
@@ -91,7 +108,8 @@
 
     ConfiguredTarget test = getConfiguredTarget("//foo:test");
     @SuppressWarnings("unchecked")
-    Iterable<Artifact> directSources = (Iterable<Artifact>) test.get("direct_sources");
+    Iterable<Artifact> directSources =
+        (Iterable<Artifact>) getMyInfoFromTarget(test).getValue("direct_sources");
     assertThat(ActionsTestUtil.baseArtifactNames(directSources)).containsExactly("p.proto");
   }
 
@@ -100,9 +118,10 @@
     useConfiguration("--noincompatible_disable_legacy_proto_provider");
     scratch.file(
         "foo/test.bzl",
+        "load('//myinfo:myinfo.bzl', 'MyInfo')",
         "def _impl(ctx):",
         "  provider = ctx.attr.dep.proto", // NB: This is the legacy provider
-        "  return struct(direct_sources=provider.direct_sources)",
+        "  return MyInfo(direct_sources=provider.direct_sources)",
         "test = rule(implementation = _impl, attrs = {'dep': attr.label()})");
 
     scratch.file(
@@ -113,7 +132,8 @@
 
     ConfiguredTarget test = getConfiguredTarget("//foo:test");
     @SuppressWarnings("unchecked")
-    Iterable<Artifact> directSources = (Iterable<Artifact>) test.get("direct_sources");
+    Iterable<Artifact> directSources =
+        (Iterable<Artifact>) getMyInfoFromTarget(test).getValue("direct_sources");
     assertThat(ActionsTestUtil.baseArtifactNames(directSources)).containsExactly("p.proto");
   }
 
@@ -121,9 +141,10 @@
   public void testProvider() throws Exception {
     scratch.file(
         "foo/test.bzl",
+        "load('//myinfo:myinfo.bzl', 'MyInfo')",
         "def _impl(ctx):",
         "  provider = ctx.attr.dep[ProtoInfo]", // NB: This is the modern provider
-        "  return struct(direct_sources=provider.direct_sources)",
+        "  return MyInfo(direct_sources=provider.direct_sources)",
         "test = rule(implementation = _impl, attrs = {'dep': attr.label()})");
 
     scratch.file(
@@ -134,7 +155,8 @@
 
     ConfiguredTarget test = getConfiguredTarget("//foo:test");
     @SuppressWarnings("unchecked")
-    Iterable<Artifact> directSources = (Iterable<Artifact>) test.get("direct_sources");
+    Iterable<Artifact> directSources =
+        (Iterable<Artifact>) getMyInfoFromTarget(test).getValue("direct_sources");
     assertThat(ActionsTestUtil.baseArtifactNames(directSources)).containsExactly("p.proto");
   }
 
@@ -143,9 +165,10 @@
 
     scratch.file(
         "foo/myTsetRule.bzl",
+        "load('//myinfo:myinfo.bzl', 'MyInfo')",
         "",
         "def _my_test_rule_impl(ctx):",
-        "    return struct(",
+        "    return MyInfo(",
         "        fetched_proto_source_root = ctx.attr.protodep.proto.proto_source_root",
         "    )",
         "",
@@ -169,7 +192,7 @@
         ")");
 
     ConfiguredTarget ct = getConfiguredTarget("//foo:myRule");
-    String protoSourceRoot = (String) ct.get("fetched_proto_source_root");
+    String protoSourceRoot = (String) getMyInfoFromTarget(ct).getValue("fetched_proto_source_root");
 
     assertThat(protoSourceRoot).isEqualTo("foo");
   }
