diff --git a/Android.bp b/Android.bp
index f2d4273..9324020 100644
--- a/Android.bp
+++ b/Android.bp
@@ -50,6 +50,7 @@
         "android/config.go",
         "android/defaults.go",
         "android/defs.go",
+        "android/expand.go",
         "android/hooks.go",
         "android/makevars.go",
         "android/module.go",
@@ -66,6 +67,7 @@
         "android/env.go",
     ],
     testSrcs: [
+        "android/expand_test.go",
         "android/paths_test.go",
         "android/prebuilt_test.go",
     ],
diff --git a/android/expand.go b/android/expand.go
new file mode 100644
index 0000000..dafb2b6
--- /dev/null
+++ b/android/expand.go
@@ -0,0 +1,72 @@
+// 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 (
+	"fmt"
+	"strings"
+	"unicode"
+)
+
+// Expand substitutes $() variables in a string
+// $(var) is passed to Expander(var)
+// $$ is converted to $
+func Expand(s string, mapping func(string) (string, error)) (string, error) {
+	// based on os.Expand
+	buf := make([]byte, 0, 2*len(s))
+	i := 0
+	for j := 0; j < len(s); j++ {
+		if s[j] == '$' {
+			if j+1 >= len(s) {
+				return "", fmt.Errorf("expected character after '$'")
+			}
+			buf = append(buf, s[i:j]...)
+			value, w, err := getMapping(s[j+1:], mapping)
+			if err != nil {
+				return "", err
+			}
+			buf = append(buf, value...)
+			j += w
+			i = j + 1
+		}
+	}
+	return string(buf) + s[i:], nil
+}
+
+func getMapping(s string, mapping func(string) (string, error)) (string, int, error) {
+	switch s[0] {
+	case '(':
+		// Scan to closing brace
+		for i := 1; i < len(s); i++ {
+			if s[i] == ')' {
+				ret, err := mapping(strings.TrimSpace(s[1:i]))
+				return ret, i + 1, err
+			}
+		}
+		return "", len(s), fmt.Errorf("missing )")
+	case '$':
+		return s[0:1], 1, nil
+	default:
+		i := strings.IndexFunc(s, func(c rune) bool {
+			return !(unicode.IsLetter(c) || unicode.IsNumber(c) || c == '_' || c == '.' || c == '-')
+		})
+		if i == 0 {
+			return "", 0, fmt.Errorf("unexpected character '%c' after '$'", s[0])
+		} else if i == -1 {
+			i = len(s)
+		}
+		return "", 0, fmt.Errorf("expected '(' after '$', did you mean $(%s)?", s[:i])
+	}
+}
diff --git a/android/expand_test.go b/android/expand_test.go
new file mode 100644
index 0000000..ca50b39
--- /dev/null
+++ b/android/expand_test.go
@@ -0,0 +1,153 @@
+// 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 (
+	"fmt"
+	"testing"
+)
+
+var vars = map[string]string{
+	"var1": "abc",
+	"var2": "",
+	"var3": "def",
+	"💩":    "😃",
+}
+
+func expander(s string) (string, error) {
+	if val, ok := vars[s]; ok {
+		return val, nil
+	} else {
+		return "", fmt.Errorf("unknown variable %q", s)
+	}
+}
+
+var expandTestCases = []struct {
+	in  string
+	out string
+	err bool
+}{
+	{
+		in:  "$(var1)",
+		out: "abc",
+	},
+	{
+		in:  "$( var1 )",
+		out: "abc",
+	},
+	{
+		in:  "def$(var1)",
+		out: "defabc",
+	},
+	{
+		in:  "$(var1)def",
+		out: "abcdef",
+	},
+	{
+		in:  "def$(var1)def",
+		out: "defabcdef",
+	},
+	{
+		in:  "$(var2)",
+		out: "",
+	},
+	{
+		in:  "def$(var2)",
+		out: "def",
+	},
+	{
+		in:  "$(var2)def",
+		out: "def",
+	},
+	{
+		in:  "def$(var2)def",
+		out: "defdef",
+	},
+	{
+		in:  "$(var1)$(var3)",
+		out: "abcdef",
+	},
+	{
+		in:  "$(var1)g$(var3)",
+		out: "abcgdef",
+	},
+	{
+		in:  "$$",
+		out: "$",
+	},
+	{
+		in:  "$$(var1)",
+		out: "$(var1)",
+	},
+	{
+		in:  "$$$(var1)",
+		out: "$abc",
+	},
+	{
+		in:  "$(var1)$$",
+		out: "abc$",
+	},
+	{
+		in:  "$(💩)",
+		out: "😃",
+	},
+
+	// Errors
+	{
+		in:  "$",
+		err: true,
+	},
+	{
+		in:  "$$$",
+		err: true,
+	},
+	{
+		in:  "$(var1)$",
+		err: true,
+	},
+	{
+		in:  "$(var1)$",
+		err: true,
+	},
+	{
+		in:  "$(var4)",
+		err: true,
+	},
+	{
+		in:  "$var1",
+		err: true,
+	},
+	{
+		in:  "$(var1",
+		err: true,
+	},
+	{
+		in:  "$a💩c",
+		err: true,
+	},
+}
+
+func TestExpand(t *testing.T) {
+	for _, test := range expandTestCases {
+		got, err := Expand(test.in, expander)
+		if err != nil && !test.err {
+			t.Errorf("%q: unexpected error %s", test.in, err.Error())
+		} else if err == nil && test.err {
+			t.Errorf("%q: expected error, got %q", test.in, got)
+		} else if !test.err && got != test.out {
+			t.Errorf("%q: expected %q, got %q", test.in, test.out, got)
+		}
+	}
+}
