diff --git a/src/com/android/tradefed/build/BuildInfo.java b/src/com/android/tradefed/build/BuildInfo.java
index 4d42ea0..2069b2a 100644
--- a/src/com/android/tradefed/build/BuildInfo.java
+++ b/src/com/android/tradefed/build/BuildInfo.java
@@ -215,7 +215,6 @@
         setBuildFlavor(build.getBuildFlavor());
         setBuildBranch(build.getBuildBranch());
         setTestTag(build.getTestTag());
-        setTestResourceBuild(build.isTestResourceBuild());
     }
 
     protected MultiMap<String, String> getAttributesMultiMap() {
@@ -681,32 +680,9 @@
                         buildFile.getVersion());
             }
         }
-        // Test resource
-        buildInfo.setTestResourceBuild(protoBuild.getIsTestResource());
         return buildInfo;
     }
 
-    /**
-     * Get test resource from a list of builds.
-     *
-     * @param testResourceBuildInfos An list of {@link IBuildInfo}.
-     * @param testResourceName the test resource name
-     * @return the test resource file.
-     */
-    public static File getTestResource(
-            List<IBuildInfo> testResourceBuildInfos, String testResourceName) {
-        if (testResourceBuildInfos == null) {
-            return null;
-        }
-        for (IBuildInfo buildInfo : testResourceBuildInfos) {
-            File testResourceFile = buildInfo.getFile(testResourceName);
-            if (testResourceFile != null) {
-                return testResourceFile;
-            }
-        }
-        return null;
-    }
-
     /** {@inheritDoc} */
     @Override
     public Set<File> getRemoteFiles() {
diff --git a/src/com/android/tradefed/invoker/InvocationExecution.java b/src/com/android/tradefed/invoker/InvocationExecution.java
index 78a1efa..395fe6e 100644
--- a/src/com/android/tradefed/invoker/InvocationExecution.java
+++ b/src/com/android/tradefed/invoker/InvocationExecution.java
@@ -18,7 +18,6 @@
 import com.android.ddmlib.IDevice;
 import com.android.ddmlib.Log.LogLevel;
 import com.android.tradefed.build.BuildInfo;
-import com.android.tradefed.build.BuildInfoKey;
 import com.android.tradefed.build.BuildInfoKey.BuildInfoFileKey;
 import com.android.tradefed.build.BuildRetrievalError;
 import com.android.tradefed.build.IBuildInfo;
@@ -158,7 +157,6 @@
                 // TODO: remove build update when reporting is done on context
                 updateBuild(info, config);
                 linkExternalDirs(info, testInfo);
-                info.setTestResourceBuild(config.isDeviceConfiguredFake(currentDeviceName));
 
                 if (config.getCommandOptions().shouldUseReplicateSetup()) {
                     buildReplicat = info;
@@ -173,7 +171,6 @@
             }
             throw e;
         }
-        createSharedResources(testInfo);
         setBinariesVersion(testInfo.getContext());
         return true;
     }
@@ -872,39 +869,6 @@
         return null;
     }
 
-    /** Populate the shared resources directory for all non-resource build */
-    private void createSharedResources(TestInformation testInfo) {
-        List<IBuildInfo> infos = testInfo.getContext().getBuildInfos();
-        if (infos.size() <= 1) {
-            return;
-        }
-        try {
-            for (IBuildInfo info : infos) {
-                if (info.isTestResourceBuild()) {
-                    // Create a reception sub-folder for each build info resource to avoid mixing
-                    String name =
-                            String.format(
-                                    "%s_%s_%s",
-                                    info.getBuildBranch(),
-                                    info.getBuildId(),
-                                    info.getBuildFlavor());
-                    File buildDir = FileUtil.createTempDir(name, testInfo.dependenciesFolder());
-                    for (BuildInfoFileKey key : BuildInfoKey.SHARED_KEY) {
-                        File f = info.getFile(key);
-                        if (f == null) {
-                            continue;
-                        }
-                        File subDir = new File(buildDir, f.getName());
-                        FileUtil.symlinkFile(f, subDir);
-                    }
-                }
-            }
-        } catch (IOException e) {
-            CLog.e("Failed to create the shared resources dir.");
-            CLog.e(e);
-        }
-    }
-
     private void setBinariesVersion(IInvocationContext context) {
         String version = getAdbVersion();
         if (version != null) {
diff --git a/tests/src/com/android/tradefed/build/BuildInfoTest.java b/tests/src/com/android/tradefed/build/BuildInfoTest.java
index 1f7b1a0..9eed940 100644
--- a/tests/src/com/android/tradefed/build/BuildInfoTest.java
+++ b/tests/src/com/android/tradefed/build/BuildInfoTest.java
@@ -28,14 +28,12 @@
 import com.android.tradefed.util.SerializationUtil;
 
 import org.junit.After;
-import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
 import java.io.File;
-import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 
@@ -211,28 +209,4 @@
             assertTrue(deserialized.getRemoteFiles().contains(new File(file)));
         }
     }
-
-    /** Test {@link BuildInfo#getTestResource(List, String)} */
-    @Test
-    public void testGetTestResource() {
-        List<IBuildInfo> buildInfos = new ArrayList<IBuildInfo>();
-        BuildInfo testResourceBuild = new BuildInfo();
-        testResourceBuild.setTestResourceBuild(true);
-        File testResourceFile = new File("test-resource1");
-        testResourceBuild.setFile("test-resource1", testResourceFile, "");
-        buildInfos.add(testResourceBuild);
-        File file = BuildInfo.getTestResource(buildInfos, "test-resource1");
-        Assert.assertEquals(testResourceFile, file);
-    }
-
-    /** Test {@link BuildInfo#getTestResource(List, String)} */
-    @Test
-    public void testGetTestResource_notExist() {
-        List<IBuildInfo> buildInfos = new ArrayList<IBuildInfo>();
-        BuildInfo testResourceBuild = new BuildInfo();
-        testResourceBuild.setTestResourceBuild(true);
-        buildInfos.add(testResourceBuild);
-        File file = BuildInfo.getTestResource(buildInfos, "test-resource1");
-        Assert.assertNull(file);
-    }
 }
diff --git a/tests/src/com/android/tradefed/invoker/InvocationExecutionTest.java b/tests/src/com/android/tradefed/invoker/InvocationExecutionTest.java
index 8b84e35..4d743ac 100644
--- a/tests/src/com/android/tradefed/invoker/InvocationExecutionTest.java
+++ b/tests/src/com/android/tradefed/invoker/InvocationExecutionTest.java
@@ -24,10 +24,6 @@
 import static org.mockito.Mockito.verify;
 
 import com.android.tradefed.build.BuildInfo;
-import com.android.tradefed.build.BuildRetrievalError;
-import com.android.tradefed.build.IBuildInfo;
-import com.android.tradefed.build.IBuildProvider;
-import com.android.tradefed.build.StubBuildProvider;
 import com.android.tradefed.config.Configuration;
 import com.android.tradefed.config.DeviceConfigurationHolder;
 import com.android.tradefed.config.IConfiguration;
@@ -55,7 +51,6 @@
 import com.android.tradefed.targetprep.multi.IMultiTargetPreparer;
 import com.android.tradefed.testtype.IRemoteTest;
 import com.android.tradefed.testtype.suite.TestSuiteStub;
-import com.android.tradefed.util.FileUtil;
 import com.android.tradefed.util.IDisableable;
 
 import org.easymock.EasyMock;
@@ -66,7 +61,6 @@
 import org.mockito.InOrder;
 import org.mockito.Mockito;
 
-import java.io.File;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashSet;
@@ -86,7 +80,6 @@
     private ILogSaver mLogSaver;
     private ITestInvocationListener mMockListener;
     private ILogSaverListener mMockLogListener;
-    private ITestDevice mMockDevice;
     private ITestLogger mMockLogger;
 
     @Before
@@ -99,7 +92,6 @@
         mMockListener = mock(ITestInvocationListener.class);
         mMockLogListener = mock(ILogSaverListener.class);
         mMockLogger = mock(ITestLogger.class);
-        mMockDevice = EasyMock.createMock(ITestDevice.class);
         // Reset the counters
         TestBaseMetricCollector.sTotalInit = 0;
         RemoteTestCollector.sTotalInit = 0;
@@ -562,68 +554,4 @@
         inOrder.verify(stub1).isDisabled();
         inOrder.verify(stub1).tearDown(testInfo, exception);
     }
-
-    /** Ensure we create the shared folder from the resource build. */
-    @Test
-    public void testFetchBuild_createSharedFolder() throws Throwable {
-        mExec =
-                new InvocationExecution() {
-                    @Override
-                    protected String getAdbVersion() {
-                        return "1";
-                    }
-                };
-        EasyMock.expect(mMockDevice.getSerialNumber()).andStubReturn("serial");
-        mMockDevice.setRecovery(EasyMock.anyObject());
-        EasyMock.expectLastCall().times(2);
-
-        List<IDeviceConfiguration> listDeviceConfig = new ArrayList<>();
-        DeviceConfigurationHolder holder = new DeviceConfigurationHolder("device1");
-        IBuildProvider provider = new StubBuildProvider();
-        holder.addSpecificConfig(provider);
-        mContext.addAllocatedDevice("device1", mMockDevice);
-        listDeviceConfig.add(holder);
-
-        DeviceConfigurationHolder holder2 = new DeviceConfigurationHolder("device2", true);
-        IBuildProvider provider2 =
-                new StubBuildProvider() {
-                    @Override
-                    public IBuildInfo getBuild() throws BuildRetrievalError {
-                        IBuildInfo info = super.getBuild();
-                        info.setBuildId("1234");
-                        info.setBuildBranch("branch");
-                        info.setBuildFlavor("flavor");
-                        return info;
-                    }
-                };
-        holder2.addSpecificConfig(provider2);
-        mContext.addAllocatedDevice("device2", mMockDevice);
-        listDeviceConfig.add(holder2);
-
-        mConfig.setDeviceConfigList(listDeviceConfig);
-        File tmpWorkDir = FileUtil.createTempDir("invocation-execution-shared-test");
-        TestInformation testInfo =
-                TestInformation.newBuilder()
-                        .setInvocationContext(mContext)
-                        .setDependenciesFolder(tmpWorkDir)
-                        .build();
-        // Download
-        EasyMock.replay(mMockDevice);
-        assertTrue(mExec.fetchBuild(testInfo, mConfig, null, mMockListener));
-        EasyMock.verify(mMockDevice);
-
-        List<IBuildInfo> builds = mContext.getBuildInfos();
-        try {
-            assertEquals(2, builds.size());
-            assertEquals(1, tmpWorkDir.listFiles().length);
-            // The resource build was linked to dependencies
-            assertTrue(tmpWorkDir.listFiles()[0].getName().startsWith("branch_1234_flavor"));
-        } finally {
-            for (IBuildInfo info : builds) {
-                info.cleanUp();
-            }
-            FileUtil.recursiveDelete(tmpWorkDir);
-        }
-        assertTrue(mContext.getAttributes().containsKey(InvocationExecution.JAVA_VERSION_KEY));
-    }
 }
diff --git a/tests/src/com/android/tradefed/invoker/TestInvocationMultiTest.java b/tests/src/com/android/tradefed/invoker/TestInvocationMultiTest.java
index 9257c88..1eb26ee 100644
--- a/tests/src/com/android/tradefed/invoker/TestInvocationMultiTest.java
+++ b/tests/src/com/android/tradefed/invoker/TestInvocationMultiTest.java
@@ -130,7 +130,6 @@
         mProvider1 = EasyMock.createMock(IBuildProvider.class);
         holder1.addSpecificConfig(mProvider1);
         EasyMock.expect(mMockConfig.getDeviceConfigByName("device1")).andStubReturn(holder1);
-        EasyMock.expect(mMockConfig.isDeviceConfiguredFake("device1")).andReturn(false);
         mDevice1.setOptions(EasyMock.anyObject());
         mDevice1.setRecovery(EasyMock.anyObject());
 
diff --git a/tests/src/com/android/tradefed/invoker/TestInvocationTest.java b/tests/src/com/android/tradefed/invoker/TestInvocationTest.java
index 8f4044c..1925909 100644
--- a/tests/src/com/android/tradefed/invoker/TestInvocationTest.java
+++ b/tests/src/com/android/tradefed/invoker/TestInvocationTest.java
@@ -242,8 +242,6 @@
         EasyMock.expect(mMockBuildInfo.getBuildFlavor()).andStubReturn("flavor");
         EasyMock.expect(mMockBuildInfo.getProperties()).andStubReturn(new HashSet<>());
         EasyMock.expect(mMockBuildInfo.isTestResourceBuild()).andStubReturn(false);
-        mMockBuildInfo.setTestResourceBuild(EasyMock.anyBoolean());
-        EasyMock.expectLastCall().anyTimes();
 
         // always expect logger initialization and cleanup calls
         mMockLogRegistry.registerLogger(mMockLogger);
