diff --git a/java/java.go b/java/java.go
index 2ded80b..326d278 100644
--- a/java/java.go
+++ b/java/java.go
@@ -20,6 +20,7 @@
 
 import (
 	"fmt"
+	"path/filepath"
 	"strconv"
 	"strings"
 
@@ -41,7 +42,6 @@
 	android.RegisterModuleType("java_binary_host", BinaryHostFactory)
 	android.RegisterModuleType("java_import", ImportFactory)
 	android.RegisterModuleType("java_import_host", ImportFactoryHost)
-	android.RegisterModuleType("android_prebuilt_sdk", SdkPrebuiltFactory)
 	android.RegisterModuleType("android_app", AndroidAppFactory)
 
 	android.RegisterSingletonType("logtags", LogtagsSingleton)
@@ -179,26 +179,90 @@
 	libTag           = dependencyTag{name: "javalib"}
 	bootClasspathTag = dependencyTag{name: "bootclasspath"}
 	frameworkResTag  = dependencyTag{name: "framework-res"}
-	sdkDependencyTag = dependencyTag{name: "sdk"}
 )
 
+type sdkDep struct {
+	useModule, useFiles, useDefaultLibs bool
+	module                              string
+	jar                                 android.Path
+	aidl                                android.Path
+}
+
+func decodeSdkDep(ctx android.BaseContext, v string) sdkDep {
+	switch v {
+	case "", "current", "system_current", "test_current":
+		// OK
+	default:
+		if _, err := strconv.Atoi(v); err != nil {
+			ctx.PropertyErrorf("sdk_version", "invalid sdk version")
+			return sdkDep{}
+		}
+	}
+
+	toFile := func(v string) sdkDep {
+		dir := filepath.Join("prebuilts/sdk", v)
+		jar := filepath.Join(dir, "android.jar")
+		aidl := filepath.Join(dir, "framework.aidl")
+		jarPath := android.ExistentPathForSource(ctx, "sdkdir", jar)
+		aidlPath := android.ExistentPathForSource(ctx, "sdkdir", aidl)
+		if !jarPath.Valid() {
+			ctx.PropertyErrorf("sdk_version", "invalid sdk version %q, %q does not exist", v, jar)
+			return sdkDep{}
+		}
+		if !aidlPath.Valid() {
+			ctx.PropertyErrorf("sdk_version", "invalid sdk version %q, %q does not exist", v, aidl)
+			return sdkDep{}
+		}
+		return sdkDep{
+			useFiles: true,
+			jar:      jarPath.Path(),
+			aidl:     aidlPath.Path(),
+		}
+	}
+
+	toModule := func(m string) sdkDep {
+		return sdkDep{
+			useModule: true,
+			module:    m,
+		}
+	}
+
+	if ctx.AConfig().UnbundledBuild() {
+		if v == "" {
+			if ctx, ok := ctx.(android.ModuleContext); ok {
+				ctx.AddMissingDependencies([]string{"sdk_version_must_be_set_for_modules_used_in_unbundled_builds"})
+			}
+			return sdkDep{}
+		}
+		return toFile(v)
+	}
+
+	switch v {
+	case "":
+		return sdkDep{
+			useDefaultLibs: true,
+		}
+	case "current":
+		return toModule("android_stubs_current")
+	case "system_current":
+		return toModule("android_system_stubs_current")
+	case "test_current":
+		return toModule("android_test_stubs_current")
+	default:
+		return toFile(v)
+	}
+}
+
 func (j *Module) deps(ctx android.BottomUpMutatorContext) {
 	if !proptools.Bool(j.properties.No_standard_libs) {
 		if ctx.Device() {
-			switch j.deviceProperties.Sdk_version {
-			case "":
+			sdkDep := decodeSdkDep(ctx, j.deviceProperties.Sdk_version)
+			if sdkDep.useDefaultLibs {
 				ctx.AddDependency(ctx.Module(), bootClasspathTag, "core-oj", "core-libart")
 				ctx.AddDependency(ctx.Module(), libTag, config.DefaultLibraries...)
-			case "current":
-				// TODO: !TARGET_BUILD_APPS
-				// TODO: export preprocessed framework.aidl from android_stubs_current
-				ctx.AddDependency(ctx.Module(), bootClasspathTag, "android_stubs_current")
-			case "test_current":
-				ctx.AddDependency(ctx.Module(), bootClasspathTag, "android_test_stubs_current")
-			case "system_current":
-				ctx.AddDependency(ctx.Module(), bootClasspathTag, "android_system_stubs_current")
-			default:
-				ctx.AddDependency(ctx.Module(), sdkDependencyTag, "sdk_v"+j.deviceProperties.Sdk_version)
+			}
+			if sdkDep.useModule {
+				ctx.AddDependency(ctx.Module(), bootClasspathTag, sdkDep.module)
 			}
 		} else {
 			if j.deviceProperties.Dex {
@@ -247,6 +311,13 @@
 
 func (j *Module) collectDeps(ctx android.ModuleContext) deps {
 	var deps deps
+
+	sdkDep := decodeSdkDep(ctx, j.deviceProperties.Sdk_version)
+	if sdkDep.useFiles {
+		deps.classpath = append(deps.classpath, sdkDep.jar)
+		deps.aidlIncludeDirs = append(deps.aidlIncludeDirs, sdkDep.aidl)
+	}
+
 	ctx.VisitDirectDeps(func(module blueprint.Module) {
 		otherName := ctx.OtherModuleName(module)
 		tag := ctx.OtherModuleDependencyTag(module)
@@ -277,17 +348,6 @@
 				// generated by framework-res.apk
 				deps.srcFileLists = append(deps.srcFileLists, module.(*AndroidApp).aaptJavaFileList)
 			}
-		case sdkDependencyTag:
-			sdkDep := module.(sdkDependency)
-			deps.bootClasspath = append(deps.bootClasspath, sdkDep.ClasspathFiles()...)
-			if sdkDep.AidlPreprocessed().Valid() {
-				if deps.aidlPreprocess.Valid() {
-					ctx.ModuleErrorf("multiple dependencies with preprocessed aidls:\n %q\n %q",
-						deps.aidlPreprocess, sdkDep.AidlPreprocessed())
-				} else {
-					deps.aidlPreprocess = sdkDep.AidlPreprocessed()
-				}
-			}
 		default:
 			panic(fmt.Errorf("unknown dependency %q for %q", otherName, ctx.ModuleName()))
 		}
@@ -677,51 +737,6 @@
 	return module
 }
 
-//
-// SDK java prebuilts (.jar containing resources plus framework.aidl)
-//
-
-type sdkDependency interface {
-	Dependency
-	AidlPreprocessed() android.OptionalPath
-}
-
-var _ sdkDependency = (*sdkPrebuilt)(nil)
-
-type sdkPrebuiltProperties struct {
-	Aidl_preprocessed *string
-}
-
-type sdkPrebuilt struct {
-	Import
-
-	sdkProperties sdkPrebuiltProperties
-
-	aidlPreprocessed android.OptionalPath
-}
-
-func (j *sdkPrebuilt) GenerateAndroidBuildActions(ctx android.ModuleContext) {
-	j.Import.GenerateAndroidBuildActions(ctx)
-
-	j.aidlPreprocessed = android.OptionalPathForModuleSrc(ctx, j.sdkProperties.Aidl_preprocessed)
-}
-
-func (j *sdkPrebuilt) AidlPreprocessed() android.OptionalPath {
-	return j.aidlPreprocessed
-}
-
-func SdkPrebuiltFactory() android.Module {
-	module := &sdkPrebuilt{}
-
-	module.AddProperties(
-		&module.sdkProperties,
-		&module.Import.properties)
-
-	android.InitPrebuiltModule(module, &module.Import.properties.Jars)
-	android.InitAndroidArchModule(module, android.HostAndDeviceSupported, android.MultilibCommon)
-	return module
-}
-
 func inList(s string, l []string) bool {
 	for _, e := range l {
 		if e == s {
