diff --git a/src/test/java/com/google/devtools/build/lib/BUILD b/src/test/java/com/google/devtools/build/lib/BUILD
index f7ae7d5..4c1f7b2 100644
--- a/src/test/java/com/google/devtools/build/lib/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/BUILD
@@ -27,6 +27,7 @@
         "//src/test/java/com/google/devtools/build/lib/skyframe:srcs",
         "//src/test/java/com/google/devtools/build/lib/rules/repository:srcs",
         "//src/test/java/com/google/devtools/build/lib/bazel/repository:srcs",
+        "//src/test/java/com/google/devtools/build/lib/buildeventstream/transports:srcs",
         "//src/test/java/com/google/devtools/build/lib/buildtool:srcs",
     ],
     visibility = ["//src:__pkg__"],
@@ -1000,6 +1001,7 @@
         "//src/main/java/com/google/devtools/build/lib:vfs",
         "//src/main/java/com/google/devtools/build/lib/actions",
         "//src/main/java/com/google/devtools/build/lib/buildeventstream/proto:build_event_stream_java_proto",
+        "//src/main/java/com/google/devtools/build/lib/buildeventstream/transports",
         "//src/main/java/com/google/devtools/common/options",
         "//src/main/protobuf:invocation_policy_java_proto",
         "//src/main/protobuf:test_status_java_proto",
diff --git a/src/test/java/com/google/devtools/build/lib/buildeventstream/transports/BUILD b/src/test/java/com/google/devtools/build/lib/buildeventstream/transports/BUILD
new file mode 100644
index 0000000..6472d8a
--- /dev/null
+++ b/src/test/java/com/google/devtools/build/lib/buildeventstream/transports/BUILD
@@ -0,0 +1,24 @@
+filegroup(
+    name = "srcs",
+    srcs = glob(["**"]),
+    visibility = ["//src/test/java/com/google/devtools/build/lib:__pkg__"],
+)
+
+java_test(
+    name = "BuildEventTransportTest",
+    srcs = glob(["*.java"]),
+    test_class = "com.google.devtools.build.lib.AllTests",
+    runtime_deps = ["//src/test/java/com/google/devtools/build/lib:test_runner"],
+    deps = [
+        "//src/main/java/com/google/devtools/build/lib:buildeventstream",
+        "//src/main/java/com/google/devtools/build/lib:runtime",
+        "//src/main/java/com/google/devtools/build/lib/buildeventstream/proto:build_event_stream_java_proto",
+        "//src/main/java/com/google/devtools/build/lib/buildeventstream/transports",
+        "//src/test/java/com/google/devtools/build/lib:packages_testutil",
+        "//third_party:guava",
+        "//third_party:junit4",
+        "//third_party:mockito",
+        "//third_party:truth",
+        "//third_party/protobuf",
+    ],
+)
diff --git a/src/test/java/com/google/devtools/build/lib/buildeventstream/transports/BinaryFormatFileTransportTest.java b/src/test/java/com/google/devtools/build/lib/buildeventstream/transports/BinaryFormatFileTransportTest.java
new file mode 100644
index 0000000..e241e84
--- /dev/null
+++ b/src/test/java/com/google/devtools/build/lib/buildeventstream/transports/BinaryFormatFileTransportTest.java
@@ -0,0 +1,90 @@
+// Copyright 2016 The Bazel Authors. 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 com.google.devtools.build.lib.buildeventstream.transports;
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Mockito.when;
+
+import com.google.devtools.build.lib.buildeventstream.BuildEvent;
+import com.google.devtools.build.lib.buildeventstream.BuildEventStreamProtos;
+import com.google.devtools.build.lib.buildeventstream.BuildEventStreamProtos.BuildStarted;
+import com.google.devtools.build.lib.buildeventstream.BuildEventStreamProtos.Progress;
+import com.google.devtools.build.lib.buildeventstream.BuildEventStreamProtos.TargetComplete;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+
+/** Tests {@link BinaryFormatFileTransport}. **/
+@RunWith(JUnit4.class)
+public class BinaryFormatFileTransportTest {
+
+  @Rule public TemporaryFolder tmp = new TemporaryFolder();
+
+  @Mock public BuildEvent buildEvent;
+
+  @Before
+  public void initMocks() {
+    MockitoAnnotations.initMocks(this);
+  }
+
+  @After
+  public void validateMocks() {
+    Mockito.validateMockitoUsage();
+  }
+
+  @Test
+  public void testCreatesFileAndWritesProtoTextFormat() throws IOException {
+    File output = tmp.newFile();
+
+    BuildEventStreamProtos.BuildEvent started =
+        BuildEventStreamProtos.BuildEvent.newBuilder()
+            .setStarted(BuildStarted.newBuilder().setCommand("build"))
+            .build();
+    when(buildEvent.asStreamProto()).thenReturn(started);
+    BinaryFormatFileTransport transport = new BinaryFormatFileTransport(output.getAbsolutePath());
+    transport.sendBuildEvent(buildEvent);
+
+    BuildEventStreamProtos.BuildEvent progress =
+        BuildEventStreamProtos.BuildEvent.newBuilder().setProgress(Progress.newBuilder()).build();
+    when(buildEvent.asStreamProto()).thenReturn(progress);
+    transport.sendBuildEvent(buildEvent);
+
+    BuildEventStreamProtos.BuildEvent completed =
+        BuildEventStreamProtos.BuildEvent.newBuilder()
+            .setCompleted(TargetComplete.newBuilder().setSuccess(true))
+            .build();
+    when(buildEvent.asStreamProto()).thenReturn(completed);
+    transport.sendBuildEvent(buildEvent);
+
+    transport.close();
+    try (InputStream in = new FileInputStream(output)) {
+      assertThat(BuildEventStreamProtos.BuildEvent.parseDelimitedFrom(in)).isEqualTo(started);
+      assertThat(BuildEventStreamProtos.BuildEvent.parseDelimitedFrom(in)).isEqualTo(progress);
+      assertThat(BuildEventStreamProtos.BuildEvent.parseDelimitedFrom(in)).isEqualTo(completed);
+      assertThat(in.available()).isEqualTo(0);
+    }
+  }
+}
diff --git a/src/test/java/com/google/devtools/build/lib/buildeventstream/transports/BuildEventTransportFactoryTest.java b/src/test/java/com/google/devtools/build/lib/buildeventstream/transports/BuildEventTransportFactoryTest.java
new file mode 100644
index 0000000..8d4aa52
--- /dev/null
+++ b/src/test/java/com/google/devtools/build/lib/buildeventstream/transports/BuildEventTransportFactoryTest.java
@@ -0,0 +1,130 @@
+// Copyright 2016 The Bazel Authors. 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 com.google.devtools.build.lib.buildeventstream.transports;
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Mockito.when;
+
+import com.google.common.base.Function;
+import com.google.common.collect.FluentIterable;
+import com.google.common.collect.ImmutableSet;
+import com.google.devtools.build.lib.buildeventstream.BuildEvent;
+import com.google.devtools.build.lib.buildeventstream.BuildEventStreamProtos;
+import com.google.devtools.build.lib.buildeventstream.BuildEventStreamProtos.BuildStarted;
+import com.google.devtools.build.lib.buildeventstream.BuildEventTransport;
+import java.io.File;
+import java.io.IOException;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+
+/** Tests {@link BuildEventTransportFactory}. **/
+@RunWith(JUnit4.class)
+public class BuildEventTransportFactoryTest {
+
+  private static final Function<Object, Class<?>> GET_CLASS =
+      new Function<Object, Class<?>>() {
+        @Override
+        public Class<?> apply(Object o) {
+          return o.getClass();
+        }
+      };
+
+  private static final BuildEventStreamProtos.BuildEvent BUILD_EVENT_AS_PROTO =
+      BuildEventStreamProtos.BuildEvent.newBuilder()
+          .setStarted(BuildStarted.newBuilder().setCommand("build"))
+          .build();
+
+  @Rule public TemporaryFolder tmp = new TemporaryFolder();
+
+  @Mock public BuildEventStreamOptions options;
+
+  @Mock public BuildEvent buildEvent;
+
+  @Before
+  public void before() {
+    MockitoAnnotations.initMocks(this);
+    when(buildEvent.asStreamProto()).thenReturn(BUILD_EVENT_AS_PROTO);
+  }
+
+  @After
+  public void validateMocks() {
+    Mockito.validateMockitoUsage();
+  }
+
+  @Test
+  public void testCreatesTextFormatFileTransport() throws IOException {
+    File textFile = tmp.newFile();
+    when(options.getBuildEventTextFile()).thenReturn(textFile.getAbsolutePath());
+    when(options.getBuildEventBinaryFile()).thenReturn("");
+    ImmutableSet<BuildEventTransport> transports =
+        BuildEventTransportFactory.createFromOptions(options);
+    assertThat(FluentIterable.from(transports).transform(GET_CLASS))
+        .containsExactly(TextFormatFileTransport.class);
+    sendEventsAndClose(buildEvent, transports);
+    assertThat(textFile.exists()).isTrue();
+  }
+
+  @Test
+  public void testCreatesBinaryFormatFileTransport() throws IOException {
+    File binaryFile = tmp.newFile();
+    when(options.getBuildEventTextFile()).thenReturn("");
+    when(options.getBuildEventBinaryFile()).thenReturn(binaryFile.getAbsolutePath());
+    ImmutableSet<BuildEventTransport> transports =
+        BuildEventTransportFactory.createFromOptions(options);
+    assertThat(FluentIterable.from(transports).transform(GET_CLASS))
+        .containsExactly(BinaryFormatFileTransport.class);
+    sendEventsAndClose(buildEvent, transports);
+    assertThat(binaryFile.exists()).isTrue();
+  }
+
+  @Test
+  public void testCreatesAllTransports() throws IOException {
+    File textFile = tmp.newFile();
+    File binaryFile = tmp.newFile();
+    when(options.getBuildEventTextFile()).thenReturn(textFile.getAbsolutePath());
+    when(options.getBuildEventBinaryFile()).thenReturn(binaryFile.getAbsolutePath());
+    ImmutableSet<BuildEventTransport> transports =
+        BuildEventTransportFactory.createFromOptions(options);
+    assertThat(FluentIterable.from(transports).transform(GET_CLASS))
+        .containsExactly(TextFormatFileTransport.class, BinaryFormatFileTransport.class);
+    sendEventsAndClose(buildEvent, transports);
+    assertThat(textFile.exists()).isTrue();
+    assertThat(binaryFile.exists()).isTrue();
+  }
+
+  @Test
+  public void testCreatesNoTransports() throws IOException {
+    when(options.getBuildEventTextFile()).thenReturn("");
+    ImmutableSet<BuildEventTransport> transports =
+        BuildEventTransportFactory.createFromOptions(options);
+    assertThat(transports).isEmpty();
+  }
+
+  private void sendEventsAndClose(BuildEvent event, Iterable<BuildEventTransport> transports)
+      throws IOException{
+    for (BuildEventTransport transport : transports) {
+      transport.sendBuildEvent(event);
+      transport.close();
+    }
+  }
+}
diff --git a/src/test/java/com/google/devtools/build/lib/buildeventstream/transports/TextFormatFileTransportTest.java b/src/test/java/com/google/devtools/build/lib/buildeventstream/transports/TextFormatFileTransportTest.java
new file mode 100644
index 0000000..798e855
--- /dev/null
+++ b/src/test/java/com/google/devtools/build/lib/buildeventstream/transports/TextFormatFileTransportTest.java
@@ -0,0 +1,91 @@
+// Copyright 2016 The Bazel Authors. 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 com.google.devtools.build.lib.buildeventstream.transports;
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Mockito.when;
+
+import com.google.common.base.Joiner;
+import com.google.common.io.Files;
+import com.google.devtools.build.lib.buildeventstream.BuildEvent;
+import com.google.devtools.build.lib.buildeventstream.BuildEventStreamProtos;
+import com.google.devtools.build.lib.buildeventstream.BuildEventStreamProtos.BuildStarted;
+import com.google.devtools.build.lib.buildeventstream.BuildEventStreamProtos.Progress;
+import com.google.devtools.build.lib.buildeventstream.BuildEventStreamProtos.TargetComplete;
+import com.google.protobuf.TextFormat;
+import java.io.File;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+
+/** Tests {@link TextFormatFileTransport}. **/
+@RunWith(JUnit4.class)
+public class TextFormatFileTransportTest {
+
+  @Rule public TemporaryFolder tmp = new TemporaryFolder();
+
+  @Mock public BuildEvent buildEvent;
+
+  @Before
+  public void initMocks() {
+    MockitoAnnotations.initMocks(this);
+  }
+
+  @After
+  public void validateMocks() {
+    Mockito.validateMockitoUsage();
+  }
+
+  @Test
+  public void testCreatesFileAndWritesProtoTextFormat() throws IOException {
+    File output = tmp.newFile();
+
+    BuildEventStreamProtos.BuildEvent started =
+        BuildEventStreamProtos.BuildEvent.newBuilder()
+            .setStarted(BuildStarted.newBuilder().setCommand("build"))
+            .build();
+    when(buildEvent.asStreamProto()).thenReturn(started);
+    TextFormatFileTransport transport = new TextFormatFileTransport(output.getAbsolutePath());
+    transport.sendBuildEvent(buildEvent);
+
+    BuildEventStreamProtos.BuildEvent progress =
+        BuildEventStreamProtos.BuildEvent.newBuilder().setProgress(Progress.newBuilder()).build();
+    when(buildEvent.asStreamProto()).thenReturn(progress);
+    transport.sendBuildEvent(buildEvent);
+
+    BuildEventStreamProtos.BuildEvent completed =
+        BuildEventStreamProtos.BuildEvent.newBuilder()
+            .setCompleted(TargetComplete.newBuilder().setSuccess(true))
+            .build();
+    when(buildEvent.asStreamProto()).thenReturn(completed);
+    transport.sendBuildEvent(buildEvent);
+
+    transport.close();
+    String contents =
+        Joiner.on(System.lineSeparator()).join(Files.readLines(output, StandardCharsets.UTF_8));
+    assertThat(contents).contains(TextFormat.printToString(started));
+    assertThat(contents).contains(TextFormat.printToString(progress));
+    assertThat(contents).contains(TextFormat.printToString(completed));
+  }
+}
diff --git a/src/test/java/com/google/devtools/build/lib/runtime/BuildEventStreamerModuleTest.java b/src/test/java/com/google/devtools/build/lib/runtime/BuildEventStreamerModuleTest.java
new file mode 100644
index 0000000..ad5a87c
--- /dev/null
+++ b/src/test/java/com/google/devtools/build/lib/runtime/BuildEventStreamerModuleTest.java
@@ -0,0 +1,136 @@
+// Copyright 2016 The Bazel Authors. 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 com.google.devtools.build.lib.runtime;
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Mockito.when;
+
+import com.google.common.base.Function;
+import com.google.common.base.Optional;
+import com.google.common.collect.FluentIterable;
+import com.google.devtools.build.lib.buildeventstream.transports.BinaryFormatFileTransport;
+import com.google.devtools.build.lib.buildeventstream.transports.BuildEventStreamOptions;
+import com.google.devtools.build.lib.buildeventstream.transports.TextFormatFileTransport;
+import com.google.devtools.build.lib.runtime.BlazeModule.ModuleEnvironment;
+import com.google.devtools.common.options.OptionsBase;
+import com.google.devtools.common.options.OptionsParser;
+import com.google.devtools.common.options.OptionsProvider;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+
+/** Tests {@link BuildEventStreamerModule}. **/
+@RunWith(JUnit4.class)
+public class BuildEventStreamerModuleTest {
+
+  private static final Function<Object, Class<?>> GET_CLASS =
+      new Function<Object, Class<?>>() {
+        @Override
+        public Class<?> apply(Object o) {
+          return o.getClass();
+        }
+      };
+
+  @Rule public TemporaryFolder tmp = new TemporaryFolder();
+
+  @Mock public BuildEventStreamOptions options;
+
+  @Mock public OptionsProvider optionsProvider;
+
+  @Mock public ModuleEnvironment moduleEnvironment;
+
+  @Mock public Command command;
+
+  @Before
+  public void initMocks() {
+    MockitoAnnotations.initMocks(this);
+  }
+
+  @After
+  public void validateMocks() {
+    Mockito.validateMockitoUsage();
+  }
+
+  @Test
+  public void testReturnsBuildEventStreamerOptions() throws Exception {
+    BuildEventStreamerModule module = new BuildEventStreamerModule();
+    Iterable<Class<? extends OptionsBase>> commandOptions = module.getCommandOptions(command);
+    assertThat(commandOptions).isNotEmpty();
+    OptionsParser optionsParser = OptionsParser.newOptionsParser(commandOptions);
+    optionsParser.parse(
+        "--experimental_build_event_text_file", "/tmp/foo.txt",
+        "--experimental_build_event_binary_file", "/tmp/foo.bin");
+    BuildEventStreamOptions options = optionsParser.getOptions(BuildEventStreamOptions.class);
+    assertThat(options.getBuildEventTextFile()).isEqualTo("/tmp/foo.txt");
+    assertThat(options.getBuildEventBinaryFile()).isEqualTo("/tmp/foo.bin");
+  }
+
+  @Test
+  public void testCreatesStreamerForTextFormatFileTransport() throws Exception {
+    when(optionsProvider.getOptions(BuildEventStreamOptions.class)).thenReturn(options);
+    when(options.getBuildEventTextFile()).thenReturn(tmp.newFile().getAbsolutePath());
+
+    BuildEventStreamerModule module = new BuildEventStreamerModule();
+    Optional<BuildEventStreamer> buildEventStreamer =
+        module.tryCreateStreamer(optionsProvider, moduleEnvironment);
+    assertThat(buildEventStreamer.get()).isInstanceOf(BuildEventStreamer.class);
+    assertThat(FluentIterable.from(buildEventStreamer.get().getTransports()).transform(GET_CLASS))
+        .containsExactly(TextFormatFileTransport.class);
+  }
+
+  @Test
+  public void testCreatesStreamerForBinaryFormatFileTransport() throws Exception {
+    when(optionsProvider.getOptions(BuildEventStreamOptions.class)).thenReturn(options);
+    when(options.getBuildEventBinaryFile()).thenReturn(tmp.newFile().getAbsolutePath());
+
+    BuildEventStreamerModule module = new BuildEventStreamerModule();
+    Optional<BuildEventStreamer> buildEventStreamer =
+        module.tryCreateStreamer(optionsProvider, moduleEnvironment);
+    assertThat(buildEventStreamer.get()).isInstanceOf(BuildEventStreamer.class);
+    assertThat(FluentIterable.from(buildEventStreamer.get().getTransports()).transform(GET_CLASS))
+        .containsExactly(BinaryFormatFileTransport.class);
+  }
+
+  @Test
+  public void testCreatesStreamerForAllTransports() throws Exception {
+    when(optionsProvider.getOptions(BuildEventStreamOptions.class)).thenReturn(options);
+    when(options.getBuildEventTextFile()).thenReturn(tmp.newFile().getAbsolutePath());
+    when(options.getBuildEventBinaryFile()).thenReturn(tmp.newFile().getAbsolutePath());
+
+    BuildEventStreamerModule module = new BuildEventStreamerModule();
+    Optional<BuildEventStreamer> buildEventStreamer =
+        module.tryCreateStreamer(optionsProvider, moduleEnvironment);
+    assertThat(buildEventStreamer.get()).isInstanceOf(BuildEventStreamer.class);
+    assertThat(FluentIterable.from(buildEventStreamer.get().getTransports()).transform(GET_CLASS))
+        .containsExactly(TextFormatFileTransport.class, BinaryFormatFileTransport.class);
+  }
+
+  @Test
+  public void testDoesNotCreatesStreamerWithoutTransports() throws Exception {
+    when(optionsProvider.getOptions(BuildEventStreamOptions.class)).thenReturn(options);
+
+    BuildEventStreamerModule module = new BuildEventStreamerModule();
+    Optional<BuildEventStreamer> buildEventStreamer =
+        module.tryCreateStreamer(optionsProvider, moduleEnvironment);
+    assertThat(buildEventStreamer.isPresent()).isFalse();
+  }
+}
