diff --git a/python/androidmk.go b/python/androidmk.go
index 5fa01ab..4c94450 100644
--- a/python/androidmk.go
+++ b/python/androidmk.go
@@ -39,7 +39,7 @@
 }
 
 func (p *Module) AndroidMk() android.AndroidMkData {
-	ret := android.AndroidMkData{OutputFile: p.installSource}
+	ret := android.AndroidMkData{}
 
 	p.subAndroidMk(&ret, p.installer)
 
@@ -55,7 +55,7 @@
 				strings.Join(p.binaryProperties.Test_suites, " "))
 		}
 	})
-	base.subAndroidMk(ret, p.pythonInstaller)
+	base.subAndroidMk(ret, p.baseInstaller)
 }
 
 func (p *testDecorator) AndroidMk(base *Module, ret *android.AndroidMkData) {
@@ -67,7 +67,7 @@
 				strings.Join(p.binaryDecorator.binaryProperties.Test_suites, " "))
 		}
 	})
-	base.subAndroidMk(ret, p.binaryDecorator.pythonInstaller)
+	base.subAndroidMk(ret, p.binaryDecorator.baseInstaller)
 }
 
 func (installer *pythonInstaller) AndroidMk(base *Module, ret *android.AndroidMkData) {
diff --git a/python/binary.go b/python/binary.go
index 457c7fa..14c4952 100644
--- a/python/binary.go
+++ b/python/binary.go
@@ -49,20 +49,24 @@
 type binaryDecorator struct {
 	binaryProperties BinaryProperties
 
-	*pythonInstaller
+	baseInstaller *pythonInstaller
 }
 
 type IntermPathProvider interface {
 	IntermPathForModuleOut() android.OptionalPath
 }
 
+func (binary *binaryDecorator) install(ctx android.ModuleContext, file android.Path) {
+	binary.baseInstaller.install(ctx, file)
+}
+
 var (
 	stubTemplateHost = "build/soong/python/scripts/stub_template_host.txt"
 )
 
 func NewBinary(hod android.HostOrDeviceSupported) (*Module, *binaryDecorator) {
 	module := newModule(hod, android.MultilibFirst)
-	decorator := &binaryDecorator{pythonInstaller: NewPythonInstaller("bin", "")}
+	decorator := &binaryDecorator{baseInstaller: NewPythonInstaller("bin")}
 
 	module.bootstrapper = decorator
 	module.installer = decorator
diff --git a/python/installer.go b/python/installer.go
index ab3d9b4..04698c5 100644
--- a/python/installer.go
+++ b/python/installer.go
@@ -15,47 +15,26 @@
 package python
 
 import (
-	"path/filepath"
-
 	"android/soong/android"
 )
 
 // This file handles installing python executables into their final location
 
-type installLocation int
-
-const (
-	InstallInData installLocation = iota
-)
-
 type pythonInstaller struct {
-	dir      string
-	dir64    string
-	relative string
+	dir string
 
 	path android.OutputPath
 }
 
-func NewPythonInstaller(dir, dir64 string) *pythonInstaller {
+func NewPythonInstaller(dir string) *pythonInstaller {
 	return &pythonInstaller{
-		dir:   dir,
-		dir64: dir64,
+		dir: dir,
 	}
 }
 
 var _ installer = (*pythonInstaller)(nil)
 
-func (installer *pythonInstaller) installDir(ctx android.ModuleContext) android.OutputPath {
-	dir := installer.dir
-	if ctx.Arch().ArchType.Multilib == "lib64" && installer.dir64 != "" {
-		dir = installer.dir64
-	}
-	if !ctx.Host() && !ctx.Arch().Native {
-		dir = filepath.Join(dir, ctx.Arch().ArchType.String())
-	}
-	return android.PathForModuleInstall(ctx, dir, installer.relative)
-}
-
 func (installer *pythonInstaller) install(ctx android.ModuleContext, file android.Path) {
-	installer.path = ctx.InstallFile(installer.installDir(ctx), file.Base(), file)
+	installer.path = ctx.InstallFile(android.PathForModuleInstall(ctx, installer.dir),
+		file.Base(), file)
 }
diff --git a/python/library.go b/python/library.go
index 65c1352..58ee55f 100644
--- a/python/library.go
+++ b/python/library.go
@@ -22,7 +22,6 @@
 
 func init() {
 	android.RegisterModuleType("python_library_host", PythonLibraryHostFactory)
-	android.RegisterModuleType("python_library", PythonLibraryFactory)
 }
 
 func PythonLibraryHostFactory() android.Module {
@@ -30,9 +29,3 @@
 
 	return module.Init()
 }
-
-func PythonLibraryFactory() android.Module {
-	module := newModule(android.HostAndDeviceSupported, android.MultilibBoth)
-
-	return module.Init()
-}
diff --git a/python/python.go b/python/python.go
index 05efbea..9d6d6a7 100644
--- a/python/python.go
+++ b/python/python.go
@@ -558,9 +558,5 @@
 	return true
 }
 
-func (p *Module) InstallInData() bool {
-	return true
-}
-
 var Bool = proptools.Bool
 var String = proptools.String
diff --git a/python/test.go b/python/test.go
index 825e63c..de2b13e 100644
--- a/python/test.go
+++ b/python/test.go
@@ -22,7 +22,6 @@
 
 func init() {
 	android.RegisterModuleType("python_test_host", PythonTestHostFactory)
-	android.RegisterModuleType("python_test", PythonTestFactory)
 }
 
 type testDecorator struct {
@@ -30,18 +29,13 @@
 }
 
 func (test *testDecorator) install(ctx android.ModuleContext, file android.Path) {
-	test.binaryDecorator.pythonInstaller.dir = "nativetest"
-	test.binaryDecorator.pythonInstaller.dir64 = "nativetest64"
-
-	test.binaryDecorator.pythonInstaller.relative = ctx.ModuleName()
-
-	test.binaryDecorator.pythonInstaller.install(ctx, file)
+	test.binaryDecorator.baseInstaller.install(ctx, file)
 }
 
 func NewTest(hod android.HostOrDeviceSupported) *Module {
 	module, binary := NewBinary(hod)
 
-	binary.pythonInstaller = NewPythonInstaller("nativetest", "nativetest64")
+	binary.baseInstaller = NewPythonInstaller("nativetest")
 
 	test := &testDecorator{binaryDecorator: binary}
 
@@ -56,10 +50,3 @@
 
 	return module.Init()
 }
-
-func PythonTestFactory() android.Module {
-	module := NewTest(android.HostAndDeviceSupported)
-	module.multilib = android.MultilibBoth
-
-	return module.Init()
-}
