diff --git a/cc/cc.go b/cc/cc.go
index 1ebd762..a9ed205 100644
--- a/cc/cc.go
+++ b/cc/cc.go
@@ -227,6 +227,9 @@
 	// Compile objects into final module
 	compileModule(common.AndroidModuleContext, ccFlags, ccDeps, []string)
 
+	// Install the built module.
+	installModule(common.AndroidModuleContext, ccFlags)
+
 	// Return the output file (.o, .a or .so) for use by other modules
 	outputFile() string
 }
@@ -307,6 +310,11 @@
 	if ctx.Failed() {
 		return
 	}
+
+	c.ccModuleType().installModule(ctx, flags)
+	if ctx.Failed() {
+		return
+	}
 }
 
 func (c *ccBase) ccModuleType() ccModuleType {
@@ -940,13 +948,6 @@
 	c.out = outputFile
 	c.exportIncludeDirs = pathtools.PrefixPaths(c.properties.Export_include_dirs,
 		common.ModuleSrcDir(ctx))
-
-	installDir := "lib"
-	if flags.toolchain.Is64Bit() {
-		installDir = "lib64"
-	}
-
-	ctx.InstallFile(installDir, outputFile)
 }
 
 func (c *ccLibrary) compileModule(ctx common.AndroidModuleContext,
@@ -966,6 +967,27 @@
 	}
 }
 
+func (c *ccLibrary) installStaticLibrary(ctx common.AndroidModuleContext, flags ccFlags) {
+	// Static libraries do not get installed.
+}
+
+func (c *ccLibrary) installSharedLibrary(ctx common.AndroidModuleContext, flags ccFlags) {
+	installDir := "lib"
+	if flags.toolchain.Is64Bit() {
+		installDir = "lib64"
+	}
+
+	ctx.InstallFile(installDir, c.out)
+}
+
+func (c *ccLibrary) installModule(ctx common.AndroidModuleContext, flags ccFlags) {
+	if c.libraryProperties.IsStatic {
+		c.installStaticLibrary(ctx, flags)
+	} else {
+		c.installSharedLibrary(ctx, flags)
+	}
+}
+
 //
 // Objects (for crt*.o)
 //
@@ -1017,6 +1039,10 @@
 	ctx.CheckbuildFile(outputFile)
 }
 
+func (c *ccObject) installModule(ctx common.AndroidModuleContext, flags ccFlags) {
+	// Object files do not get installed.
+}
+
 func (c *ccObject) outputFile() string {
 	return c.out
 }
@@ -1027,6 +1053,7 @@
 
 type ccBinary struct {
 	ccDynamic
+	out              string
 	binaryProperties binaryProperties
 }
 
@@ -1099,12 +1126,61 @@
 	}
 
 	outputFile := filepath.Join(common.ModuleOutDir(ctx), c.getStem(ctx))
+	c.out = outputFile
 
 	TransformObjToDynamicBinary(ctx, objFiles, deps.sharedLibs, deps.staticLibs,
 		deps.lateStaticLibs, deps.wholeStaticLibs, deps.crtBegin, deps.crtEnd,
 		ccFlagsToBuilderFlags(flags), outputFile)
+}
 
-	ctx.InstallFile("bin", outputFile)
+func (c *ccBinary) installModule(ctx common.AndroidModuleContext, flags ccFlags) {
+	ctx.InstallFile("bin", c.out)
+}
+
+type ccTest struct {
+	ccBinary
+}
+
+var (
+	gtestLibs = []string{"libgtest", "libgtest_main"}
+)
+
+func (c *ccTest) collectDeps(ctx common.AndroidModuleContext, flags ccFlags) (ccDeps, ccFlags) {
+	deps, flags := c.ccBinary.collectDeps(ctx, flags)
+
+	flags.cFlags = append(flags.cFlags, "-DGTEST_HAS_STD_STRING")
+	if c.HostOrDevice().Host() {
+		flags.cFlags = append(flags.cFlags, "-O0", "-g")
+		flags.ldLibs = append(flags.ldLibs, "-lpthread")
+	}
+
+	// TODO(danalbert): Make gtest export its dependencies.
+	flags.includeDirs = append(flags.includeDirs, "external/gtest/include")
+
+	_, staticLibs, _ := c.collectDepsFromList(ctx, gtestLibs)
+	deps.staticLibs = append(deps.staticLibs, staticLibs...)
+
+	return deps, flags
+}
+
+func (c *ccTest) AndroidDynamicDependencies(ctx common.AndroidDynamicDependerModuleContext) []string {
+	ctx.AddVariationDependencies([]blueprint.Variation{{"link", "static"}}, gtestLibs...)
+	deps := c.ccBinary.AndroidDynamicDependencies(ctx)
+	return append(deps, gtestLibs...)
+}
+
+func (c *ccTest) installModule(ctx common.AndroidModuleContext, flags ccFlags) {
+	if c.HostOrDevice().Device() {
+		ctx.InstallFile("../data/nativetest/" + ctx.ModuleName(), c.out)
+	} else {
+		c.ccBinary.installModule(ctx, flags)
+	}
+}
+
+func NewCCTest() (blueprint.Module, []interface{}) {
+	module := &ccTest{}
+	return newCCDynamic(&module.ccDynamic, module, common.HostAndDeviceSupported,
+		common.MultilibFirst, &module.binaryProperties)
 }
 
 //
@@ -1198,6 +1274,10 @@
 	ctx.CheckbuildFile(outputFile)
 }
 
+func (c *toolchainLibrary) installModule(ctx common.AndroidModuleContext, flags ccFlags) {
+	// Toolchain libraries do not get installed.
+}
+
 func LinkageMutator(mctx blueprint.EarlyMutatorContext) {
 	if c, ok := mctx.Module().(*ccLibrary); ok {
 		var modules []blueprint.Module
