diff --git a/Android.bp b/Android.bp
index bb9ab74..355dfd2 100644
--- a/Android.bp
+++ b/Android.bp
@@ -94,6 +94,7 @@
         "android/androidmk.go",
         "android/arch.go",
         "android/config.go",
+        "android/customizer.go",
         "android/defaults.go",
         "android/defs.go",
         "android/glob.go",
diff --git a/android/arch.go b/android/arch.go
index 2d38daf..62acb09 100644
--- a/android/arch.go
+++ b/android/arch.go
@@ -24,13 +24,6 @@
 	"github.com/google/blueprint/proptools"
 )
 
-func init() {
-	RegisterBottomUpMutator("defaults_deps", defaultsDepsMutator).Parallel()
-	RegisterTopDownMutator("defaults", defaultsMutator).Parallel()
-
-	RegisterBottomUpMutator("arch", ArchMutator).Parallel()
-}
-
 var (
 	Arm    = newArch("arm", "lib32")
 	Arm64  = newArch("arm64", "lib64")
@@ -490,6 +483,8 @@
 		allProperties = append(allProperties, asp)
 	}
 
+	base.customizableProperties = allProperties
+
 	return m, allProperties
 }
 
diff --git a/android/customizer.go b/android/customizer.go
new file mode 100644
index 0000000..056880d
--- /dev/null
+++ b/android/customizer.go
@@ -0,0 +1,77 @@
+// 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 android
+
+import "github.com/google/blueprint/proptools"
+
+type CustomizePropertiesContext interface {
+	BaseContext
+	AppendProperties(...interface{})
+	PrependProperties(...interface{})
+}
+
+type customizePropertiesContext struct {
+	BaseContext
+
+	module *ModuleBase
+}
+
+type PropertyCustomizer interface {
+	CustomizeProperties(CustomizePropertiesContext)
+}
+
+func customizerMutator(ctx TopDownMutatorContext) {
+	if m, ok := ctx.Module().(Module); ok {
+		a := m.base()
+		if len(a.customizers) > 0 {
+			mctx := &customizePropertiesContext{
+				BaseContext: ctx,
+				module:      a,
+			}
+			for _, c := range a.customizers {
+				c.CustomizeProperties(mctx)
+				if mctx.Failed() {
+					return
+				}
+			}
+		}
+	}
+}
+
+func (ctx *customizePropertiesContext) AppendProperties(props ...interface{}) {
+	for _, p := range props {
+		err := proptools.AppendMatchingProperties(ctx.module.customizableProperties, p, nil)
+		if err != nil {
+			if propertyErr, ok := err.(*proptools.ExtendPropertyError); ok {
+				ctx.PropertyErrorf(propertyErr.Property, "%s", propertyErr.Err.Error())
+			} else {
+				panic(err)
+			}
+		}
+	}
+}
+
+func (ctx *customizePropertiesContext) PrependProperties(props ...interface{}) {
+	for _, p := range props {
+		err := proptools.PrependMatchingProperties(ctx.module.customizableProperties, p, nil)
+		if err != nil {
+			if propertyErr, ok := err.(*proptools.ExtendPropertyError); ok {
+				ctx.PropertyErrorf(propertyErr.Property, "%s", propertyErr.Err.Error())
+			} else {
+				panic(err)
+			}
+		}
+	}
+}
diff --git a/android/module.go b/android/module.go
index 03c06b4..fd37ca8 100644
--- a/android/module.go
+++ b/android/module.go
@@ -25,6 +25,14 @@
 	"github.com/google/blueprint"
 )
 
+func init() {
+	RegisterTopDownMutator("customizer", customizerMutator).Parallel()
+	RegisterBottomUpMutator("defaults_deps", defaultsDepsMutator).Parallel()
+	RegisterTopDownMutator("defaults", defaultsMutator).Parallel()
+
+	RegisterBottomUpMutator("arch", ArchMutator).Parallel()
+}
+
 var (
 	DeviceSharedLibrary = "shared_library"
 	DeviceStaticLibrary = "static_library"
@@ -188,6 +196,11 @@
 	return InitArchModule(m, propertyStructs...)
 }
 
+func AddCustomizer(m blueprint.Module, c PropertyCustomizer) {
+	base := m.(Module).base()
+	base.customizers = append(base.customizers, c)
+}
+
 // A AndroidModuleBase object contains the properties that are common to all Android
 // modules.  It should be included as an anonymous field in every module
 // struct definition.  InitAndroidModule should then be called from the module's
@@ -238,6 +251,7 @@
 	hostAndDeviceProperties hostAndDeviceProperties
 	generalProperties       []interface{}
 	archProperties          []*archProperties
+	customizableProperties  []interface{}
 
 	noAddressSanitizer bool
 	installFiles       Paths
@@ -248,6 +262,8 @@
 	installTarget    string
 	checkbuildTarget string
 	blueprintDir     string
+
+	customizers []PropertyCustomizer
 }
 
 func (a *ModuleBase) base() *ModuleBase {
