diff --git a/Android.bp b/Android.bp
index a941ca4..23cbad8 100644
--- a/Android.bp
+++ b/Android.bp
@@ -159,6 +159,7 @@
         "soong-android",
     ],
     srcs: [
+        "genrule/filegroup.go",
         "genrule/genrule.go",
     ],
     pluginFor: ["soong_build"],
diff --git a/README.md b/README.md
index 9d3dde6..8b086df 100644
--- a/README.md
+++ b/README.md
@@ -8,7 +8,9 @@
 
 By design, Android.bp files are very simple.  There are no conditionals or
 control flow statements - any complexity is handled in build logic written in
-Go.
+Go.  The syntax and semantics of Android.bp files are intentionally similar
+to [Bazel BUILD files](https://www.bazel.io/versions/master/docs/be/overview.html)
+when possible.
 
 ### Modules
 
diff --git a/android/module.go b/android/module.go
index c0b9c47..7156e8c 100644
--- a/android/module.go
+++ b/android/module.go
@@ -711,6 +711,38 @@
 	return -1
 }
 
+func SrcIsModule(s string) string {
+	if len(s) > 1 && s[0] == ':' {
+		return s[1:]
+	}
+	return ""
+}
+
+type sourceDependencyTag struct {
+	blueprint.BaseDependencyTag
+}
+
+var SourceDepTag sourceDependencyTag
+
+// Returns a list of modules that must be depended on to satisfy filegroup or generated sources
+// modules listed in srcFiles using ":module" syntax
+func ExtractSourcesDeps(ctx BottomUpMutatorContext, srcFiles []string) {
+	var deps []string
+	for _, s := range srcFiles {
+		if m := SrcIsModule(s); m != "" {
+			deps = append(deps, m)
+		}
+	}
+
+	ctx.AddDependency(ctx.Module(), SourceDepTag, deps...)
+}
+
+type SourceFileProducer interface {
+	Srcs() Paths
+}
+
+// Returns a list of paths expanded from globs and modules referenced using ":module" syntax.
+// ExpandSourceDeps must have already been called during the dependency resolution phase.
 func (ctx *androidModuleContext) ExpandSources(srcFiles, excludes []string) Paths {
 	prefix := PathForModuleSrc(ctx).String()
 	for i, e := range excludes {
@@ -724,7 +756,14 @@
 
 	globbedSrcFiles := make(Paths, 0, len(srcFiles))
 	for _, s := range srcFiles {
-		if pathtools.IsGlob(s) {
+		if m := SrcIsModule(s); m != "" {
+			module := ctx.GetDirectDepWithTag(m, SourceDepTag)
+			if srcProducer, ok := module.(SourceFileProducer); ok {
+				globbedSrcFiles = append(globbedSrcFiles, srcProducer.Srcs()...)
+			} else {
+				ctx.ModuleErrorf("srcs dependency %q is not a source file producing module", m)
+			}
+		} else if pathtools.IsGlob(s) {
 			globbedSrcFiles = append(globbedSrcFiles, ctx.Glob(filepath.Join(prefix, s), excludes)...)
 		} else {
 			globbedSrcFiles = append(globbedSrcFiles, PathForModuleSrc(ctx, s))
diff --git a/cc/cc.go b/cc/cc.go
index 74d3d3d..8bf1467 100644
--- a/cc/cc.go
+++ b/cc/cc.go
@@ -227,7 +227,8 @@
 	staticExportDepTag    = dependencyTag{name: "static", library: true, reexportFlags: true}
 	lateStaticDepTag      = dependencyTag{name: "late static", library: true}
 	wholeStaticDepTag     = dependencyTag{name: "whole static", library: true, reexportFlags: true}
-	headerDepTag          = dependencyTag{name: "header", library: true, reexportFlags: true}
+	headerDepTag          = dependencyTag{name: "header", library: true}
+	headerExportDepTag    = dependencyTag{name: "header", library: true, reexportFlags: true}
 	genSourceDepTag       = dependencyTag{name: "gen source"}
 	genHeaderDepTag       = dependencyTag{name: "gen header"}
 	genHeaderExportDepTag = dependencyTag{name: "gen header", reexportFlags: true}
@@ -663,7 +664,13 @@
 		deps.LateSharedLibs, variantLateNdkLibs = rewriteNdkLibs(deps.LateSharedLibs)
 	}
 
-	actx.AddVariationDependencies(nil, headerDepTag, deps.HeaderLibs...)
+	for _, lib := range deps.HeaderLibs {
+		depTag := headerDepTag
+		if inList(lib, deps.ReexportHeaderLibHeaders) {
+			depTag = headerExportDepTag
+		}
+		actx.AddVariationDependencies(nil, depTag, lib)
+	}
 
 	actx.AddVariationDependencies([]blueprint.Variation{{"link", "static"}}, wholeStaticDepTag,
 		deps.WholeStaticLibs...)
@@ -826,7 +833,7 @@
 		cc, _ := m.(*Module)
 		if cc == nil {
 			switch tag {
-			case android.DefaultsDepTag:
+			case android.DefaultsDepTag, android.SourceDepTag:
 			case genSourceDepTag:
 				if genRule, ok := m.(genrule.SourceFileGenerator); ok {
 					depPaths.GeneratedSources = append(depPaths.GeneratedSources,
diff --git a/cc/compiler.go b/cc/compiler.go
index e6f432c..d53e799 100644
--- a/cc/compiler.go
+++ b/cc/compiler.go
@@ -29,6 +29,8 @@
 
 type BaseCompilerProperties struct {
 	// list of source files used to compile the C/C++ module.  May be .c, .cpp, or .S files.
+	// srcs may reference the outputs of other modules that produce source files like genrule
+	// or filegroup using the syntax ":module".
 	Srcs []string `android:"arch_variant"`
 
 	// list of source files that should not be used to build the C/C++ module.
@@ -133,6 +135,8 @@
 	deps.GeneratedSources = append(deps.GeneratedSources, compiler.Properties.Generated_sources...)
 	deps.GeneratedHeaders = append(deps.GeneratedHeaders, compiler.Properties.Generated_headers...)
 
+	android.ExtractSourcesDeps(ctx, compiler.Properties.Srcs)
+
 	if compiler.hasSrcExt(".proto") {
 		deps = protoDeps(ctx, deps, &compiler.Proto)
 	}
diff --git a/cc/config/global.go b/cc/config/global.go
index c8b803b..6f14486 100644
--- a/cc/config/global.go
+++ b/cc/config/global.go
@@ -113,7 +113,6 @@
 	pctx.PrefixedPathsForOptionalSourceVariable("CommonGlobalSystemIncludes", "-isystem ",
 		[]string{
 			"frameworks/av/include",
-			"frameworks/base/include",
 		})
 	// This is used by non-NDK modules to get jni.h. export_include_dirs doesn't help
 	// with this, since there is no associated library.
diff --git a/genrule/filegroup.go b/genrule/filegroup.go
new file mode 100644
index 0000000..9b53c9f
--- /dev/null
+++ b/genrule/filegroup.go
@@ -0,0 +1,61 @@
+// Copyright 2016 Google Inc. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package genrule
+
+import (
+	"github.com/google/blueprint"
+
+	"android/soong/android"
+)
+
+func init() {
+	android.RegisterModuleType("filegroup", fileGroupFactory)
+}
+
+type fileGroupProperties struct {
+	// srcs lists files that will be included in this filegroup
+	Srcs []string
+
+	Exclude_srcs []string
+}
+
+type fileGroup struct {
+	android.ModuleBase
+	properties fileGroupProperties
+	srcs       android.Paths
+}
+
+var _ android.SourceFileProducer = (*fileGroup)(nil)
+
+// filegroup modules contain a list of files, and can be used to export files across package
+// boundaries.  filegroups (and genrules) can be referenced from srcs properties of other modules
+// using the syntax ":module".
+func fileGroupFactory() (blueprint.Module, []interface{}) {
+	module := &fileGroup{}
+
+	return android.InitAndroidModule(module, &module.properties)
+}
+
+func (fg *fileGroup) DepsMutator(ctx android.BottomUpMutatorContext) {
+	android.ExtractSourcesDeps(ctx, fg.properties.Srcs)
+}
+
+func (fg *fileGroup) GenerateAndroidBuildActions(ctx android.ModuleContext) {
+	fg.srcs = ctx.ExpandSources(fg.properties.Srcs, fg.properties.Exclude_srcs)
+}
+
+func (fg *fileGroup) Srcs() android.Paths {
+	return fg.srcs
+}
diff --git a/genrule/genrule.go b/genrule/genrule.go
index bb78b1f..5a2ac84 100644
--- a/genrule/genrule.go
+++ b/genrule/genrule.go
@@ -96,6 +96,10 @@
 	return g.outputFiles
 }
 
+func (g *generator) Srcs() android.Paths {
+	return g.outputFiles
+}
+
 func (g *generator) GeneratedHeaderDirs() android.Paths {
 	return g.exportedIncludeDirs
 }
