diff --git a/src/main/java/com/google/devtools/build/lib/events/OutputFilter.java b/src/main/java/com/google/devtools/build/lib/events/OutputFilter.java
index b5fe412..bea4ddf 100644
--- a/src/main/java/com/google/devtools/build/lib/events/OutputFilter.java
+++ b/src/main/java/com/google/devtools/build/lib/events/OutputFilter.java
@@ -42,10 +42,8 @@
    */
   boolean showOutput(String tag);
 
-  /**
-   * An output filter using regular expression matching.
-   */
-  public static final class RegexOutputFilter implements OutputFilter {
+  /** An output filter using regular expression matching. */
+  final class RegexOutputFilter implements OutputFilter {
     /** Returns an output filter for the given regex (by compiling it). */
     public static OutputFilter forRegex(String regex) {
       return new RegexOutputFilter(Pattern.compile(regex));
diff --git a/src/test/java/com/google/devtools/build/lib/outputfilter/AutoOutputFilterTest.java b/src/test/java/com/google/devtools/build/lib/outputfilter/AutoOutputFilterTest.java
index db45197..00b2603 100644
--- a/src/test/java/com/google/devtools/build/lib/outputfilter/AutoOutputFilterTest.java
+++ b/src/test/java/com/google/devtools/build/lib/outputfilter/AutoOutputFilterTest.java
@@ -25,7 +25,6 @@
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ListMultimap;
-import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.events.OutputFilter;
 import java.util.List;
@@ -33,11 +32,9 @@
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
-/**
- * Tests for the {@link AutoOutputFilter} class.
- */
+/** Tests for the {@link AutoOutputFilter} class. */
 @RunWith(JUnit4.class)
-public class AutoOutputFilterTest extends BuildViewTestCase {
+public class AutoOutputFilterTest {
   @Test
   public void testNoneAOF() throws Exception {
     assertThat(NONE.getFilter(targets())).isEqualTo(OutputFilter.OUTPUT_EVERYTHING);
@@ -109,17 +106,6 @@
       targetsPerPackage.put(label.getPackageName(), label.getName());
     }
 
-    // Create BUILD file for each package
-    for (String pkg : targetsPerPackage.keySet()) {
-      StringBuilder contents = new StringBuilder();
-      for (String target : targetsPerPackage.get(pkg)) {
-        contents.append("sh_library(name='" + target + "');");
-      }
-      scratch.overwriteFile(pkg + "/BUILD", contents.toString());
-    }
-
-    invalidatePackages();
-
     // Collect targets
     ImmutableList.Builder<Label> targets = ImmutableList.builder();
     for (String targetName : targetLabels) {
diff --git a/src/test/java/com/google/devtools/build/lib/outputfilter/BUILD b/src/test/java/com/google/devtools/build/lib/outputfilter/BUILD
index aa48f6f..49708fd 100644
--- a/src/test/java/com/google/devtools/build/lib/outputfilter/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/outputfilter/BUILD
@@ -5,31 +5,24 @@
     default_visibility = ["//src:__subpackages__"],
 )
 
-licenses(["notice"])  # Apache 2.0
-
 filegroup(
     name = "srcs",
     testonly = 0,
     srcs = glob(["**"]),
-    visibility = ["//src/test/java/com/google/devtools/build/lib:__pkg__"],
+    visibility = ["//src:__subpackages__"],
 )
 
 java_test(
     name = "OutputFilterTests",
     srcs = glob(["*.java"]),
-    # TODO(bazel-team) The test is currently broken due to BazelAnalysisMock not supporting integration tests.
-    tags = ["manual"],
     test_class = "com.google.devtools.build.lib.AllTests",
-    runtime_deps = ["//src/test/java/com/google/devtools/build/lib:test_runner"],
+    runtime_deps = [
+        "//src/test/java/com/google/devtools/build/lib:test_runner",
+    ],
     deps = [
-        "//src/main/java/com/google/devtools/build/lib:runtime",
         "//src/main/java/com/google/devtools/build/lib/cmdline",
         "//src/main/java/com/google/devtools/build/lib/events",
         "//src/main/java/com/google/devtools/build/lib/outputfilter",
-        "//src/main/java/com/google/devtools/build/lib/unix",
-        "//src/main/java/com/google/devtools/build/lib/vfs",
-        "//src/test/java/com/google/devtools/build/lib/analysis/util",
-        "//src/test/java/com/google/devtools/build/lib/buildtool/util",
         "//third_party:guava",
         "//third_party:junit4",
         "//third_party:truth",
diff --git a/src/test/java/com/google/devtools/build/lib/outputfilter/OutputFilterTest.java b/src/test/java/com/google/devtools/build/lib/outputfilter/OutputFilterTest.java
index cf5e6ac..52d0a20 100644
--- a/src/test/java/com/google/devtools/build/lib/outputfilter/OutputFilterTest.java
+++ b/src/test/java/com/google/devtools/build/lib/outputfilter/OutputFilterTest.java
@@ -14,359 +14,45 @@
 
 package com.google.devtools.build.lib.outputfilter;
 
-import static org.junit.Assert.fail;
+import static com.google.common.truth.Truth.assertThat;
 
-import com.google.common.base.Joiner;
-import com.google.devtools.build.lib.buildtool.util.BuildIntegrationTestCase;
-import com.google.devtools.build.lib.events.Event;
-import com.google.devtools.build.lib.events.EventCollector;
-import com.google.devtools.build.lib.events.EventKind;
-import com.google.devtools.build.lib.runtime.BlazeRuntime;
-import com.google.devtools.build.lib.runtime.CommandEnvironment;
-import org.junit.Before;
+import com.google.devtools.build.lib.events.OutputFilter;
+import java.util.regex.Pattern;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
 /** Tests for the {@code --output_filter} option. */
 @RunWith(JUnit4.class)
-public class OutputFilterTest extends BuildIntegrationTestCase {
-  private EventCollector stderr = new EventCollector(EventKind.STDERR);
+public class OutputFilterTest {
 
-  // Cast warnings are silenced by default.
-  private void enableCastWarnings() throws Exception {
-    addOptions("--javacopt=\"-Xlint:cast\"");
-  }
-
-  // Deprecation warnings are silenced by default.
-  private void enableDeprecationWarnings() throws Exception {
-    addOptions("--javacopt=\"-Xlint:deprecation\"");
-  }
-
-  @Override
-  protected BlazeRuntime.Builder getRuntimeBuilder() throws Exception {
-    return super.getRuntimeBuilder().addBlazeModule(new OutputFilteringModule());
-  }
-
-  @Before
-  public final void writeFiles() throws Exception  {
-    write("java/a/BUILD",
-        "java_library(name = 'a',",
-        "            srcs = ['A.java']," +
-        "            deps = ['//java/b'])");
-    write("java/a/A.java",
-        "package a;",
-        "public class A {",
-        "  public static void a() { b.B.b(); }",
-        "}");
-    write("java/b/BUILD",
-        "java_library(name = 'b',",
-        "             srcs = ['B.java']," +
-        "             deps = ['//java/c'])");
-    write("java/b/B.java",
-        "package b;",
-        "public class B {",
-        "  @Deprecated public static void b() {}",
-        "  public static void x() { c.C.c(); }",
-        "}");
-    write("java/c/BUILD",
-        "java_library(name = 'c',",
-        "             srcs = ['C.java'])");
-    write("java/c/C.java",
-        "package c;",
-        "public class C {",
-        "  @Deprecated public static void c() {}",
-        "}");
-    write("java/d/BUILD",
-        "java_library(name = 'd',",
-        "             srcs = ['D.java'],",
-        "             deps = ['//java/e'])");
-    write(
-        "java/d/D.java",
-        "package d;",
-        "import java.lang.Integer;",
-        "import java.util.ArrayList;",
-        "public class D {",
-        "  public static void d() {",
-        "    int i = (int) 0;",
-        "    e.E.e();",
-        "  }",
-        "}");
-    write("java/e/BUILD",
-        "java_library(name = 'e',",
-        "             srcs = ['E.java'])");
-    write(
-        "java/e/E.java",
-        "package e;",
-        "import java.lang.Integer;",
-        "import java.util.LinkedList;",
-        "public class E {",
-        "  public static void e() {",
-        "    int i = (int) 0;",
-        "  }",
-        "}");
-    write("javatests/a/BUILD",
-        "java_library(name = 'a',",
-        "             srcs = ['ATest.java']," +
-        "             deps = ['//java/a', '//javatests/b'])");
-    write("javatests/a/ATest.java",
-        "package a;",
-        "public class ATest {",
-        "  public static void aTest() { a.A.a(); }",
-        "}");
-    write("javatests/b/BUILD",
-        "java_library(name = 'b',",
-        "             srcs = ['BTest.java']," +
-        "             deps = ['//java/b', '//javatests/c'])");
-    write("javatests/b/BTest.java",
-        "package b;",
-        "public class BTest {",
-        "  public static void bTest() { c.CTest.c(); }",
-        "}");
-    write("javatests/c/BUILD",
-        "java_library(name = 'c',",
-        "             srcs = ['CTest.java'])");
-    write("javatests/c/CTest.java",
-        "package c;",
-        "public class CTest {",
-        "  @Deprecated public static void c() {}",
-        "}");
-    write("javatests/d/BUILD",
-        "java_library(name = 'd',",
-        "             srcs = ['DTest.java'],",
-        "             deps = ['//java/d', '//javatests/e'])");
-    write("javatests/d/DTest.java",
-        "package d;",
-        "public class DTest {",
-        "  public static void dTest() { d.D.d(); }",
-        "}");
-    write("javatests/e/BUILD",
-        "java_library(name = 'e',",
-        "             srcs = ['ETest.java'])");
-    write(
-        "javatests/e/ETest.java",
-        "package e;",
-        "import java.lang.Integer;",
-        "import java.util.LinkedList;",
-        "public class ETest {",
-        "  public static void eTest() {",
-        "    int i = (int) 0;",
-        "  }",
-        "}");
-
-    // Always enable cast warnings.
-    enableCastWarnings();
+  @Test
+  public void testOutputEverythingAlwaysTrue() {
+    assertThat(OutputFilter.OUTPUT_EVERYTHING.showOutput("some tag")).isTrue();
+    assertThat(OutputFilter.OUTPUT_EVERYTHING.showOutput("literally anything")).isTrue();
+    assertThat(OutputFilter.OUTPUT_EVERYTHING.showOutput("even empty")).isTrue();
+    assertThat(OutputFilter.OUTPUT_EVERYTHING.showOutput("")).isTrue();
   }
 
   @Test
-  public void testExplicitFilter() throws Exception {
-    enableDeprecationWarnings();
-    addOptions("--output_filter=^//java/a");
-    CommandEnvironment env = runtimeWrapper.newCommand();
-    env.getReporter().addHandler(stderr);
-    buildTarget("//java/a");
-
-    assertEvent(deprecationMessages("b", "B", "b"));
-    assertNoEvent(deprecationMessages("c", "C", "c"));
+  public void testOutputNothingAlwaysTrue() {
+    assertThat(OutputFilter.OUTPUT_NOTHING.showOutput("some tag")).isFalse();
+    assertThat(OutputFilter.OUTPUT_NOTHING.showOutput("literally anything")).isFalse();
+    assertThat(OutputFilter.OUTPUT_NOTHING.showOutput("even empty")).isFalse();
+    assertThat(OutputFilter.OUTPUT_NOTHING.showOutput("")).isFalse();
   }
 
   @Test
-  public void testExplicitFilterNoJavacoptOverride() throws Exception {
-    addOptions("--output_filter=^//java/d");
-    CommandEnvironment env = runtimeWrapper.newCommand();
-    env.getReporter().addHandler(stderr);
-    buildTarget("//java/d");
-
-    assertEvent("D.java:6: warning: [cast] redundant cast to int");
-    assertNoEvent("E.java:6: warning: [cast] redundant cast to int");
+  public void testRegexpFilterShowOutputMatchTagReturnsTrue() {
+    OutputFilter underTest =
+        OutputFilter.RegexOutputFilter.forPattern(Pattern.compile("^//some/target"));
+    assertThat(underTest.showOutput("//some/target")).isTrue();
   }
 
   @Test
-  public void testPackagesAOF_A() throws Exception {
-    enableDeprecationWarnings();
-    addOptions("--auto_output_filter=packages");
-    CommandEnvironment env = runtimeWrapper.newCommand();
-    env.getReporter().addHandler(stderr);
-    buildTarget("//java/a");
-
-    assertEvent(deprecationMessages("b", "B", "b"));
-    assertNoEvent(deprecationMessages("c", "C", "c"));
-  }
-
-  @Test
-  public void testPackagesAOF_B() throws Exception {
-    enableDeprecationWarnings();
-    addOptions("--auto_output_filter=packages");
-    CommandEnvironment env = runtimeWrapper.newCommand();
-    env.getReporter().addHandler(stderr);
-    buildTarget("//java/b");
-
-    assertNoEvent(deprecationMessages("b", "B", "b"));
-    assertEvent(deprecationMessages("c", "C", "c"));
-  }
-
-  @Test
-  public void testPackagesAOF_C() throws Exception {
-    enableDeprecationWarnings();
-    addOptions("--auto_output_filter=packages");
-    CommandEnvironment env = runtimeWrapper.newCommand();
-    env.getReporter().addHandler(stderr);
-    buildTarget("//java/c");
-
-    assertNoEvent(deprecationMessages("b", "B", "b"));
-    assertNoEvent(deprecationMessages("c", "C", "c"));
-  }
-
-  @Test
-  public void testPackagesAOF_D() throws Exception {
-    addOptions("--auto_output_filter=packages");
-    CommandEnvironment env = runtimeWrapper.newCommand();
-    env.getReporter().addHandler(stderr);
-    buildTarget("//java/d");
-
-    assertEvent("D.java:6: warning: [cast] redundant cast to int");
-    assertNoEvent("E.java:6: warning: [cast] redundant cast to int");
-  }
-
-  @Test
-  public void testPackagesAOF_AB() throws Exception {
-    enableDeprecationWarnings();
-    addOptions("--auto_output_filter=packages");
-    CommandEnvironment env = runtimeWrapper.newCommand();
-    env.getReporter().addHandler(stderr);
-    buildTarget("//java/a", "//java/b");
-
-    assertEvent(deprecationMessages("b", "B", "b"));
-    assertEvent(deprecationMessages("c", "C", "c"));
-  }
-
-  @Test
-  public void testPackagesAOF_AC() throws Exception {
-    enableDeprecationWarnings();
-    addOptions("--auto_output_filter=packages");
-    CommandEnvironment env = runtimeWrapper.newCommand();
-    env.getReporter().addHandler(stderr);
-    buildTarget("//java/a", "//java/c");
-
-    assertEvent(deprecationMessages("b", "B", "b"));
-    assertNoEvent(deprecationMessages("c", "C", "c"));
-  }
-
-  @Test
-  public void testPackagesAOF_BC() throws Exception {
-    enableDeprecationWarnings();
-    addOptions("--auto_output_filter=packages");
-    CommandEnvironment env = runtimeWrapper.newCommand();
-    env.getReporter().addHandler(stderr);
-    buildTarget("//java/b", "//java/c");
-
-    assertNoEvent(deprecationMessages("b", "B", "b"));
-    assertEvent(deprecationMessages("c", "C", "c"));
-  }
-
-  @Test
-  public void testPackagesAOF_ABC() throws Exception {
-    enableDeprecationWarnings();
-    addOptions("--auto_output_filter=packages");
-    CommandEnvironment env = runtimeWrapper.newCommand();
-    env.getReporter().addHandler(stderr);
-    buildTarget("//java/a", "//java/b", "//java/c");
-
-    assertEvent(deprecationMessages("b", "B", "b"));
-    assertEvent(deprecationMessages("c", "C", "c"));
-  }
-
-  @Test
-  public void testPackagesAOF_javaTestsA() throws Exception {
-    enableDeprecationWarnings();
-    addOptions("--auto_output_filter=packages");
-    CommandEnvironment env = runtimeWrapper.newCommand();
-    env.getReporter().addHandler(stderr);
-    buildTarget("//javatests/a");
-
-    assertEvent(deprecationMessages("b", "B", "b"));
-    assertNoEvent(deprecationMessages("c", "C", "c"));
-    assertNoEvent(deprecationMessages("c", "CTest", "c"));
-  }
-
-  @Test
-  public void testPackagesAOF_javaTestsAB() throws Exception {
-    enableDeprecationWarnings();
-    addOptions("--auto_output_filter=packages");
-    CommandEnvironment env = runtimeWrapper.newCommand();
-    env.getReporter().addHandler(stderr);
-    buildTarget("//javatests/a", "//java/b");
-
-    assertEvent(deprecationMessages("b", "B", "b"));
-    assertEvent(deprecationMessages("c", "C", "c"));
-    assertEvent(deprecationMessages("c", "CTest", "c"));
-  }
-
-  @Test
-  public void testPackagesAOF_javaTestsD() throws Exception {
-    addOptions("--auto_output_filter=packages");
-    CommandEnvironment env = runtimeWrapper.newCommand();
-    env.getReporter().addHandler(stderr);
-    buildTarget("//javatests/d");
-
-    assertEvent("D.java:6: warning: [cast] redundant cast to int");
-    assertNoEvent("E.java:6: warning: [cast] redundant cast to int");
-    assertNoEvent("ETest.java:6: warning: [cast] redundant cast to int");
-  }
-
-  @Test
-  public void testEmptyFilter() throws Exception {
-    enableDeprecationWarnings();
-    addOptions("--output_filter=");
-    CommandEnvironment env = runtimeWrapper.newCommand();
-    env.getReporter().addHandler(stderr);
-    buildTarget("//java/a");
-
-    assertEvent(deprecationMessages("b", "B", "b"));
-    assertEvent(deprecationMessages("c", "C", "c"));
-  }
-
-  @Test
-  public void testNoMatchFilter() throws Exception {
-    enableDeprecationWarnings();
-    addOptions("--output_filter=DONT_MATCH");
-    CommandEnvironment env = runtimeWrapper.newCommand();
-    env.getReporter().addHandler(stderr);
-    buildTarget("//java/a");
-
-    assertNoEvent(deprecationMessages("b", "B", "b"));
-    assertNoEvent(deprecationMessages("c", "C", "c"));
-  }
-
-  private void assertEvent(String... choices) {
-    for (Event event : stderr) {
-      for (String msg : choices) {
-        if (event.getMessage().contains(msg)) {
-          return;
-        }
-      }
-    }
-
-    fail(String.format("Expected one of [%s] in output: %s",
-        Joiner.on(',').join(choices),
-        Joiner.on('\n').join(stderr)
-        ));
-  }
-
-  private void assertNoEvent(String... choices) {
-    for (Event event : stderr) {
-      for (String msg : choices) {
-        if (event.getMessage().contains(msg)) {
-          fail("Event '" + msg + "' was found in output: \n" + Joiner.on('\n').join(stderr));
-        }
-      }
-    }
-  }
-
-  private String[] deprecationMessages(String pkg, String clazz, String method) {
-    return new String[] {
-        String.format("%s() in %s.%s has been deprecated", method, pkg, clazz), // javac6
-        String.format("%s() in %s has been deprecated", method, clazz) // javac7
-    };
+  public void testRegexpFilterShowOutputNonMatchTagReturnsFalse() {
+    OutputFilter underTest =
+        OutputFilter.RegexOutputFilter.forPattern(Pattern.compile("^//some/target"));
+    assertThat(underTest.showOutput("//not/some/target")).isFalse();
   }
 }
