diff --git a/cc/cc.go b/cc/cc.go
index 61e2568..051bbaf 100644
--- a/cc/cc.go
+++ b/cc/cc.go
@@ -531,7 +531,7 @@
 
 	buildFlags := ccFlagsToBuilderFlags(flags)
 
-	srcFiles = common.ExpandSources(ctx, srcFiles)
+	srcFiles = ctx.ExpandSources(srcFiles)
 	srcFiles, deps := genSources(ctx, srcFiles, buildFlags)
 
 	return TransformSourceToObj(ctx, subdir, srcFiles, buildFlags, deps)
diff --git a/common/glob.go b/common/glob.go
index 669d185..d63f87a 100644
--- a/common/glob.go
+++ b/common/glob.go
@@ -66,41 +66,20 @@
 	return false
 }
 
-func expandGlobs(ctx AndroidModuleContext, in []string) []string {
-	if !hasGlob(in) {
-		return in
-	}
-
-	var excludes []string
-	for _, s := range in {
-		if s[0] == '-' {
-			excludes = append(excludes, s[1:])
-		}
-	}
-
-	out := make([]string, 0, len(in))
-	for _, s := range in {
-		if s[0] == '-' {
-			continue
-		} else if glob.IsGlob(s) {
-			out = append(out, Glob(ctx, s, excludes)...)
-		} else {
-			out = append(out, s)
-		}
-	}
-
-	return out
+// The subset of ModuleContext and SingletonContext needed by Glob
+type globContext interface {
+	Build(pctx *blueprint.PackageContext, params blueprint.BuildParams)
+	AddNinjaFileDeps(deps ...string)
 }
 
-func Glob(ctx AndroidModuleContext, globPattern string, excludes []string) []string {
-	fileListFile := filepath.Join(ModuleOutDir(ctx), "glob", globToString(globPattern))
+func Glob(ctx globContext, outDir string, globPattern string, excludes []string) ([]string, error) {
+	fileListFile := filepath.Join(outDir, "glob", globToString(globPattern))
 	depFile := fileListFile + ".d"
 
 	// Get a globbed file list, and write out fileListFile and depFile
 	files, err := glob.GlobWithDepFile(globPattern, fileListFile, depFile, excludes)
 	if err != nil {
-		ctx.ModuleErrorf("glob: %s", err.Error())
-		return []string{globPattern}
+		return nil, err
 	}
 
 	GlobRule(ctx, globPattern, excludes, fileListFile, depFile)
@@ -108,10 +87,10 @@
 	// Make build.ninja depend on the fileListFile
 	ctx.AddNinjaFileDeps(fileListFile)
 
-	return files
+	return files, nil
 }
 
-func GlobRule(ctx AndroidModuleContext, globPattern string, excludes []string,
+func GlobRule(ctx globContext, globPattern string, excludes []string,
 	fileListFile, depFile string) {
 
 	// Create a rule to rebuild fileListFile if a directory in depFile changes.  fileListFile
diff --git a/common/module.go b/common/module.go
index 327aeca..33c586c 100644
--- a/common/module.go
+++ b/common/module.go
@@ -18,6 +18,8 @@
 	"path/filepath"
 	"runtime"
 
+	"android/soong/glob"
+
 	"github.com/google/blueprint"
 )
 
@@ -49,6 +51,9 @@
 	blueprint.ModuleContext
 	androidBaseContext
 
+	ExpandSources(srcFiles []string) []string
+	Glob(globPattern string, excludes []string) []string
+
 	InstallFile(installPath, srcPath string, deps ...string) string
 	InstallFileName(installPath, name, srcPath string, deps ...string) string
 	CheckbuildFile(srcPath string)
@@ -465,7 +470,7 @@
 	return ok
 }
 
-func ExpandSources(ctx AndroidModuleContext, srcFiles []string) []string {
+func (ctx *androidModuleContext) ExpandSources(srcFiles []string) []string {
 	prefix := ModuleSrcDir(ctx)
 	for i, srcFile := range srcFiles {
 		if srcFile[0] == '-' {
@@ -475,8 +480,37 @@
 		}
 	}
 
-	srcFiles = expandGlobs(ctx, srcFiles)
-	return srcFiles
+	if !hasGlob(srcFiles) {
+		return srcFiles
+	}
+
+	var excludes []string
+	for _, s := range srcFiles {
+		if s[0] == '-' {
+			excludes = append(excludes, s[1:])
+		}
+	}
+
+	globbedSrcFiles := make([]string, 0, len(srcFiles))
+	for _, s := range srcFiles {
+		if s[0] == '-' {
+			continue
+		} else if glob.IsGlob(s) {
+			globbedSrcFiles = append(globbedSrcFiles, ctx.Glob(s, excludes)...)
+		} else {
+			globbedSrcFiles = append(globbedSrcFiles, s)
+		}
+	}
+
+	return globbedSrcFiles
+}
+
+func (ctx *androidModuleContext) Glob(globPattern string, excludes []string) []string {
+	ret, err := Glob(ctx, ModuleOutDir(ctx), globPattern, excludes)
+	if err != nil {
+		ctx.ModuleErrorf("glob: %s", err.Error())
+	}
+	return ret
 }
 
 func BuildTargetSingleton() blueprint.Singleton {
diff --git a/genrule/genrule.go b/genrule/genrule.go
index 42ab047..ea30e3d 100644
--- a/genrule/genrule.go
+++ b/genrule/genrule.go
@@ -132,7 +132,7 @@
 	properties := &genSrcsProperties{}
 
 	tasks := func(ctx common.AndroidModuleContext) []generateTask {
-		srcFiles := common.ExpandSources(ctx, properties.Srcs)
+		srcFiles := ctx.ExpandSources(properties.Srcs)
 		tasks := make([]generateTask, 0, len(srcFiles))
 		for _, in := range srcFiles {
 			out := pathtools.ReplaceExtension(in, properties.Output_extension)
@@ -159,7 +159,7 @@
 	tasks := func(ctx common.AndroidModuleContext) []generateTask {
 		return []generateTask{
 			{
-				in:  common.ExpandSources(ctx, properties.Srcs),
+				in:  ctx.ExpandSources(properties.Srcs),
 				out: filepath.Join(common.ModuleGenDir(ctx), properties.Out),
 			},
 		}
diff --git a/java/app.go b/java/app.go
index 869cfea..5f153cf 100644
--- a/java/app.go
+++ b/java/app.go
@@ -244,14 +244,14 @@
 	var aaptDeps []string
 	var hasResources bool
 	for _, d := range resourceDirs {
-		newDeps := common.Glob(ctx, filepath.Join(d, "**/*"), aaptIgnoreFilenames)
+		newDeps := ctx.Glob(filepath.Join(d, "**/*"), aaptIgnoreFilenames)
 		aaptDeps = append(aaptDeps, newDeps...)
 		if len(newDeps) > 0 {
 			hasResources = true
 		}
 	}
 	for _, d := range assetDirs {
-		newDeps := common.Glob(ctx, filepath.Join(d, "**/*"), aaptIgnoreFilenames)
+		newDeps := ctx.Glob(filepath.Join(d, "**/*"), aaptIgnoreFilenames)
 		aaptDeps = append(aaptDeps, newDeps...)
 	}
 
diff --git a/java/java.go b/java/java.go
index d22f47a..9787d60 100644
--- a/java/java.go
+++ b/java/java.go
@@ -292,7 +292,7 @@
 		javacDeps = append(javacDeps, classpath...)
 	}
 
-	srcFiles := common.ExpandSources(ctx, j.properties.Srcs)
+	srcFiles := ctx.ExpandSources(j.properties.Srcs)
 
 	srcFiles = j.genSources(ctx, srcFiles, flags)
 
diff --git a/java/resources.go b/java/resources.go
index 7aa909e..f9d7a05 100644
--- a/java/resources.go
+++ b/java/resources.go
@@ -47,7 +47,7 @@
 			continue
 		}
 		resourceDir := filepath.Join(common.ModuleSrcDir(ctx), resourceDir)
-		dirs := common.Glob(ctx, resourceDir, nil)
+		dirs := ctx.Glob(resourceDir, nil)
 		for _, dir := range dirs {
 			fileListFile := filepath.Join(common.ModuleOutDir(ctx), "res", dir, "resources.list")
 			depFile := fileListFile + ".d"
