diff --git a/cmd/javac_wrapper/Android.bp b/cmd/javac_wrapper/Android.bp
new file mode 100644
index 0000000..c00f4bd
--- /dev/null
+++ b/cmd/javac_wrapper/Android.bp
@@ -0,0 +1,23 @@
+// Copyright 2017 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.
+
+blueprint_go_binary {
+    name: "soong_javac_wrapper",
+    srcs: [
+        "javac_wrapper.go",
+    ],
+    testSrcs: [
+        "javac_wrapper_test.go",
+    ],
+}
diff --git a/cmd/javac_wrapper/javac_wrapper.go b/cmd/javac_wrapper/javac_wrapper.go
new file mode 100644
index 0000000..a323473
--- /dev/null
+++ b/cmd/javac_wrapper/javac_wrapper.go
@@ -0,0 +1,173 @@
+// Copyright 2017 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.
+
+// soong_javac_wrapper expects a javac command line and argments, executes
+// it, and produces an ANSI colorized version of the output on stdout.
+//
+// It also hides the unhelpful and unhideable "warning there is a warning"
+// messages.
+package main
+
+import (
+	"bufio"
+	"fmt"
+	"io"
+	"os"
+	"os/exec"
+	"regexp"
+	"syscall"
+)
+
+// Regular expressions are based on
+// https://chromium.googlesource.com/chromium/src/+/master/build/android/gyp/javac.py
+// Colors are based on clang's output
+var (
+	filelinePrefix = `^([-.\w/\\]+.java:[0-9]+: )`
+	warningRe      = regexp.MustCompile(filelinePrefix + `?(warning:) .*$`)
+	errorRe        = regexp.MustCompile(filelinePrefix + `(.*?:) .*$`)
+	markerRe       = regexp.MustCompile(`()\s*(\^)\s*$`)
+
+	escape  = "\x1b"
+	reset   = escape + "[0m"
+	bold    = escape + "[1m"
+	red     = escape + "[31m"
+	green   = escape + "[32m"
+	magenta = escape + "[35m"
+)
+
+func main() {
+	exitCode, err := Main(os.Args[0], os.Args[1:])
+	if err != nil {
+		fmt.Fprintln(os.Stderr, err.Error())
+	}
+	os.Exit(exitCode)
+}
+
+func Main(name string, args []string) (int, error) {
+	if len(args) < 1 {
+		return 1, fmt.Errorf("usage: %s javac ...", name)
+	}
+
+	pr, pw, err := os.Pipe()
+	if err != nil {
+		return 1, fmt.Errorf("creating output pipe: %s", err)
+	}
+
+	cmd := exec.Command(args[0], args[1:]...)
+	cmd.Stdin = os.Stdin
+	cmd.Stdout = pw
+	cmd.Stderr = pw
+	err = cmd.Start()
+	if err != nil {
+		return 1, fmt.Errorf("starting subprocess: %s", err)
+	}
+
+	pw.Close()
+
+	// Process subprocess stdout asynchronously
+	errCh := make(chan error)
+	go func() {
+		errCh <- process(pr, os.Stdout)
+	}()
+
+	// Wait for subprocess to finish
+	cmdErr := cmd.Wait()
+
+	// Wait for asynchronous stdout processing to finish
+	err = <-errCh
+
+	// Check for subprocess exit code
+	if cmdErr != nil {
+		if exitErr, ok := cmdErr.(*exec.ExitError); ok {
+			if status, ok := exitErr.Sys().(syscall.WaitStatus); ok {
+				if status.Exited() {
+					return status.ExitStatus(), nil
+				} else if status.Signaled() {
+					exitCode := 128 + int(status.Signal())
+					return exitCode, nil
+				} else {
+					return 1, exitErr
+				}
+			} else {
+				return 1, nil
+			}
+		}
+	}
+
+	if err != nil {
+		return 1, err
+	}
+
+	return 0, nil
+}
+
+func process(r io.Reader, w io.Writer) error {
+	scanner := bufio.NewScanner(r)
+	// Some javac wrappers output the entire list of java files being
+	// compiled on a single line, which can be very large, set the maximum
+	// buffer size to 2MB.
+	scanner.Buffer(nil, 2*1024*1024)
+	for scanner.Scan() {
+		processLine(w, scanner.Text())
+	}
+	err := scanner.Err()
+	if err != nil {
+		return fmt.Errorf("scanning input: %s", err)
+	}
+	return nil
+}
+
+func processLine(w io.Writer, line string) {
+	for _, f := range filters {
+		if f.MatchString(line) {
+			return
+		}
+	}
+	for _, p := range colorPatterns {
+		var matched bool
+		if line, matched = applyColor(line, p.color, p.re); matched {
+			break
+		}
+	}
+	fmt.Fprintln(w, line)
+}
+
+// If line matches re, make it bold and apply color to the first submatch
+// Returns line, modified if it matched, and true if it matched.
+func applyColor(line, color string, re *regexp.Regexp) (string, bool) {
+	if m := re.FindStringSubmatchIndex(line); m != nil {
+		tagStart, tagEnd := m[4], m[5]
+		line = bold + line[:tagStart] +
+			color + line[tagStart:tagEnd] + reset + bold +
+			line[tagEnd:] + reset
+		return line, true
+	}
+	return line, false
+}
+
+var colorPatterns = []struct {
+	re    *regexp.Regexp
+	color string
+}{
+	{warningRe, magenta},
+	{errorRe, red},
+	{markerRe, green},
+}
+
+var filters = []*regexp.Regexp{
+	regexp.MustCompile(`Note: (Some input files|.*\.java) uses? or overrides? a deprecated API.`),
+	regexp.MustCompile(`Note: Recompile with -Xlint:deprecation for details.`),
+	regexp.MustCompile(`Note: (Some input files|.*\.java) uses? unchecked or unsafe operations.`),
+	regexp.MustCompile(`Note: Recompile with -Xlint:unchecked for details.`),
+}
diff --git a/cmd/javac_wrapper/javac_wrapper_test.go b/cmd/javac_wrapper/javac_wrapper_test.go
new file mode 100644
index 0000000..9f41078
--- /dev/null
+++ b/cmd/javac_wrapper/javac_wrapper_test.go
@@ -0,0 +1,114 @@
+// Copyright 2017 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 main
+
+import (
+	"bytes"
+	"strconv"
+	"testing"
+)
+
+var testCases = []struct {
+	in, out string
+}{
+	{
+		in:  "File.java:40: error: cannot find symbol\n",
+		out: "\x1b[1mFile.java:40: \x1b[31merror:\x1b[0m\x1b[1m cannot find symbol\x1b[0m\n",
+	},
+	{
+		in:  "import static com.blah.SYMBOL;\n",
+		out: "import static com.blah.SYMBOL;\n",
+	},
+	{
+		in:  "          ^           \n",
+		out: "\x1b[1m          \x1b[32m^\x1b[0m\x1b[1m           \x1b[0m\n",
+	},
+	{
+		in:  "File.java:398: warning: [RectIntersectReturnValueIgnored] Return value of com.blah.function() must be checked\n",
+		out: "\x1b[1mFile.java:398: \x1b[35mwarning:\x1b[0m\x1b[1m [RectIntersectReturnValueIgnored] Return value of com.blah.function() must be checked\x1b[0m\n",
+	},
+	{
+		in:  "warning: [options] bootstrap class path not set in conjunction with -source 1.7\n",
+		out: "\x1b[1m\x1b[35mwarning:\x1b[0m\x1b[1m [options] bootstrap class path not set in conjunction with -source 1.7\x1b[0m\n",
+	},
+	{
+		in:  "    (see http://go/errorprone/bugpattern/RectIntersectReturnValueIgnored.md)\n",
+		out: "    (see http://go/errorprone/bugpattern/RectIntersectReturnValueIgnored.md)\n",
+	},
+	{
+		in: `
+Note: Some input files use or override a deprecated API.
+Note: Recompile with -Xlint:deprecation for details.
+Note: Some input files use unchecked or unsafe operations.
+Note: Recompile with -Xlint:unchecked for details.
+Note: dir/file.java uses or overrides a deprecated API.
+Note: dir/file.java uses unchecked or unsafe operations.
+`,
+		out: "\n",
+	},
+	{
+		in:  "\n",
+		out: "\n",
+	},
+}
+
+func TestJavacColorize(t *testing.T) {
+	for i, test := range testCases {
+		t.Run(strconv.Itoa(i), func(t *testing.T) {
+			buf := new(bytes.Buffer)
+			err := process(bytes.NewReader([]byte(test.in)), buf)
+			if err != nil {
+				t.Errorf("error: %q", err)
+			}
+			got := string(buf.Bytes())
+			if got != test.out {
+				t.Errorf("expected %q got %q", test.out, got)
+			}
+		})
+	}
+}
+
+func TestSubprocess(t *testing.T) {
+	t.Run("failure", func(t *testing.T) {
+		exitCode, err := Main("test", []string{"sh", "-c", "exit 9"})
+		if err != nil {
+			t.Fatal("unexpected error", err)
+		}
+		if exitCode != 9 {
+			t.Fatal("expected exit code 9, got", exitCode)
+		}
+	})
+
+	t.Run("signal", func(t *testing.T) {
+		exitCode, err := Main("test", []string{"sh", "-c", "kill -9 $$"})
+		if err != nil {
+			t.Fatal("unexpected error", err)
+		}
+		if exitCode != 137 {
+			t.Fatal("expected exit code 137, got", exitCode)
+		}
+	})
+
+	t.Run("success", func(t *testing.T) {
+		exitCode, err := Main("test", []string{"echo"})
+		if err != nil {
+			t.Fatal("unexpected error", err)
+		}
+		if exitCode != 0 {
+			t.Fatal("expected exit code 0, got", exitCode)
+		}
+	})
+
+}
