diff --git a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/result/SubPlanCreator.java b/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/result/SubPlanCreator.java
index 4b4c0be..6b9b5e4 100644
--- a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/result/SubPlanCreator.java
+++ b/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/result/SubPlanCreator.java
@@ -191,10 +191,51 @@
         if (mModuleName != null) {
             subPlan.addIncludeFilter(new TestFilter(mAbiName, mModuleName, mTestName).toString());
         }
+        Set<TestStatus> statusesToRun = getStatusesToRun();
 
         for (IModuleResult module : mResult.getModules()) {
+
+            // TODO(aaronholden): remove this special case from SubPlanCreator, and filter
+            // individual tests only when the module should run. Tracked by b/33211104
+            if (MULTITEST_MODULES.contains(module.getName())) {
+                // cannot check module.isDone() since this value is not accurate for modules
+                // with multiple test configs. If we should run not-executed tests, include module
+                // and exclude tests with status not in mResultTypes.
+                TestFilter moduleFilter =
+                            new TestFilter(module.getAbi(), module.getName(), null /*test*/);
+                if (mResultTypes.contains(NOT_EXECUTED)) {
+                    subPlan.addIncludeFilter(moduleFilter.toString());
+                    for (ICaseResult caseResult : module.getResults()) {
+                        for (ITestResult testResult : caseResult.getResults()) {
+                            if (!statusesToRun.contains(testResult.getResultStatus())) {
+                                TestFilter testExclude = new TestFilter(module.getAbi(),
+                                        module.getName(), testResult.getFullName());
+                                subPlan.addExcludeFilter(testExclude.toString());
+                            }
+                        }
+                    }
+                } else {
+                    // not running not-executed tests, only include executed tests
+                    if (shouldRunModule(module)) {
+                        // at least some executed tests will be included
+                        for (ICaseResult caseResult : module.getResults()) {
+                            for (ITestResult testResult : caseResult.getResults()) {
+                                if (statusesToRun.contains(testResult.getResultStatus())) {
+                                    TestFilter testInclude = new TestFilter(module.getAbi(),
+                                            module.getName(), testResult.getFullName());
+                                    subPlan.addIncludeFilter(testInclude.toString());
+                                }
+                            }
+                        }
+                    } else {
+                        // no executed tests will be included, so exclude entire module
+                        subPlan.addExcludeFilter(moduleFilter.toString());
+                    }
+                }
+                continue;
+            }
+
             if (shouldRunModule(module)) {
-                Set<TestStatus> statusesToRun = getStatusesToRun();
                 TestFilter moduleInclude =
                             new TestFilter(module.getAbi(), module.getName(), null /*test*/);
                 if (shouldRunEntireModule(module)) {
@@ -227,21 +268,9 @@
                 }
             } else {
                 // module should not run, exclude entire module
-                // TODO(aaronholden): remove this special case from SubPlanCreator, and filter
-                // individual tests only when the module should run. Tracked by b/33211104
-                if (MULTITEST_MODULES.contains(module.getName())) {
-                    for (ICaseResult caseResult : module.getResults()) {
-                        for (ITestResult testResult : caseResult.getResults()) {
-                            TestFilter testExclude = new TestFilter(module.getAbi(),
-                                    module.getName(), testResult.getFullName());
-                            subPlan.addExcludeFilter(testExclude.toString());
-                        }
-                    }
-                } else {
-                    TestFilter moduleExclude =
-                            new TestFilter(module.getAbi(), module.getName(), null /*test*/);
-                    subPlan.addExcludeFilter(moduleExclude.toString());
-                }
+                TestFilter moduleExclude =
+                        new TestFilter(module.getAbi(), module.getName(), null /*test*/);
+                subPlan.addExcludeFilter(moduleExclude.toString());
             }
         }
         return subPlan;
