diff --git a/README.md b/README.md
index eefcee8..aeed6b3 100644
--- a/README.md
+++ b/README.md
@@ -43,3 +43,4 @@
 * topaz/public/lib/module_resolver: 2e13a4929
 * topaz/public/lib/proposal: d32421a9d
 * topaz/public/lib/user: 62cc03e
+* topaz/lib/setui/settings: 4009b4a
diff --git a/lib/setui/settings/analysis_options.yaml b/lib/setui/settings/analysis_options.yaml
deleted file mode 100644
index 49a21d7..0000000
--- a/lib/setui/settings/analysis_options.yaml
+++ /dev/null
@@ -1,6 +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: ../analysis_options.yaml
-
diff --git a/lib/setui/settings/client/BUILD.gn b/lib/setui/settings/client/BUILD.gn
deleted file mode 100644
index 6a8d315..0000000
--- a/lib/setui/settings/client/BUILD.gn
+++ /dev/null
@@ -1,38 +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("//build/dart/dart_library.gni")
-import("//topaz/runtime/dart/flutter_test.gni")
-
-dart_library("client") {
-  package_name = "lib_setui_settings_client"
-
-  sources = [
-    "time_zone_controller.dart",
-    "wireless_controller.dart",
-  ]
-
-  deps = [
-    "//sdk/fidl/fuchsia.setui",
-    "//topaz/lib/setui/common:common",
-    "//topaz/lib/setui/flutter:flutter",
-    "//topaz/lib/setui/settings/common:common",
-  ]
-}
-
-flutter_test("lib_setui_settings_client_test") {
-  sources = [
-    "time_zone_controller_test.dart",
-    # STOPSHIP(brycelee): add test back once migration to new api is complete.
-    #"wireless_controller_test.dart",
-  ]
-
-  deps = [
-    ":client",
-    "//sdk/fidl/fuchsia.setui",
-    "//third_party/dart-pkg/git/flutter/packages/flutter_test",
-    "//third_party/dart-pkg/pub/mockito",
-    "//third_party/dart-pkg/pub/test",
-  ]
-}
diff --git a/lib/setui/settings/client/analysis_options.yaml b/lib/setui/settings/client/analysis_options.yaml
deleted file mode 100644
index 49a21d7..0000000
--- a/lib/setui/settings/client/analysis_options.yaml
+++ /dev/null
@@ -1,6 +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: ../analysis_options.yaml
-
diff --git a/lib/setui/settings/client/lib/time_zone_controller.dart b/lib/setui/settings/client/lib/time_zone_controller.dart
deleted file mode 100644
index 588d590..0000000
--- a/lib/setui/settings/client/lib/time_zone_controller.dart
+++ /dev/null
@@ -1,21 +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_setui/fidl.dart';
-import 'package:lib_setui_settings_common/setting_adapter.dart';
-import 'package:lib_setui_settings_common/setting_controller.dart';
-
-/// A controller class for interacting with time zones.
-class TimeZoneController extends SettingController<TimeZoneInfo> {
-  TimeZoneController(SettingAdapter adapter) : super(adapter);
-
-  /// Sets the system timezone to the specified zone.
-  void setCurrentTimeZone(TimeZone timeZone) {
-    mutate(
-        Mutation.withTimeZoneMutationValue(TimeZoneMutation(
-            value:
-                TimeZoneInfo(available: state.available, current: timeZone))),
-        null /* handles */);
-  }
-}
diff --git a/lib/setui/settings/client/lib/wireless_controller.dart b/lib/setui/settings/client/lib/wireless_controller.dart
deleted file mode 100644
index 214cc78..0000000
--- a/lib/setui/settings/client/lib/wireless_controller.dart
+++ /dev/null
@@ -1,90 +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_setui/fidl.dart';
-import 'package:flutter/widgets.dart';
-import 'package:lib_setui_settings_common/setting_adapter.dart';
-import 'package:lib_setui_settings_common/setting_controller.dart';
-
-/// A controller for interacting with the wireless networks.
-class WirelessController extends SettingController<WirelessState> {
-  WirelessController(SettingAdapter adapter) : super(adapter);
-
-  final WirelessUiState uiState = WirelessUiState();
-
-  /// Enter in a password and connect to the currently selected point
-  Future<void> password(String password) async {
-    uiState._passwordSubmitted(password);
-    await _connect();
-  }
-
-  /// Called when the user dismisses the password dialog
-  void dismissPassword() {
-    uiState._passwordDismissed();
-  }
-
-  /// Connects to the specified [WirelessAccessPoint].
-  ///
-  /// If the access point requires password, then show password dialog if needed
-  Future<void> select(WirelessNetwork network) async {
-    if (uiState._networkSelected(network)) {
-      await _connect();
-    }
-  }
-
-  Future<void> _connect() async {
-    // TODO: mutate
-    uiState._reset();
-  }
-}
-
-class WirelessUiState extends ChangeNotifier {
-  final ValueNotifier<CurrentScreen> _screen =
-      ValueNotifier(CurrentScreen.main);
-  final ValueNotifier<WirelessNetwork> _selectedAccessPoint =
-      ValueNotifier<WirelessNetwork>(null);
-  final ValueNotifier<String> _password = ValueNotifier(null);
-
-  WirelessUiState() {
-    _screen.addListener(notifyListeners);
-    _password.addListener(notifyListeners);
-    _selectedAccessPoint.addListener(notifyListeners);
-  }
-
-  // Returns true if the selection should result in immediate connection
-  bool _networkSelected(WirelessNetwork network) {
-    _selectedAccessPoint.value = network;
-    if (network.wpaAuth != WpaAuth.noneOpen) {
-      _screen.value = CurrentScreen.passwordShowing;
-    } else {
-      _screen.value = CurrentScreen.connecting;
-      return true;
-    }
-    return false;
-  }
-
-  void _passwordSubmitted(String password) {
-    _password.value = password;
-    _screen.value = CurrentScreen.connecting;
-  }
-
-  void _passwordDismissed() {
-    _reset();
-  }
-
-  void _reset() {
-    _screen.value = CurrentScreen.main;
-    _selectedAccessPoint.value = null;
-    _password.value = null;
-  }
-
-  CurrentScreen get screen => _screen.value;
-  WirelessNetwork get selectedAccessPoint => _selectedAccessPoint.value;
-}
-
-enum CurrentScreen {
-  main,
-  passwordShowing,
-  connecting,
-}
diff --git a/lib/setui/settings/client/pubspec.yaml b/lib/setui/settings/client/pubspec.yaml
deleted file mode 100644
index e044d05..0000000
--- a/lib/setui/settings/client/pubspec.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.
-
-name: settings_client
diff --git a/lib/setui/settings/client/test/time_zone_controller_test.dart b/lib/setui/settings/client/test/time_zone_controller_test.dart
deleted file mode 100644
index 0e982d1..0000000
--- a/lib/setui/settings/client/test/time_zone_controller_test.dart
+++ /dev/null
@@ -1,60 +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_setui/fidl.dart';
-import 'package:lib_setui_settings_client/time_zone_controller.dart';
-import 'package:lib_setui_settings_common/setting_adapter.dart';
-import 'package:lib_setui_settings_common/setting_model.dart';
-import 'package:lib_setui_settings_common/setting_source.dart';
-import 'package:mockito/mockito.dart';
-import 'package:test/test.dart';
-
-class MockTestAdapter extends Mock implements SettingAdapter {}
-
-class MockTimeZoneSettingSource extends Mock
-    implements SettingSource<TimeZoneInfo> {}
-
-void main() {
-  // Exercises the TimeZoneController functionality, retrieving and setting the
-  // time zone state.
-  test('test_controller_interaction', () async {
-    final TimeZone current = TimeZone(id: '1', name: 'tz1', region: []);
-    // Fixture data handed back through the mock adapter.
-    final TimeZoneInfo state = TimeZoneInfo(
-        available: [current, TimeZone(id: '2', name: 'tz2', region: [])],
-        current: current);
-
-    final MockTestAdapter adapter = MockTestAdapter();
-
-    // Hand back a mock setting source wrapping the fixture data.
-    when(adapter.fetch(SettingType.timeZone)).thenAnswer((_) {
-      final MockTimeZoneSettingSource source = MockTimeZoneSettingSource();
-      when(source.state).thenReturn(state);
-
-      return source;
-    });
-
-    final TimeZoneController controller = TimeZoneController(adapter);
-
-    // Upon fetch, make sure fixture is handed back.
-    final SettingModel<TimeZoneInfo> model = controller.fetch();
-    expect(model.state, state);
-
-    final TimeZone firstTimeZone = model.state.available[0];
-
-    // When setting the time zone, make sure adapter is notified with the
-    // correctly modified state.
-    controller.setCurrentTimeZone(firstTimeZone);
-
-    final TimeZoneInfo updatedState =
-        verify(adapter.mutate(SettingType.timeZone, captureAny))
-            .captured
-            .single
-            .timeZoneMutationValue
-            .value;
-
-    expect(updatedState.current, firstTimeZone);
-    expect(updatedState.available, state.available);
-  });
-}
diff --git a/lib/setui/settings/client/test/wireless_controller_test.dart b/lib/setui/settings/client/test/wireless_controller_test.dart
deleted file mode 100644
index 602f341..0000000
--- a/lib/setui/settings/client/test/wireless_controller_test.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 'dart:math';
-
-import 'package:fidl_fuchsia_setui/fidl.dart';
-import 'package:lib_setui_settings_client/wireless_controller.dart';
-import 'package:lib_setui_settings_common/setting_adapter.dart';
-import 'package:lib_setui_settings_common/setting_model.dart';
-import 'package:lib_setui_settings_common/setting_source.dart';
-import 'package:mockito/mockito.dart';
-import 'package:test/test.dart';
-
-class MockTestAdapter extends Mock implements SettingAdapter {}
-
-class MockWirelessSource extends Mock implements SettingSource<WirelessState> {}
-
-void main() {
-  // Exercises the NetworkController functionality, retrieving and setting the
-  // current wireless network.
-  test('test_controller_interaction', () async {
-    final WirelessAccessPoint accessPoint = WirelessAccessPoint(
-        accessPointId: Random().nextInt(1000),
-        name: 'accessPoint',
-        password: null,
-        rssi: Random().nextInt(1000),
-        security: WirelessSecurity.secured,
-        status: null);
-
-    final WirelessState state = WirelessState(accessPoints: [accessPoint]);
-
-    final MockTestAdapter adapter = MockTestAdapter();
-
-    // Hand back a mock setting source wrapping the fixture data.
-    when(adapter.fetch(SettingType.wireless)).thenAnswer((_) {
-      final MockWirelessSource source = MockWirelessSource();
-      when(source.state).thenReturn(state);
-      return source;
-    });
-
-    final WirelessController controller = WirelessController(adapter);
-
-    // Upon fetch, make sure fixture is handed back.
-    final SettingModel<WirelessState> model = controller.fetch();
-    expect(model.state, state);
-
-    const String testPassword = 'TestPassword123';
-
-    await controller.connect(accessPoint);
-
-    expect(controller.uiState.passwordShowing, true);
-    expect(controller.uiState.selectedAccessPoint, accessPoint);
-
-    await controller.password(testPassword);
-    expect(controller.uiState.passwordShowing, false);
-
-    final WirelessState updatedState =
-        verify(adapter.update(captureAny)).captured.single.data.wireless;
-
-    // The state should house a single interface.
-    expect(updatedState.accessPoints.length, 1);
-
-    final WirelessAccessPoint updatedAccessPoint = updatedState.accessPoints[0];
-
-    // id and password should match.
-    expect(updatedAccessPoint.accessPointId, accessPoint.accessPointId);
-    expect(updatedAccessPoint.password, testPassword);
-    expect(updatedAccessPoint.status, ConnectionStatus.connected);
-
-    expect(controller.uiState.selectedAccessPoint, null);
-  });
-}
diff --git a/lib/setui/settings/common/BUILD.gn b/lib/setui/settings/common/BUILD.gn
deleted file mode 100644
index 2e70a9d..0000000
--- a/lib/setui/settings/common/BUILD.gn
+++ /dev/null
@@ -1,39 +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("//build/dart/dart_library.gni")
-import("//topaz/runtime/dart/flutter_test.gni")
-
-dart_library("common") {
-  package_name = "lib_setui_settings_common"
-
-  sources = [
-    "setting_adapter.dart",
-    "setting_controller.dart",
-    "setting_model.dart",
-    "setting_source.dart",
-  ]
-
-  deps = [
-    "//sdk/fidl/fuchsia.setui",
-    "//topaz/lib/setui/common:common",
-    "//topaz/lib/setui/flutter:flutter",
-    "//topaz/lib/setui/settings/json:fuchsia.setui.json",
-  ]
-}
-
-flutter_test("lib_setui_settings_common_test") {
-  sources = [
-    "adapter_log_test.dart",
-    "setting_controller_test.dart",
-  ]
-
-  deps = [
-    ":common",
-    "//sdk/fidl/fuchsia.setui",
-    "//third_party/dart-pkg/git/flutter/packages/flutter_test",
-    "//third_party/dart-pkg/pub/mockito",
-    "//third_party/dart-pkg/pub/test",
-  ]
-}
diff --git a/lib/setui/settings/common/analysis_options.yaml b/lib/setui/settings/common/analysis_options.yaml
deleted file mode 100644
index 49a21d7..0000000
--- a/lib/setui/settings/common/analysis_options.yaml
+++ /dev/null
@@ -1,6 +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: ../analysis_options.yaml
-
diff --git a/lib/setui/settings/common/lib/setting_adapter.dart b/lib/setui/settings/common/lib/setting_adapter.dart
deleted file mode 100644
index e0f4c72..0000000
--- a/lib/setui/settings/common/lib/setting_adapter.dart
+++ /dev/null
@@ -1,343 +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:fidl_fuchsia_setui/fidl.dart';
-import 'package:fidl_fuchsia_setui_json/json.dart';
-
-import 'setting_source.dart';
-
-/// An interface for accessing settings.
-///
-/// Adapters are meant for controllers, who expose a narrower interaction
-/// surface to the clients.
-abstract class SettingAdapter {
-  /// Retrieves the current setting source.
-  SettingSource<T> fetch<T>(SettingType settingType);
-
-  /// Applies the updated values to the backend.
-  Future<UpdateResponse> update(SettingsObject updatedSetting);
-
-  /// Applies a mutation to the backend.
-  Future<MutationResponse> mutate(SettingType settingType, Mutation mutation,
-      {MutationHandles handles});
-}
-
-/// An interface for receiving setting updates.
-abstract class AdapterLogger {
-  /// Invoked when fetch is requested.
-  void onFetch(FetchLog log);
-
-  /// Invoked when an update occurs from the client.
-  void onUpdate(UpdateLog log);
-
-  /// Invoked when an update response is ready.
-  void onResponse(ResponseLog log);
-
-  /// Invoked when a mutation occurs from client.
-  void onMutation(MutationLog log);
-
-  /// Invoked when an mutation response is ready.
-  void onMutationResponse(MutationResponseLog log);
-
-  /// Invoked when a setting is updated from the server.
-  void onSettingLog(SettingLog log);
-}
-
-/// Enum class for who is responsible for the update.
-class AdapterLogType {
-  static const int fetchId = 0;
-  static const int updateId = 1;
-  static const int settingId = 2;
-  static const int responseId = 3;
-  static const int mutationId = 4;
-  static const int mutationResponseId = 5;
-
-  final int value;
-
-  factory AdapterLogType(int value) {
-    switch (value) {
-      case fetchId:
-        return fetch;
-      case updateId:
-        return update;
-      case settingId:
-        return setting;
-      case responseId:
-        return response;
-      case mutationId:
-        return mutation;
-      case mutationResponseId:
-        return mutationResponse;
-      default:
-        return null;
-    }
-  }
-
-  const AdapterLogType._(this.value);
-
-  static const AdapterLogType fetch = AdapterLogType._(fetchId);
-
-  static const AdapterLogType update = AdapterLogType._(updateId);
-
-  static const AdapterLogType setting = AdapterLogType._(settingId);
-
-  static const AdapterLogType response = AdapterLogType._(responseId);
-
-  static const AdapterLogType mutation = AdapterLogType._(mutationId);
-
-  static const AdapterLogType mutationResponse =
-      AdapterLogType._(mutationResponseId);
-
-  int toJson() {
-    return value;
-  }
-}
-
-/// Union container for an adapter log.
-class AdapterLog {
-  static const String _timeKey = 'time';
-  static const String _typeKey = 'type';
-  static const String _dataKey = 'data';
-
-  static const String _fetchType = 'fetch';
-  static const String _settingType = 'setting';
-  static const String _responseType = 'response';
-  static const String _updateType = 'update';
-  static const String _mutationType = 'mutation';
-  static const String _mutationResponseType = 'mutationResponse';
-
-  final DateTime time;
-  final AdapterLogType type;
-
-  // ignore: prefer_typing_uninitialized_variables
-  final _data;
-
-  const AdapterLog.withFetch(this.time, FetchLog fetch)
-      : _data = fetch,
-        type = AdapterLogType.fetch;
-
-  const AdapterLog.withUpdate(this.time, UpdateLog update)
-      : _data = update,
-        type = AdapterLogType.update;
-
-  const AdapterLog.withSetting(this.time, SettingLog setting)
-      : _data = setting,
-        type = AdapterLogType.setting;
-
-  const AdapterLog.withResponse(this.time, ResponseLog response)
-      : _data = response,
-        type = AdapterLogType.response;
-
-  const AdapterLog.withMutation(this.time, MutationLog mutation)
-      : _data = mutation,
-        type = AdapterLogType.mutation;
-
-  const AdapterLog.withMutationResponse(
-      this.time, MutationResponseLog mutationResponse)
-      : _data = mutationResponse,
-        type = AdapterLogType.mutationResponse;
-
-  factory AdapterLog.fromJson(Map<String, dynamic> json) {
-    String type = json[_typeKey];
-    DateTime time = DateTime.parse(json[_timeKey]);
-
-    switch (type) {
-      case _fetchType:
-        return AdapterLog.withFetch(time, FetchLog?.fromJson(json[_dataKey]));
-      case _updateType:
-        return AdapterLog.withSetting(
-            time, SettingLog?.fromJson(json[_dataKey]));
-      case _settingType:
-        return AdapterLog.withSetting(
-            time, SettingLog?.fromJson(json[_dataKey]));
-      case _responseType:
-        return AdapterLog.withResponse(
-            time, ResponseLog?.fromJson(json[_dataKey]));
-      default:
-        return null;
-    }
-  }
-
-  String _typeToString() {
-    switch (type) {
-      case AdapterLogType.fetch:
-        return _fetchType;
-      case AdapterLogType.setting:
-        return _settingType;
-      case AdapterLogType.response:
-        return _responseType;
-      case AdapterLogType.update:
-        return _updateType;
-      case AdapterLogType.mutation:
-        return _mutationType;
-      case AdapterLogType.mutationResponse:
-        return _mutationResponseType;
-      default:
-        return null;
-    }
-  }
-
-  Map<String, dynamic> toJson() => {
-        _timeKey: time.toIso8601String(),
-        _typeKey: _typeToString(),
-        _dataKey: _data,
-      };
-
-  bool get fromClient =>
-      type == AdapterLogType.fetch || type == AdapterLogType.update;
-
-  UpdateLog get updateLog {
-    if (type != AdapterLogType.update) {
-      return null;
-    }
-
-    return _data;
-  }
-
-  FetchLog get fetchLog {
-    if (type != AdapterLogType.fetch) {
-      return null;
-    }
-
-    return _data;
-  }
-
-  SettingLog get settingLog {
-    if (type != AdapterLogType.setting) {
-      return null;
-    }
-
-    return _data;
-  }
-
-  ResponseLog get responseLog {
-    if (type != AdapterLogType.response) {
-      return null;
-    }
-
-    return _data;
-  }
-
-  MutationLog get mutationLog => type == AdapterLogType.mutation ? _data : null;
-
-  MutationResponseLog get mutationResponseLog =>
-      type == AdapterLogType.mutationResponse ? _data : null;
-}
-
-class FetchLog {
-  static const String _typeKey = 'type';
-
-  final SettingType type;
-
-  FetchLog(this.type);
-
-  factory FetchLog.fromJson(Map<String, dynamic> json) => json != null
-      ? FetchLog(SettingTypeConverter.fromJson(json[_typeKey]))
-      : null;
-
-  Map<String, dynamic> toJson() =>
-      {_typeKey: SettingTypeConverter.toJson(type)};
-}
-
-/// A container for capturing details around a service response.
-class ResponseLog {
-  static const String _updateIdKey = 'update_id';
-  static const String _responseKey = 'response';
-
-  final int updateId;
-  final UpdateResponse response;
-
-  ResponseLog(this.updateId, this.response);
-
-  factory ResponseLog.fromJson(Map<String, dynamic> json) => json != null
-      ? ResponseLog(json[_updateIdKey],
-          UpdateResponseConverter.fromJson(json[_responseKey]))
-      : null;
-
-  Map<String, dynamic> toJson() => {
-        _updateIdKey: updateId,
-        _responseKey: UpdateResponseConverter.toJson(response)
-      };
-}
-
-/// A container for capturing interaction events between the client and service.
-class SettingLog {
-  static const String _settingsKey = 'settings';
-
-  /// The captured settings.
-  final SettingsObject settings;
-
-  SettingLog(this.settings);
-
-  factory SettingLog.fromJson(Map<String, dynamic> json) =>
-      SettingLog(SettingsObjectConverter.fromJson(json[_settingsKey]));
-
-  Map<String, dynamic> toJson() => {
-        _settingsKey: SettingsObjectConverter.toJson(settings),
-      };
-}
-
-class UpdateLog {
-  static const String _idKey = 'id';
-  static const String _settingsKey = 'settings';
-
-  final int id;
-  final SettingsObject settings;
-
-  UpdateLog(this.id, this.settings);
-
-  factory UpdateLog.fromJson(Map<String, dynamic> json) => UpdateLog(
-      json[_idKey], SettingsObjectConverter.fromJson(json[_settingsKey]));
-
-  Map<String, dynamic> toJson() => {
-        _idKey: id,
-        _settingsKey: SettingsObjectConverter.toJson(settings),
-      };
-}
-
-class MutationLog {
-  static const String _idKey = 'id';
-  static const String _settingTypeKey = 'settingType';
-  static const String _mutationKey = 'mutation';
-
-  final int id;
-  final SettingType settingType;
-  final Mutation mutation;
-
-  MutationLog(this.id, this.settingType, this.mutation);
-
-  factory MutationLog.fromJson(Map<String, dynamic> json) => MutationLog(
-      json[_idKey],
-      SettingTypeConverter.fromJson(json[_settingTypeKey]),
-      MutationConverter.fromJson(json[_mutationKey]));
-
-  Map<String, dynamic> toJson() => {
-        _idKey: id,
-        _settingTypeKey: SettingTypeConverter.toJson(settingType),
-        _mutationKey: MutationConverter.toJson(mutation),
-      };
-}
-
-class MutationResponseLog {
-  static const String _mutationIdKey = 'mutation_id';
-  static const String _responseKey = 'response';
-
-  final int mutationId;
-  final MutationResponse response;
-
-  MutationResponseLog(this.mutationId, this.response);
-
-  factory MutationResponseLog.fromJson(Map<String, dynamic> json) =>
-      json != null
-          ? MutationResponseLog(json[_mutationIdKey],
-              MutationResponseConverter.fromJson(json[_responseKey]))
-          : null;
-
-  Map<String, dynamic> toJson() => {
-        _mutationIdKey: mutationId,
-        _responseKey: UpdateResponseConverter.toJson(response)
-      };
-}
diff --git a/lib/setui/settings/common/lib/setting_controller.dart b/lib/setui/settings/common/lib/setting_controller.dart
deleted file mode 100644
index f8e6fcf..0000000
--- a/lib/setui/settings/common/lib/setting_controller.dart
+++ /dev/null
@@ -1,50 +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_setui/fidl.dart';
-
-import 'setting_adapter.dart';
-import 'setting_model.dart';
-import 'setting_source.dart';
-
-/// Base controller that handles interaction with the underlying setting adapter
-/// and access to the state data.
-class SettingController<T> {
-  final SettingAdapter _adapter;
-  SettingSource<T> _source;
-
-  SettingController(this._adapter);
-
-  /// Returns a setting model that will be updated with the latest state.
-  SettingModel<T> fetch() {
-    _source ??= _adapter.fetch(settingType);
-
-    return SettingModel<T>(_source);
-  }
-
-  SettingType get settingType {
-    switch (T) {
-      case TimeZoneInfo:
-        return SettingType.timeZone;
-      case WirelessState:
-        return SettingType.wireless;
-      case ConnectedState:
-        return SettingType.connectivity;
-    }
-
-    throw Exception('Undefined setting type!');
-  }
-
-  Future<void> mutate(Mutation mutation, MutationHandles handles) async {
-    await _adapter.mutate(settingType, mutation, handles: handles);
-  }
-
-  /// Updates the setting state to the provided version.
-  Future<void> update(SettingsObject state) async {
-    await _adapter.update(state);
-  }
-
-  /// Returns the most current data from source.
-  T get state => _source.state;
-}
diff --git a/lib/setui/settings/common/lib/setting_model.dart b/lib/setui/settings/common/lib/setting_model.dart
deleted file mode 100644
index 3cec913..0000000
--- a/lib/setui/settings/common/lib/setting_model.dart
+++ /dev/null
@@ -1,17 +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.widgets/model.dart';
-
-import 'setting_source.dart';
-
-/// A wrapper around settings data to notify widgets on new data.
-class SettingModel<T> extends Model {
-  SettingSource<T> _source;
-
-  SettingModel(this._source) {
-    _source.addListener((value) => notifyListeners());
-  }
-
-  T get state => _source.state;
-}
diff --git a/lib/setui/settings/common/lib/setting_source.dart b/lib/setui/settings/common/lib/setting_source.dart
deleted file mode 100644
index 0aa1585..0000000
--- a/lib/setui/settings/common/lib/setting_source.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 'dart:async';
-
-import 'package:fidl_fuchsia_setui/fidl.dart';
-
-/// An accessor for settings.
-///
-/// [SettingSource] extends [ChangeNotifier] to provide updates on changes to
-/// owners. For example, a model may wrap [SettingSource] for the view layer and
-/// register its notify method as the change callback.
-class SettingSource<T> implements SettingListener {
-  T _value;
-
-  final StreamController<T> _streamController =
-      StreamController<T>.broadcast();
-
-  StreamSubscription<T> addListener(void callback(T value)) =>
-      _streamController.stream.listen(callback);
-
-  /// The current setting.
-  T get state => _value;
-
-  @override
-  Future<Null> notify(SettingsObject object) async {
-    _value = object.data.$data;
-    _streamController.add(_value);
-  }
-}
diff --git a/lib/setui/settings/common/pubspec.yaml b/lib/setui/settings/common/pubspec.yaml
deleted file mode 100644
index 2075d71..0000000
--- a/lib/setui/settings/common/pubspec.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.
-
-name: settings_common
diff --git a/lib/setui/settings/common/test/adapter_log_test.dart b/lib/setui/settings/common/test/adapter_log_test.dart
deleted file mode 100644
index 0e7a09c..0000000
--- a/lib/setui/settings/common/test/adapter_log_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 'package:fidl_fuchsia_setui/fidl.dart';
-import 'package:lib_setui_settings_common/setting_adapter.dart';
-import 'package:test/test.dart';
-
-void main() {
-  // Exercises json encoding of setting log.
-  test('test_setting_log_json', () async {
-    final TimeZone tz1 = TimeZone(id: '1', name: 'foo', region: ['foo1']);
-    final TimeZone tz2 = TimeZone(id: '2', name: 'bar', region: ['bar2']);
-
-    final AdapterLog log1 = AdapterLog.withSetting(
-        DateTime.now(),
-        SettingLog(SettingsObject(
-            settingType: SettingType.timeZone,
-            data: SettingData.withTimeZoneValue(
-                TimeZoneInfo(available: [tz1, tz2], current: tz2)))));
-
-    final AdapterLog log2 = AdapterLog.fromJson(jsonDecode(jsonEncode(log1)));
-
-    expect(log1.time, log2.time);
-    expect(log1.settingLog.settings.settingType,
-        log2.settingLog.settings.settingType);
-
-    // FIDL parsing is covered by the fidl-gen tests.
-  });
-
-  // Exercises json encoding of fetch log.
-  test('test_fetch_log_json', () async {
-    final AdapterLog adapterLog1 = AdapterLog.withFetch(
-        DateTime.now(), FetchLog(SettingType.connectivity));
-
-    final AdapterLog adapterLog2 =
-        AdapterLog.fromJson(jsonDecode(jsonEncode(adapterLog1)));
-
-    expect(adapterLog1.fetchLog.type, adapterLog2.fetchLog.type);
-  });
-}
diff --git a/lib/setui/settings/common/test/setting_controller_test.dart b/lib/setui/settings/common/test/setting_controller_test.dart
deleted file mode 100644
index 9735732..0000000
--- a/lib/setui/settings/common/test/setting_controller_test.dart
+++ /dev/null
@@ -1,28 +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_setui/fidl.dart';
-import 'package:lib_setui_settings_common/setting_adapter.dart';
-import 'package:lib_setui_settings_common/setting_controller.dart';
-import 'package:lib_setui_settings_common/setting_source.dart';
-import 'package:mockito/mockito.dart';
-import 'package:test/test.dart';
-
-class MockTestAdapter extends Mock implements SettingAdapter {}
-
-void main() {
-  // Make sure mappings call the correct underlying mapping.
-  test('test_setting_controller_mapping', () async {
-    verifyMapping<WirelessState>(SettingType.wireless);
-    verifyMapping<ConnectedState>(SettingType.connectivity);
-    verifyMapping<TimeZoneInfo>(SettingType.timeZone);
-  });
-}
-
-void verifyMapping<T>(SettingType type) {
-  final MockTestAdapter adapter = MockTestAdapter();
-  when(adapter.fetch(type)).thenReturn(SettingSource<T>());
-  SettingController<T>(adapter).fetch();
-  verify(adapter.fetch(type));
-}
diff --git a/lib/setui/settings/json/BUILD.gn b/lib/setui/settings/json/BUILD.gn
deleted file mode 100644
index 9b40458..0000000
--- a/lib/setui/settings/json/BUILD.gn
+++ /dev/null
@@ -1,14 +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/bin/dart_fidl_json/dart_fidl_json.gni")
-import("//topaz/runtime/dart/flutter_test.gni")
-
-json_fidl("fuchsia.setui.json") {
-  fidl_target = "//sdk/fidl/fuchsia.setui"
-
-  deps = [
-    "//sdk/fidl/fuchsia.setui",
-  ]
-}
diff --git a/lib/setui/settings/service/BUILD.gn b/lib/setui/settings/service/BUILD.gn
deleted file mode 100644
index bc8cccd..0000000
--- a/lib/setui/settings/service/BUILD.gn
+++ /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("//build/dart/dart_library.gni")
-import("//topaz/runtime/dart/flutter_test.gni")
-
-dart_library("service") {
-  package_name = "lib_setui_service"
-
-  sources = [
-    "service.dart",
-    "src/setui_setting_controller.dart",
-    "src/network_controller.dart",
-    "src/intl_controller.dart",
-    "src/connectivity_controller.dart",
-    "src/timezone_controller.dart",
-    "src/intl/intl_settings_util.dart",
-  ]
-
-  deps = [
-    "//sdk/fidl/fuchsia.netstack",
-    "//sdk/fidl/fuchsia.setui",
-    "//sdk/fidl/fuchsia.stash",
-    "//sdk/fidl/fuchsia.timezone",
-    "//sdk/fidl/fuchsia.wlan.service",
-    "//topaz/lib/settings:lib.settings",
-    "//topaz/lib/setui/settings/common:common",
-    "//topaz/public/dart/fidl",
-    "//topaz/public/dart/widgets:lib.widgets",
-    "//topaz/public/lib/app/dart",
-    "//zircon/public/fidl/fuchsia-net:fuchsia-net",
-  ]
-}
-
-flutter_test("lib_setui_service_test") {
-  sources = [
-    "intl/intl_settings_util_test.dart",
-
-    # STOPSHIP(brycelee): add test back once migration to new api is complete.
-    # "network_controller_test.dart",
-    "intl_controller_test.dart",
-  ]
-
-  deps = [
-    ":service",
-    "//third_party/dart-pkg/git/flutter/packages/flutter_test",
-    "//third_party/dart-pkg/pub/mockito",
-    "//third_party/dart-pkg/pub/test",
-  ]
-}
diff --git a/lib/setui/settings/service/analysis_options.yaml b/lib/setui/settings/service/analysis_options.yaml
deleted file mode 100644
index e375f1c..0000000
--- a/lib/setui/settings/service/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: ../analysis_options.yaml
\ No newline at end of file
diff --git a/lib/setui/settings/service/lib/service.dart b/lib/setui/settings/service/lib/service.dart
deleted file mode 100644
index a301379..0000000
--- a/lib/setui/settings/service/lib/service.dart
+++ /dev/null
@@ -1,114 +0,0 @@
-import 'dart:async';
-
-import 'package:fidl/fidl.dart';
-import 'package:fidl_fuchsia_setui/fidl.dart';
-import 'package:lib_setui_settings_common/setting_adapter.dart';
-import 'package:lib_setui_settings_common/setting_source.dart';
-
-/// Library that wraps the underlying setUi service.
-///
-/// Can be used to swap out between different implementations.
-/// A [SetUiListenerBinder] can be passed in to provide alternative
-/// binding forms (such as in linux host tests).
-class SetUiServiceAdapter implements SettingAdapter {
-  final SetUiService _service;
-  final SetUiListenerBinder _listenerBinder;
-  final Map<SettingType, SettingSource> _sources = {};
-  final AdapterLogger _logger;
-
-  int nextUpdateId = 0;
-
-  int _nextMutationId = 0;
-
-  factory SetUiServiceAdapter(
-      {SetUiService service,
-      SetUiListenerBinder binder = _bindListener,
-      AdapterLogger logger}) {
-    final SetUiServiceAdapter adapter = service != null
-        ? SetUiServiceAdapter.withService(service, binder, logger)
-        : SetUiServiceAdapter._local(binder, logger);
-
-    return adapter;
-  }
-
-  SetUiServiceAdapter.withService(
-      this._service, this._listenerBinder, this._logger);
-
-  SetUiServiceAdapter._local(this._listenerBinder, this._logger)
-      : _service = null;
-
-  /// Gets the setting from the service with the given [SettingType].
-  ///
-  /// [T] must be the type returned by the service for the given SettingType
-  /// as documented in fuchsia.setui.types.fidl.
-  @override
-  SettingSource<T> fetch<T>(SettingType settingType) {
-    if (!_sources.containsKey(settingType)) {
-      _sources[settingType] = ObservableSettingSource<T>(_logger);
-    }
-
-    final ObservableSettingSource<T> notifier = _sources[settingType];
-
-    _service.listen(settingType, _listenerBinder(notifier));
-    _logger?.onFetch(FetchLog(settingType));
-
-    return notifier;
-  }
-
-  /// Updates the setting based on [SettingsObject]'s type.
-  @override
-  Future<UpdateResponse> update(SettingsObject object) async {
-    final int nextUpdateId = this.nextUpdateId++;
-
-    _logger?.onUpdate(UpdateLog(nextUpdateId, object));
-
-    Completer<UpdateResponse> c = Completer<UpdateResponse>();
-
-    _service.update(object, (response) {
-      _logger?.onResponse(ResponseLog(nextUpdateId, response));
-      c.complete(response);
-    });
-
-    return c.future;
-  }
-
-  @override
-  Future<MutationResponse> mutate(SettingType settingType, Mutation mutation,
-      {MutationHandles handles}) async {
-    final int nextMutationId = _nextMutationId++;
-
-    _logger?.onMutation(MutationLog(nextMutationId, settingType, mutation));
-
-    Completer<MutationResponse> completer = Completer<MutationResponse>();
-
-    void callback(MutationResponse response) {
-      completer.complete(response);
-    }
-
-    if (handles != null) {
-      _service.interactiveMutate(settingType, mutation, handles, callback);
-    } else {
-      _service.mutate(settingType, mutation, callback);
-    }
-    return completer.future;
-  }
-}
-
-// A source that can be instrumented to capture updates.
-class ObservableSettingSource<T> extends SettingSource<T> {
-  final AdapterLogger _logger;
-
-  ObservableSettingSource(this._logger);
-
-  @override
-  Future<Null> notify(SettingsObject object) {
-    _logger?.onSettingLog(SettingLog(object));
-    return super.notify(object);
-  }
-}
-
-typedef SetUiListenerBinder = InterfaceHandle<SettingListener> Function(
-    SettingListener impl);
-
-InterfaceHandle<SettingListener> _bindListener(SettingListener impl) =>
-    SettingListenerBinding().wrap(impl);
diff --git a/lib/setui/settings/service/lib/src/connectivity_controller.dart b/lib/setui/settings/service/lib/src/connectivity_controller.dart
deleted file mode 100644
index 60cd462..0000000
--- a/lib/setui/settings/service/lib/src/connectivity_controller.dart
+++ /dev/null
@@ -1,50 +0,0 @@
-import 'dart:async';
-
-import 'package:fidl_fuchsia_setui/fidl.dart';
-import 'package:fidl_fuchsia_net/fidl.dart' as net;
-import 'package:lib.app.dart/app.dart';
-
-import 'setui_setting_controller.dart';
-
-// TODO: Implement and override applyMutation.
-class ConnectivityController extends SetUiSettingController {
-  net.ConnectivityProxy _connectivity;
-  bool _reachable;
-
-  @override
-  Future<void> close() async {
-    _connectivity.ctrl.close();
-  }
-
-  @override
-  Future<void> initialize() async {
-    Completer<void> completer = Completer();
-
-    _connectivity = net.ConnectivityProxy();
-    connectToService(StartupContext.fromStartupInfo().environmentServices,
-        _connectivity.ctrl);
-
-    _connectivity.onNetworkReachable = (reachable) {
-      // Wait for initital state before being done initializing.
-      if (_reachable != reachable) {
-        _reachable = reachable;
-        _connectivity.onNetworkReachable = _updateReachable;
-        completer.complete();
-      }
-    };
-    return completer.future;
-  }
-
-  void _updateReachable(bool reachable) {
-    if (_reachable != reachable) {
-      _reachable = reachable;
-      notifyListeners();
-    }
-  }
-
-  @override
-  SettingsObject get value => SettingsObject(
-      settingType: SettingType.connectivity,
-      data: SettingData.withConnectivity(ConnectedState(
-          reachability: _reachable ? Reachability.wan : Reachability.unknown)));
-}
diff --git a/lib/setui/settings/service/lib/src/intl/intl_settings_util.dart b/lib/setui/settings/service/lib/src/intl/intl_settings_util.dart
deleted file mode 100644
index 5797831..0000000
--- a/lib/setui/settings/service/lib/src/intl/intl_settings_util.dart
+++ /dev/null
@@ -1,72 +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.
-
-/// Utility methods for working with the [IntlSettings] FIDL struct.
-library intl_settings_util;
-
-import 'dart:convert';
-import 'package:fidl_fuchsia_setui/fidl.dart';
-
-IntlSettings applyMutation(IntlSettings settings, Mutation mutation) {
-  switch (mutation.$tag) {
-    case MutationTag.localesMutationValue:
-      return setLocales(settings, mutation.localesMutationValue);
-    case MutationTag.hourCycleMutationValue:
-      return setHourCycle(settings, mutation.hourCycleMutationValue);
-    case MutationTag.temperatureUnitMutationValue:
-      return setTemperatureUnit(
-          settings, mutation.temperatureUnitMutationValue);
-    default:
-      throw ArgumentError('Unsupported mutation type');
-  }
-}
-
-IntlSettings setLocales(IntlSettings settings, LocalesMutation mutation) {
-  return IntlSettings(
-      locales: mutation.locales,
-      hourCycle: settings.hourCycle,
-      temperatureUnit: settings.temperatureUnit);
-}
-
-IntlSettings setHourCycle(IntlSettings settings, HourCycleMutation mutation) {
-  if (settings.hourCycle != mutation.hourCycle) {
-    return IntlSettings(
-        locales: settings.locales,
-        hourCycle: mutation.hourCycle,
-        temperatureUnit: settings.temperatureUnit);
-  }
-  return settings;
-}
-
-IntlSettings setTemperatureUnit(
-    IntlSettings settings, TemperatureUnitMutation mutation) {
-  if (settings.temperatureUnit != mutation.temperatureUnit) {
-    return IntlSettings(
-        locales: settings.locales,
-        hourCycle: settings.hourCycle,
-        temperatureUnit: mutation.temperatureUnit);
-  }
-  return settings;
-}
-
-/// JSON encoder, since there's no standard one for FIDL.
-String toJson(IntlSettings settings) {
-  Map<String, dynamic> map = {
-    'locales': settings.locales,
-    'hour_cycle': settings.hourCycle == HourCycle.h12 ? 'h12' : 'h23',
-    'temperature_unit': settings.temperatureUnit == TemperatureUnit.celsius
-        ? 'celsius'
-        : 'fahrenheit'
-  };
-  return jsonEncode(map);
-}
-
-/// JSON decoder, since there's no standard one for FIDL.
-IntlSettings fromJson(String json) {
-  Map<String, dynamic> parsed = jsonDecode(json);
-  return IntlSettings(
-      locales: List<String>.from(parsed['locales']),
-      hourCycle: HourCycle.$valuesMap[parsed['hour_cycle']],
-      temperatureUnit: TemperatureUnit.$valuesMap[parsed['temperature_unit']]);
-}
diff --git a/lib/setui/settings/service/lib/src/intl_controller.dart b/lib/setui/settings/service/lib/src/intl_controller.dart
deleted file mode 100644
index 268b3ff..0000000
--- a/lib/setui/settings/service/lib/src/intl_controller.dart
+++ /dev/null
@@ -1,128 +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 'dart:async';
-
-import 'package:fidl_fuchsia_setui/fidl.dart';
-import 'package:fidl_fuchsia_stash/fidl.dart';
-import 'package:fidl_fuchsia_sys/fidl.dart';
-import 'package:lib.app.dart/app.dart';
-import 'package:meta/meta.dart';
-import 'intl/intl_settings_util.dart' as intl_util;
-
-import 'setui_setting_controller.dart';
-
-/// An implementation of [SetUiSettingController] for internationalization
-/// settings. Currently uses Stash as a backing store.
-class IntlSettingsController extends SetUiSettingController {
-  static const String _stashStoreName = 'INTL_SETTINGS';
-  @visibleForTesting
-  static const String stashKey = 'INTL_SETTINGS_KEY';
-
-  final StoreAccessorWrapperProvider _storeAccessorWrapperProvider;
-  StoreAccessorWrapper _storeAccessorWrapper;
-  IntlSettings _currentIntlSettings;
-
-  /// Default constructor
-  IntlSettingsController() : this.withStashProvider(createStoreAccessorWrapper);
-
-  /// Constructor that takes a custom [StoreAccessorWrapperProvider], primarily
-  /// for use in tests.
-  IntlSettingsController.withStashProvider(
-      StoreAccessorWrapperProvider storeAccessorWrapperProvider)
-      : _storeAccessorWrapperProvider = storeAccessorWrapperProvider;
-
-  @override
-  Future<void> close() async {
-    _storeAccessorWrapper.close();
-    _currentIntlSettings = null;
-  }
-
-  @override
-  Future<void> initialize() {
-    Completer<void> completer = Completer();
-
-    _storeAccessorWrapper = _storeAccessorWrapperProvider();
-    _storeAccessorWrapper.accessor.getValue(stashKey, (value) {
-      if (value != null && value.stringval != null) {
-        // TODO: Parse error handling? Should the future ever fail?
-        _currentIntlSettings = intl_util.fromJson(value.stringval);
-      }
-      completer.complete();
-    });
-
-    return completer.future;
-  }
-
-  @override
-  SettingsObject get value => SettingsObject(
-      settingType: SettingType.intl,
-      data: SettingData.withIntl(_currentIntlSettings));
-
-  @override
-  Future<ReturnCode> applyMutation(Mutation mutation,
-      {MutationHandles handles}) async {
-    _currentIntlSettings =
-        intl_util.applyMutation(_currentIntlSettings, mutation);
-    final json = intl_util.toJson(_currentIntlSettings);
-    _storeAccessorWrapper.accessor
-      ..setValue(stashKey, Value.withStringval(json))
-      ..commit();
-
-    return ReturnCode.ok;
-  }
-}
-
-/// Utility class that wraps an instance of Stash's [StoreAccessor], as well as
-/// a function for closing it when [IntlSettingsController.close] is called.
-abstract class StoreAccessorWrapper {
-  StoreAccessor get accessor;
-
-  StoreAccessorCloser get close;
-}
-
-/// Implementers should close any FIDL channels associated with a
-/// [StoreAccessor].
-typedef StoreAccessorCloser = void Function();
-
-/// Implementers should provide a new instance of [StoreAccessorWrapper].
-typedef StoreAccessorWrapperProvider = StoreAccessorWrapper Function();
-
-class _StoreAccessorWrapperImpl extends StoreAccessorWrapper {
-  final StoreAccessorProxy _storeAccessorProxy;
-  final StoreAccessorCloser _closer;
-
-  _StoreAccessorWrapperImpl(this._storeAccessorProxy, this._closer);
-
-  @override
-  StoreAccessor get accessor => _storeAccessorProxy;
-
-  @override
-  StoreAccessorCloser get close => _closer;
-}
-
-/// Default factory method for [StoreAccessorWrapper]. Connects to Stash and
-/// requests a [StoreAccessor].
-StoreAccessorWrapper createStoreAccessorWrapper() {
-  ServiceProviderProxy environmentServices =
-      StartupContext.fromStartupInfo().environmentServices;
-
-  var storeProxy = StoreProxy();
-  connectToService(environmentServices, storeProxy.ctrl);
-
-  var storeAccessorProxy = StoreAccessorProxy();
-
-  storeProxy
-    ..identify(IntlSettingsController._stashStoreName)
-    ..createAccessor(false, storeAccessorProxy.ctrl.request());
-
-  connectToService(environmentServices, storeAccessorProxy.ctrl);
-
-  void closer() {
-    storeAccessorProxy.ctrl.close();
-    storeProxy.ctrl.close();
-  }
-
-  return _StoreAccessorWrapperImpl(storeAccessorProxy, closer);
-}
diff --git a/lib/setui/settings/service/lib/src/network_controller.dart b/lib/setui/settings/service/lib/src/network_controller.dart
deleted file mode 100644
index 335ee37..0000000
--- a/lib/setui/settings/service/lib/src/network_controller.dart
+++ /dev/null
@@ -1,253 +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:fidl_fuchsia_setui/fidl.dart';
-
-import 'setui_setting_controller.dart';
-
-// TODO: Implement and override applyMutation.
-class NetworkController extends SetUiSettingController {
-  @override
-  Future<void> close() async {
-    // TODO: implement close
-  }
-
-  @override
-  Future<void> initialize() async {
-    // TODO: implement initialize
-  }
-
-  // TODO: implement value
-  @override
-  SettingsObject get value => null;
-}
-
-/// STOPSHIP(brycelee): re-enable once Migration is complete
-// /// How often to poll the wlan for wifi information.
-// const Duration _statusPeriod = Duration(seconds: 3);
-
-// /// How often to poll the wlan for available wifi networks.
-// const Duration _scanPeriod = Duration(seconds: 40);
-
-// const int _scanTimeout = 25;
-
-// const _connectionScanInterval = 3;
-
-// class NetworkController extends SetUiSettingController {
-//   // List of APs that we obtained from wireless scanning.
-//   // Periodically refreshed when there is no connected network.
-//   List<wlan.Ap> _scannedAps = [];
-
-//   /// This status is guaranteed to not be null as long as initialize is
-//   /// called. Periodically refreshed.
-//   wlan.WlanStatus _status;
-
-//   Timer _updateTimer;
-//   Timer _scanTimer;
-
-//   wlan.WlanProxy _wlanProxy;
-
-//   @override
-//   Future<void> close() async {
-//     _scanTimer?.cancel();
-//     _updateTimer?.cancel();
-//     _wlanProxy?.ctrl?.close();
-//     _scannedAps = [];
-//     _status = null;
-//   }
-
-//   @override
-//   Future<void> initialize() async {
-//     await initializeWithService(() async {
-//       final proxy = wlan.WlanProxy();
-//       connectToService(
-//           StartupContext.fromStartupInfo().environmentServices, proxy.ctrl);
-//       return proxy;
-//     });
-//   }
-
-//   /// Initializes the controller with the given [wlan.WlanProxy].
-//   ///
-//   /// Needed to allow providing a fake proxy for testing.
-//   @visibleForTesting
-//   Future<void> initializeWithService(
-//       Future<wlan.WlanProxy> proxyGetter()) async {
-//     final Completer<bool> wlanCompleter = Completer();
-
-//     _wlanProxy = await proxyGetter();
-
-//     _updateTimer = Timer.periodic(_statusPeriod, (timer) {
-//       _wlanProxy.status((status) {
-//         if (_onStatusRefreshed(status)) {
-//           notifyListeners();
-//         }
-//       });
-//     });
-
-//     _wlanProxy.status((status) {
-//       _onStatusRefreshed(status);
-//       wlanCompleter.complete(true);
-//     });
-
-//     /// Waits for all initial values and then returns false if any of the futures return false
-//     return await wlanCompleter.future;
-//   }
-
-//   @override
-//   Future<bool> setSettingValue(SettingsObject value) async {
-//     assert(value.data.tag == SettingDataTag.wireless);
-
-//     if (value.data.tag != SettingDataTag.wireless) {
-//       return false;
-//     }
-
-//     final accessPoints = value.data.wireless?.accessPoints ?? [];
-
-//     for (WirelessAccessPoint ap in accessPoints) {
-//       if (_status.currentAp != null &&
-//           ap.accessPointId == _accessPointId(_status.currentAp.ssid)) {
-//         if (ap.status == ConnectionStatus.disconnected ||
-//             ap.status == ConnectionStatus.disconnecting) {
-//           await _disconnect();
-//         }
-//       } else {
-//         if (ap.status == ConnectionStatus.connected ||
-//             ap.status == ConnectionStatus.connecting) {
-//           await _connect(ap.name,
-//               ap.security == WirelessSecurity.secured ? ap.password : null);
-//         }
-//       }
-//     }
-
-//     return true;
-//   }
-
-//   @override
-//   SettingsObject get value => _buildSettingsObject();
-
-//   // Returns true if this caused a change in state.
-//   bool _onStatusRefreshed(wlan.WlanStatus status) {
-//     bool changed = false;
-
-//     if (_status != status) {
-//       _status = status;
-//       changed = true;
-//     }
-//     if (status.state == wlan.State.associated) {
-//       _scanTimer?.cancel();
-//       _scannedAps = [];
-//     } else {
-//       if (_scanTimer == null || !_scanTimer.isActive) {
-//         _scan();
-//         _scanTimer = Timer.periodic(_scanPeriod, (timer) {
-//           _scan();
-//         });
-//       }
-//     }
-
-//     return changed;
-//   }
-
-//   SettingsObject _buildSettingsObject() {
-//     return SettingsObject(
-//         settingType: SettingType.wireless,
-//         data: SettingData.withWireless(_buildWirelessState()));
-//   }
-
-//   WirelessState _buildWirelessState() {
-//     return WirelessState(
-//         accessPoints: _status.currentAp != null
-//             ? [_buildCurrentAccessPoint()]
-//             : _scannedAps.map(_buildAccessPoint).toList());
-//   }
-
-//   WirelessAccessPoint _buildCurrentAccessPoint() =>
-//       _buildAccessPoint(_status.currentAp, status: _getState(_status.state));
-
-//   WirelessAccessPoint _buildAccessPoint(wlan.Ap accessPoint,
-//       {ConnectionStatus status}) {
-//     return WirelessAccessPoint(
-//         accessPointId: _accessPointId(accessPoint.ssid),
-//         security: accessPoint.isSecure
-//             ? WirelessSecurity.secured
-//             : WirelessSecurity.unsecured,
-//         password: '',
-//         rssi: accessPoint.rssiDbm,
-//         status: status ?? ConnectionStatus.disconnected,
-//         name: accessPoint.ssid);
-//   }
-
-//   void _scan() {
-//     _wlanProxy.scan(const wlan.ScanRequest(timeout: _scanTimeout),
-//         (wlan.ScanResult scanResult) {
-//       _scannedAps = _dedupeAndRemoveIncompatible(scanResult);
-//       notifyListeners();
-//     });
-//   }
-
-//   Future<void> _disconnect() {
-//     Completer completer = Completer();
-//     _wlanProxy.disconnect((wlan.Error error) {
-//       completer.complete();
-//     });
-//     return completer.future;
-//   }
-
-//   Future<bool> _connect(String ssid, [String password]) {
-//     Completer<bool> completer = Completer();
-
-//     final config = wlan.ConnectConfig(
-//         ssid: ssid,
-//         passPhrase: password ?? '',
-//         scanInterval: _connectionScanInterval,
-//         bssid: '');
-
-//     _wlanProxy.connect(config, (result) {
-//       completer.complete(result.code == wlan.ErrCode.ok);
-//     });
-
-//     return completer.future;
-//   }
-// }
-
-// /// Remove duplicate and incompatible networks
-// List<wlan.Ap> _dedupeAndRemoveIncompatible(wlan.ScanResult scanResult) {
-//   List<wlan.Ap> aps = <wlan.Ap>[];
-
-//   if (scanResult.error.code == wlan.ErrCode.ok) {
-//     // First sort APs by signal strength so when we de-dupe we drop the
-//     // weakest ones
-//     scanResult.aps.sort((wlan.Ap a, wlan.Ap b) => b.rssiDbm - a.rssiDbm);
-//     Set<String> seenNames = Set<String>();
-
-//     for (wlan.Ap ap in scanResult.aps) {
-//       // Dedupe: if we've seen this ssid before, skip it.
-//       if (!seenNames.contains(ap.ssid) && ap.isCompatible) {
-//         aps.add(ap);
-//       }
-//       seenNames.add(ap.ssid);
-//     }
-//   }
-//   return aps;
-// }
-
-// ConnectionStatus _getState(wlan.State state) {
-//   switch (state) {
-//     case wlan.State.associated:
-//       return ConnectionStatus.connected;
-//     case wlan.State.associating:
-//     case wlan.State.joining:
-//     case wlan.State.scanning:
-//     case wlan.State.bss:
-//     case wlan.State.querying:
-//     case wlan.State.authenticating:
-//       return ConnectionStatus.connecting;
-//     default:
-//       return ConnectionStatus.unknown;
-//   }
-// }
-
-// int _accessPointId(String ssid) => ssid.hashCode;
diff --git a/lib/setui/settings/service/lib/src/setui_setting_controller.dart b/lib/setui/settings/service/lib/src/setui_setting_controller.dart
deleted file mode 100644
index 931eade..0000000
--- a/lib/setui/settings/service/lib/src/setui_setting_controller.dart
+++ /dev/null
@@ -1,90 +0,0 @@
-import 'dart:async';
-
-import 'package:fidl_fuchsia_setui/fidl.dart';
-import 'package:meta/meta.dart';
-
-/// Controller for a specific setting.
-///
-/// The service instantiates [SetUiSettingController]s mapped to [SettingType]s.
-abstract class SetUiSettingController {
-  final List<SettingListenerProxy> listeners = [];
-
-  @visibleForTesting
-  bool active = false;
-
-  Future<void> addListener(SettingListenerProxy listener) async {
-    if (listeners.isEmpty) {
-      await _initialize();
-    }
-    listeners.add(listener);
-    listener.notify(_getValue());
-  }
-
-  Future<void> notifyListeners() async {
-    listeners.removeWhere((listener) => !listener.ctrl.isBound);
-    for (SettingListenerProxy listener in listeners) {
-      listener.notify(_getValue());
-    }
-    if (listeners.isEmpty) {
-      await _close();
-    }
-  }
-
-  Future<ReturnCode> mutate(Mutation mutation,
-      {MutationHandles handles}) async {
-    if (listeners.isEmpty) {
-      await _initialize();
-    }
-
-    if (!active)
-      throw StateError(
-          'Attempted to mutate state with an uninitialized controller!');
-
-    final result = await applyMutation(mutation, handles: handles);
-
-    if (listeners.isEmpty) {
-      await _close();
-    }
-
-    return result;
-  }
-
-  /// Subclasses should override this to make the changes requested
-  /// by applyMutation, and return once complete.
-  Future<ReturnCode> applyMutation(Mutation mutation,
-      {MutationHandles handles}) async {
-    return ReturnCode.unsupported;
-  }
-
-  /// Initializes the controller.
-  ///
-  /// notifyListeners shouldn't be called in this function, or close
-  /// will be immediately called due to lack of listeners.
-  /// Subclasses should override to apply mutations. By default, the operation
-  /// is ignored and a failure result is returned.
-  Future<void> initialize();
-
-  // Close should stop listening to any underlying services.
-  // [initialize] and [close] can both be called multiple times during the
-  // controller's lifetime
-  Future<void> close();
-
-  Future<void> _initialize() async {
-    await initialize();
-    active = true;
-  }
-
-  Future<void> _close() async {
-    await close();
-    active = false;
-  }
-
-  SettingsObject _getValue() {
-    if (!active)
-      throw StateError(
-          'Attempted to retreive state from an uninitialized controller!');
-    return value;
-  }
-
-  SettingsObject get value;
-}
diff --git a/lib/setui/settings/service/lib/src/timezone_controller.dart b/lib/setui/settings/service/lib/src/timezone_controller.dart
deleted file mode 100644
index a6af4ca..0000000
--- a/lib/setui/settings/service/lib/src/timezone_controller.dart
+++ /dev/null
@@ -1,86 +0,0 @@
-import 'dart:async';
-
-import 'package:fidl_fuchsia_setui/fidl.dart';
-import 'package:fidl_fuchsia_timezone/fidl.dart';
-import 'package:lib.app.dart/app.dart';
-
-import 'setui_setting_controller.dart';
-
-class TimeZoneController extends SetUiSettingController
-    implements TimezoneWatcher {
-  TimezoneProxy _timeZoneProxy;
-
-  static const Map<String, TimeZone> _timeZones = {
-    'US/Pacific': TimeZone(
-        id: 'US/Pacific',
-        name: 'Pacific Standard Time',
-        region: ['San Francisco', 'Seattle', 'Los Angeles']),
-    'US/Eastern': TimeZone(
-        id: 'US/Eastern',
-        name: 'Eastern Standard Time',
-        region: ['Toronto', 'Detroit', 'New York']),
-    'Europe/Paris': TimeZone(
-        id: 'Europe/Paris',
-        name: 'Central European Standard Time',
-        region: ['Paris']),
-    'Australia/Sydney': TimeZone(
-        id: 'Australia/Sydney',
-        name: 'Australian Eastern Standard Time',
-        region: ['Sydney']),
-  };
-
-  String _currentTimeZoneId;
-
-  @override
-  Future<void> close() async {
-    _timeZoneProxy.ctrl.close();
-    _currentTimeZoneId = null;
-  }
-
-  @override
-  Future<void> initialize() async {
-    Completer<void> completer = Completer();
-
-    _timeZoneProxy = TimezoneProxy();
-    connectToService(StartupContext.fromStartupInfo().environmentServices,
-        _timeZoneProxy.ctrl);
-
-    _timeZoneProxy
-      ..watch(TimezoneWatcherBinding().wrap(this))
-      ..getTimezoneId((timezoneId) {
-        _currentTimeZoneId = timezoneId;
-        completer.complete();
-      });
-
-    return completer.future;
-  }
-
-  @override
-  Future<ReturnCode> applyMutation(Mutation mutation,
-      {MutationHandles handles}) async {
-    assert(mutation.timeZoneMutationValue != null);
-
-    final Completer<ReturnCode> completer = Completer<ReturnCode>();
-    final currentTimeZone = mutation.timeZoneMutationValue.value.current;
-    final newId = currentTimeZone != null ? currentTimeZone.id : 0;
-
-    _timeZoneProxy.setTimezone(newId, (success) {
-      completer.complete(ReturnCode.ok);
-    });
-
-    return completer.future;
-  }
-
-  @override
-  SettingsObject get value => SettingsObject(
-      settingType: SettingType.timeZone,
-      data: SettingData.withTimeZoneValue(TimeZoneInfo(
-          available: _timeZones.values.toList(),
-          current: _timeZones[_currentTimeZoneId])));
-
-  @override
-  void onTimezoneOffsetChange(String timezoneId) {
-    _currentTimeZoneId = timezoneId;
-    notifyListeners();
-  }
-}
diff --git a/lib/setui/settings/service/pubspec.yaml b/lib/setui/settings/service/pubspec.yaml
deleted file mode 100644
index a53fec4..0000000
--- a/lib/setui/settings/service/pubspec.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.
-
-# Dummy for Dart analysis server.
diff --git a/lib/setui/settings/service/test/intl/intl_settings_util_test.dart b/lib/setui/settings/service/test/intl/intl_settings_util_test.dart
deleted file mode 100644
index 6ca31ec..0000000
--- a/lib/setui/settings/service/test/intl/intl_settings_util_test.dart
+++ /dev/null
@@ -1,85 +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:fidl_fuchsia_setui/fidl.dart';
-import 'package:test/test.dart';
-import 'package:lib_setui_service/src/intl/intl_settings_util.dart' as util;
-
-// ignore_for_file: implementation_imports
-
-void main() {
-  group('Intl settings util', () {
-    test('setLocales() works', () {
-      const before = IntlSettings(
-          locales: ['en-US', 'es-MX', 'fr-FR', 'ru-RU'],
-          hourCycle: HourCycle.h12,
-          temperatureUnit: TemperatureUnit.celsius);
-      const expected = IntlSettings(
-          locales: ['en-US', 'fr-FR', 'ru-RU', 'es-MX'],
-          hourCycle: HourCycle.h12,
-          temperatureUnit: TemperatureUnit.celsius);
-      expect(
-          util.setLocales(before,
-              LocalesMutation(locales: ['en-US', 'fr-FR', 'ru-RU', 'es-MX'])),
-          equals(expected));
-    });
-
-    test('setHourCycle() works', () {
-      const before = IntlSettings(
-          locales: ['en-US', 'es-MX'],
-          hourCycle: HourCycle.h12,
-          temperatureUnit: TemperatureUnit.celsius);
-      const expected = IntlSettings(
-          locales: ['en-US', 'es-MX'],
-          hourCycle: HourCycle.h23,
-          temperatureUnit: TemperatureUnit.celsius);
-      expect(
-          util.setHourCycle(
-              before, HourCycleMutation(hourCycle: HourCycle.h23)),
-          equals(expected));
-    });
-
-    test('setTemperatureUnit() works', () {
-      const before = IntlSettings(
-          locales: ['en-US', 'es-MX'],
-          hourCycle: HourCycle.h12,
-          temperatureUnit: TemperatureUnit.celsius);
-      const expected = IntlSettings(
-          locales: ['en-US', 'es-MX'],
-          hourCycle: HourCycle.h12,
-          temperatureUnit: TemperatureUnit.fahrenheit);
-      expect(
-          util.setTemperatureUnit(
-              before,
-              TemperatureUnitMutation(
-                  temperatureUnit: TemperatureUnit.fahrenheit)),
-          equals(expected));
-    });
-
-    test('toJson() works', () {
-      const settings = IntlSettings(
-          locales: ['en-US', 'es-MX'],
-          hourCycle: HourCycle.h23,
-          temperatureUnit: TemperatureUnit.fahrenheit);
-      const expected =
-          '{"locales":["en-US","es-MX"],"hour_cycle":"h23","temperature_unit":"fahrenheit"}';
-      expect(util.toJson(settings), equals(expected));
-    });
-
-    test('fromJson() works', () {
-      const json = '''
-      {
-        "locales": ["en-US", "es-MX"],
-        "hour_cycle": "h23",
-        "temperature_unit": "fahrenheit"
-      }
-      ''';
-      const expected = IntlSettings(
-          locales: ['en-US', 'es-MX'],
-          hourCycle: HourCycle.h23,
-          temperatureUnit: TemperatureUnit.fahrenheit);
-      expect(util.fromJson(json), equals(expected));
-    });
-  });
-}
diff --git a/lib/setui/settings/service/test/intl_controller_test.dart b/lib/setui/settings/service/test/intl_controller_test.dart
deleted file mode 100644
index e727d87..0000000
--- a/lib/setui/settings/service/test/intl_controller_test.dart
+++ /dev/null
@@ -1,134 +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:fidl/src/interface.dart';
-import 'package:fidl_fuchsia_setui/fidl.dart';
-import 'package:fidl_fuchsia_stash/fidl.dart';
-import 'package:lib_setui_service/src/intl_controller.dart';
-import 'package:lib_setui_service/src/intl/intl_settings_util.dart';
-import 'package:mockito/mockito.dart';
-import 'package:test/test.dart';
-
-// ignore_for_file: implementation_imports
-
-const String _stashKey = IntlSettingsController.stashKey;
-
-void main() async {
-  IntlSettingsController controller;
-  _MockStoreAccessorWrapper storeAccessorWrapper;
-  _FakeStoreAccessor storeAccessor;
-
-  setUp(() {
-    storeAccessor = _FakeStoreAccessor();
-    storeAccessorWrapper = _MockStoreAccessorWrapper();
-    when(storeAccessorWrapper.accessor).thenReturn(storeAccessor);
-    StoreAccessorWrapper provider() => storeAccessorWrapper;
-    controller = IntlSettingsController.withStashProvider(provider);
-  });
-
-  group('Intl controller', () {
-    test('initialize() reads existing settings from Stash', () {
-      const IntlSettings settings = IntlSettings(
-          locales: ['en-US', 'es-MX'],
-          hourCycle: HourCycle.h23,
-          temperatureUnit: TemperatureUnit.fahrenheit);
-
-      storeAccessor
-        ..setValue(_stashKey, Value.withStringval(toJson(settings)))
-        ..commit();
-
-      controller.initialize();
-      const SettingsObject expected = SettingsObject(
-          settingType: SettingType.intl, data: SettingData.withIntl(settings));
-      expect(expected, equals(controller.value));
-    });
-
-    test('applyMutation() writes to Stash', () {
-      const IntlSettings initialSettings = IntlSettings(
-          locales: ['en-US', 'es-MX'],
-          hourCycle: HourCycle.h23,
-          temperatureUnit: TemperatureUnit.fahrenheit);
-
-      storeAccessor
-        ..setValue(_stashKey, Value.withStringval(toJson(initialSettings)))
-        ..commit();
-
-      controller
-        ..initialize()
-        ..applyMutation(Mutation.withLocalesMutationValue(
-            LocalesMutation(locales: ['en-US', 'es-MX', 'fr-FR'])));
-
-      final expected = Value.withStringval(toJson(IntlSettings(
-          locales: ['en-US', 'es-MX', 'fr-FR'],
-          hourCycle: HourCycle.h23,
-          temperatureUnit: TemperatureUnit.fahrenheit)));
-      expect(storeAccessor.getValueDirectly(_stashKey), equals(expected));
-    });
-
-    test('close() closes Stash channels', () {
-      bool isClosed = false;
-      void stubClose() {
-        isClosed = true;
-      }
-
-      when(storeAccessorWrapper.close).thenReturn(stubClose);
-
-      controller
-        ..initialize()
-        ..close();
-
-      expect(isClosed, isTrue);
-    });
-  });
-}
-
-/// Fake implementation of [StoreAccessor] (synchronous) that just uses
-/// in-memory maps.
-class _FakeStoreAccessor implements StoreAccessor {
-  Map<String, Value> committedValues = {};
-  Map<String, Value> pendingValues = {};
-
-  @override
-  void getValue(String key, void Function(Value val) callback) {
-    callback(getValueDirectly(key));
-  }
-
-  /// Get a value without using a callback.
-  Value getValueDirectly(String key) {
-    return committedValues[key];
-  }
-
-  @override
-  void setValue(String key, Value val) {
-    pendingValues[key] = val;
-  }
-
-  @override
-  void commit() {
-    committedValues.addAll(pendingValues);
-    pendingValues.clear();
-  }
-
-  @override
-  void deletePrefix(String prefix) {
-    throw UnimplementedError();
-  }
-
-  @override
-  void deleteValue(String key) {
-    throw UnimplementedError();
-  }
-
-  @override
-  void getPrefix(String prefix, InterfaceRequest<GetIterator> it) {
-    throw UnimplementedError();
-  }
-
-  @override
-  void listPrefix(String prefix, InterfaceRequest<ListIterator> it) {
-    throw UnimplementedError();
-  }
-}
-
-class _MockStoreAccessorWrapper extends Mock implements StoreAccessorWrapper {}
diff --git a/lib/setui/settings/service/test/network_controller_test.dart b/lib/setui/settings/service/test/network_controller_test.dart
deleted file mode 100644
index 87b4d3c..0000000
--- a/lib/setui/settings/service/test/network_controller_test.dart
+++ /dev/null
@@ -1,187 +0,0 @@
-import 'dart:typed_data';
-
-import 'package:fidl/src/interface.dart';
-import 'package:fidl_fuchsia_setui/fidl.dart';
-import 'package:fidl_fuchsia_wlan_mlme/fidl.dart' as mlme;
-import 'package:fidl_fuchsia_wlan_service/fidl.dart';
-import 'package:lib_setui_service/src/network_controller.dart';
-import 'package:mockito/mockito.dart';
-import 'package:test/test.dart';
-
-// ignore_for_file: implementation_imports
-
-const String defaultValue = 'default';
-
-const String value1 = 'value1';
-
-void main() async {
-  NetworkController controller;
-  MockWlanProxy proxy;
-  SettingListenerObject object;
-
-  setUp(() async {
-    proxy = MockWlanProxy();
-    controller = NetworkController();
-    object = SettingListenerObject();
-
-    controller.listeners.add(object);
-    controller.active = true;
-  });
-
-  group('Network controller', () {
-    test('can get settings object', () async {
-      when(proxy.status(any)).thenAnswer((invocation) {
-        void Function(WlanStatus) callback =
-            invocation.positionalArguments.first;
-        callback(_status());
-      });
-
-      when(proxy.scan(any, any)).thenAnswer((invocation) {
-        void Function(ScanResult) callback = invocation.positionalArguments[1];
-        callback(
-            ScanResult(error: Error(code: ErrCode.ok, description: ''), aps: [
-          _buildAp('a', rssiDbm: 11),
-          // Should be deduped by the other one
-          _buildAp('a', rssiDbm: 5),
-          // Shouldn't be included because incompatible
-          _buildAp('b', isCompatible: false),
-          _buildAp('c', isSecure: true)
-        ]));
-      });
-
-      await controller.initializeWithService(() async => proxy);
-
-      final settingsObject = controller.value;
-
-      expect(settingsObject.settingType, SettingType.wireless);
-      expect(settingsObject.data.wireless, isNotNull);
-      expect(settingsObject.data.wireless.accessPoints.length, 2);
-
-      int matchedPoints = 0;
-      for (WirelessAccessPoint accessPoint
-          in settingsObject.data.wireless.accessPoints) {
-        if (accessPoint.name == 'a') {
-          matchedPoints++;
-          expect(accessPoint.rssi, 11);
-          expect(accessPoint.security, WirelessSecurity.unsecured);
-        } else if (accessPoint.name == 'c') {
-          matchedPoints++;
-          expect(accessPoint.rssi, 8);
-          expect(accessPoint.security, WirelessSecurity.secured);
-        }
-      }
-      expect(matchedPoints, 2);
-    });
-
-    test('will call service when disconnecting', () async {
-      when(proxy.status(any)).thenAnswer((invocation) {
-        void Function(WlanStatus) callback =
-            invocation.positionalArguments.first;
-        callback(WlanStatus(
-            error: Error(code: ErrCode.ok, description: ''),
-            state: State.associated,
-            currentAp: _buildAp('a')));
-      });
-
-      await controller.initializeWithService(() async => proxy);
-      final currentAp = controller.value.data.wireless.accessPoints.first;
-
-      when(proxy.disconnect(any)).thenAnswer((invocation) {
-        void Function(Error) callback = invocation.positionalArguments.first;
-        callback(Error(code: ErrCode.ok, description: ''));
-      });
-
-      await controller.setSetting(SettingsObject(
-          settingType: SettingType.wireless,
-          data: SettingData.withWireless(WirelessState(accessPoints: [
-            WirelessAccessPoint.clone(currentAp,
-                status: ConnectionStatus.disconnected)
-          ]))));
-
-      verify(proxy.disconnect(any)).called(1);
-    });
-
-    test('will call service when connecting', () async {
-      const password = 'password';
-
-      when(proxy.status(any)).thenAnswer((invocation) {
-        void Function(WlanStatus) callback =
-            invocation.positionalArguments.first;
-        callback(_status());
-      });
-
-      when(proxy.scan(any, any)).thenAnswer((invocation) {
-        void Function(ScanResult) callback = invocation.positionalArguments[1];
-        callback(ScanResult(
-            error: Error(code: ErrCode.ok, description: ''),
-            aps: [_buildAp('c', isSecure: true)]));
-      });
-
-      await controller.initializeWithService(() async => proxy);
-      final currentAp = controller.value.data.wireless.accessPoints.first;
-
-      when(proxy.connect(any, any)).thenAnswer((invocation) {
-        final ConnectConfig connectConfig =
-            invocation.positionalArguments.first;
-
-        expect(connectConfig.passPhrase, password);
-
-        void Function(Error) callback = invocation.positionalArguments[1];
-        callback(Error(code: ErrCode.ok, description: ''));
-      });
-
-      await controller.setSetting(SettingsObject(
-          settingType: SettingType.wireless,
-          data: SettingData.withWireless(WirelessState(accessPoints: [
-            WirelessAccessPoint.clone(currentAp,
-                password: password, status: ConnectionStatus.connected)
-          ]))));
-
-      verify(proxy.connect(any, any)).called(1);
-    });
-  });
-
-  tearDown(() {
-    controller.close();
-  });
-}
-
-WlanStatus _status() {
-  return WlanStatus(
-      error: Error(code: ErrCode.ok, description: ''), state: State.scanning);
-}
-
-Ap _buildAp(String ssid,
-        {bool isCompatible = true, bool isSecure = false, int rssiDbm = 8}) =>
-    Ap(
-      ssid: ssid,
-      rssiDbm: rssiDbm,
-      chan: mlme.WlanChan(primary: 32, secondary80: 18, cbw: mlme.Cbw.cbw80),
-      isCompatible: isCompatible,
-      isSecure: isSecure,
-      bssid: Uint8List.fromList([32, 0]),
-    );
-
-class MockWlanProxy extends Mock implements WlanProxy {}
-
-class MockProxyController<T> extends Mock implements ProxyController<T> {}
-
-class SettingListenerObject implements SettingListenerProxy {
-  SettingsObject object;
-  MockProxyController<SettingListener> controller =
-      MockProxyController<SettingListener>();
-
-  SettingListenerObject() {
-    when(controller.isBound).thenReturn(true);
-  }
-
-  @override
-  ProxyController<SettingListener> get ctrl => controller;
-
-  // This shouldn't be a setter since it overrides a different field.
-  // ignore: use_setters_to_change_properties
-  @override
-  void notify(SettingsObject object) {
-    this.object = object;
-  }
-}
diff --git a/lib/setui/settings/testing/BUILD.gn b/lib/setui/settings/testing/BUILD.gn
deleted file mode 100644
index 30057a7..0000000
--- a/lib/setui/settings/testing/BUILD.gn
+++ /dev/null
@@ -1,34 +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("//build/dart/dart_library.gni")
-import("//topaz/runtime/dart/flutter_test.gni")
-
-dart_library("testing") {
-  package_name = "lib_setui_settings_testing"
-
-  sources = [
-    "mock_setting_adapter.dart",
-  ]
-
-  deps = [
-    "//sdk/fidl/fuchsia.setui",
-    "//topaz/lib/setui/settings/client:client",
-    "//topaz/lib/setui/settings/common:common",
-  ]
-}
-
-flutter_test("lib_setui_settings_testing_test") {
-  sources = [
-    "mock_setting_adapter_test.dart",
-  ]
-
-  deps = [
-    ":testing",
-    "//sdk/fidl/fuchsia.setui",
-    "//third_party/dart-pkg/git/flutter/packages/flutter_test",
-    "//third_party/dart-pkg/pub/test",
-    "//topaz/lib/setui/settings/common:common",
-  ]
-}
diff --git a/lib/setui/settings/testing/analysis_options.yaml b/lib/setui/settings/testing/analysis_options.yaml
deleted file mode 100644
index 49a21d7..0000000
--- a/lib/setui/settings/testing/analysis_options.yaml
+++ /dev/null
@@ -1,6 +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: ../analysis_options.yaml
-
diff --git a/lib/setui/settings/testing/lib/mock_setting_adapter.dart b/lib/setui/settings/testing/lib/mock_setting_adapter.dart
deleted file mode 100644
index 8e5aa24..0000000
--- a/lib/setui/settings/testing/lib/mock_setting_adapter.dart
+++ /dev/null
@@ -1,143 +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:fidl_fuchsia_setui/fidl.dart';
-import 'package:lib_setui_settings_common/setting_adapter.dart';
-import 'package:lib_setui_settings_common/setting_source.dart';
-
-typedef LogAction = void Function();
-typedef LogExecutor = void Function(Duration delay, LogAction action);
-
-/// An adapter that can be preconfigured to return set values.
-class MockSettingAdapter implements SettingAdapter {
-  final Map<SettingType, SettingSource> _sources = {};
-  final Map<int, Completer<UpdateResponse>> _activeResponses = {};
-  final Map<int, Completer<MutationResponse>> _activeMutationResponses = {};
-  final List<AdapterLog> logs;
-  final LogExecutor executor;
-
-  /// Default constructor to execute provided [AdapterLog]s. A [LogExecutor] may
-  /// be provided to override the default behavior of executing server logs
-  /// based on their time relationship with the closest user action keyframe.
-  MockSettingAdapter(this.logs, {this.executor = _logExecute});
-
-  @override
-  SettingSource<T> fetch<T>(SettingType settingType) {
-    if (!_sources.containsKey(settingType)) {
-      _sources[settingType] = SettingSource<T>();
-    }
-
-    // Immediately unwind to the matching fetch
-    _unwindTo((AdapterLog log) =>
-        log.type == AdapterLogType.fetch && log.fetchLog.type == settingType);
-
-    if (logs.isNotEmpty) {
-      // Unwind in relation to the found fetch log.
-      final AdapterLog log = logs.removeAt(0);
-      _unwindTo((AdapterLog log) => log.fromClient, keyFrame: log.time);
-    }
-    return _sources[settingType];
-  }
-
-  @override
-  Future<UpdateResponse> update(SettingsObject updatedSetting) {
-    final Completer<UpdateResponse> completer = Completer<UpdateResponse>();
-
-    // Unwind to the matching update log.
-    _unwindTo((AdapterLog log) {
-      return log.type == AdapterLogType.update &&
-          log.updateLog.settings.settingType == updatedSetting.settingType;
-    });
-
-    if (logs.isEmpty) {
-      completer.complete(null);
-    } else {
-      final AdapterLog log = logs.removeAt(0);
-
-      _activeResponses[log.updateLog.id] = completer;
-
-      // Unwind to the next client log.
-      _unwindTo((AdapterLog log) => log.fromClient, keyFrame: log.time);
-    }
-    return completer.future;
-  }
-
-  @override
-  Future<MutationResponse> mutate(SettingType settingType, Mutation mutation,
-      {MutationHandles handles}) {
-    final Completer<MutationResponse> completer = Completer<MutationResponse>();
-
-    // Unwind to the matching update log.
-    _unwindTo((AdapterLog log) {
-      return log.type == AdapterLogType.mutation &&
-          log.mutationLog.settingType == settingType;
-    });
-
-    if (logs.isEmpty) {
-      completer.complete(null);
-    } else {
-      final AdapterLog log = logs.removeAt(0);
-
-      _activeMutationResponses[log.mutationLog.id] = completer;
-
-      // Unwind to the next client log.
-      _unwindTo((AdapterLog log) => log.fromClient, keyFrame: log.time);
-    }
-    return completer.future;
-  }
-
-  /// Replays logs up to the log which matches the conditions provided by the
-  /// input match function. The keyframe provides a time reference which events
-  /// will be temporally executed against.
-  void _unwindTo(bool match(AdapterLog log), {DateTime keyFrame}) {
-    while (logs.isNotEmpty && !match(logs.first)) {
-      _processLog(keyFrame, logs.removeAt(0));
-    }
-  }
-
-  void _processLog(DateTime keyFrame, AdapterLog log) {
-    LogAction action;
-
-    switch (log.type) {
-      case AdapterLogType.response:
-        action = () {
-          final Completer completer =
-              _activeResponses[log.responseLog.updateId];
-          if (completer == null) {
-            return;
-          }
-
-          completer.complete(log.responseLog.response);
-        };
-        break;
-      case AdapterLogType.mutationResponse:
-        action = () {
-          final Completer completer =
-              _activeMutationResponses[log.mutationResponseLog.mutationId];
-          if (completer == null) {
-            return;
-          }
-
-          completer.complete(log.mutationResponseLog.response);
-        };
-        break;
-      case AdapterLogType.setting:
-        action = () => _sources[log.settingLog.settings.settingType]
-            .notify(log.settingLog.settings);
-        break;
-    }
-
-    if (action != null) {
-      executor(keyFrame != null ? log.time.difference(keyFrame) : Duration.zero,
-          action);
-    }
-  }
-
-  /// Default playback mechanism, executing action after specified delay.
-  static void _logExecute(Duration delay, LogAction action) {
-    Future.delayed(delay, action);
-  }
-}
diff --git a/lib/setui/settings/testing/pubspec.yaml b/lib/setui/settings/testing/pubspec.yaml
deleted file mode 100644
index fd4bc0e..0000000
--- a/lib/setui/settings/testing/pubspec.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.
-
-name: settings_testing
diff --git a/lib/setui/settings/testing/test/mock_setting_adapter_test.dart b/lib/setui/settings/testing/test/mock_setting_adapter_test.dart
deleted file mode 100644
index 2e5520c..0000000
--- a/lib/setui/settings/testing/test/mock_setting_adapter_test.dart
+++ /dev/null
@@ -1,99 +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_setui/fidl.dart';
-import 'package:lib_setui_settings_common/setting_adapter.dart';
-import 'package:lib_setui_settings_common/setting_source.dart';
-import 'package:lib_setui_settings_testing/mock_setting_adapter.dart';
-import 'package:test/test.dart';
-
-void main() {
-  /// The following test ensures events are executed and held according to the
-  /// replay timeline. In the following scenario, we should see the following:
-  /// 1. client fetch of time zone
-  /// 2. time zone update from server
-  /// 3. client fetch of connectivity
-  /// 4. time zone update from server
-  /// 5. connectivity update from server.
-  test('test_log_test', () async {
-    final List<AdapterLog> logs = [];
-
-    final DateTime epoch = DateTime.now();
-
-    final TimeZone tz1 = TimeZone(region: [], id: 'tz1', name: 'timezone1');
-    final TimeZone tz2 = TimeZone(region: [], id: 'tz2', name: 'timezone2');
-
-    final SettingsObject tzSettings1 = SettingsObject(
-        settingType: SettingType.timeZone,
-        data: SettingData.withTimeZoneValue(
-            TimeZoneInfo(available: [tz1], current: null)));
-
-    final SettingsObject tzSettings2 = SettingsObject(
-        settingType: SettingType.timeZone,
-        data: SettingData.withTimeZoneValue(
-            TimeZoneInfo(available: [tz1, tz2], current: tz1)));
-
-    final SettingsObject connectivitySettings1 = SettingsObject(
-        settingType: SettingType.connectivity,
-        data: SettingData.withConnectivity(
-            ConnectedState(reachability: Reachability.wan)));
-
-    logs
-      ..add(AdapterLog.withFetch(
-          epoch.add(Duration(seconds: 1)), FetchLog(SettingType.timeZone)))
-      ..add(AdapterLog.withSetting(
-          epoch.add(Duration(seconds: 2)), SettingLog(tzSettings1)))
-      ..add(AdapterLog.withFetch(
-          epoch.add(Duration(seconds: 3)), FetchLog(SettingType.connectivity)))
-      ..add(AdapterLog.withSetting(
-          epoch.add(Duration(seconds: 4)), SettingLog(tzSettings2)))
-      ..add(AdapterLog.withSetting(
-          epoch.add(Duration(seconds: 5)), SettingLog(connectivitySettings1)));
-
-    TestExecutor executor = TestExecutor();
-
-    final MockSettingAdapter adapter =
-        MockSettingAdapter(logs, executor: executor.capture);
-
-    // 1. Fetch time zone
-    final SettingSource<TimeZoneInfo> tzSource =
-        adapter.fetch(SettingType.timeZone);
-
-    expect(executor.actions.length, 1);
-
-    // 2. Time zone returned from server
-    executor.playback();
-    expect(tzSource.state, tzSettings1.data.timeZoneValue);
-
-    // 3. Fetch connectivity
-    final SettingSource<ConnectedState> connectedSource =
-        adapter.fetch(SettingType.connectivity);
-
-    expect(executor.actions.length, 2);
-
-    // 4. Time zone returned from server
-    executor.playback();
-    expect(tzSource.state, tzSettings2.data.timeZoneValue);
-
-    // 5. Connectivity returned from server
-    executor.playback();
-    expect(connectedSource.state, connectivitySettings1.data.connectivity);
-  });
-}
-
-class TestExecutor {
-  List<LogAction> actions = [];
-
-  void capture(Duration delay, LogAction action) {
-    actions.add(action);
-  }
-
-  void playback() {
-    if (actions.isEmpty) {
-      return;
-    }
-
-    actions.removeAt(0)();
-  }
-}
diff --git a/packages/tests/BUILD.gn b/packages/tests/BUILD.gn
index 6c8a36b..4703d2b 100644
--- a/packages/tests/BUILD.gn
+++ b/packages/tests/BUILD.gn
@@ -27,10 +27,6 @@
     "//topaz/lib/keyboard/flutter:keyboard_test($host_toolchain)",
     "//topaz/lib/setui/common:lib_setui_common_test($host_toolchain)",
     "//topaz/lib/setui/flutter:lib_setui_flutter_test($host_toolchain)",
-    "//topaz/lib/setui/settings/client:lib_setui_settings_client_test($host_toolchain)",
-    "//topaz/lib/setui/settings/common:lib_setui_settings_common_test($host_toolchain)",
-    "//topaz/lib/setui/settings/service:lib_setui_service_test($host_toolchain)",
-    "//topaz/lib/setui/settings/testing:lib_setui_settings_testing_test($host_toolchain)",
     "//topaz/lib/tiler:tiler_unittests($host_toolchain)",
     "//topaz/public/dart/composition_delegate:composition_delegate_tests($host_toolchain)",
     "//topaz/public/dart/fuchsia_inspect:fuchsia_inspect_package_unittests($host_toolchain)",
diff --git a/packages/tests/dart_unittests b/packages/tests/dart_unittests
index c5efb47..4bf285f 100644
--- a/packages/tests/dart_unittests
+++ b/packages/tests/dart_unittests
@@ -5,10 +5,6 @@
       "//topaz/lib/keyboard/flutter:keyboard_test",
       "//topaz/lib/setui/common:lib_setui_common_test",
       "//topaz/lib/setui/flutter:lib_setui_flutter_test",
-      "//topaz/lib/setui/settings/client:lib_setui_settings_client_test",
-      "//topaz/lib/setui/settings/common:lib_setui_settings_common_test",
-      "//topaz/lib/setui/settings/service:lib_setui_service_test",
-      "//topaz/lib/setui/settings/testing:lib_setui_settings_testing_test",
       "//topaz/public/dart/composition_delegate:composition_delegate_tests",
       "//topaz/public/dart/fuchsia_inspect:fuchsia_inspect_package_unittests",
       "//topaz/public/dart/fuchsia_logger:fuchsia_logger_package_unittests",
