diff --git a/BUILD.gn b/BUILD.gn
index c2f5409..9e26875 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -8,7 +8,6 @@
   deps = [
     "examples/test/flutter_widget_test:flutter_widget_test",
     "public/dart/sledge:dart_sledge_tests",
-    "public/lib/app/dart:dart_app_tests",
     "shell:tests",
   ]
 }
diff --git a/README.md b/README.md
index a561f9d..5d7f48d 100644
--- a/README.md
+++ b/README.md
@@ -47,3 +47,7 @@
 * topaz/public/lib/schemas: e5810dfa1
 * topaz/public/lib/entity: e5810dfa1
 * topaz/public/lib/component: e5810dfa1
+* public/lib/app/dart: 12404bc
+* examples/fidl/echo_client_dart: 12404bc
+* examples/fidl/echo_server_dart: 12404bc
+* examples/fidl/fidl_bindings_performance: 12404bc
diff --git a/bin/dart_fidl_json/json.fidlmerge b/bin/dart_fidl_json/json.fidlmerge
index 29cacc3..318b587 100644
--- a/bin/dart_fidl_json/json.fidlmerge
+++ b/bin/dart_fidl_json/json.fidlmerge
@@ -19,7 +19,7 @@
 
 {{- define "FidlInclude" }}
 import 'dart:typed_data';
-import 'package:fidl{{- range .Name.Parts }}_{{ . }}{{ end }}/fidl.dart';
+import 'package:fidl{{- range .Name.Parts }}_{{ . }}{{ end }}/fidl_async.dart';
 {{ end }}
 
 {{/*
diff --git a/bin/dart_fidl_json/test/test/json_test.dart b/bin/dart_fidl_json/test/test/json_test.dart
index ab35544..b6de337 100644
--- a/bin/dart_fidl_json/test/test/json_test.dart
+++ b/bin/dart_fidl_json/test/test/json_test.dart
@@ -5,7 +5,7 @@
 import 'dart:typed_data';
 
 import 'package:fidl_dart_fidl_json_test_fidl_json/json.dart';
-import 'package:fidl_test_dart_fidl_json/fidl.dart';
+import 'package:fidl_test_dart_fidl_json/fidl_async.dart';
 import 'package:test/test.dart';
 
 void main() {
@@ -14,9 +14,9 @@
     const ExampleEnum sourceEnum = ExampleEnum.val1;
 
     expect(
-        sourceEnum,
         ExampleEnumConverter.fromJson(
-            jsonDecode(jsonEncode(ExampleEnumConverter.toJson(sourceEnum)))));
+            jsonDecode(jsonEncode(ExampleEnumConverter.toJson(sourceEnum)))),
+            sourceEnum);
   });
 
   // Ensure struct encode/decode.
diff --git a/bin/fidl_bindings_test/test/test/failure_test.dart b/bin/fidl_bindings_test/test/test/failure_test.dart
index f8360fda..838c195 100644
--- a/bin/fidl_bindings_test/test/test/failure_test.dart
+++ b/bin/fidl_bindings_test/test/test/failure_test.dart
@@ -2,10 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import 'dart:async';
 
-import 'package:fidl/fidl.dart';
-import 'package:fidl_fidl_examples_bindingstest/fidl.dart' as fidlgen;
 import 'package:fidl_fidl_examples_bindingstest/fidl_async.dart';
 import 'package:test/test.dart';
 
@@ -60,20 +57,6 @@
       expect(server.proxy.emptyEvent.first, throwsA(anything));
       server.proxy.ctrl.close();
     });
-
-    test('binding closes immediately after sending response', () async {
-      var impl = SimpleServerImpl();
-      var proxy = impl.newAsyncProxy();
-      var pinged = false;
-
-      Future<Null> pingFut = proxy.ping().then((_) {
-        pinged = true;
-      });
-      var closedFut = proxy.ctrl.whenClosed.then((_) {
-        expect(pinged, equals(true));
-      });
-      await Future.wait([pingFut, closedFut]);
-    });
   });
 
   group('unbound', () {
@@ -91,25 +74,3 @@
     });
   });
 }
-
-// This implementation uses the callback-based bindings, since the future-based
-// bindings don't cleanly allow SimpleServerImpl.ping() to respond and then
-// close the bound channel.
-class SimpleServerImpl extends fidlgen.SimpleServer {
-  SimpleServerProxy newAsyncProxy() {
-    var proxy = SimpleServerProxy();
-    binding.bind(
-        this,
-        InterfaceRequest<fidlgen.SimpleServer>(
-            proxy.ctrl.request().passChannel()));
-    return proxy;
-  }
-
-  @override
-  void ping(void callback()) {
-    callback();
-    binding.close();
-  }
-
-  fidlgen.SimpleServerBinding binding = fidlgen.SimpleServerBinding();
-}
diff --git a/bin/ui/benchmarks/image_grid_flutter/BUILD.gn b/bin/ui/benchmarks/image_grid_flutter/BUILD.gn
index 05d4465..ffef0ff 100644
--- a/bin/ui/benchmarks/image_grid_flutter/BUILD.gn
+++ b/bin/ui/benchmarks/image_grid_flutter/BUILD.gn
@@ -24,6 +24,6 @@
   deps = [
     "//third_party/dart-pkg/git/flutter/packages/flutter",
     "//topaz/public/dart/widgets:lib.widgets",
-    "//topaz/public/lib/app/dart",
+    "//topaz/public/dart/fuchsia_logger",
   ]
 }
diff --git a/bin/ui/benchmarks/image_grid_flutter/lib/image_grid_model.dart b/bin/ui/benchmarks/image_grid_flutter/lib/image_grid_model.dart
index 909fa80..1f74da7 100644
--- a/bin/ui/benchmarks/image_grid_flutter/lib/image_grid_model.dart
+++ b/bin/ui/benchmarks/image_grid_flutter/lib/image_grid_model.dart
@@ -8,10 +8,11 @@
 import 'dart:ui' as ui;
 
 import 'package:flutter/widgets.dart';
-import 'package:lib.app.dart/logging.dart';
 import 'package:lib.widgets/model.dart';
+import 'package:lib.widgets/utils.dart';
 import 'package:lib.widgets/widgets.dart';
 
+
 const RK4SpringDescription _kSimulationDesc =
     RK4SpringDescription(tension: 10.0, friction: 50.0);
 const double _kMinScrollOffset = 0.0;
diff --git a/bin/ui/benchmarks/image_grid_flutter/lib/main.dart b/bin/ui/benchmarks/image_grid_flutter/lib/main.dart
index d1b2bdb..1debbdf 100644
--- a/bin/ui/benchmarks/image_grid_flutter/lib/main.dart
+++ b/bin/ui/benchmarks/image_grid_flutter/lib/main.dart
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 import 'package:flutter/material.dart';
-import 'package:lib.app.dart/logging.dart';
+import 'package:fuchsia_logger/logger.dart';
 import 'package:lib.widgets/model.dart' show ScopedModel, ScopedModelDescendant;
 
 import 'image_grid.dart';
diff --git a/bin/userpicker_base_shell/lib/user_picker_base_shell_model.dart b/bin/userpicker_base_shell/lib/user_picker_base_shell_model.dart
index 3fe0d69..decbdb0 100644
--- a/bin/userpicker_base_shell/lib/user_picker_base_shell_model.dart
+++ b/bin/userpicker_base_shell/lib/user_picker_base_shell_model.dart
@@ -13,10 +13,10 @@
 import 'package:flutter/foundation.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter/scheduler.dart';
-import 'package:lib.app.dart/logging.dart';
 import 'package:lib.base_shell/base_model.dart';
 import 'package:lib.widgets/model.dart';
 import 'package:zircon/zircon.dart';
+import 'package:fuchsia_logger/logger.dart';
 
 export 'package:lib.widgets/model.dart'
     show ScopedModel, ScopedModelDescendant, ModelFinder;
diff --git a/examples/fidl/BUILD.gn b/examples/fidl/BUILD.gn
index 07fb3cb..46e7ecf 100644
--- a/examples/fidl/BUILD.gn
+++ b/examples/fidl/BUILD.gn
@@ -16,7 +16,6 @@
         "//garnet/examples/fidl/services:echo",
         "//sdk/fidl/fuchsia.sys",
         "//topaz/public/dart/fidl",
-        "//topaz/public/lib/app/dart",
       ]
     },
     {
@@ -28,7 +27,6 @@
       deps = [
         "//garnet/examples/fidl/services:echo",
         "//topaz/public/dart/fidl",
-        "//topaz/public/lib/app/dart",
       ]
     },
   ]
diff --git a/examples/fidl/echo_client_dart/analysis_options.yaml b/examples/fidl/echo_client_dart/analysis_options.yaml
deleted file mode 100644
index e36fcd5..0000000
--- a/examples/fidl/echo_client_dart/analysis_options.yaml
+++ /dev/null
@@ -1,5 +0,0 @@
-# Copyright 2019 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-include: ../../../tools/analysis_options.yaml
diff --git a/examples/fidl/echo_client_dart/lib/main.dart b/examples/fidl/echo_client_dart/lib/main.dart
deleted file mode 100644
index 996d979..0000000
--- a/examples/fidl/echo_client_dart/lib/main.dart
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-import 'package:fidl_fidl_examples_echo/fidl.dart';
-import 'package:lib.app.dart/app.dart';
-import 'package:fidl_fuchsia_sys/fidl.dart';
-
-StartupContext _context;
-EchoProxy _echo;
-
-void main(List<String> args) {
-  String server = 'fuchsia-pkg://fuchsia.com/echo_dart#meta/echo_server_dart.cmx';
-  if (args.length >= 2 && args[0] == '--server') {
-    server = args[1];
-  }
-
-  _context = StartupContext.fromStartupInfo();
-
-  final Services services = Services();
-  final LaunchInfo launchInfo =
-      LaunchInfo(url: server, directoryRequest: services.request());
-  _context.launcher.createComponent(launchInfo, null);
-
-  _echo = EchoProxy();
-  _echo.ctrl.bind(services.connectToServiceByName<Echo>(Echo.$serviceName));
-
-  _echo.echoString('hello', (String response) {
-    print('***** Response: $response');
-  });
-}
diff --git a/examples/fidl/echo_client_dart/meta/echo_client_dart.cmx b/examples/fidl/echo_client_dart/meta/echo_client_dart.cmx
deleted file mode 100644
index 698a385..0000000
--- a/examples/fidl/echo_client_dart/meta/echo_client_dart.cmx
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-    "program": {
-        "data": "data/echo_client_dart"
-    },
-    "sandbox": {
-        "services": [ "fuchsia.sys.Environment" ]
-    }
-}
diff --git a/examples/fidl/echo_client_dart/pubspec.yaml b/examples/fidl/echo_client_dart/pubspec.yaml
deleted file mode 100644
index 64e8f21..0000000
--- a/examples/fidl/echo_client_dart/pubspec.yaml
+++ /dev/null
@@ -1,3 +0,0 @@
-# Copyright 2019 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
diff --git a/examples/fidl/echo_server_dart/analysis_options.yaml b/examples/fidl/echo_server_dart/analysis_options.yaml
deleted file mode 100644
index e36fcd5..0000000
--- a/examples/fidl/echo_server_dart/analysis_options.yaml
+++ /dev/null
@@ -1,5 +0,0 @@
-# Copyright 2019 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-include: ../../../tools/analysis_options.yaml
diff --git a/examples/fidl/echo_server_dart/lib/main.dart b/examples/fidl/echo_server_dart/lib/main.dart
deleted file mode 100644
index f920fee..0000000
--- a/examples/fidl/echo_server_dart/lib/main.dart
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-import 'package:fidl/fidl.dart';
-import 'package:fidl_fidl_examples_echo/fidl.dart';
-import 'package:lib.app.dart/app.dart';
-
-bool quiet = false;
-
-class _EchoImpl extends Echo {
-  final EchoBinding _binding = EchoBinding();
-
-  void bind(InterfaceRequest<Echo> request) {
-    _binding.bind(this, request);
-  }
-
-  @override
-  void echoString(String value, void callback(String response)) {
-    if (!quiet) {
-      print('EchoString: $value');
-    }
-    callback(value);
-  }
-}
-
-StartupContext _context;
-_EchoImpl _echo;
-
-void main(List<String> args) {
-  quiet = args.contains('-q');
-  _context = StartupContext.fromStartupInfo();
-  _echo = _EchoImpl();
-  _context.outgoingServices
-      .addServiceForName<Echo>(_echo.bind, Echo.$serviceName);
-}
diff --git a/examples/fidl/echo_server_dart/meta/echo_server_dart.cmx b/examples/fidl/echo_server_dart/meta/echo_server_dart.cmx
deleted file mode 100644
index 363b04a..0000000
--- a/examples/fidl/echo_server_dart/meta/echo_server_dart.cmx
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-    "program": {
-        "data": "data/echo_server_dart"
-    },
-    "sandbox": {
-        "services": [ "fuchsia.sys.Environment" ]
-    }
-}
diff --git a/examples/fidl/echo_server_dart/pubspec.yaml b/examples/fidl/echo_server_dart/pubspec.yaml
deleted file mode 100644
index 64e8f21..0000000
--- a/examples/fidl/echo_server_dart/pubspec.yaml
+++ /dev/null
@@ -1,3 +0,0 @@
-# Copyright 2019 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
diff --git a/examples/fidl/fidl_bindings_performance/BUILD.gn b/examples/fidl/fidl_bindings_performance/BUILD.gn
deleted file mode 100644
index 1c232c5..0000000
--- a/examples/fidl/fidl_bindings_performance/BUILD.gn
+++ /dev/null
@@ -1,26 +0,0 @@
-# Copyright 2018 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//topaz/runtime/dart_runner/dart_app.gni")
-
-dart_app("fidl_bindings_performance") {
-
-  main_dart = "lib/main.dart"
-
-  meta = [
-    {
-      path = rebase_path("meta/fidl_bindings_performance.cmx")
-      dest = "fidl_bindings_performance.cmx"
-    },
-  ]
-
-  sources = []
-  deps = [
-    "//garnet/examples/fidl/services:echo",
-    "//sdk/fidl/fuchsia.sys",
-    "//third_party/dart-pkg/pub/args",
-    "//topaz/public/dart/fidl",
-    "//topaz/public/lib/app/dart",
-  ]
-}
diff --git a/examples/fidl/fidl_bindings_performance/analysis_options.yaml b/examples/fidl/fidl_bindings_performance/analysis_options.yaml
deleted file mode 100644
index f0cea8a..0000000
--- a/examples/fidl/fidl_bindings_performance/analysis_options.yaml
+++ /dev/null
@@ -1,5 +0,0 @@
-# Copyright 2018 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-include: ../../../tools/analysis_options.yaml
diff --git a/examples/fidl/fidl_bindings_performance/lib/main.dart b/examples/fidl/fidl_bindings_performance/lib/main.dart
deleted file mode 100644
index ac6bbb9..0000000
--- a/examples/fidl/fidl_bindings_performance/lib/main.dart
+++ /dev/null
@@ -1,168 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-import 'dart:async';
-import 'package:args/args.dart';
-import 'package:fidl_fidl_examples_echo/fidl.dart';
-import 'package:lib.app.dart/app.dart';
-import 'package:fidl_fuchsia_sys/fidl.dart';
-import 'package:fuchsia/fuchsia.dart';
-
-typedef PerfTest = Future<int> Function(String server, int number);
-
-StartupContext _context;
-
-const List<String> kDefaultServers = [
-  'fuchsia-pkg://fuchsia.com/echo_server_cpp#meta/echo_server_cpp.cmx',
-  'fuchsia-pkg://fuchsia.com/echo_server_rust#meta/echo_server_rust.cmx',
-  'fuchsia-pkg://fuchsia.com/echo_server_go#meta/echo_server_go.cmx',
-  'fuchsia-pkg://fuchsia.com/echo_dart#meta/echo_server_dart.cmx',
-  'fuchsia-pkg://fuchsia.com/echo_server_async_dart#meta/echo_server_async_dart.cmx'
-];
-const List<int> kDefaultCalls = [1000, 10000];
-const String kMessage = 'hello';
-
-Future<int> runTest(String server, void ready(Echo echo, void complete())) {
-  final EchoProxy echo = EchoProxy();
-  final ComponentControllerProxy controller = ComponentControllerProxy();
-  final Services services = Services();
-  final LaunchInfo launchInfo = LaunchInfo(
-      url: server,
-      arguments: <String>['-q'],
-      directoryRequest: services.request());
-  _context.launcher.createComponent(launchInfo, controller.ctrl.request());
-  echo.ctrl.bind(services.connectToServiceByName<Echo>(Echo.$serviceName));
-
-  final Completer<int> completer = Completer<int>();
-
-  // Notice if the echo server or its controller goes away.
-  echo.ctrl.onConnectionError = () {
-    final message = '$server unexpectedly closed the connection';
-    print(message);
-    completer.completeError(message);
-  };
-  controller.ctrl.onConnectionError = () {  // ignore: cascade_invocations
-    final message = '$server controller connection unexpectedly closed';
-    print(message);
-    completer.completeError(message);
-  };
-
-  // Wait until the echo server is up and replying to messages.
-  echo.echoString(kMessage, (String response) {
-    final Stopwatch stopwatch = Stopwatch()..start();
-    void done() {
-      stopwatch.stop();
-      void complete() {
-        if (!completer.isCompleted) {
-          completer.complete(stopwatch.elapsedMicroseconds);
-        }
-      }
-
-      // Stop the echo server.
-      echo.ctrl.onConnectionError = null;
-      echo.ctrl.close();
-      controller
-        ..ctrl.onConnectionError = complete
-        ..ctrl.onClose = complete
-        ..kill()
-        ..onTerminated = (unusedReturnCode, unusedTerminationReason) {
-          // Now we're done...
-          complete();
-          controller.ctrl.close();
-        };
-    }
-
-    try {
-      ready(echo, done);
-      // ignore: avoid_catches_without_on_clauses
-    } catch (ex, stack) {
-      print('Exception testing $server: $ex');
-      print(stack);
-      completer.completeError(ex);
-    }
-  });
-
-  return completer.future;
-}
-
-Future<int> testSerialPerf(String server, int number) async {
-  return runTest(server, (Echo echo, void complete()) {
-    int remaining = number;
-    void callServer() {
-      echo.echoString(kMessage, (String _) {
-        remaining--;
-        if (remaining == 0) {
-          complete();
-        } else {
-          callServer();
-        }
-      });
-    }
-
-    callServer();
-  });
-}
-
-Future<int> testParallelPerf(String server, int number) async {
-  return runTest(server, (Echo echo, void complete()) {
-    int remaining = number;
-    for (int i = 0; i < number; i++) {
-      echo.echoString(kMessage, (String _) {
-        remaining--;
-        if (remaining == 0) {
-          complete();
-        }
-      });
-    }
-  });
-}
-
-void main(List<String> argv) async {
-  final parser = ArgParser()
-    ..addMultiOption('server', abbr: 's', defaultsTo: kDefaultServers)
-    ..addMultiOption('num-calls',
-        abbr: 'n', defaultsTo: kDefaultCalls.map((i) => i.toString()))
-    ..addFlag('parallel', abbr: 'p');
-  final ArgResults args = parser.parse(argv);
-  final List<String> servers = args['server'];
-  final List<int> numCalls = [];
-  for (final String str in args['num-calls']) {
-    numCalls.add(int.parse(str));
-  }
-  final PerfTest perfTest =
-      args['parallel'] ? testParallelPerf : testSerialPerf;
-
-  _context = StartupContext.fromStartupInfo();
-
-  // Map of server to map of count to total microseconds.
-  final Map<String, Map<int, int>> results = {};
-
-  try {
-    for (final int count in numCalls) {
-      for (final String server in servers) {
-        if (!results.containsKey(server)) {
-          results[server] = {};
-        }
-        print('Making $count calls to $server...');
-        final microseconds = await perfTest(server, count);
-        results[server][count] = microseconds;
-      }
-    }
-    // ignore: avoid_catches_without_on_clauses
-  } catch (ex, stack) {
-    print('Exception running tests: $ex');
-    print(stack);
-  }
-
-  print('server,${numCalls.join(',')}');
-  for (final String server in results.keys) {
-    StringBuffer line = StringBuffer(server);
-    for (final int count in numCalls) {
-      final int microseconds = results[server][count] ?? 0;
-      line.write(',${(microseconds / count)}');
-    }
-    print(line);
-  }
-  exit(0);
-}
diff --git a/examples/fidl/fidl_bindings_performance/meta/fidl_bindings_performance.cmx b/examples/fidl/fidl_bindings_performance/meta/fidl_bindings_performance.cmx
deleted file mode 100644
index 948ae42..0000000
--- a/examples/fidl/fidl_bindings_performance/meta/fidl_bindings_performance.cmx
+++ /dev/null
@@ -1,21 +0,0 @@
-{
-    "program": {
-        "data": "data/fidl_bindings_performance"
-    },
-    "sandbox": {
-        "services": [
-            "fuchsia.cobalt.LoggerFactory",
-            "fuchsia.fonts.Provider",
-            "fuchsia.logger.LogSink",
-            "fuchsia.modular.Clipboard",
-            "fuchsia.modular.ContextWriter",
-            "fuchsia.modular.ModuleContext",
-            "fuchsia.netstack.Netstack",
-            "fuchsia.sys.Environment",
-            "fuchsia.ui.input.ImeService",
-            "fuchsia.ui.policy.Presenter",
-            "fuchsia.ui.scenic.Scenic",
-            "fuchsia.wlan.service.Wlan"
-        ]
-    }
-}
diff --git a/examples/fidl/fidl_bindings_performance/pubspec.yaml b/examples/fidl/fidl_bindings_performance/pubspec.yaml
deleted file mode 100644
index de784fc..0000000
--- a/examples/fidl/fidl_bindings_performance/pubspec.yaml
+++ /dev/null
@@ -1,3 +0,0 @@
-# Copyright 2018 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
diff --git a/lib/story_shell/examples/mondrian_test/BUILD.gn b/lib/story_shell/examples/mondrian_test/BUILD.gn
index b8c7881..a78c4d6 100644
--- a/lib/story_shell/examples/mondrian_test/BUILD.gn
+++ b/lib/story_shell/examples/mondrian_test/BUILD.gn
@@ -19,6 +19,6 @@
   sources = []
   deps = [
     "//third_party/dart-pkg/git/flutter/packages/flutter",
-    "//topaz/public/lib/app/dart",
+    "//topaz/public/dart/fuchsia_logger",
   ]
 }
diff --git a/lib/story_shell/examples/mondrian_test/lib/main.dart b/lib/story_shell/examples/mondrian_test/lib/main.dart
index f42480d..0a6e3a3 100644
--- a/lib/story_shell/examples/mondrian_test/lib/main.dart
+++ b/lib/story_shell/examples/mondrian_test/lib/main.dart
@@ -5,7 +5,7 @@
 import 'dart:math' as math;
 
 import 'package:flutter/material.dart';
-import 'package:lib.app.dart/logging.dart';
+import 'package:fuchsia_logger/logger.dart';
 
 void main() {
   setupLogger(name: 'mondrianTest');
diff --git a/packages/examples/BUILD.gn b/packages/examples/BUILD.gn
index f222ee9..9b563dc 100644
--- a/packages/examples/BUILD.gn
+++ b/packages/examples/BUILD.gn
@@ -48,9 +48,7 @@
   public_deps = [
     "//topaz/examples/fidl/compiler",
     "//topaz/examples/fidl/echo_client_async_dart",
-    "//topaz/examples/fidl:echo_dart",
     "//topaz/examples/fidl/echo_server_async_dart",
-    "//topaz/examples/fidl/fidl_bindings_performance",
   ]
 }
 
diff --git a/packages/tests/BUILD.gn b/packages/tests/BUILD.gn
index bf0d49a..b3c7fed 100644
--- a/packages/tests/BUILD.gn
+++ b/packages/tests/BUILD.gn
@@ -30,7 +30,6 @@
     "//topaz/public/dart/sledge:dart_sledge_tests($host_toolchain)",
     "//topaz/public/dart/story_shell_labs:layout_unittests($host_toolchain)",
     "//topaz/public/dart/widgets:dart_widget_tests($host_toolchain)",
-    "//topaz/public/lib/app/dart:dart_app_tests($host_toolchain)",
     "//topaz/public/lib/display/flutter:display_test($host_toolchain)",
     "//topaz/shell/mondrian_story_shell:mondrian_story_shell_tests($host_toolchain)",
   ]
diff --git a/public/dart/fuchsia_inspect/test/integration/BUILD.gn b/public/dart/fuchsia_inspect/test/integration/BUILD.gn
index 57a90e9..eda71a2 100644
--- a/public/dart/fuchsia_inspect/test/integration/BUILD.gn
+++ b/public/dart/fuchsia_inspect/test/integration/BUILD.gn
@@ -53,7 +53,6 @@
         "//topaz/public/dart/fidl",
         "//topaz/public/dart/fuchsia_inspect",
         "//topaz/public/dart/fuchsia_services",
-        "//topaz/public/lib/app/dart",
       ]
     },
   ]
diff --git a/public/dart/widgets/BUILD.gn b/public/dart/widgets/BUILD.gn
index f976d0e..4489117 100644
--- a/public/dart/widgets/BUILD.gn
+++ b/public/dart/widgets/BUILD.gn
@@ -50,7 +50,6 @@
     "//topaz/public/dart/fidl",
     "//topaz/public/dart/fuchsia_logger",
     "//topaz/public/dart/fuchsia_scenic_flutter",
-    "//topaz/public/lib/app/dart",
     "//zircon/public/fidl/fuchsia-cobalt",
   ]
 }
diff --git a/public/dart/widgets/lib/src/application/application_widget.dart b/public/dart/widgets/lib/src/application/application_widget.dart
index b6e6319..3e9d22b 100644
--- a/public/dart/widgets/lib/src/application/application_widget.dart
+++ b/public/dart/widgets/lib/src/application/application_widget.dart
@@ -10,7 +10,7 @@
 import 'package:fuchsia_scenic_flutter/child_view.dart' show ChildView;
 import 'package:fuchsia_scenic_flutter/child_view_connection.dart'
     show ChildViewConnection;
-import 'package:lib.app.dart/app_async.dart';
+import 'package:fuchsia_services/services.dart';
 import 'package:meta/meta.dart';
 import 'package:zircon/zircon.dart';
 
@@ -88,9 +88,11 @@
   void _launchApp() {
     _applicationController = ComponentControllerProxy();
 
-    Services incomingServices = Services();
+    final incomingServices = Incoming();
     widget.launcher.createComponent(
-      LaunchInfo(url: widget.url, directoryRequest: incomingServices.request()),
+      LaunchInfo(
+          url: widget.url,
+          directoryRequest: incomingServices.request().passChannel()),
       _applicationController.ctrl.request(),
     );
 
@@ -105,10 +107,10 @@
 
   /// Creates a [ViewProviderProxy] from a [Services], closing it in the
   /// process.
-  ViewProviderProxy _consumeServices(Services services) {
+  ViewProviderProxy _consumeServices(Incoming services) {
     ViewProviderProxy viewProvider = ViewProviderProxy();
     services
-      ..connectToService(viewProvider.ctrl)
+      ..connectToService(viewProvider)
       ..close();
     return viewProvider;
   }
diff --git a/public/lib/app/dart/BUILD.gn b/public/lib/app/dart/BUILD.gn
deleted file mode 100644
index 4f1cfcf..0000000
--- a/public/lib/app/dart/BUILD.gn
+++ /dev/null
@@ -1,88 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//build/dart/dart_library.gni")
-import("//topaz/runtime/dart/flutter_test.gni")
-
-dart_library("dart") {
-  package_name = "lib.app.dart"
-
-  sdk_category = "partner"
-
-  source_dir = "."
-  # Unclear non-standard directory structure
-  sources_required = false
-
-  sources = [
-    "app.dart",
-    "logging.dart",
-    "src/frame_rate_tracer.dart",
-    "src/fuchsia_log_record.dart",
-    "src/fuchsia_logger.dart",
-    "src/logging.dart",
-    "src/outgoing.dart",
-  ]
-
-  deps = [
-    "//sdk/fidl/fuchsia.sys",
-    "//third_party/dart-pkg/pub/logging",
-    "//third_party/dart-pkg/pub/stack_trace",
-    "//topaz/public/dart/fidl",
-    "//topaz/public/dart/fuchsia",
-    "//topaz/public/dart/fuchsia_vfs",
-    "//topaz/public/dart/zircon",
-    "//zircon/public/fidl/fuchsia-cobalt",
-    "//zircon/public/fidl/fuchsia-io",
-    "//zircon/public/fidl/fuchsia-logger",
-  ]
-}
-
-dart_library("testing") {
-  package_name = "lib.app.dart.testing"
-
-  sdk_category = "partner"
-  # Unclear non-standard directory structure
-  sources_required = false
-
-  source_dir = "testing"
-
-  sources = [
-    "app_test.dart",
-  ]
-
-  deps = [
-    "//third_party/dart-pkg/pub/mockito",
-    "//third_party/dart-pkg/pub/test",
-    "//topaz/public/dart/fidl",
-    "//topaz/public/lib/app/dart",
-  ]
-}
-
-flutter_test("dart_app_tests") {
-  sources = [
-    "fuchsia_log_record_test.dart",
-    "legacy_code.dart",
-    "legacy_logger_test.dart",
-    "log_writer_test.dart",
-    "socket_test.dart",
-    "socket_validate.dart",
-    "socket_with_exception_test.dart",
-    "socket_with_location_test.dart",
-    "socket_with_stacktrace_test.dart",
-    "socket_with_tags_test.dart",
-    "stdout_test.dart",
-    "stdout_with_exception.dart",
-    "stdout_with_location.dart",
-    "test_startup_context_test.dart",
-  ]
-
-  deps = [
-    ":dart",
-    "//third_party/dart-pkg/git/flutter/packages/flutter_test",
-    "//third_party/dart-pkg/pub/logging",
-    "//third_party/dart-pkg/pub/mockito",
-    "//third_party/dart-pkg/pub/test",
-    "//topaz/public/lib/app/dart",
-  ]
-}
diff --git a/public/lib/app/dart/OWNERS b/public/lib/app/dart/OWNERS
deleted file mode 100644
index 371ca9c..0000000
--- a/public/lib/app/dart/OWNERS
+++ /dev/null
@@ -1,4 +0,0 @@
-jasoncampbell@google.com
-larrylandry@google.com
-
-*
diff --git a/public/lib/app/dart/analysis_options.yaml b/public/lib/app/dart/analysis_options.yaml
deleted file mode 100644
index 54917c0..0000000
--- a/public/lib/app/dart/analysis_options.yaml
+++ /dev/null
@@ -1,5 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-include: ../../../analysis_options.yaml
diff --git a/public/lib/app/dart/app.dart b/public/lib/app/dart/app.dart
deleted file mode 100644
index 68f4c64..0000000
--- a/public/lib/app/dart/app.dart
+++ /dev/null
@@ -1,172 +0,0 @@
-// Copyright 2016 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// ignore_for_file: public_member_api_docs
-
-import 'package:fidl/fidl.dart';
-import 'package:fuchsia/fuchsia.dart';
-import 'package:fidl_fuchsia_sys/fidl.dart';
-import 'package:fidl_fuchsia_io/fidl.dart';
-import 'package:zircon/zircon.dart';
-import 'package:fidl_fuchsia_io/fidl_async.dart' as async_io;
-
-import 'src/outgoing.dart';
-
-export 'src/outgoing.dart';
-
-/// Deprecated! Use package:fuchsia_services/services.dart instead
-class StartupContext {
-  static StartupContext _context;
-
-  /// Holds the stack trace for the when the startup info is retrieved.
-  /// It's useful for tracking down why the async StartupInfo is missing
-  /// during the port.
-  static StackTrace initialTrace;
-
-  StartupContext();
-
-  final EnvironmentProxy environment = EnvironmentProxy();
-  final LauncherProxy launcher = LauncherProxy();
-  final ServiceProviderProxy environmentServices = ServiceProviderProxy();
-  final Outgoing outgoingServices = Outgoing();
-
-  factory StartupContext.fromStartupInfo() {
-    if (_context != null) {
-      return _context;
-    }
-    initialTrace = StackTrace.current;
-
-    final StartupContext context = StartupContext();
-
-    final Handle environmentHandle = MxStartupInfo.takeEnvironment();
-    if (environmentHandle != null) {
-      context.environment
-        ..ctrl.bind(
-            InterfaceHandle<Environment>(Channel(environmentHandle)))
-        ..getLauncher(context.launcher.ctrl.request())
-        ..getServices(context.environmentServices.ctrl.request());
-    }
-
-    final Handle outgoingServicesHandle = MxStartupInfo.takeOutgoingServices();
-    if (outgoingServicesHandle != null) {
-      context.outgoingServices.serve(
-          InterfaceRequest<async_io.Node>(Channel(outgoingServicesHandle)));
-    }
-
-    _context = context;
-
-    return context;
-  }
-
-  /// Provide an alternative startup context that will then be provided on
-  /// through [StartupContext.fromStartupInfo].
-  ///
-  /// This is primarily used to provide alternative environment services for
-  /// testing purposes.
-  static void provideStartupContext(StartupContext context) {
-    assert(_context == null, 'StartupContext should never be overwritten.');
-    _context = context;
-  }
-
-  void close() {
-    environment.ctrl.close();
-    launcher.ctrl.close();
-    environmentServices.ctrl.close();
-    outgoingServices.close();
-  }
-}
-
-/// Deprecated! Use package:fuchsia_services/services.dart instead
-void connectToService<T>(
-    ServiceProvider serviceProvider, ProxyController<T> controller) {
-  final String serviceName = controller.$serviceName;
-  assert(serviceName != null,
-      'controller.\$serviceName must not be null. Check the FIDL file for a missing [Discoverable]');
-  serviceProvider.connectToService(
-      serviceName, controller.request().passChannel());
-}
-
-/// Deprecated! Use package:fuchsia_services/services.dart instead
-InterfaceHandle<T> connectToServiceByName<T>(
-    ServiceProvider serviceProvider, String serviceName) {
-  final ChannelPair pair = ChannelPair();
-  serviceProvider.connectToService(serviceName, pair.first);
-  return InterfaceHandle<T>(pair.second);
-}
-
-typedef ServiceConnector<T> = void Function(InterfaceRequest<T> request);
-typedef DefaultServiceConnector<T> = void Function(
-    String serviceName, InterfaceRequest<T> request);
-
-typedef _ServiceConnectorThunk = void Function(Channel channel);
-
-/// Deprecated! Use package:fuchsia_services/services.dart instead
-class ServiceProviderImpl extends ServiceProvider {
-  final ServiceProviderBinding _binding = ServiceProviderBinding();
-
-  void bind(InterfaceRequest<ServiceProvider> interfaceRequest) {
-    _binding.bind(this, interfaceRequest);
-  }
-
-  void close() {
-    _binding.close();
-  }
-
-  DefaultServiceConnector<dynamic> defaultConnector;
-
-  final Map<String, _ServiceConnectorThunk> _connectorThunks =
-      <String, _ServiceConnectorThunk>{};
-
-  void addServiceForName<T>(ServiceConnector<T> connector, String serviceName) {
-    _connectorThunks[serviceName] = (Channel channel) {
-      connector(InterfaceRequest<T>(channel));
-    };
-  }
-
-  @override
-  void connectToService(String serviceName, Channel channel) {
-    final _ServiceConnectorThunk connectorThunk = _connectorThunks[serviceName];
-    if (connectorThunk != null) {
-      connectorThunk(channel);
-    } else if (defaultConnector != null) {
-      defaultConnector(serviceName, InterfaceRequest<dynamic>(channel));
-    } else {
-      channel.close();
-    }
-  }
-}
-
-/// Deprecated! Use package:fuchsia_services/services.dart instead
-class Services {
-  DirectoryProxy _proxy;
-  static const int _openFlags =
-      openRightReadable | openRightWritable; // connect flags for service
-  static const int _openMode = 0x1ED; // 0755
-
-  Services();
-
-  Channel request() {
-    _proxy = DirectoryProxy();
-    return _proxy.ctrl.request().passChannel();
-  }
-
-  void connectToService<T>(ProxyController<T> controller) {
-    final String serviceName = controller.$serviceName;
-    assert(serviceName != null,
-        'controller.\$serviceName must not be null. Check the FIDL file for a missing [Discoverable]');
-    _proxy.open(_openFlags, _openMode, serviceName,
-        InterfaceRequest<Node>(controller.request().passChannel()));
-  }
-
-  InterfaceHandle<T> connectToServiceByName<T>(String serviceName) {
-    final ChannelPair pair = ChannelPair();
-    _proxy.open(
-        _openFlags, _openMode, serviceName, InterfaceRequest<Node>(pair.first));
-    return InterfaceHandle<T>(pair.second);
-  }
-
-  void close() {
-    _proxy.close((_) {});
-  }
-}
diff --git a/public/lib/app/dart/app_async.dart b/public/lib/app/dart/app_async.dart
deleted file mode 100644
index b48ce38..0000000
--- a/public/lib/app/dart/app_async.dart
+++ /dev/null
@@ -1,181 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file
-
-/// A version of app.dart built on the new async bindings.
-
-import 'dart:async';
-import 'package:fidl/fidl.dart';
-import 'package:fuchsia/fuchsia.dart';
-import 'package:fidl_fuchsia_sys/fidl_async.dart';
-import 'package:zircon/zircon.dart';
-import 'package:fidl_fuchsia_io/fidl_async.dart';
-
-import 'app.dart' as sync_app;
-import 'src/outgoing.dart';
-
-export 'src/outgoing.dart';
-
-/// Deprecated! Use package:fuchsia_services/services.dart instead
-class StartupContext {
-  static StartupContext _context;
-
-  StartupContext();
-
-  final EnvironmentProxy environment = EnvironmentProxy();
-  final LauncherProxy launcher = LauncherProxy();
-  final ServiceProviderProxy environmentServices = ServiceProviderProxy();
-  final Outgoing outgoingServices = Outgoing();
-
-  factory StartupContext.fromStartupInfo() {
-    if (_context != null) {
-      return _context;
-    }
-
-    if (sync_app.StartupContext.initialTrace != null) {
-      print(
-          "WARNING: app.dart's StartupContext was created at:\n${sync_app.StartupContext.initialTrace}");
-    }
-
-    final StartupContext context = StartupContext();
-
-    final Handle environmentHandle = MxStartupInfo.takeEnvironment();
-    if (environmentHandle != null) {
-      context.environment
-        ..ctrl.bind(
-            InterfaceHandle<Environment>(Channel(environmentHandle)))
-        ..getLauncher(context.launcher.ctrl.request())
-        ..getServices(context.environmentServices.ctrl.request());
-    }
-
-    final Handle outgoingServicesHandle = MxStartupInfo.takeOutgoingServices();
-    if (outgoingServicesHandle != null) {
-      context.outgoingServices
-          .serve(InterfaceRequest<Node>(Channel(outgoingServicesHandle)));
-    }
-
-    _context = context;
-
-    return context;
-  }
-
-  /// Provide an alternative startup context that will then be provided on
-  /// through [StartupContext.fromStartupInfo].
-  ///
-  /// This is primarily used to provide alternative environment services for
-  /// testing purposes.
-  static void provideStartupContext(StartupContext context) {
-    assert(_context != null, 'StartupContext should never be overwritten.');
-    _context = context;
-  }
-
-  void close() {
-    environment.ctrl.close();
-    launcher.ctrl.close();
-    environmentServices.ctrl.close();
-    outgoingServices.close();
-  }
-}
-
-/// Deprecated! Use package:fuchsia_services/services.dart instead
-Future<void> connectToService<T>(
-    ServiceProvider serviceProvider, AsyncProxyController<T> controller) async {
-  final String serviceName = controller.$serviceName;
-  if (serviceName == null) {
-    throw Exception(
-        "${controller.$interfaceName}'s controller.\$serviceName"
-        ' must not be null. Check the FIDL file for a missing [Discoverable]');
-  }
-  await serviceProvider.connectToService(
-      serviceName, controller.request().passChannel());
-}
-
-/// Deprecated! Use package:fuchsia_services/services.dart instead
-InterfaceHandle<T> connectToServiceByName<T>(
-    ServiceProvider serviceProvider, String serviceName) {
-  final ChannelPair pair = ChannelPair();
-  serviceProvider.connectToService(serviceName, pair.first);
-  return InterfaceHandle<T>(pair.second);
-}
-
-typedef ServiceConnector<T> = void Function(InterfaceRequest<T> request);
-typedef DefaultServiceConnector<T> = void Function(
-    String serviceName, InterfaceRequest<T> request);
-
-typedef _ServiceConnectorThunk = void Function(Channel channel);
-
-/// Deprecated! Use package:fuchsia_services/services.dart instead
-class ServiceProviderImpl extends ServiceProvider {
-  final ServiceProviderBinding _binding = ServiceProviderBinding();
-
-  void bind(InterfaceRequest<ServiceProvider> interfaceRequest) {
-    _binding.bind(this, interfaceRequest);
-  }
-
-  void close() {
-    _binding.close();
-  }
-
-  DefaultServiceConnector<dynamic> defaultConnector;
-
-  final Map<String, _ServiceConnectorThunk> _connectorThunks =
-      <String, _ServiceConnectorThunk>{};
-
-  void addServiceForName<T>(ServiceConnector<T> connector, String serviceName) {
-    _connectorThunks[serviceName] = (Channel channel) {
-      connector(InterfaceRequest<T>(channel));
-    };
-  }
-
-  @override
-  Future<Null> connectToService(String serviceName, Channel channel) {
-    final _ServiceConnectorThunk connectorThunk = _connectorThunks[serviceName];
-    if (connectorThunk != null) {
-      connectorThunk(channel);
-    } else if (defaultConnector != null) {
-      defaultConnector(serviceName, InterfaceRequest<dynamic>(channel));
-    } else {
-      channel.close();
-    }
-    return null;
-  }
-}
-
-/// Deprecated! Use package:fuchsia_services/services.dart instead
-class Services {
-  DirectoryProxy _proxy;
-  static const int _openFlags =
-      openRightReadable | openRightWritable; // connect flags for service
-  static const int _openMode = 0x1ED; // 0755
-
-  Services();
-
-  Channel request() {
-    _proxy = DirectoryProxy();
-    return _proxy.ctrl.request().passChannel();
-  }
-
-  Future<void> connectToService<T>(AsyncProxyController<T> controller) async {
-    final String serviceName = controller.$serviceName;
-    if (serviceName == null) {
-      throw Exception(
-          "${controller.$interfaceName}'s controller.\$serviceName"
-          ' must not be null. Check the FIDL file for a missing [Discoverable]');
-    }
-    await _proxy.open(_openFlags, _openMode, serviceName,
-        InterfaceRequest<Node>(controller.request().passChannel()));
-  }
-
-  Future<InterfaceHandle<T>> connectToServiceByName<T>(
-      String serviceName) async {
-    final ChannelPair pair = ChannelPair();
-
-    await _proxy.open(
-        _openFlags, _openMode, serviceName, InterfaceRequest<Node>(pair.first));
-    return InterfaceHandle<T>(pair.second);
-  }
-
-  Future<void> close() async {
-    await _proxy.close();
-  }
-}
diff --git a/public/lib/app/dart/logging.dart b/public/lib/app/dart/logging.dart
deleted file mode 100644
index b5bdde1..0000000
--- a/public/lib/app/dart/logging.dart
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file
-
-// NOTE: Some of the non-fuchsia flutter projects import this file, so this file
-// should only contain pure dart/flutter files. Including any fuchsia-specific,
-// FIDL related files here will break some of the host-side flutter tests we
-// have. (See: https://fuchsia.atlassian.net/browse/SO-435)
-
-export 'package:logging/logging.dart' show Level;
-
-export 'src/frame_rate_tracer.dart';
-export 'src/logging.dart';
diff --git a/public/lib/app/dart/pubspec.yaml b/public/lib/app/dart/pubspec.yaml
deleted file mode 100644
index 3a809f4..0000000
--- a/public/lib/app/dart/pubspec.yaml
+++ /dev/null
@@ -1,3 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
diff --git a/public/lib/app/dart/src/frame_rate_tracer.dart b/public/lib/app/dart/src/frame_rate_tracer.dart
deleted file mode 100644
index 3217c9f..0000000
--- a/public/lib/app/dart/src/frame_rate_tracer.dart
+++ /dev/null
@@ -1,73 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-import 'package:fidl_fuchsia_cobalt/fidl.dart';
-import 'package:meta/meta.dart';
-
-import 'logging.dart';
-
-/// Traces the frame rate of an animation.
-@Deprecated('Use package:lib.widgets/utils.dart instead')
-class FrameRateTracer {
-  /// Name of the animation for tracing purposes.
-  final String name;
-
-  /// Optional cobalt logger.  If not null the frame rate will be logged as
-  /// an observation to cobalt.
-  final Logger cobaltLogger;
-
-  DateTime _animationStart = DateTime.now();
-  int _frames = 0;
-  String _currentTargetName;
-  int _currentCobaltMetricId;
-
-  /// Constructor.
-  FrameRateTracer({@required this.name, this.cobaltLogger});
-
-  /// Starts tracking an animation.
-  void start({String targetName, int cobaltMetricId}) {
-    _currentTargetName = targetName;
-    _currentCobaltMetricId = cobaltMetricId;
-    _animationStart = DateTime.now();
-    _frames = 0;
-  }
-
-  /// Must be called per tick of the animation.
-  void tick() {
-    _frames++;
-  }
-
-  /// Must be called when the animation is done.  This emits the trace.
-  void done() {
-    if (_frames == 0) {
-      return;
-    }
-    int microSeconds =
-        DateTime.now().difference(_animationStart).inMicroseconds;
-    double frameRate = _frames.toDouble() * 1000000.0 / microSeconds.toDouble();
-    String prefix = _currentTargetName?.isEmpty ?? true
-        ? '$name'
-        : '$name to $_currentTargetName';
-    trace(
-      '$prefix: ${frameRate.toStringAsPrecision(3)} fps '
-          '($_frames/${microSeconds / 1000000.0}s)',
-    );
-    if (cobaltLogger != null && _currentCobaltMetricId != null) {
-      cobaltLogger.logFrameRate(
-        _currentCobaltMetricId,
-        0,
-        '',
-        frameRate,
-        (Status status) {
-          if (status != Status.ok) {
-            log.warning(
-              'Failed to observe frame rate metric '
-                  '$_currentCobaltMetricId: $status. ',
-            );
-          }
-        },
-      );
-    }
-  }
-}
diff --git a/public/lib/app/dart/src/fuchsia_log_record.dart b/public/lib/app/dart/src/fuchsia_log_record.dart
deleted file mode 100644
index f53b787..0000000
--- a/public/lib/app/dart/src/fuchsia_log_record.dart
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-import 'package:logging/logging.dart' show Level;
-
-/// A log entry representation used to propagate information from
-/// FuchsiaLogger to individual handlers.
-class FuchsiaLogRecord {
-  /// Time specified in system time. On a system running zircon this is
-  /// defined by zx_get_time() as nanoseconds since boot. Otherwise it is
-  /// defined by DateTime.now().microsecondsSinceEpoch converted to nanoseconds.
-  final int systemTime;
-
-  /// One additional tag specified for this log record.
-  final String localTag;
-
-  /// Level of severity for this log message.
-  final Level level;
-
-  /// Message to display.
-  final String message;
-
-  /// Unique sequence number greater than all log records created before it.
-  final int sequenceNumber;
-
-  static int _nextNumber = 1;
-
-  /// Associated error (if any) when recording errors messages.
-  final Object error;
-
-  /// Associated stackTrace (if any) when recording errors messages.
-  final StackTrace stackTrace;
-
-  /// Constructor
-  FuchsiaLogRecord(this.level, this.message, this.systemTime,
-      {this.localTag, this.error, this.stackTrace})
-      : sequenceNumber = _nextNumber++;
-
-  @override
-  String toString() => '[${level.name}] $message';
-}
diff --git a/public/lib/app/dart/src/fuchsia_logger.dart b/public/lib/app/dart/src/fuchsia_logger.dart
deleted file mode 100644
index b519f9d..0000000
--- a/public/lib/app/dart/src/fuchsia_logger.dart
+++ /dev/null
@@ -1,195 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// The standard dart logger cannot be extended as the only way to create one is
-// via factory methods. Those factory methods cannot return an instance of this
-// class, which they know nothing about. To remedy that, this code provides a
-// parallel implementation of Logger with extensions required to accommodate
-// the extended functionality logger in fuchsia/zircon.
-//
-// This removes support for the hierarchical logger that is enabled in the dart
-// version.
-
-import 'dart:async';
-import 'dart:io';
-
-import 'package:logging/logging.dart';
-import 'package:zircon/zircon.dart';
-
-import 'fuchsia_log_record.dart';
-
-/// Handler callback to process log entries as they are added to a [Logger].
-typedef LoggerHandler = void Function(FuchsiaLogRecord logRecord);
-
-const int _zxClockMonotonic = 0;
-
-/// Use a [FuchsiaLogger] to log debug messages. This class adds fuchsia
-/// specific extenstions for logging: time specified in zircon time and local
-/// tags in log messages.
-class FuchsiaLogger {
-  /// Constructor
-  FuchsiaLogger(this.level) {
-    Logger.root.clearListeners();
-    Logger.root.onRecord.listen((LogRecord rec) {
-      log(rec.level, rec.message, /* local tag */ null, rec.error,
-          rec.stackTrace);
-    });
-  }
-
-  /// Logging [Level] used for entries generated on this logger.
-  Level level;
-
-  /// Controller used to notify when log entries are added to this logger.
-  StreamController<FuchsiaLogRecord> _controller;
-
-  /// Returns a stream of messages added to this [FuchsiaLogger].
-  ///
-  /// You can listen for messages using the standard stream APIs, for instance:
-  ///
-  /// ```dart
-  /// logger.onRecord.listen((record) { ... });
-  /// ```
-  Stream<FuchsiaLogRecord> get onRecord => _getStream();
-
-  /// Remove the Listener attached to this [FuchsiaLogger].
-  void clearListener() {
-    if (_controller != null) {
-      _controller.close();
-      _controller = null;
-    }
-  }
-
-  /// Log message at level [Level.FINEST].
-  // ignore: type_annotate_public_apis, always_specify_types
-  void finest(message, [Object error, StackTrace stackTrace]) =>
-      log(Level.FINEST, message, null, error, stackTrace);
-
-  /// Log message at level [Level.FINER].
-  // ignore: type_annotate_public_apis, always_specify_types
-  void finer(message, [Object error, StackTrace stackTrace]) =>
-      log(Level.FINER, message, null, error, stackTrace);
-
-  /// Log message at level [Level.FINE].
-  // ignore: type_annotate_public_apis, always_specify_types
-  void fine(message, [Object error, StackTrace stackTrace]) =>
-      log(Level.FINE, message, null, error, stackTrace);
-
-  /// Log message at level [Level.CONFIG].
-  // ignore: type_annotate_public_apis, always_specify_types
-  void config(message, [Object error, StackTrace stackTrace]) =>
-      log(Level.CONFIG, message, null, error, stackTrace);
-
-  /// Log message at level [Level.INFO].
-  // ignore: type_annotate_public_apis, always_specify_types
-  void info(message, [Object error, StackTrace stackTrace]) =>
-      log(Level.INFO, message, null, error, stackTrace);
-
-  /// Log message at level [Level.WARNING].
-  // ignore: type_annotate_public_apis, always_specify_types
-  void warning(message, [Object error, StackTrace stackTrace]) =>
-      log(Level.WARNING, message, null, error, stackTrace);
-
-  /// Log message at level [Level.SEVERE].
-  // ignore: type_annotate_public_apis, always_specify_types
-  void severe(message, [Object error, StackTrace stackTrace]) =>
-      log(Level.SEVERE, message, null, error, stackTrace);
-
-  /// Log message at level [Level.SHOUT].
-  // ignore: type_annotate_public_apis, always_specify_types
-  void shout(message, [Object error, StackTrace stackTrace]) =>
-      log(Level.SHOUT, message, null, error, stackTrace);
-
-  /// Log message at level [Level.FINEST].
-  // ignore: type_annotate_public_apis, always_specify_types
-  void finestT(message, {String tag, Object error, StackTrace stackTrace}) =>
-      log(Level.FINEST, message, tag, error, stackTrace);
-
-  /// Log message at level [Level.FINER].
-  // ignore: type_annotate_public_apis, always_specify_types
-  void finerT(message, {String tag, Object error, StackTrace stackTrace}) =>
-      log(Level.FINER, message, tag, error, stackTrace);
-
-  /// Log message at level [Level.FINE].
-  // ignore: type_annotate_public_apis, always_specify_types
-  void fineT(message, {String tag, Object error, StackTrace stackTrace}) =>
-      log(Level.FINE, message, tag, error, stackTrace);
-
-  /// Log message at level [Level.CONFIG].
-  // ignore: type_annotate_public_apis, always_specify_types
-  void configT(message, {String tag, Object error, StackTrace stackTrace}) =>
-      log(Level.CONFIG, message, tag, error, stackTrace);
-
-  /// Log message at level [Level.INFO].
-  // ignore: type_annotate_public_apis, always_specify_types
-  void infoT(message, {String tag, Object error, StackTrace stackTrace}) =>
-      log(Level.INFO, message, tag, error, stackTrace);
-
-  /// Log message at level [Level.WARNING].
-  // ignore: type_annotate_public_apis, always_specify_types
-  void warningT(message, {String tag, Object error, StackTrace stackTrace}) =>
-      log(Level.WARNING, message, tag, error, stackTrace);
-
-  /// Log message at level [Level.SEVERE].
-  // ignore: type_annotate_public_apis, always_specify_types
-  void severeT(message, {String tag, Object error, StackTrace stackTrace}) =>
-      log(Level.SEVERE, message, tag, error, stackTrace);
-
-  /// Log message at level [Level.SHOUT].
-  // ignore: type_annotate_public_apis, always_specify_types
-  void shoutT(message, {String tag, Object error, StackTrace stackTrace}) =>
-      log(Level.SHOUT, message, tag, error, stackTrace);
-
-  /// Whether a message for [value]'s level is loggable in this logger.
-  bool isLoggable(Level value) => value >= level;
-
-  /// Adds a log record for a [message] at a particular [logLevel] if
-  /// `isLoggable(logLevel)` is true.
-  ///
-  /// Use this method to create log entries for user-defined levels. To record a
-  /// message at a predefined level (e.g. [Level.INFO], [Level.WARNING], etc)
-  /// you can use their specialized methods instead (e.g. [info], [warning],
-  /// etc).
-  ///
-  /// If [message] is a [Function], it will be lazy evaluated. Additionally, if
-  /// [message] or its evaluated value is not a [String], then 'toString()' will
-  /// be called on the object and the result will be logged. The log record will
-  /// contain a field holding the original object.
-  ///
-  /// The log record will also contain a field for the zone in which this call
-  /// was made. This can be advantageous if a log listener wants to handler
-  /// records of different zones differently (e.g. group log records by HTTP
-  /// request if each HTTP request handler runs in it's own zone).
-  void log(Level logLevel, Object message, String localTag, Object error,
-      StackTrace stackTrace) {
-    if (!isLoggable(logLevel)) {
-      return;
-    }
-    int systemTime = Platform.isFuchsia
-        ? System.clockGet(_zxClockMonotonic)
-        : DateTime.now().microsecondsSinceEpoch * 1000;
-    String logMsg;
-    if (message is Function) {
-      logMsg = message();
-    } else if (message is String) {
-      logMsg = message;
-    } else {
-      Object object = message;
-      logMsg = object.toString();
-    }
-    _publish(FuchsiaLogRecord(logLevel, logMsg, systemTime,
-        localTag: localTag, error: error, stackTrace: stackTrace));
-  }
-
-  Stream<FuchsiaLogRecord> _getStream() {
-    _controller ??=
-        StreamController<FuchsiaLogRecord>.broadcast(sync: true);
-    return _controller.stream;
-  }
-
-  void _publish(FuchsiaLogRecord record) {
-    if (_controller != null) {
-      _controller.add(record);
-    }
-  }
-}
diff --git a/public/lib/app/dart/src/logging.dart b/public/lib/app/dart/src/logging.dart
deleted file mode 100644
index 5466f59..0000000
--- a/public/lib/app/dart/src/logging.dart
+++ /dev/null
@@ -1,435 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-import 'dart:async';
-import 'dart:convert';
-import 'dart:developer' show Timeline;
-import 'dart:io';
-import 'dart:isolate';
-import 'dart:math';
-import 'dart:typed_data';
-
-import 'package:fidl_fuchsia_logger/fidl.dart' show LogSinkProxy;
-import 'package:fidl_fuchsia_logger/fidl_async.dart' as logger_async
-    show LogSinkProxy;
-import 'package:lib.app.dart/app.dart' show connectToService, StartupContext;
-import 'package:lib.app.dart/app_async.dart' as app_async
-    show connectToService, StartupContext;
-import 'package:logging/logging.dart' show Level;
-import 'package:stack_trace/stack_trace.dart';
-import 'package:zircon/zircon.dart' as zircon;
-
-import 'fuchsia_log_record.dart';
-import 'fuchsia_logger.dart';
-
-const int _maxGlobalTags = 3;
-const int _maxCombinedTags = 5;
-const int _maxTagLength = 63;
-
-const int _socketBufferLength = 2032;
-
-final Map<Level, int> _enumToFuchsiaLevelMap = <Level, int>{
-  Level.FINEST: -4,
-  Level.FINER: -3,
-  Level.FINE: -2,
-  Level.CONFIG: -1,
-  Level.INFO: 0,
-  Level.WARNING: 1,
-  Level.SEVERE: 2,
-  Level.SHOUT: 3,
-};
-const int _unexpectedLoggingLevel = 100;
-
-/// Method to write a single log message to a single output medium.
-/// Solutions are provided to write to stdout and a fuchsia Socket.
-typedef LogWriter = void Function(LogWriterMessage message);
-
-/// Interim method that sets up the logger using the new-style bindings for service resolution.
-void setupLoggerAsync({
-  String name,
-  Level level,
-  bool forceShowCodeLocation,
-  bool logToStdoutForTest,
-  List<String> globalTags,
-  zircon.Socket logSocket,
-  LogWriter logWriter,
-}) {
-  FutureOr<zircon.Socket> sock;
-  if (logSocket == null) {
-    final socketPair = zircon.SocketPair(zircon.Socket.DATAGRAM);
-    final logSinkProxy = logger_async.LogSinkProxy();
-
-    final completer = Completer<zircon.Socket>();
-
-    app_async
-        .connectToService(
-          app_async.StartupContext.fromStartupInfo().environmentServices,
-          logSinkProxy.ctrl,
-        )
-        .then((_) => logSinkProxy.connect(socketPair.second))
-        .then((_) => completer.complete(socketPair.first))
-        .catchError(completer.completeError);
-
-    sock = completer.future;
-  } else {
-    sock = logSocket;
-  }
-
-  setupLogger(
-      name: name,
-      level: level,
-      forceShowCodeLocation: forceShowCodeLocation,
-      logToStdoutForTest: logToStdoutForTest,
-      globalTags: globalTags,
-      logSocket: sock,
-      logWriter: logWriter);
-}
-
-/// Sets up the default logger for the current Dart application.
-///
-/// Every Dart application should call this [setupLogger] function in their main
-/// before calling the actual log statements.
-///
-/// The provided [name] will be used for displaying the scope, and this name
-/// will default to the last segment (i.e. basename) of the application url.
-///
-/// If [level] is provided, only the log messages of which level is greater than
-/// equal to the provided [level] will be shown. If not provided, it defaults to
-/// [Level.INFO].
-///
-/// By default, the caller code location is automatically added in checked mode
-/// and not in production mode, because it is relatively expensive to calculate
-/// the code location. If [forceShowCodeLocation] is set to true, the location
-/// will be added in production mode as well.
-///
-/// If [globalTags] is provided, these tags will be added to each message logged
-/// via this logger.
-///
-/// [logToStdoutForTest] will redirect log output to stdout. This should only be
-/// used when debugging tests that run on device to mix the log output with
-/// the messages from the test infrastructure. It has no effect for on-host
-/// tests and should not be included in production code.
-///
-/// [logWriter] and [logSocket] are intended only for testing purposes.
-void setupLogger({
-  String name,
-  Level level,
-  bool forceShowCodeLocation,
-  bool logToStdoutForTest,
-  List<String> globalTags,
-  FutureOr<zircon.Socket> logSocket,
-  LogWriter logWriter,
-}) {
-  final String scopeName = name ??
-      Platform.script?.pathSegments?.lastWhere((_) => true, orElse: () => null);
-  final List<String> approvedTags = _verifyGlobalTags(globalTags);
-
-  log = FuchsiaLogger(level ?? Level.ALL);
-
-  // This code decides how to log messages. Here's the why:
-  // If not running on zircon, there is no sys_logger so must use stdout.
-  // The author can force stdout via flag to assist is debugging tests.
-  // logSocket and logWriter are used for internal logging tests.
-  LogWriter activeLogWriter;
-  if (logWriter != null) {
-    activeLogWriter = logWriter;
-  } else if (logToStdoutForTest != true &&
-      (Platform.isFuchsia || logSocket != null)) {
-    _logSocket = logSocket ?? _connectToLoggerSocket();
-    activeLogWriter = writeLogToSocket;
-  } else {
-    activeLogWriter = writeLogToStdout;
-  }
-  _loggerName = scopeName;
-
-  bool inCheckedMode = false;
-  assert(() {
-    inCheckedMode = true;
-    return true;
-  }());
-
-  log.onRecord.listen((FuchsiaLogRecord rec) {
-    String codeLocation;
-    if (forceShowCodeLocation ?? inCheckedMode) {
-      final Trace trace = Trace.current();
-      final Frame callerFrame = _findCallerFrame(trace);
-      if (callerFrame != null) {
-        if (callerFrame.uri.pathSegments.isNotEmpty) {
-          final String filename = callerFrame.uri.pathSegments.last;
-          final String line =
-              callerFrame.line != null ? '(${callerFrame.line})' : '';
-          codeLocation = '$filename$line';
-        }
-      }
-    }
-
-    activeLogWriter(LogWriterMessage(
-      logRecord: rec,
-      scopeName: scopeName,
-      codeLocation: codeLocation,
-      tags: approvedTags,
-    ));
-  });
-}
-
-/// Create a Socket and connect it to the FIDL logger
-zircon.Socket _connectToLoggerSocket() {
-  final socketPair = zircon.SocketPair(zircon.Socket.DATAGRAM);
-  final logSinkProxy = LogSinkProxy();
-  connectToService(
-    StartupContext.fromStartupInfo().environmentServices,
-    logSinkProxy.ctrl,
-  );
-  logSinkProxy.connect(socketPair.second);
-  return socketPair.first;
-}
-
-/// All information required to construct a log message to either stdout or
-/// Zircon logging Socket.
-class LogWriterMessage {
-  /// Log record created by fuchsiaLogger
-  final FuchsiaLogRecord logRecord;
-
-  /// Name from the logger, typically the module name
-  final String scopeName;
-
-  /// If specified, file name and line number where this log message originated
-  final String codeLocation;
-
-  /// Identifying tags to associate with this logging message
-  final List<String> tags;
-
-  /// Constructor
-  LogWriterMessage(
-      {this.logRecord, this.scopeName, this.codeLocation, this.tags});
-}
-
-/// The default logger to be used by dart applications. Each application should
-/// call [setupLogger()] in their main function to properly configure it.
-FuchsiaLogger log = FuchsiaLogger(Level.ALL)
-  ..onRecord.listen((FuchsiaLogRecord rec) {
-    print('WARNING: The logger is not initialized properly.');
-    print('WARNING: Please call setupLogger() from your main function.');
-    print('[${rec.level}] ${rec.message}');
-  });
-
-/// The name of the logger.
-String _loggerName = 'uninitialized';
-
-/// Socket used to write to the universal Zircon logger.
-FutureOr<zircon.Socket> _logSocket;
-
-// Enforce limits on number of global tags and length of each tag
-List<String> _verifyGlobalTags(List<String> globalTags) {
-  List<String> result = <String>[];
-  if (globalTags != null) {
-    if (globalTags.length > _maxGlobalTags) {
-      print('WARNING: Logger initialized with > $_maxGlobalTags tags.');
-      print('WARNING: Later tags will be ignored.');
-    }
-    for (int i = 0; i < _maxGlobalTags && i < globalTags.length; i++) {
-      String s = globalTags[i];
-      if (s.length > _maxTagLength) {
-        print('WARNING: Logger tags limited to $_maxTagLength characters.');
-        print('WARNING: Tag "$s" will be truncated.');
-        s = s.substring(0, _maxTagLength);
-      }
-      result.add(s);
-    }
-  }
-  return result;
-}
-
-/// LogWriter that outputs to stdout in a similar format the original fuchsia
-///  logger.
-void writeLogToStdout(LogWriterMessage message) {
-  final List<dynamic> scopes = <dynamic>[
-    _getLevelString(message.logRecord.level),
-  ];
-  if (message.scopeName != null) {
-    scopes.add(message.scopeName);
-  }
-  if (message.codeLocation != null) {
-    scopes.add(message.codeLocation);
-  }
-  message.tags.forEach(scopes.add);
-  String scopesString = scopes.join(':');
-  if (message.logRecord.error != null) {
-    print(
-        '[$scopesString] ${message.logRecord.message}: ${message.logRecord.error}');
-  } else {
-    print('[$scopesString] ${message.logRecord.message}');
-  }
-
-  if (message.logRecord.stackTrace != null) {
-    print('${message.logRecord.stackTrace}');
-  }
-}
-
-int _convertLogLevel(Level logLevel) =>
-    _enumToFuchsiaLevelMap[logLevel] ?? _unexpectedLoggingLevel;
-
-/// Format log message zircon socket connected to Log Viewer
-void writeLogToSocket(LogWriterMessage message) {
-  ByteData bytes = ByteData(_socketBufferLength)
-    ..setUint64(0, pid, Endian.little)
-    ..setUint64(8, Isolate.current.hashCode, Endian.little)
-    ..setUint64(16, message.logRecord.systemTime, Endian.little)
-    ..setInt32(24, _convertLogLevel(message.logRecord.level), Endian.little)
-    ..setUint32(28, 0, Endian.little); // TODO droppedLogs
-  int byteOffset = 32;
-
-  // Write global tags
-  int totalTagCount = 0;
-  if (message.scopeName != null) {
-    byteOffset = _setTag(bytes, byteOffset, message.scopeName);
-    totalTagCount++;
-  }
-  if (message.codeLocation != null) {
-    byteOffset = _setTag(bytes, byteOffset, message.codeLocation);
-    totalTagCount++;
-  }
-  for (String tag in message.tags) {
-    if (tag != null && totalTagCount < _maxCombinedTags) {
-      byteOffset = _setTag(bytes, byteOffset, tag);
-      totalTagCount++;
-    }
-  }
-  // Local tags are currently not supported by dart.
-  bytes.setUint8(byteOffset++, 0);
-
-  // Write message
-  byteOffset = _setString(bytes, byteOffset, message.logRecord.message,
-      _socketBufferLength - byteOffset - 1);
-  if (message.logRecord.error != null) {
-    byteOffset = _setString(
-        bytes, byteOffset, ': ', _socketBufferLength - byteOffset - 1);
-    byteOffset = _setString(
-        bytes,
-        byteOffset,
-        message.logRecord.error.toString(),
-        _socketBufferLength - byteOffset - 1);
-  }
-  if (message.logRecord.stackTrace != null) {
-    byteOffset = _setString(
-        bytes, byteOffset, '\n', _socketBufferLength - byteOffset - 1);
-    byteOffset = _setString(
-        bytes,
-        byteOffset,
-        message.logRecord.stackTrace.toString(),
-        _socketBufferLength - byteOffset - 1);
-  }
-  bytes.setUint8(byteOffset++, 0);
-  assert(byteOffset <= _socketBufferLength);
-
-  void writeBytes(zircon.Socket sock) {
-    sock.write(ByteData.view(bytes.buffer, 0, byteOffset));
-  }
-
-  if (_logSocket is Future) {
-    // need to wrap in a function to avoid casting errors
-    _writeToSocketFuture(_logSocket, writeBytes);
-  } else {
-    writeBytes(_logSocket);
-  }
-}
-
-void _writeToSocketFuture(Future<zircon.Socket> socketFuture,
-        void Function(zircon.Socket) writer) =>
-    socketFuture.then(writer);
-
-// Write a string to ByteData with a leading length byte. Return the byteOffstet
-// to use for the next value.
-int _setTag(ByteData bytes, int byteOffset, String tag) {
-  if (tag == null || tag == 'null') {
-    return byteOffset;
-  }
-  int nextOffset = _setString(bytes, byteOffset + 1, tag, _maxTagLength);
-  bytes.setUint8(byteOffset, nextOffset - byteOffset - 1);
-  return nextOffset;
-}
-
-// Wrie a non-terminated string to ByteData. Return the byteOffset to use for
-// the terminating byte or the next value.
-int _setString(ByteData bytes, int firstByteOffset, String value, int maxLen) {
-  if (value == null || value.isEmpty) {
-    return firstByteOffset;
-  }
-  List<int> charBytes = utf8.encode(value);
-  int len = min(charBytes.length, maxLen);
-  int byteOffset = firstByteOffset;
-  for (int i = 0; i < len; i++) {
-    bytes.setUint8(byteOffset++, charBytes[i]);
-  }
-  // If the string was truncated (and there is space), add an elipsis character.
-  if (len < charBytes.length && len >= 3) {
-    const int period = 46; // UTF8 value for '.'
-    for (int i = 1; i <= 3; i++) {
-      bytes.setUint8(byteOffset - i, period);
-    }
-  }
-  return byteOffset;
-}
-
-/// A convenient function for displaying the stack trace of the caller in the
-/// console.
-void showStackTrace() {
-  print(Trace.current(1).toString());
-}
-
-/// Emits an instant trace with [name] prefixed with [log]'s name
-void trace(String name) {
-  Timeline.instantSync('$_loggerName $name');
-}
-
-/// From the given [Trace], finds the last [Frame] from this package
-/// (lib.app.dart) and then the next [Frame] not in this package. That frame
-/// represents whomever called the log function and is returned.
-/// If no such [Frame] is found, returns `null`.
-///
-/// SEE: https://github.com/dart-lang/logging/issues/32
-Frame _findCallerFrame(Trace trace) {
-  bool foundLogging = false;
-  Frame matchedFrame;
-
-  for (int i = 0; i < trace.frames.length; ++i) {
-    final Frame frame = trace.frames[i];
-    final bool loggingPackage = frame.package == 'lib.app.dart';
-    if (foundLogging && !loggingPackage) {
-      matchedFrame = frame;
-    }
-    foundLogging = loggingPackage;
-  }
-
-  return matchedFrame;
-}
-
-/// Remaps the level string to the ones used in FTL.
-String _getLevelString(Level level) {
-  if (level == null) {
-    return null;
-  }
-
-  if (level == Level.FINE) {
-    return 'VLOG(1)';
-  }
-
-  if (level == Level.FINER) {
-    return 'VLOG(2)';
-  }
-
-  if (level == Level.FINEST) {
-    return 'VLOG(3)';
-  }
-
-  if (level == Level.SEVERE) {
-    return 'ERROR';
-  }
-
-  if (level == Level.SHOUT) {
-    return 'FATAL';
-  }
-
-  return level.toString();
-}
diff --git a/public/lib/app/dart/src/outgoing.dart b/public/lib/app/dart/src/outgoing.dart
deleted file mode 100644
index c643fcb..0000000
--- a/public/lib/app/dart/src/outgoing.dart
+++ /dev/null
@@ -1,91 +0,0 @@
-// Copyright 2019 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file
-
-import 'package:fuchsia_vfs/vfs.dart' as vfs;
-import 'package:fidl/fidl.dart';
-import 'package:fidl_fuchsia_io/fidl_async.dart';
-
-/// Helper class to publish outgoing services and other directories for debug
-/// and control purposes
-class Outgoing {
-  final vfs.PseudoDir _root = vfs.PseudoDir();
-  final vfs.PseudoDir _public = vfs.PseudoDir();
-  final vfs.PseudoDir _debug = vfs.PseudoDir();
-  final vfs.PseudoDir _ctrl = vfs.PseudoDir();
-  bool _isClosed = false;
-
-  /// This will setup outgoing directory and add required
-  /// directories to root of this class.
-  ///
-  /// This class will throw an Exception if its methods are called
-  /// after it is closed. Calling close twice doesn't cause exception.
-  Outgoing() {
-    _root
-      ..addNode('public', _public)
-      ..addNode('debug', _debug)
-      ..addNode('ctrl', _ctrl);
-  }
-
-  void _ensureNotClosed() {
-    if (_isClosed) {
-      throw Exception('Outgoing closed');
-    }
-  }
-
-  /// deprecated method, until we change all reference to use [addPublicService].
-  void addServiceForName<T>(vfs.Connector<T> connector, String serviceName) {
-    addPublicService(connector, serviceName);
-  }
-
-  /// Serves root dir to request channel and serve [fuchsia.io.Directory]
-  ///  over it.
-  void serve(InterfaceRequest<Node> request) {
-    _ensureNotClosed();
-    _root.serve(request);
-  }
-
-  /// Closes root directory
-  void close() {
-    if (_isClosed) {
-      return;
-    }
-    _root.close();
-    _isClosed = true;
-  }
-
-  /// return root directory which can be used to host other directories
-  /// and extend this class.
-  vfs.PseudoDir rootDir() {
-    _ensureNotClosed();
-    return _root;
-  }
-
-  /// return debug directory which can be used to publish debug info to /hub
-  vfs.PseudoDir debugDir() {
-    _ensureNotClosed();
-    return _debug;
-  }
-
-  /// return public directory which usually contains all published services.
-  vfs.PseudoDir publicDir() {
-    _ensureNotClosed();
-    return _public;
-  }
-
-  /// return ctrl directory which can be used to publish control information
-  /// for /hub and system.
-  vfs.PseudoDir ctrlDir() {
-    _ensureNotClosed();
-    return _ctrl;
-  }
-
-  /// Add and publish a public service.
-  /// Will return ZX_OK if successful, else will return error status.
-  int addPublicService<T>(vfs.Connector<T> connector, String serviceName) {
-    _ensureNotClosed();
-    var service = vfs.Service.withConnector(connector);
-    int status = _public.addNode(serviceName, service);
-    return status;
-  }
-}
diff --git a/public/lib/app/dart/test/fuchsia_log_record_test.dart b/public/lib/app/dart/test/fuchsia_log_record_test.dart
deleted file mode 100644
index 854f27b..0000000
--- a/public/lib/app/dart/test/fuchsia_log_record_test.dart
+++ /dev/null
@@ -1,87 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-import 'dart:io';
-
-import 'package:test/test.dart';
-import 'package:zircon/zircon.dart';
-
-import 'package:lib.app.dart/logging.dart';
-import 'package:lib.app.dart/src/fuchsia_log_record.dart';
-
-const int _lookBackTimeGap = 15 * 1000 * 1000 * 1000; // 15 sec in nanoseconds
-
-const int _zxClockMonotonic = 0;
-
-class LoggerStub {
-  final List<LogWriterMessage> logMessages = <LogWriterMessage>[];
-
-  void writeLogMessage(LogWriterMessage message) {
-    logMessages.add(message);
-  }
-}
-
-void main() {
-  test('simple message', _testSimpleMessage);
-  test('message with exception', _testMessageWithException);
-}
-
-void _testSimpleMessage() {
-  LoggerStub logger = LoggerStub();
-  setupLogger(
-    logWriter: logger.writeLogMessage,
-  );
-  expect(logger.logMessages.isEmpty, true);
-
-  log.infoT('hello', tag: 'tag');
-  expect(logger.logMessages.length, equals(1));
-  FuchsiaLogRecord underTest = logger.logMessages[0].logRecord;
-
-  int now = Platform.isFuchsia
-      ? System.clockGet(_zxClockMonotonic)
-      : DateTime.now().microsecondsSinceEpoch * 1000;
-
-  expect(underTest.systemTime, lessThanOrEqualTo(now));
-  expect(underTest.systemTime, greaterThanOrEqualTo(now - _lookBackTimeGap));
-
-  expect(underTest.localTag, equals('tag'));
-  expect(underTest.level, equals(Level.INFO));
-  expect(underTest.message, equals('hello'));
-  expect(underTest.sequenceNumber, equals(1));
-  expect(underTest.error, equals(null));
-  expect(underTest.stackTrace, equals(null));
-
-  log.info('world');
-  expect(logger.logMessages.length, equals(2));
-  underTest = logger.logMessages[1].logRecord;
-  expect(underTest.sequenceNumber, equals(2));
-}
-
-void _testMessageWithException() {
-  LoggerStub logger = LoggerStub();
-  setupLogger(
-    logWriter: logger.writeLogMessage,
-  );
-  expect(logger.logMessages.isEmpty, true);
-
-  Exception exception = Exception('cause');
-  log.infoT('hello',
-      tag: 'tag', error: exception, stackTrace: StackTrace.current);
-  expect(logger.logMessages.length, equals(1));
-  FuchsiaLogRecord underTest = logger.logMessages[0].logRecord;
-
-  int now = Platform.isFuchsia
-      ? System.clockGet(_zxClockMonotonic)
-      : DateTime.now().microsecondsSinceEpoch * 1000;
-
-  expect(underTest.systemTime, lessThanOrEqualTo(now));
-  expect(underTest.systemTime, greaterThanOrEqualTo(now - _lookBackTimeGap));
-
-  expect(underTest.localTag, equals('tag'));
-  expect(underTest.level, equals(Level.INFO));
-  expect(underTest.message, equals('hello'));
-  expect(underTest.error, equals(exception));
-  expect(
-      underTest.stackTrace.toString(), contains('_testMessageWithException'));
-}
diff --git a/public/lib/app/dart/test/legacy_code.dart b/public/lib/app/dart/test/legacy_code.dart
deleted file mode 100644
index 44cfaac..0000000
--- a/public/lib/app/dart/test/legacy_code.dart
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-import 'package:logging/logging.dart';
-
-/// This method makes one log call using the legacy dart logger implementation.
-/// This is used as part of a test to ensure that the new zircon base logger
-/// will also log calls from legacy libraries and pass those to the zircon
-/// logger.
-void makeOneLegacyLogCall() {
-  Logger.root.info('hello');
-}
diff --git a/public/lib/app/dart/test/legacy_logger_test.dart b/public/lib/app/dart/test/legacy_logger_test.dart
deleted file mode 100644
index aded451..0000000
--- a/public/lib/app/dart/test/legacy_logger_test.dart
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-import 'dart:convert';
-import 'dart:typed_data';
-
-import 'package:lib.app.dart/logging.dart';
-import 'package:mockito/mockito.dart';
-import 'package:test/test.dart';
-import 'package:zircon/zircon.dart';
-
-import 'legacy_code.dart';
-import 'socket_validate.dart';
-
-class MockSocket extends Mock implements Socket {}
-
-void main() {
-  test('_testLegacyLogger', _testLegacyLogger);
-}
-
-void _testLegacyLogger() {
-  MockSocket mockSocket = MockSocket();
-  setupLogger(
-    name: 'TEST',
-    forceShowCodeLocation: false,
-    logSocket: mockSocket,
-  );
-
-  makeOneLegacyLogCall();
-
-  ByteData byteData = verify(mockSocket.write(captureAny)).captured.single;
-  List<int> logged = byteData.buffer.asInt8List(0, byteData.lengthInBytes);
-  validateFixedBlock(logged, 0);
-  expect(logged[32], equals(4));
-  expect(utf8.decode(logged.sublist(33, 37)), equals('TEST'));
-  expect(utf8.decode(logged.sublist(38, 43)), equals('hello'));
-  expect(logged[43], equals(0));
-  // Length should be 33 + 5 (TEST) + 6 (foo)
-  expect(logged.length, equals(44));
-
-  mockSocket.close();
-}
diff --git a/public/lib/app/dart/test/log_writer_test.dart b/public/lib/app/dart/test/log_writer_test.dart
deleted file mode 100644
index 5237c7d..0000000
--- a/public/lib/app/dart/test/log_writer_test.dart
+++ /dev/null
@@ -1,231 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-import 'dart:async';
-
-import 'package:lib.app.dart/logging.dart';
-import 'package:test/test.dart';
-
-List<String> _tagNames = <String>[
-  'TAG1',
-  'TAG2',
-  'TAG3', // Only 3 global tags are allowed
-  'TAG4',
-];
-
-List<String> _tooLongTagName = <String>[
-  'THIS NAME IS TOO LONG, IT ONLY ALLOWED TO BE 63 CHARACTERS AND NOT 70.',
-  // 34567890123456789012345678901234567890123456789012345678901234567890
-];
-
-class LoggerStub {
-  final List<LogWriterMessage> logMessages = <LogWriterMessage>[];
-
-  void writeLogMessage(LogWriterMessage message) {
-    logMessages.add(message);
-  }
-}
-
-void main() {
-  test('simple message', _testSimpleMessage);
-  test('constructor options 1', _constructorOptions1);
-  test('constructor options 2', _constructorOptions2);
-  test('_testTooManyTags', _testTooManyTags);
-  test('_tagTooLong', _testTagTooLong);
-  test('_testInfoLevels', _testInfoLevels);
-  test('_testDefaultLevels', _testDefaultLevels);
-}
-
-void _testSimpleMessage() {
-  LoggerStub logger = LoggerStub();
-  setupLogger(
-    logWriter: logger.writeLogMessage,
-  );
-  expect(logger.logMessages.isEmpty, true);
-
-  log.info('hello');
-  expect(logger.logMessages.length, equals(1));
-  expect(logger.logMessages[0].scopeName, equals('main.dart'));
-  expect(logger.logMessages[0].tags.isEmpty, equals(true));
-  expect(logger.logMessages[0].logRecord.message, equals('hello'));
-  expect(logger.logMessages[0].logRecord.level, equals(Level.INFO));
-  expect(logger.logMessages[0].logRecord.error, equals(null));
-  expect(logger.logMessages[0].logRecord.stackTrace, equals(null));
-}
-
-void _constructorOptions1() {
-  LoggerStub logger = LoggerStub();
-  setupLogger(
-    logWriter: logger.writeLogMessage,
-    name: 'LOGGER_NAME',
-    level: Level.ALL,
-    forceShowCodeLocation: true,
-    globalTags: _tagNames.sublist(1, 3),
-  );
-  expect(logger.logMessages.isEmpty, true);
-
-  log.finest('world');
-  expect(logger.logMessages.length, equals(1));
-  expect(logger.logMessages[0].scopeName, equals('LOGGER_NAME'));
-  expect(
-      logger.logMessages[0].codeLocation, startsWith('log_writer_test.dart'));
-  expect(logger.logMessages[0].tags.length, equals(2));
-  expect(logger.logMessages[0].tags[0], equals(_tagNames[1]));
-  expect(logger.logMessages[0].tags[1], equals(_tagNames[2]));
-  expect(logger.logMessages[0].logRecord.message, equals('world'));
-  expect(logger.logMessages[0].logRecord.level, equals(Level.FINEST));
-  expect(logger.logMessages[0].logRecord.error, equals(null));
-  expect(logger.logMessages[0].logRecord.stackTrace, equals(null));
-}
-
-void _constructorOptions2() {
-  LoggerStub logger = LoggerStub();
-  setupLogger(
-    logWriter: logger.writeLogMessage,
-    level: Level.WARNING,
-    forceShowCodeLocation: false,
-    globalTags: _tagNames.sublist(0, 3),
-  );
-  expect(logger.logMessages.isEmpty, true);
-
-  log.warning('cruel');
-  expect(logger.logMessages.length, equals(1));
-  expect(logger.logMessages[0].codeLocation, equals(null));
-  expect(logger.logMessages[0].tags.length, equals(3));
-  expect(logger.logMessages[0].tags[0], equals(_tagNames[0]));
-  expect(logger.logMessages[0].tags[1], equals(_tagNames[1]));
-  expect(logger.logMessages[0].tags[2], equals(_tagNames[2]));
-  expect(logger.logMessages[0].logRecord.message, equals('cruel'));
-  expect(logger.logMessages[0].logRecord.level, equals(Level.WARNING));
-
-  log.info('info should be blocked because we are at warning level');
-  expect(logger.logMessages.length, equals(1));
-
-  log.severe('but sending the higher level severe should get logged');
-  expect(logger.logMessages.length, equals(2));
-}
-
-void _testTooManyTags() {
-  final List<String> stdoutLines = <String>[];
-  runZoned<void>(
-    () {
-      LoggerStub logger = LoggerStub();
-      setupLogger(
-        logWriter: logger.writeLogMessage,
-        level: Level.WARNING,
-        forceShowCodeLocation: false,
-        globalTags: _tagNames,
-      );
-      expect(logger.logMessages.isEmpty, true);
-
-      log.warning('cruel');
-      expect(logger.logMessages.length, equals(1));
-      expect(logger.logMessages[0].codeLocation, equals(null));
-      expect(logger.logMessages[0].tags.length, equals(3));
-      expect(logger.logMessages[0].tags[0], equals(_tagNames[0]));
-      expect(logger.logMessages[0].tags[1], equals(_tagNames[1]));
-      expect(logger.logMessages[0].tags[2], equals(_tagNames[2]));
-      expect(logger.logMessages[0].logRecord.message, equals('cruel'));
-      expect(logger.logMessages[0].logRecord.level, equals(Level.WARNING));
-
-      expect(stdoutLines.length, equals(2));
-      expect(
-          stdoutLines[0], equals('WARNING: Logger initialized with > 3 tags.'));
-      expect(stdoutLines[1], equals('WARNING: Later tags will be ignored.'));
-    },
-    zoneSpecification: ZoneSpecification(
-      print: (Zone self, ZoneDelegate parent, Zone zone, String line) {
-        stdoutLines.add(line);
-      },
-    ),
-  );
-}
-
-void _testTagTooLong() {
-  final List<String> stdoutLines = <String>[];
-  runZoned<void>(
-    () {
-      LoggerStub logger = LoggerStub();
-      setupLogger(
-        logWriter: logger.writeLogMessage,
-        level: Level.WARNING,
-        forceShowCodeLocation: false,
-        globalTags: _tooLongTagName,
-      );
-      expect(logger.logMessages.isEmpty, true);
-
-      log.warning('cruel');
-      expect(logger.logMessages.length, equals(1));
-      expect(logger.logMessages[0].codeLocation, equals(null));
-      expect(logger.logMessages[0].tags.length, equals(1));
-      expect(logger.logMessages[0].tags[0],
-          equals(_tooLongTagName[0].substring(0, 63)));
-      expect(logger.logMessages[0].logRecord.message, equals('cruel'));
-      expect(logger.logMessages[0].logRecord.level, equals(Level.WARNING));
-
-      expect(stdoutLines.length, equals(2));
-      expect(stdoutLines[0],
-          equals('WARNING: Logger tags limited to 63 characters.'));
-      expect(stdoutLines[1], startsWith('WARNING: Tag "'));
-    },
-    zoneSpecification: ZoneSpecification(
-      print: (Zone self, ZoneDelegate parent, Zone zone, String line) {
-        stdoutLines.add(line);
-      },
-    ),
-  );
-}
-
-void _testInfoLevels() {
-  LoggerStub logger = LoggerStub();
-  setupLogger(
-    logWriter: logger.writeLogMessage,
-    level: Level.INFO,
-  );
-  expect(logger.logMessages.isEmpty, true);
-
-  log
-    ..shout('shout')
-    ..severe('severe')
-    ..warning('warning')
-    ..info('info')
-    ..config('config')
-    ..fine('fine')
-    ..finer('finer')
-    ..finest('finest');
-
-  expect(logger.logMessages.length, equals(4));
-  expect(logger.logMessages[0].logRecord.message, equals('shout'));
-  expect(logger.logMessages[1].logRecord.message, equals('severe'));
-  expect(logger.logMessages[2].logRecord.message, equals('warning'));
-  expect(logger.logMessages[3].logRecord.message, equals('info'));
-}
-
-void _testDefaultLevels() {
-  LoggerStub logger = LoggerStub();
-  setupLogger(
-    logWriter: logger.writeLogMessage,
-  );
-  expect(logger.logMessages.isEmpty, true);
-
-  log
-    ..shout('shout')
-    ..severe('severe')
-    ..warning('warning')
-    ..info('info')
-    ..config('config')
-    ..fine('fine')
-    ..finer('finer')
-    ..finest('finest');
-
-  expect(logger.logMessages.length, equals(8));
-  expect(logger.logMessages[0].logRecord.message, equals('shout'));
-  expect(logger.logMessages[1].logRecord.message, equals('severe'));
-  expect(logger.logMessages[2].logRecord.message, equals('warning'));
-  expect(logger.logMessages[3].logRecord.message, equals('info'));
-  expect(logger.logMessages[4].logRecord.message, equals('config'));
-  expect(logger.logMessages[5].logRecord.message, equals('fine'));
-  expect(logger.logMessages[6].logRecord.message, equals('finer'));
-  expect(logger.logMessages[7].logRecord.message, equals('finest'));
-}
diff --git a/public/lib/app/dart/test/socket_redirect_to_stdout_test.dart b/public/lib/app/dart/test/socket_redirect_to_stdout_test.dart
deleted file mode 100644
index 9c56b69..0000000
--- a/public/lib/app/dart/test/socket_redirect_to_stdout_test.dart
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// This test should run on device to enable sys_logger
-
-import 'dart:async';
-
-import 'package:lib.app.dart/logging.dart';
-import 'package:test/test.dart';
-
-void main() {
-  test('_testlogToStdout', _testlogToStdout);
-}
-
-void _testlogToStdout() {
-  final List<String> logOutput = <String>[];
-  runZoned<void>(
-    () {
-      setupLogger(
-        name: 'TEST',
-        forceShowCodeLocation: false,
-        logToStdoutForTest: true,
-      );
-      log.info('foo');
-
-      expect(logOutput.length, equals(1));
-      expect(logOutput[0], equals('[INFO:TEST] foo'));
-    },
-    zoneSpecification: ZoneSpecification(
-      print: (Zone self, ZoneDelegate parent, Zone zone, String line) {
-        logOutput.add(line);
-      },
-    ),
-  );
-}
diff --git a/public/lib/app/dart/test/socket_test.dart b/public/lib/app/dart/test/socket_test.dart
deleted file mode 100644
index e44b1a6..0000000
--- a/public/lib/app/dart/test/socket_test.dart
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-import 'dart:convert';
-import 'dart:typed_data';
-
-import 'package:lib.app.dart/logging.dart';
-import 'package:mockito/mockito.dart';
-import 'package:test/test.dart';
-import 'package:zircon/zircon.dart';
-
-import 'socket_validate.dart';
-
-class MockSocket extends Mock implements Socket {}
-
-void main() {
-  test('_testlogToSocket', _testlogToSocket);
-}
-
-void _testlogToSocket() {
-  MockSocket mockSocket = MockSocket();
-  setupLogger(
-    name: 'TEST',
-    forceShowCodeLocation: false,
-    logSocket: mockSocket,
-  );
-  log.info('foo');
-
-  ByteData byteData = verify(mockSocket.write(captureAny)).captured.single;
-  List<int> logged = byteData.buffer.asInt8List(0, byteData.lengthInBytes);
-  validateFixedBlock(logged, 0);
-  expect(logged[32], equals(4));
-  expect(utf8.decode(logged.sublist(33, 37)), equals('TEST'));
-  expect(utf8.decode(logged.sublist(38, 41)), equals('foo'));
-  expect(logged[41], equals(0));
-  // Length should be 33 + 5 (TEST) + 4 (foo)
-  expect(logged.length, equals(42));
-
-  mockSocket.close();
-}
diff --git a/public/lib/app/dart/test/socket_validate.dart b/public/lib/app/dart/test/socket_validate.dart
deleted file mode 100644
index 42016cf..0000000
--- a/public/lib/app/dart/test/socket_validate.dart
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-import 'dart:io';
-import 'dart:isolate';
-import 'dart:typed_data';
-
-import 'package:test/test.dart';
-import 'package:zircon/zircon.dart';
-
-const int _lookBackTimeGap = 15 * 1000 * 1000 * 1000; // 15 sec in nanoseconds
-
-const int _zxClockMonotonic = 0;
-
-/// Convert from little endian format bytes to an unsiged 32 bit int.
-int bytesToInt32(List<int> bytes) {
-  ByteData byteData = ByteData(4);
-  for (int i = 0; i < 4; i++) {
-    byteData.setInt8(i, bytes[i]);
-  }
-  return byteData.getInt32(0, Endian.little);
-}
-
-/// Convert from little endian format bytes to an unsiged 64 bit int.
-int bytesToUint64(List<int> bytes) {
-  ByteData byteData = ByteData(8);
-  for (int i = 0; i < 8; i++) {
-    byteData.setInt8(i, bytes[i]);
-  }
-  return byteData.getUint64(0, Endian.little);
-}
-
-/// Validate the primary contents of the fixed location portion of a log
-/// record on the logging Socket.
-void validateFixedBlock(List<int> data, int level) {
-  // Process ID
-  expect(bytesToUint64(data), equals(pid));
-  // Thread ID
-  expect(bytesToUint64(data.sublist(8, 16)), equals(Isolate.current.hashCode));
-
-  // Log time should be within the last 30 seconds
-  int nowNanos = Platform.isFuchsia
-      ? System.clockGet(_zxClockMonotonic)
-      : DateTime.now().microsecondsSinceEpoch * 1000;
-  int logNanos = bytesToUint64(data.sublist(16, 24));
-  expect(logNanos, lessThanOrEqualTo(nowNanos));
-  expect(logNanos + _lookBackTimeGap, greaterThan(nowNanos));
-
-  expect(bytesToInt32(data.sublist(24, 28)), equals(level));
-}
diff --git a/public/lib/app/dart/test/socket_with_exception_test.dart b/public/lib/app/dart/test/socket_with_exception_test.dart
deleted file mode 100644
index f71fb3c..0000000
--- a/public/lib/app/dart/test/socket_with_exception_test.dart
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-import 'dart:convert';
-import 'dart:typed_data';
-
-import 'package:lib.app.dart/logging.dart';
-import 'package:mockito/mockito.dart';
-import 'package:test/test.dart';
-import 'package:zircon/zircon.dart';
-
-import 'socket_validate.dart';
-
-class MockSocket extends Mock implements Socket {}
-
-void main() {
-  test('_testLogToSocketWithException', _testLogToSocketWithException);
-}
-
-void _testLogToSocketWithException() {
-  MockSocket mockSocket = MockSocket();
-  setupLogger(
-    name: 'TEST',
-    forceShowCodeLocation: false,
-    logSocket: mockSocket,
-  );
-  log.shout('error', Exception('cause'));
-
-  ByteData byteData = verify(mockSocket.write(captureAny)).captured.single;
-  List<int> logged = byteData.buffer.asInt8List(0, byteData.lengthInBytes);
-  validateFixedBlock(logged, 3);
-
-  expect(logged[32], equals(4));
-  expect(utf8.decode(logged.sublist(33, 37)), equals('TEST'));
-  int end = 37;
-
-  // dividing 0 byte
-  expect(logged[end++], equals(0));
-
-  int start = end;
-  expect(
-      utf8.decode(logged.sublist(start)), matches('error: Exception: cause'));
-  end = start + 23;
-  expect(logged[end++], equals(0));
-  expect(logged.length, equals(end));
-
-  mockSocket.close();
-}
diff --git a/public/lib/app/dart/test/socket_with_location_test.dart b/public/lib/app/dart/test/socket_with_location_test.dart
deleted file mode 100644
index 8800af8..0000000
--- a/public/lib/app/dart/test/socket_with_location_test.dart
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-import 'dart:convert';
-import 'dart:typed_data';
-
-import 'package:lib.app.dart/logging.dart';
-import 'package:mockito/mockito.dart';
-import 'package:test/test.dart';
-import 'package:zircon/zircon.dart';
-
-import 'socket_validate.dart';
-
-const String _fileName = 'socket_with_location_test.dart';
-
-class MockSocket extends Mock implements Socket {}
-
-void main() {
-  test('_testLogToSocketWithLocation', _testLogToSocketWithLocation);
-}
-
-void _testLogToSocketWithLocation() {
-  MockSocket mockSocket = MockSocket();
-  setupLogger(
-    name: 'TEST',
-    level: Level.ALL,
-    forceShowCodeLocation: true,
-    logSocket: mockSocket,
-  );
-  log.finest('bar');
-
-  ByteData byteData = verify(mockSocket.write(captureAny)).captured.single;
-  List<int> logged = byteData.buffer.asInt8List(0, byteData.lengthInBytes);
-  validateFixedBlock(logged, -4);
-
-  expect(logged[32], equals(4));
-  expect(utf8.decode(logged.sublist(33, 37)), equals('TEST'));
-  int start = 37;
-  expect(logged[start], greaterThan(_fileName.length));
-  int end = start + logged[start] + 1;
-  start++;
-  expect(
-      utf8.decode(logged.sublist(start, end)), matches('$_fileName\\(\\d+\\)'));
-
-  // dividing 0 byte
-  expect(logged[end++], equals(0));
-
-  start = end;
-  expect(utf8.decode(logged.sublist(start, start + 3)), equals('bar'));
-  end = start + 3;
-  expect(logged[end++], equals(0));
-  expect(logged.length, equals(end));
-
-  mockSocket.close();
-}
diff --git a/public/lib/app/dart/test/socket_with_stacktrace_test.dart b/public/lib/app/dart/test/socket_with_stacktrace_test.dart
deleted file mode 100644
index 9f9f826..0000000
--- a/public/lib/app/dart/test/socket_with_stacktrace_test.dart
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-import 'dart:convert';
-import 'dart:typed_data';
-
-import 'package:lib.app.dart/logging.dart';
-import 'package:mockito/mockito.dart';
-import 'package:test/test.dart';
-import 'package:zircon/zircon.dart';
-
-import 'socket_validate.dart';
-
-class MockSocket extends Mock implements Socket {}
-
-void main() {
-  test('_testLogToSocketWithStacktrace', _testLogToSocketWithStacktrace);
-}
-
-const int _socketBufferLength = 2032;
-const String _errorMsg = 'this error message plus the stacktrace need to be '
-    'long enough to hit the max block size to validate that truncation of long '
-    'messages works properly';
-
-void _testLogToSocketWithStacktrace() {
-  MockSocket mockSocket = MockSocket();
-  setupLogger(
-    name: 'TEST',
-    forceShowCodeLocation: false,
-    logSocket: mockSocket,
-  );
-  log.severe(_errorMsg, Exception('because'), StackTrace.current);
-
-  ByteData byteData = verify(mockSocket.write(captureAny)).captured.single;
-  List<int> logged = byteData.buffer.asInt8List(0, byteData.lengthInBytes);
-  validateFixedBlock(logged, 2);
-
-  expect(logged[32], equals(4));
-  expect(utf8.decode(logged.sublist(33, 37)), equals('TEST'));
-  int end = 37;
-
-  // dividing 0 byte
-  expect(logged[end++], equals(0));
-
-  String msg = utf8.decode(logged.sublist(end));
-  expect(msg, startsWith('$_errorMsg: Exception: because\n'));
-  expect(msg, matches(r'.*_testLogToSocketWithStacktrace'));
-  expect(logged.length, equals(_socketBufferLength));
-  expect(
-      utf8.decode(
-          logged.sublist(_socketBufferLength - 4, _socketBufferLength - 1)),
-      equals('...'));
-
-  mockSocket.close();
-}
diff --git a/public/lib/app/dart/test/socket_with_tags_test.dart b/public/lib/app/dart/test/socket_with_tags_test.dart
deleted file mode 100644
index 7adab2a..0000000
--- a/public/lib/app/dart/test/socket_with_tags_test.dart
+++ /dev/null
@@ -1,76 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-import 'dart:convert';
-import 'dart:typed_data';
-
-import 'package:lib.app.dart/logging.dart';
-import 'package:mockito/mockito.dart';
-import 'package:test/test.dart';
-import 'package:zircon/zircon.dart';
-
-import 'socket_validate.dart';
-
-List<String> _tagNames = <String>[
-  'TAG1',
-  'TAG2',
-];
-
-const String _fileName = 'socket_with_tags_test.dart';
-
-class MockSocket extends Mock implements Socket {}
-
-void main() {
-  test('_testlogToSocketWithTags', _testlogToSocketWithTags);
-}
-
-void _testlogToSocketWithTags() {
-  MockSocket mockSocket = MockSocket();
-  setupLogger(
-    name: 'TEST',
-    level: Level.ALL,
-    forceShowCodeLocation: true,
-    globalTags: _tagNames.sublist(0, 2),
-    logSocket: mockSocket,
-  );
-  log.fine('bar');
-
-  ByteData byteData = verify(mockSocket.write(captureAny)).captured.single;
-  List<int> logged = byteData.buffer.asInt8List(0, byteData.lengthInBytes);
-  validateFixedBlock(logged, -2);
-
-  expect(logged[32], equals(4));
-  expect(utf8.decode(logged.sublist(33, 37)), equals('TEST'));
-  int start = 37;
-  expect(logged[start], greaterThan(_fileName.length));
-  int end = start + logged[start] + 1;
-  start++;
-  expect(
-      utf8.decode(logged.sublist(start, end)), matches('$_fileName\\(\\d+\\)'));
-
-  // verify the first tag
-  start = end;
-  expect(logged[start], equals(_tagNames[0].length));
-  end = start + logged[start] + 1;
-  start++;
-  expect(utf8.decode(logged.sublist(start, end)), equals(_tagNames[0]));
-
-  // verify the second tag
-  start = end;
-  expect(logged[start], equals(_tagNames[1].length));
-  end = start + logged[start] + 1;
-  start++;
-  expect(utf8.decode(logged.sublist(start, end)), equals(_tagNames[1]));
-
-  // dividing 0 byte
-  expect(logged[end++], equals(0));
-
-  start = end;
-  expect(utf8.decode(logged.sublist(start, start + 3)), equals('bar'));
-  end = start + 3;
-  expect(logged[end++], equals(0));
-  expect(logged.length, equals(end));
-
-  mockSocket.close();
-}
diff --git a/public/lib/app/dart/test/stdout_test.dart b/public/lib/app/dart/test/stdout_test.dart
deleted file mode 100644
index b8d1599..0000000
--- a/public/lib/app/dart/test/stdout_test.dart
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-import 'dart:async';
-
-import 'package:lib.app.dart/logging.dart';
-import 'package:test/test.dart';
-
-void main() {
-  test('_testlogToStdout', _testlogToStdout);
-}
-
-void _testlogToStdout() async {
-  final List<String> logOutput = <String>[];
-  runZoned<void>(
-    () {
-      setupLogger(
-        name: 'TEST',
-        forceShowCodeLocation: false,
-      );
-      log
-        ..info('foo')
-        ..warning('bar');
-
-      expect(logOutput.length, equals(2));
-      expect(logOutput[0], equals('[INFO:TEST] foo'));
-      expect(logOutput[1], equals('[WARNING:TEST] bar'));
-    },
-    zoneSpecification: ZoneSpecification(
-      print: (Zone self, ZoneDelegate parent, Zone zone, String line) {
-        logOutput.add(line);
-      },
-    ),
-  );
-}
diff --git a/public/lib/app/dart/test/stdout_with_exception.dart b/public/lib/app/dart/test/stdout_with_exception.dart
deleted file mode 100644
index 248c4a0..0000000
--- a/public/lib/app/dart/test/stdout_with_exception.dart
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-import 'dart:async';
-
-import 'package:lib.app.dart/logging.dart';
-import 'package:test/test.dart';
-
-void main() {
-  test('_testLogToStdoutWithException', _testLogToStdoutWithException);
-}
-
-void _testLogToStdoutWithException() async {
-  final List<String> logOutput = <String>[];
-  runZoned<void>(
-    () {
-      setupLogger(
-        name: 'TEST',
-        level: Level.ALL,
-        forceShowCodeLocation: false,
-      );
-      log.shout('foo', Exception('cause'));
-
-      expect(logOutput.length, equals(1));
-      expect(logOutput[0], equals('[FATAL:TEST] foo: Exception: cause'));
-
-      log.severe('bar', Exception('because'), StackTrace.current);
-
-      expect(logOutput.length, equals(3));
-      expect(logOutput[1], equals('[ERROR:TEST] bar: Exception: because'));
-      expect(logOutput[2], matches(r'.*_testLogToStdoutWithError.*'));
-    },
-    zoneSpecification: ZoneSpecification(
-      print: (Zone self, ZoneDelegate parent, Zone zone, String line) {
-        logOutput.add(line);
-      },
-    ),
-  );
-}
diff --git a/public/lib/app/dart/test/stdout_with_location.dart b/public/lib/app/dart/test/stdout_with_location.dart
deleted file mode 100644
index 751b495..0000000
--- a/public/lib/app/dart/test/stdout_with_location.dart
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-import 'dart:async';
-
-import 'package:lib.app.dart/logging.dart';
-import 'package:test/test.dart';
-
-const String _fileName = 'stdout_with_location_test.dart';
-
-void main() {
-  test('_testLogToStdoutWithLocation', _testLogToStdoutWithLocation);
-}
-
-void _testLogToStdoutWithLocation() async {
-  final List<String> logOutput = <String>[];
-  runZoned<void>(
-    () {
-      setupLogger(
-        name: 'TEST',
-        forceShowCodeLocation: true,
-      );
-      log.info('foo');
-
-      expect(logOutput.length, equals(1));
-      expect(logOutput[0], matches('\\[INFO:TEST:$_fileName\\(\\d+\\)\\] foo'));
-    },
-    zoneSpecification: ZoneSpecification(
-      print: (Zone self, ZoneDelegate parent, Zone zone, String line) {
-        logOutput.add(line);
-      },
-    ),
-  );
-}
diff --git a/public/lib/app/dart/test/test_startup_context_test.dart b/public/lib/app/dart/test/test_startup_context_test.dart
deleted file mode 100644
index 4b01ee4..0000000
--- a/public/lib/app/dart/test/test_startup_context_test.dart
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-import 'package:lib.app.dart/testing/test_startup_context.dart';
-import 'package:lib.app.dart/app.dart';
-import 'package:test/test.dart';
-import 'package:zircon/zircon.dart';
-
-void main() {
-  TestStartupContext testContext = TestStartupContext();
-  StartupContext.provideStartupContext(testContext);
-
-  group('Fake context', () {
-    test('can be obtained through fromStartupInfo', () {
-      expect(StartupContext.fromStartupInfo(), testContext);
-    });
-    test('should not crash with normal calls', () {
-      final context = StartupContext.fromStartupInfo();
-
-      context.outgoingServices.addServiceForName((req) {}, 'service');
-      context.environmentServices.ctrl.close();
-      context.close();
-    });
-    test('should connect a service when connected', () {
-      final context = StartupContext.fromStartupInfo();
-      var wasConnected = false;
-
-      testContext.withTestService((req) {
-        wasConnected = true;
-      }, 'connectedService');
-
-      context.environmentServices.connectToService(
-          'connectedService', Channel(Handle.invalid()));
-
-      expect(wasConnected, true);
-    }, skip: 'TODO(tvolkert): re-enable this test');
-  });
-
-  // TODO(ejia): add tests with full fidl service
-}
diff --git a/public/lib/app/dart/testing/test_startup_context.dart b/public/lib/app/dart/testing/test_startup_context.dart
deleted file mode 100644
index 2fdfedb..0000000
--- a/public/lib/app/dart/testing/test_startup_context.dart
+++ /dev/null
@@ -1,79 +0,0 @@
-import 'package:fidl/fidl.dart';
-import 'package:fidl_fuchsia_sys/fidl.dart';
-import 'package:lib.app.dart/app.dart';
-import 'package:mockito/mockito.dart';
-import 'package:zircon/zircon.dart';
-
-/// Fake startup context that can be used to provide services for host testing
-/// as well as outgoing services.
-///
-/// To use:
-///
-/// Before first call to get StartupContext, call
-/// final startupContext = TestStartupContext();
-/// provideStartupContext(startupContext);
-class TestStartupContext implements StartupContext {
-  @override
-  MockEnvironmentProxy environment = MockEnvironmentProxy();
-
-  @override
-  TestServiceProvider environmentServices = TestServiceProvider();
-
-  @override
-  final MockLauncherProxy launcher = MockLauncherProxy();
-
-  @override
-  final MockOutgoing outgoingServices = MockOutgoing();
-
-  @override
-  void close() {
-    // No-op.
-  }
-
-  void withTestService<T>(ServiceConnector<T> connector, String serviceName) =>
-      environmentServices._withTestService(connector, serviceName);
-}
-
-class TestServiceProvider implements ServiceProviderProxy {
-  final ServiceProviderImpl _testServices = ServiceProviderImpl();
-  final Set<String> _serviceNames = <String>{};
-
-  void _withTestService<T>(ServiceConnector<T> connector, String serviceName) {
-    if (_serviceNames.contains(serviceName)) {
-      throw TestEnvironmentException('Duplicate $serviceName provided');
-    }
-    _serviceNames.add(serviceName);
-    _testServices.addServiceForName(connector, serviceName);
-  }
-
-  @override
-  MockProxyController<ServiceProvider> ctrl =
-      MockProxyController<ServiceProvider>();
-
-  @override
-  void connectToService(String serviceName, Channel channel) {
-    if (!_serviceNames.contains(serviceName)) {
-      throw TestEnvironmentException(
-          'No service provider for $serviceName in test environment.');
-    }
-
-    _testServices.connectToService(serviceName, channel);
-  }
-}
-
-class MockEnvironmentProxy extends Mock implements EnvironmentProxy {}
-
-class MockLauncherProxy extends Mock implements LauncherProxy {}
-
-class MockProxyController<T> extends Mock implements ProxyController<T> {}
-
-class MockOutgoing extends Mock implements Outgoing {}
-
-class TestEnvironmentException implements Exception {
-  final String message;
-
-  TestEnvironmentException([this.message]);
-
-  @override
-  String toString() => 'TestEnvironmentException: $message';
-}
diff --git a/public/lib/device/dart/BUILD.gn b/public/lib/device/dart/BUILD.gn
index d7ee2c5..06d3066 100644
--- a/public/lib/device/dart/BUILD.gn
+++ b/public/lib/device/dart/BUILD.gn
@@ -18,6 +18,5 @@
     "//sdk/fidl/fuchsia.auth",
     "//sdk/fidl/fuchsia.modular",
     "//topaz/public/dart/fidl",
-    "//topaz/public/lib/app/dart",
   ]
 }
diff --git a/public/lib/media/dart/BUILD.gn b/public/lib/media/dart/BUILD.gn
index 605a809..a156745 100644
--- a/public/lib/media/dart/BUILD.gn
+++ b/public/lib/media/dart/BUILD.gn
@@ -18,7 +18,6 @@
     "//topaz/public/dart/fidl",
     "//topaz/public/dart/fuchsia_logger",
     "//topaz/public/dart/fuchsia_services",
-    "//topaz/public/lib/app/dart",
     "//topaz/public/lib/settings:settings_protos",
   ]
 }
diff --git a/public/lib/mediaplayer/flutter/BUILD.gn b/public/lib/mediaplayer/flutter/BUILD.gn
index 819fe3d..5135bd8 100644
--- a/public/lib/mediaplayer/flutter/BUILD.gn
+++ b/public/lib/mediaplayer/flutter/BUILD.gn
@@ -23,7 +23,6 @@
     "//third_party/dart-pkg/git/flutter/packages/flutter",
     "//topaz/public/dart/fuchsia_scenic",
     "//topaz/public/dart/fuchsia_scenic_flutter",
-    "//topaz/public/lib/app/dart",
     "//topaz/public/lib/mediaplayer/dart",
   ]
 }
diff --git a/runtime/dart_runner/embedder/script_runner_snapshot.dart b/runtime/dart_runner/embedder/script_runner_snapshot.dart
index 9a2ff32..95553ae 100644
--- a/runtime/dart_runner/embedder/script_runner_snapshot.dart
+++ b/runtime/dart_runner/embedder/script_runner_snapshot.dart
@@ -24,8 +24,7 @@
 import 'package:zircon/zircon.dart';
 
 // FIDL bindings and application libraries.
-import 'package:lib.app.dart/app.dart';
 import 'package:fidl/fidl.dart';
 
 // From //sdk/fidl/fuchsia.modular
-import 'package:fidl_fuchsia_modular/fidl.dart';
+import 'package:fidl_fuchsia_modular/fidl_async.dart';
