diff --git a/android/config.go b/android/config.go
index 3d494af..f6ca2e7 100644
--- a/android/config.go
+++ b/android/config.go
@@ -17,6 +17,7 @@
 import (
 	"encoding/json"
 	"fmt"
+	"io/ioutil"
 	"os"
 	"path/filepath"
 	"runtime"
@@ -127,28 +128,34 @@
 	return nil
 }
 
+// atomically writes the config file in case two copies of soong_build are running simultaneously
+// (for example, docs generation and ninja manifest generation)
 func saveToConfigFile(config jsonConfigurable, filename string) error {
 	data, err := json.MarshalIndent(&config, "", "    ")
 	if err != nil {
 		return fmt.Errorf("cannot marshal config data: %s", err.Error())
 	}
 
-	configFileWriter, err := os.Create(filename)
+	f, err := ioutil.TempFile(filepath.Dir(filename), "config")
 	if err != nil {
 		return fmt.Errorf("cannot create empty config file %s: %s\n", filename, err.Error())
 	}
-	defer configFileWriter.Close()
+	defer os.Remove(f.Name())
+	defer f.Close()
 
-	_, err = configFileWriter.Write(data)
+	_, err = f.Write(data)
 	if err != nil {
 		return fmt.Errorf("default config file: %s could not be written: %s", filename, err.Error())
 	}
 
-	_, err = configFileWriter.WriteString("\n")
+	_, err = f.WriteString("\n")
 	if err != nil {
 		return fmt.Errorf("default config file: %s could not be written: %s", filename, err.Error())
 	}
 
+	f.Close()
+	os.Rename(f.Name(), filename)
+
 	return nil
 }
 
diff --git a/android/module.go b/android/module.go
index 230d95c..5894ee7 100644
--- a/android/module.go
+++ b/android/module.go
@@ -34,16 +34,18 @@
 )
 
 type ModuleBuildParams struct {
-	Rule      blueprint.Rule
-	Output    WritablePath
-	Outputs   WritablePaths
-	Input     Path
-	Inputs    Paths
-	Implicit  Path
-	Implicits Paths
-	OrderOnly Paths
-	Default   bool
-	Args      map[string]string
+	Rule            blueprint.Rule
+	Output          WritablePath
+	Outputs         WritablePaths
+	ImplicitOutput  WritablePath
+	ImplicitOutputs WritablePaths
+	Input           Path
+	Inputs          Paths
+	Implicit        Path
+	Implicits       Paths
+	OrderOnly       Paths
+	Default         bool
+	Args            map[string]string
 }
 
 type androidBaseContext interface {
@@ -519,18 +521,22 @@
 
 func (a *androidModuleContext) ModuleBuild(pctx blueprint.PackageContext, params ModuleBuildParams) {
 	bparams := blueprint.BuildParams{
-		Rule:      params.Rule,
-		Outputs:   params.Outputs.Strings(),
-		Inputs:    params.Inputs.Strings(),
-		Implicits: params.Implicits.Strings(),
-		OrderOnly: params.OrderOnly.Strings(),
-		Args:      params.Args,
-		Optional:  !params.Default,
+		Rule:            params.Rule,
+		Outputs:         params.Outputs.Strings(),
+		ImplicitOutputs: params.ImplicitOutputs.Strings(),
+		Inputs:          params.Inputs.Strings(),
+		Implicits:       params.Implicits.Strings(),
+		OrderOnly:       params.OrderOnly.Strings(),
+		Args:            params.Args,
+		Optional:        !params.Default,
 	}
 
 	if params.Output != nil {
 		bparams.Outputs = append(bparams.Outputs, params.Output.String())
 	}
+	if params.ImplicitOutput != nil {
+		bparams.ImplicitOutputs = append(bparams.ImplicitOutputs, params.ImplicitOutput.String())
+	}
 	if params.Input != nil {
 		bparams.Inputs = append(bparams.Inputs, params.Input.String())
 	}
diff --git a/cc/compiler.go b/cc/compiler.go
index a14f397..7e79dfa 100644
--- a/cc/compiler.go
+++ b/cc/compiler.go
@@ -115,7 +115,7 @@
 }
 
 func (compiler *baseCompiler) compilerProps() []interface{} {
-	return []interface{}{&compiler.Properties}
+	return []interface{}{&compiler.Properties, &compiler.Proto}
 }
 
 func (compiler *baseCompiler) compilerInit(ctx BaseModuleContext) {}
diff --git a/cc/gen.go b/cc/gen.go
index 9d3a67c..1000bf8 100644
--- a/cc/gen.go
+++ b/cc/gen.go
@@ -33,11 +33,11 @@
 var (
 	yacc = pctx.AndroidStaticRule("yacc",
 		blueprint.RuleParams{
-			Command:     "BISON_PKGDATADIR=$yaccDataDir $yaccCmd -d $yaccFlags --defines=$hFile -o $cFile $in",
+			Command:     "BISON_PKGDATADIR=$yaccDataDir $yaccCmd -d $yaccFlags --defines=$hFile -o $out $in",
 			CommandDeps: []string{"$yaccCmd"},
 			Description: "yacc $out",
 		},
-		"yaccFlags", "cFile", "hFile")
+		"yaccFlags", "hFile")
 
 	lex = pctx.AndroidStaticRule("lex",
 		blueprint.RuleParams{
@@ -51,12 +51,12 @@
 	headerFile = android.GenPathWithExt(ctx, "yacc", yaccFile, "h")
 
 	ctx.ModuleBuild(pctx, android.ModuleBuildParams{
-		Rule:    yacc,
-		Outputs: android.WritablePaths{outFile, headerFile},
-		Input:   yaccFile,
+		Rule:           yacc,
+		Output:         outFile,
+		ImplicitOutput: headerFile,
+		Input:          yaccFile,
 		Args: map[string]string{
 			"yaccFlags": yaccFlags,
-			"cFile":     outFile.String(),
 			"hFile":     headerFile.String(),
 		},
 	})
