diff --git a/sdk/bp.go b/sdk/bp.go
index e0e06f3..6936daf 100644
--- a/sdk/bp.go
+++ b/sdk/bp.go
@@ -22,6 +22,7 @@
 
 type bpPropertySet struct {
 	properties map[string]interface{}
+	tags       map[string]android.BpPropertyTag
 	order      []string
 }
 
@@ -29,6 +30,7 @@
 
 func (s *bpPropertySet) init() {
 	s.properties = make(map[string]interface{})
+	s.tags = make(map[string]android.BpPropertyTag)
 }
 
 func (s *bpPropertySet) AddProperty(name string, value interface{}) {
@@ -40,6 +42,11 @@
 	s.order = append(s.order, name)
 }
 
+func (s *bpPropertySet) AddPropertyWithTag(name string, value interface{}, tag android.BpPropertyTag) {
+	s.AddProperty(name, value)
+	s.tags[name] = tag
+}
+
 func (s *bpPropertySet) AddPropertySet(name string) android.BpPropertySet {
 	set := &bpPropertySet{}
 	set.init()
@@ -51,15 +58,21 @@
 	return s.properties[name]
 }
 
+func (s *bpPropertySet) getTag(name string) interface{} {
+	return s.tags[name]
+}
+
 func (s *bpPropertySet) transform(transformer bpPropertyTransformer) {
 	var newOrder []string
 	for _, name := range s.order {
 		value := s.properties[name]
+		tag := s.tags[name]
 		var newValue interface{}
+		var newTag android.BpPropertyTag
 		if propertySet, ok := value.(*bpPropertySet); ok {
-			newValue = transformer.transformPropertySet(name, propertySet)
+			newValue, newTag = transformer.transformPropertySet(name, propertySet, tag)
 		} else {
-			newValue = transformer.transformProperty(name, value)
+			newValue, newTag = transformer.transformProperty(name, value, tag)
 		}
 
 		if newValue == nil {
@@ -68,6 +81,7 @@
 		} else {
 			// Update the property in the map and add the name to the new order list.
 			s.properties[name] = newValue
+			s.tags[name] = newTag
 			newOrder = append(newOrder, name)
 		}
 	}
@@ -79,6 +93,7 @@
 		s.AddProperty(name, value)
 	} else {
 		s.properties[name] = value
+		s.tags[name] = nil
 	}
 }
 
@@ -113,20 +128,20 @@
 var _ android.BpModule = (*bpModule)(nil)
 
 type bpPropertyTransformer interface {
-	// Transform the property set, returning the new property set to insert back into the
+	// Transform the property set, returning the new property set/tag to insert back into the
 	// parent property set (or module if this is the top level property set).
 	//
 	// This will be called before transforming the properties in the supplied set.
 	//
 	// The name will be "" for the top level property set.
 	//
-	// Returning nil will cause the property set to be removed.
-	transformPropertySet(name string, propertySet *bpPropertySet) *bpPropertySet
+	// Returning (nil, ...) will cause the property set to be removed.
+	transformPropertySet(name string, propertySet *bpPropertySet, tag android.BpPropertyTag) (*bpPropertySet, android.BpPropertyTag)
 
-	// Transform a property, return the new value to insert back into the property set.
+	// Transform a property, return the new value/tag to insert back into the property set.
 	//
-	// Returning nil will cause the property to be removed.
-	transformProperty(name string, value interface{}) interface{}
+	// Returning (nil, ...) will cause the property to be removed.
+	transformProperty(name string, value interface{}, tag android.BpPropertyTag) (interface{}, android.BpPropertyTag)
 }
 
 // Interface for transforming bpModule objects.
@@ -150,12 +165,12 @@
 	return module
 }
 
-func (t identityTransformation) transformPropertySet(name string, propertySet *bpPropertySet) *bpPropertySet {
-	return propertySet
+func (t identityTransformation) transformPropertySet(name string, propertySet *bpPropertySet, tag android.BpPropertyTag) (*bpPropertySet, android.BpPropertyTag) {
+	return propertySet, tag
 }
 
-func (t identityTransformation) transformProperty(name string, value interface{}) interface{} {
-	return value
+func (t identityTransformation) transformProperty(name string, value interface{}, tag android.BpPropertyTag) (interface{}, android.BpPropertyTag) {
+	return value, tag
 }
 
 func (m *bpModule) deepCopy() *bpModule {
@@ -165,7 +180,7 @@
 func (m *bpModule) transform(transformer bpTransformer) *bpModule {
 	transformedModule := transformer.transformModule(m)
 	// Copy the contents of the returned property set into the module and then transform that.
-	transformedModule.bpPropertySet = transformer.transformPropertySet("", transformedModule.bpPropertySet)
+	transformedModule.bpPropertySet, _ = transformer.transformPropertySet("", transformedModule.bpPropertySet, nil)
 	transformedModule.bpPropertySet.transform(transformer)
 	return transformedModule
 }
@@ -179,29 +194,36 @@
 	return &moduleCopy
 }
 
-func (t deepCopyTransformation) transformPropertySet(name string, propertySet *bpPropertySet) *bpPropertySet {
+func (t deepCopyTransformation) transformPropertySet(name string, propertySet *bpPropertySet, tag android.BpPropertyTag) (*bpPropertySet, android.BpPropertyTag) {
 	// Create a shallow copy of the properties map. Any mutable property values will be copied by the
 	// transformer.
 	propertiesCopy := make(map[string]interface{})
-	for p, v := range propertySet.properties {
-		propertiesCopy[p] = v
+	for propertyName, value := range propertySet.properties {
+		propertiesCopy[propertyName] = value
+	}
+
+	// Ditto for tags map.
+	tagsCopy := make(map[string]android.BpPropertyTag)
+	for propertyName, propertyTag := range propertySet.tags {
+		tagsCopy[propertyName] = propertyTag
 	}
 
 	// Create a new property set.
 	return &bpPropertySet{
 		properties: propertiesCopy,
+		tags:       tagsCopy,
 		order:      append([]string(nil), propertySet.order...),
-	}
+	}, tag
 }
 
-func (t deepCopyTransformation) transformProperty(name string, value interface{}) interface{} {
+func (t deepCopyTransformation) transformProperty(name string, value interface{}, tag android.BpPropertyTag) (interface{}, android.BpPropertyTag) {
 	// Copy string slice, otherwise return value.
 	if values, ok := value.([]string); ok {
 		valuesCopy := make([]string, len(values))
 		copy(valuesCopy, values)
-		return valuesCopy
+		return valuesCopy, tag
 	}
-	return value
+	return value, tag
 }
 
 var deepCopyTransformer bpTransformer = deepCopyTransformation{}
