Clean up code organization in flutter_tools

1) Moved basic utility code into base/ directory to make it clear which code
   doesn't depend on Flutter-specific knowldge.
2) Move the CommandRunner subclasses into a runner/ directory because these
   aren't commands themselves.
diff --git a/packages/flutter_tools/lib/executable.dart b/packages/flutter_tools/lib/executable.dart
index 02c7aa0..9a28466 100644
--- a/packages/flutter_tools/lib/executable.dart
+++ b/packages/flutter_tools/lib/executable.dart
@@ -9,12 +9,12 @@
 import 'package:logging/logging.dart';
 import 'package:stack_trace/stack_trace.dart';
 
+import 'src/base/process.dart';
 import 'src/commands/analyze.dart';
 import 'src/commands/apk.dart';
 import 'src/commands/build.dart';
 import 'src/commands/cache.dart';
 import 'src/commands/daemon.dart';
-import 'src/commands/flutter_command_runner.dart';
 import 'src/commands/init.dart';
 import 'src/commands/install.dart';
 import 'src/commands/list.dart';
@@ -26,7 +26,7 @@
 import 'src/commands/test.dart';
 import 'src/commands/trace.dart';
 import 'src/commands/upgrade.dart';
-import 'src/process.dart';
+import 'src/runner/flutter_command_runner.dart';
 
 /// Main entry point for commands.
 ///
diff --git a/packages/flutter_tools/lib/src/application_package.dart b/packages/flutter_tools/lib/src/application_package.dart
index ac25746..ab62a4e 100644
--- a/packages/flutter_tools/lib/src/application_package.dart
+++ b/packages/flutter_tools/lib/src/application_package.dart
@@ -4,14 +4,11 @@
 
 import 'dart:async';
 
-import 'package:logging/logging.dart';
 import 'package:path/path.dart' as path;
 
 import 'artifacts.dart';
 import 'build_configuration.dart';
 
-final Logger _logging = new Logger('flutter_tools.application_package');
-
 abstract class ApplicationPackage {
   /// Path to the actual apk or bundle.
   final String localPath;
diff --git a/packages/flutter_tools/lib/src/artifacts.dart b/packages/flutter_tools/lib/src/artifacts.dart
index 345a527..e66658d 100644
--- a/packages/flutter_tools/lib/src/artifacts.dart
+++ b/packages/flutter_tools/lib/src/artifacts.dart
@@ -6,14 +6,12 @@
 import 'dart:io';
 
 import 'package:archive/archive.dart';
-import 'package:logging/logging.dart';
 import 'package:path/path.dart' as path;
 
 import 'build_configuration.dart';
-import 'os_utils.dart';
-import 'process.dart';
-
-final Logger _logging = new Logger('flutter_tools.artifacts');
+import 'base/os.dart';
+import 'base/process.dart';
+import 'base/logging.dart';
 
 String _getNameForHostPlatform(HostPlatform platform) {
   switch (platform) {
@@ -221,12 +219,12 @@
   /// and extract it to the local cache.
   static Future _doDownloadArtifactsFromZip(String platform) async {
     String url = getCloudStorageBaseUrl(platform) + 'artifacts.zip';
-    _logging.info('Downloading $url.');
+    logging.info('Downloading $url.');
 
     HttpClient httpClient = new HttpClient();
     HttpClientRequest request = await httpClient.getUrl(Uri.parse(url));
     HttpClientResponse response = await request.close();
-    _logging.fine('Received response statusCode=${response.statusCode}');
+    logging.fine('Received response statusCode=${response.statusCode}');
     if (response.statusCode != 200)
       throw new Exception(response.reasonPhrase);
 
@@ -246,7 +244,7 @@
 
     for (Artifact artifact in knownArtifacts) {
       if (artifact.platform == platform && artifact.executable) {
-        ProcessResult result = osUtils.makeExecutable(
+        ProcessResult result = os.makeExecutable(
             new File(path.join(cacheDir.path, artifact.fileName)));
         if (result.exitCode != 0)
           throw new Exception(result.stderr);
@@ -270,7 +268,7 @@
 
   static Directory _getBaseCacheDir() {
     if (flutterRoot == null) {
-      _logging.severe('FLUTTER_ROOT not specified. Cannot find artifact cache.');
+      logging.severe('FLUTTER_ROOT not specified. Cannot find artifact cache.');
       throw new ProcessExit(2);
     }
     Directory cacheDir = new Directory(path.join(flutterRoot, 'bin', 'cache', 'artifacts'));
@@ -296,7 +294,7 @@
     if (!cachedFile.existsSync()) {
       await _downloadArtifactsFromZip(artifact.platform);
       if (!cachedFile.existsSync()) {
-        _logging.severe('File not found in the platform artifacts: ${cachedFile.path}');
+        logging.severe('File not found in the platform artifacts: ${cachedFile.path}');
         throw new ProcessExit(2);
       }
     }
@@ -305,7 +303,7 @@
 
   static void clear() {
     Directory cacheDir = _getBaseCacheDir();
-    _logging.fine('Clearing cache directory ${cacheDir.path}');
+    logging.fine('Clearing cache directory ${cacheDir.path}');
     cacheDir.deleteSync(recursive: true);
   }
 
diff --git a/packages/flutter_tools/lib/src/file_system.dart b/packages/flutter_tools/lib/src/base/file_system.dart
similarity index 100%
rename from packages/flutter_tools/lib/src/file_system.dart
rename to packages/flutter_tools/lib/src/base/file_system.dart
diff --git a/packages/flutter_tools/lib/src/base/logging.dart b/packages/flutter_tools/lib/src/base/logging.dart
new file mode 100644
index 0000000..4774b4e
--- /dev/null
+++ b/packages/flutter_tools/lib/src/base/logging.dart
@@ -0,0 +1,7 @@
+// Copyright 2015 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 'package:logging/logging.dart';
+
+final Logger logging = new Logger('flutter_tools');
diff --git a/packages/flutter_tools/lib/src/os_utils.dart b/packages/flutter_tools/lib/src/base/os.dart
similarity index 83%
rename from packages/flutter_tools/lib/src/os_utils.dart
rename to packages/flutter_tools/lib/src/base/os.dart
index 6b5a986..a60f923 100644
--- a/packages/flutter_tools/lib/src/os_utils.dart
+++ b/packages/flutter_tools/lib/src/base/os.dart
@@ -4,11 +4,7 @@
 
 import 'dart:io';
 
-import 'package:logging/logging.dart';
-
-final OperatingSystemUtils osUtils = new OperatingSystemUtils._();
-
-final Logger _logging = new Logger('flutter_tools.os');
+final OperatingSystemUtils os = new OperatingSystemUtils._();
 
 abstract class OperatingSystemUtils {
   factory OperatingSystemUtils._() {
diff --git a/packages/flutter_tools/lib/src/process.dart b/packages/flutter_tools/lib/src/base/process.dart
similarity index 88%
rename from packages/flutter_tools/lib/src/process.dart
rename to packages/flutter_tools/lib/src/base/process.dart
index 0dd6cfb..84e4b6a 100644
--- a/packages/flutter_tools/lib/src/process.dart
+++ b/packages/flutter_tools/lib/src/base/process.dart
@@ -6,9 +6,7 @@
 import 'dart:convert';
 import 'dart:io';
 
-import 'package:logging/logging.dart';
-
-final Logger _logging = new Logger('flutter_tools.process');
+import 'logging.dart';
 
 /// This runs the command and streams stdout/stderr from the child process to
 /// this process' stdout/stderr.
@@ -17,7 +15,7 @@
   RegExp filter,
   String workingDirectory
 }) async {
-  _logging.info(cmd.join(' '));
+  logging.info(cmd.join(' '));
   Process process = await Process.start(
     cmd[0],
     cmd.sublist(1),
@@ -49,13 +47,13 @@
 Future runAndKill(List<String> cmd, Duration timeout) {
   Future<Process> proc = runDetached(cmd);
   return new Future.delayed(timeout, () async {
-    _logging.info('Intentionally killing ${cmd[0]}');
+    logging.info('Intentionally killing ${cmd[0]}');
     Process.killPid((await proc).pid);
   });
 }
 
 Future<Process> runDetached(List<String> cmd) {
-  _logging.info(cmd.join(' '));
+  logging.info(cmd.join(' '));
   Future<Process> proc = Process.start(
       cmd[0], cmd.getRange(1, cmd.length).toList(),
       mode: ProcessStartMode.DETACHED);
@@ -81,20 +79,20 @@
   bool checked: false,
   String workingDirectory
 }) {
-  _logging.info(cmd.join(' '));
+  logging.info(cmd.join(' '));
   ProcessResult results =
       Process.runSync(cmd[0], cmd.getRange(1, cmd.length).toList(), workingDirectory: workingDirectory);
   if (results.exitCode != 0) {
     String errorDescription = 'Error code ${results.exitCode} '
         'returned when attempting to run command: ${cmd.join(' ')}';
-    _logging.info(errorDescription);
+    logging.info(errorDescription);
     if (results.stderr.length > 0)
-      _logging.info('Errors logged: ${results.stderr.trim()}');
+      logging.info('Errors logged: ${results.stderr.trim()}');
     if (checked)
       throw errorDescription;
   }
   if (results.stdout.trim().isNotEmpty)
-    _logging.fine(results.stdout.trim());
+    logging.fine(results.stdout.trim());
   return results.stdout;
 }
 
diff --git a/packages/flutter_tools/lib/src/build_configuration.dart b/packages/flutter_tools/lib/src/build_configuration.dart
index 374fbb4..cb04dd5 100644
--- a/packages/flutter_tools/lib/src/build_configuration.dart
+++ b/packages/flutter_tools/lib/src/build_configuration.dart
@@ -4,10 +4,9 @@
 
 import 'dart:io';
 
-import 'package:logging/logging.dart';
 import 'package:path/path.dart' as path;
 
-final Logger _logging = new Logger('flutter_tools.build_configuration');
+import 'base/logging.dart';
 
 enum BuildType {
   prebuilt,
@@ -33,7 +32,7 @@
     return HostPlatform.mac;
   if (Platform.isLinux)
     return HostPlatform.linux;
-  _logging.warning('Unsupported host platform, defaulting to Linux');
+  logging.warning('Unsupported host platform, defaulting to Linux');
   return HostPlatform.linux;
 }
 
@@ -42,7 +41,7 @@
     return TargetPlatform.mac;
   if (Platform.isLinux)
     return TargetPlatform.linux;
-  _logging.warning('Unsupported host platform, defaulting to Linux');
+  logging.warning('Unsupported host platform, defaulting to Linux');
   return TargetPlatform.linux;
 }
 
diff --git a/packages/flutter_tools/lib/src/commands/analyze.dart b/packages/flutter_tools/lib/src/commands/analyze.dart
index 3bf9608..23c3ad2 100644
--- a/packages/flutter_tools/lib/src/commands/analyze.dart
+++ b/packages/flutter_tools/lib/src/commands/analyze.dart
@@ -6,15 +6,13 @@
 import 'dart:convert';
 import 'dart:io';
 
-import 'package:logging/logging.dart';
 import 'package:path/path.dart' as path;
 
 import '../artifacts.dart';
+import '../base/logging.dart';
+import '../base/process.dart';
 import '../build_configuration.dart';
-import '../process.dart';
-import 'flutter_command.dart';
-
-final Logger _logging = new Logger('sky_tools.analyze');
+import '../runner/flutter_command.dart';
 
 class AnalyzeCommand extends FlutterCommand {
   String get name => 'analyze';
@@ -174,7 +172,7 @@
         for (String package in dependencies.keys) {
           if (packages.containsKey(package)) {
             if (packages[package] != dependencies[package]) {
-              _logging.warning('Inconsistent requirements for $package; using ${packages[package]} (and not ${dependencies[package]}).');
+              logging.warning('Inconsistent requirements for $package; using ${packages[package]} (and not ${dependencies[package]}).');
               hadInconsistentRequirements = true;
             }
           } else {
@@ -185,9 +183,9 @@
     }
     if (hadInconsistentRequirements) {
       if (argResults['flutter-repo'])
-        _logging.warning('You may need to run "dart ${path.normalize(path.relative(path.join(ArtifactStore.flutterRoot, 'dev/update_packages.dart')))} --upgrade".');
+        logging.warning('You may need to run "dart ${path.normalize(path.relative(path.join(ArtifactStore.flutterRoot, 'dev/update_packages.dart')))} --upgrade".');
       if (foundAnyInCurrentDirectory)
-        _logging.warning('You may need to run "pub upgrade".');
+        logging.warning('You may need to run "pub upgrade".');
     }
 
     String buildDir = buildConfigurations.firstWhere((BuildConfiguration config) => config.testable, orElse: () => null)?.buildDir;
@@ -222,7 +220,7 @@
       mainFile.path
     ];
 
-    _logging.info(cmd.join(' '));
+    logging.info(cmd.join(' '));
     Process process = await Process.start(
       cmd[0],
       cmd.sublist(1),
diff --git a/packages/flutter_tools/lib/src/commands/apk.dart b/packages/flutter_tools/lib/src/commands/apk.dart
index 7e3ac6a..8961d69 100644
--- a/packages/flutter_tools/lib/src/commands/apk.dart
+++ b/packages/flutter_tools/lib/src/commands/apk.dart
@@ -5,15 +5,15 @@
 import 'dart:async';
 import 'dart:io';
 
-import 'package:logging/logging.dart';
 import 'package:path/path.dart' as path;
 
 import '../artifacts.dart';
+import '../base/file_system.dart';
+import '../base/logging.dart';
 import '../build_configuration.dart';
 import '../device.dart';
-import '../file_system.dart';
+import '../runner/flutter_command.dart';
 import 'build.dart';
-import 'flutter_command.dart';
 import 'start.dart';
 
 const String _kDefaultAndroidManifestPath = 'apk/AndroidManifest.xml';
@@ -24,8 +24,6 @@
 const String _kAndroidPlatformVersion = '22';
 const String _kBuildToolsVersion = '22.0.1';
 
-final Logger _logging = new Logger('flutter_tools.apk');
-
 /// Copies files into a new directory structure.
 class _AssetBuilder {
   final Directory outDir;
@@ -172,19 +170,19 @@
     components.keystore = new File(artifactPaths[3]);
 
     if (!components.androidSdk.existsSync()) {
-      _logging.severe('Can not locate Android SDK: $androidSdkPath');
+      logging.severe('Can not locate Android SDK: $androidSdkPath');
       return null;
     }
     if (!(new _ApkBuilder(components.androidSdk.path).checkSdkPath())) {
-      _logging.severe('Can not locate expected Android SDK tools at $androidSdkPath');
-      _logging.severe('You must install version $_kAndroidPlatformVersion of the SDK platform');
-      _logging.severe('and version $_kBuildToolsVersion of the build tools.');
+      logging.severe('Can not locate expected Android SDK tools at $androidSdkPath');
+      logging.severe('You must install version $_kAndroidPlatformVersion of the SDK platform');
+      logging.severe('and version $_kBuildToolsVersion of the build tools.');
       return null;
     }
     for (File f in [components.manifest, components.icuData, components.classesDex,
                     components.libSkyShell, components.keystore]) {
       if (!f.existsSync()) {
-        _logging.severe('Can not locate file: ${f.path}');
+        logging.severe('Can not locate file: ${f.path}');
         return null;
       }
     }
@@ -227,7 +225,7 @@
 
     _ApkComponents components = await _findApkComponents(config);
     if (components == null) {
-      _logging.severe('Unable to build APK.');
+      logging.severe('Unable to build APK.');
       return 1;
     }
 
@@ -235,8 +233,8 @@
 
     if (!flxPath.isEmpty) {
       if (!FileSystemEntity.isFileSync(flxPath)) {
-        _logging.severe('FLX does not exist: $flxPath');
-        _logging.severe('(Omit the --flx option to build the FLX automatically)');
+        logging.severe('FLX does not exist: $flxPath');
+        logging.severe('(Omit the --flx option to build the FLX automatically)');
         return 1;
       }
       return _buildApk(components, flxPath);
diff --git a/packages/flutter_tools/lib/src/commands/build.dart b/packages/flutter_tools/lib/src/commands/build.dart
index e0c37e0..5f8b0a9 100644
--- a/packages/flutter_tools/lib/src/commands/build.dart
+++ b/packages/flutter_tools/lib/src/commands/build.dart
@@ -9,21 +9,19 @@
 import 'package:archive/archive.dart';
 import 'package:flx/bundle.dart';
 import 'package:flx/signing.dart';
-import 'package:logging/logging.dart';
 import 'package:path/path.dart' as path;
 import 'package:yaml/yaml.dart';
 
-import '../file_system.dart';
+import '../base/file_system.dart';
+import '../base/logging.dart';
+import '../runner/flutter_command.dart';
 import '../toolchain.dart';
-import 'flutter_command.dart';
 
 const String _kSnapshotKey = 'snapshot_blob.bin';
 const List<String> _kDensities = const ['drawable-xxhdpi'];
 const List<String> _kThemes = const ['white', 'black'];
 const List<int> _kSizes = const [18, 24, 36, 48];
 
-final Logger _logging = new Logger('flutter_tools.build');
-
 class _Asset {
   final String base;
   final String key;
@@ -182,7 +180,7 @@
     String privateKeyPath: _kDefaultPrivateKeyPath,
     bool precompiledSnapshot: false
   }) async {
-    _logging.fine('Building $outputPath');
+    logging.fine('Building $outputPath');
 
     Map manifestDescriptor = _loadManifest(manifestPath);
 
diff --git a/packages/flutter_tools/lib/src/commands/cache.dart b/packages/flutter_tools/lib/src/commands/cache.dart
index 6ab2fb8..f08bb97 100644
--- a/packages/flutter_tools/lib/src/commands/cache.dart
+++ b/packages/flutter_tools/lib/src/commands/cache.dart
@@ -5,12 +5,9 @@
 import 'dart:async';
 
 import 'package:args/command_runner.dart';
-import 'package:logging/logging.dart';
 
 import '../artifacts.dart';
 
-final Logger _logging = new Logger('flutter_tools.cache');
-
 class CacheCommand extends Command {
   final String name = 'cache';
   final String description = 'Manages Flutter\'s cache of binary artifacts.';
diff --git a/packages/flutter_tools/lib/src/commands/daemon.dart b/packages/flutter_tools/lib/src/commands/daemon.dart
index 22eb920..ddd09be 100644
--- a/packages/flutter_tools/lib/src/commands/daemon.dart
+++ b/packages/flutter_tools/lib/src/commands/daemon.dart
@@ -6,9 +6,8 @@
 import 'dart:convert';
 import 'dart:io';
 
-import 'package:logging/logging.dart';
-
-import 'flutter_command.dart';
+import '../base/logging.dart';
+import '../runner/flutter_command.dart';
 import 'start.dart';
 import 'stop.dart';
 
@@ -20,8 +19,6 @@
 /// A domain @command annotation.
 const String command = 'command';
 
-final Logger _logging = new Logger('flutter_tools.daemon');
-
 // TODO: Create a `device` domain in order to list devices and fire events when
 // devices are added or removed.
 
@@ -96,7 +93,7 @@
     var id = command['id'];
 
     if (id == null) {
-      _logging.severe('no id for command: $command');
+      logging.severe('no id for command: $command');
       return;
     }
 
@@ -113,7 +110,7 @@
       _domains[prefix].handleEvent(name, id, command['params']);
     } catch (error, trace) {
       _send({'id': id, 'error': _toJsonable(error)});
-      _logging.warning('error handling ${command['event']}', error, trace);
+      logging.warning('error handling ${command['event']}', error, trace);
     }
   }
 
@@ -151,7 +148,7 @@
       }
     }).catchError((error, trace) {
       _send({'id': id, 'error': _toJsonable(error)});
-      _logging.warning('error handling $name', error, trace);
+      logging.warning('error handling $name', error, trace);
     });
   }
 
diff --git a/packages/flutter_tools/lib/src/commands/init.dart b/packages/flutter_tools/lib/src/commands/init.dart
index f11d6ef..d33aac9 100644
--- a/packages/flutter_tools/lib/src/commands/init.dart
+++ b/packages/flutter_tools/lib/src/commands/init.dart
@@ -6,14 +6,12 @@
 import 'dart:io';
 
 import 'package:args/command_runner.dart';
-import 'package:logging/logging.dart';
 import 'package:mustache4dart/mustache4dart.dart' as mustache;
 import 'package:path/path.dart' as path;
 
 import '../artifacts.dart';
-import '../process.dart';
-
-final Logger _logging = new Logger('sky_tools.init');
+import '../base/logging.dart';
+import '../base/process.dart';
 
 class InitCommand extends Command {
   final String name = 'init';
@@ -82,7 +80,7 @@
     if (!pubSpecYaml.existsSync()) {
       if (skipIfAbsent)
         return 0;
-      _logging.severe('$directory: no pubspec.yaml found');
+      logging.severe('$directory: no pubspec.yaml found');
       return 1;
     }
 
@@ -101,7 +99,7 @@
         (dotPackages.existsSync() && dotPackages.lastModifiedSync().isAfter(pubSpecYaml.lastModifiedSync())))
       return 0;
 
-    _logging.severe('$directory: pubspec.yaml, pubspec.lock, and .packages are in an inconsistent state');
+    logging.severe('$directory: pubspec.yaml, pubspec.lock, and .packages are in an inconsistent state');
     return 1;
   }
 }
diff --git a/packages/flutter_tools/lib/src/commands/install.dart b/packages/flutter_tools/lib/src/commands/install.dart
index 235243e..40c133a 100644
--- a/packages/flutter_tools/lib/src/commands/install.dart
+++ b/packages/flutter_tools/lib/src/commands/install.dart
@@ -6,7 +6,7 @@
 
 import '../application_package.dart';
 import '../device.dart';
-import 'flutter_command.dart';
+import '../runner/flutter_command.dart';
 
 class InstallCommand extends FlutterCommand {
   final String name = 'install';
diff --git a/packages/flutter_tools/lib/src/commands/list.dart b/packages/flutter_tools/lib/src/commands/list.dart
index d38cd78..d598d60 100644
--- a/packages/flutter_tools/lib/src/commands/list.dart
+++ b/packages/flutter_tools/lib/src/commands/list.dart
@@ -4,12 +4,8 @@
 
 import 'dart:async';
 
-import 'package:logging/logging.dart';
-
 import '../device.dart';
-import 'flutter_command.dart';
-
-final Logger _logging = new Logger('flutter_tools.list');
+import '../runner/flutter_command.dart';
 
 class ListCommand extends FlutterCommand {
   final String name = 'list';
diff --git a/packages/flutter_tools/lib/src/commands/listen.dart b/packages/flutter_tools/lib/src/commands/listen.dart
index 01f80b1..bb6b1e3 100644
--- a/packages/flutter_tools/lib/src/commands/listen.dart
+++ b/packages/flutter_tools/lib/src/commands/listen.dart
@@ -5,15 +5,12 @@
 import 'dart:async';
 import 'dart:io';
 
-import 'package:logging/logging.dart';
-
 import '../application_package.dart';
+import '../base/logging.dart';
+import '../base/process.dart';
 import '../device.dart';
-import '../process.dart';
+import '../runner/flutter_command.dart';
 import 'build.dart';
-import 'flutter_command.dart';
-
-final Logger _logging = new Logger('flutter_tools.listen');
 
 class ListenCommand extends FlutterCommand {
   final String name = 'listen';
@@ -48,7 +45,7 @@
     }
 
     while (true) {
-      _logging.info('Updating running Flutter apps...');
+      logging.info('Updating running Flutter apps...');
 
       BuildCommand builder = new BuildCommand();
       builder.inheritFromParent(this);
@@ -85,7 +82,7 @@
       try {
         runCheckedSync(['which', 'fswatch']);
       } catch (e) {
-        _logging.severe('"listen" command is only useful if you have installed '
+        logging.severe('"listen" command is only useful if you have installed '
             'fswatch on Mac.  Run "brew install fswatch" to install it with '
             'homebrew.');
         return null;
@@ -95,7 +92,7 @@
       try {
         runCheckedSync(['which', 'inotifywait']);
       } catch (e) {
-        _logging.severe('"listen" command is only useful if you have installed '
+        logging.severe('"listen" command is only useful if you have installed '
             'inotifywait on Linux.  Run "apt-get install inotify-tools" or '
             'equivalent to install it.');
         return null;
@@ -109,7 +106,7 @@
         'modify,close_write,move,create,delete',
       ]..addAll(directories);
     } else {
-      _logging.severe('"listen" command is only available on Mac and Linux.');
+      logging.severe('"listen" command is only available on Mac and Linux.');
     }
     return null;
   }
@@ -121,7 +118,7 @@
     try {
       runCheckedSync(watchCommand);
     } catch (e) {
-      _logging.warning('Watching directories failed.', e);
+      logging.warning('Watching directories failed.', e);
       return false;
     }
 
diff --git a/packages/flutter_tools/lib/src/commands/logs.dart b/packages/flutter_tools/lib/src/commands/logs.dart
index bd3f690..8898039 100644
--- a/packages/flutter_tools/lib/src/commands/logs.dart
+++ b/packages/flutter_tools/lib/src/commands/logs.dart
@@ -4,12 +4,8 @@
 
 import 'dart:async';
 
-import 'package:logging/logging.dart';
-
 import '../device.dart';
-import 'flutter_command.dart';
-
-final Logger _logging = new Logger('flutter_tools.logs');
+import '../runner/flutter_command.dart';
 
 class LogsCommand extends FlutterCommand {
   final String name = 'logs';
diff --git a/packages/flutter_tools/lib/src/commands/run_mojo.dart b/packages/flutter_tools/lib/src/commands/run_mojo.dart
index 59e64c6..add1d76 100644
--- a/packages/flutter_tools/lib/src/commands/run_mojo.dart
+++ b/packages/flutter_tools/lib/src/commands/run_mojo.dart
@@ -9,16 +9,15 @@
 import 'package:path/path.dart' as path;
 
 import '../artifacts.dart';
+import '../base/logging.dart';
+import '../base/process.dart';
 import '../build_configuration.dart';
-import '../process.dart';
+import '../runner/flutter_command.dart';
 import 'build.dart';
-import 'flutter_command.dart';
 import 'start.dart';
 
 const String _kDefaultBundlePath = 'build/app.flx';
 
-final Logger _logging = new Logger('flutter_tools.run_mojo');
-
 class RunMojoCommand extends FlutterCommand {
   final String name = 'run_mojo';
   final String description = 'Run a Flutter app in mojo.';
@@ -121,9 +120,9 @@
     if (useDevtools) {
       final String buildFlag = argResults['mojo-debug'] ? '--debug' : '--release';
       args.add(buildFlag);
-      if (_logging.level <= Level.INFO) {
+      if (logging.level <= Level.INFO) {
         args.add('--verbose');
-        if (_logging.level <= Level.FINE) {
+        if (logging.level <= Level.FINE) {
           args.add('--verbose');
         }
       }
@@ -141,12 +140,12 @@
   @override
   Future<int> runInProject() async {
     if ((argResults['mojo-path'] == null && argResults['devtools-path'] == null) || (argResults['mojo-path'] != null && argResults['devtools-path'] != null)) {
-      _logging.severe('Must specify either --mojo-path or --devtools-path.');
+      logging.severe('Must specify either --mojo-path or --devtools-path.');
       return 1;
     }
 
     if (argResults['mojo-debug'] && argResults['mojo-release']) {
-      _logging.severe('Cannot specify both --mojo-debug and --mojo-release');
+      logging.severe('Cannot specify both --mojo-debug and --mojo-release');
       return 1;
     }
 
diff --git a/packages/flutter_tools/lib/src/commands/start.dart b/packages/flutter_tools/lib/src/commands/start.dart
index 7911178..38f92ae 100644
--- a/packages/flutter_tools/lib/src/commands/start.dart
+++ b/packages/flutter_tools/lib/src/commands/start.dart
@@ -5,18 +5,16 @@
 import 'dart:async';
 import 'dart:io';
 
-import 'package:logging/logging.dart';
 import 'package:path/path.dart' as path;
 
 import '../application_package.dart';
+import '../base/logging.dart';
 import '../device.dart';
+import '../runner/flutter_command.dart';
 import 'build.dart';
-import 'flutter_command.dart';
 import 'install.dart';
 import 'stop.dart';
 
-final Logger _logging = new Logger('flutter_tools.start');
-
 class StartCommand extends FlutterCommand {
   final String name = 'start';
   final String description = 'Start your Flutter app on attached devices.';
@@ -51,7 +49,7 @@
 
   @override
   Future<int> runInProject() async {
-    _logging.fine('downloading toolchain');
+    logging.fine('downloading toolchain');
 
     await Future.wait([
       downloadToolchain(),
@@ -60,13 +58,13 @@
 
     bool poke = argResults['poke'];
     if (!poke) {
-      _logging.fine('running stop command');
+      logging.fine('running stop command');
 
       StopCommand stopper = new StopCommand();
       stopper.inheritFromParent(this);
       stopper.stop();
 
-      _logging.fine('running install command');
+      logging.fine('running install command');
 
       // Only install if the user did not specify a poke
       InstallCommand installer = new InstallCommand();
@@ -91,14 +89,14 @@
           continue;
         }
 
-        _logging.fine('running build command for $device');
+        logging.fine('running build command for $device');
 
         BuildCommand builder = new BuildCommand();
         builder.inheritFromParent(this);
         await builder.buildInTempDir(
           mainPath: mainPath,
           onBundleAvailable: (String localBundlePath) {
-            _logging.fine('running start bundle for $device');
+            logging.fine('running start bundle for $device');
 
             if (device.startBundle(package, localBundlePath,
                                    poke: poke,
@@ -108,7 +106,7 @@
           }
         );
       } else {
-        _logging.fine('running start command for $device');
+        logging.fine('running start command for $device');
 
         if (await device.startApp(package))
           startedSomething = true;
@@ -117,13 +115,13 @@
 
     if (!startedSomething) {
       if (!devices.all.any((device) => device.isConnected())) {
-        _logging.severe('Unable to run application - no connected devices.');
+        logging.severe('Unable to run application - no connected devices.');
       } else {
-        _logging.severe('Unable to run application.');
+        logging.severe('Unable to run application.');
       }
     }
 
-    _logging.fine('finished start command');
+    logging.fine('finished start command');
 
     return startedSomething ? 0 : 2;
   }
diff --git a/packages/flutter_tools/lib/src/commands/stop.dart b/packages/flutter_tools/lib/src/commands/stop.dart
index 1b94da0..b4c56ee 100644
--- a/packages/flutter_tools/lib/src/commands/stop.dart
+++ b/packages/flutter_tools/lib/src/commands/stop.dart
@@ -4,13 +4,9 @@
 
 import 'dart:async';
 
-import 'package:logging/logging.dart';
-
 import '../application_package.dart';
 import '../device.dart';
-import 'flutter_command.dart';
-
-final Logger _logging = new Logger('flutter_tools.stop');
+import '../runner/flutter_command.dart';
 
 class StopCommand extends FlutterCommand {
   final String name = 'stop';
diff --git a/packages/flutter_tools/lib/src/commands/test.dart b/packages/flutter_tools/lib/src/commands/test.dart
index f721936..a837d0e 100644
--- a/packages/flutter_tools/lib/src/commands/test.dart
+++ b/packages/flutter_tools/lib/src/commands/test.dart
@@ -5,16 +5,14 @@
 import 'dart:async';
 import 'dart:io';
 
-import 'package:logging/logging.dart';
 import 'package:path/path.dart' as path;
 import 'package:test/src/executable.dart' as executable;
 
 import '../artifacts.dart';
+import '../base/logging.dart';
 import '../build_configuration.dart';
+import '../runner/flutter_command.dart';
 import '../test/loader.dart' as loader;
-import 'flutter_command.dart';
-
-final Logger _logging = new Logger('flutter_tools.test');
 
 class TestCommand extends FlutterCommand {
   String get name => 'test';
@@ -88,7 +86,7 @@
       foundOne = true;
       loader.shellPath = path.join(Directory.current.path, getShellPath(config.targetPlatform, config.buildDir));
       if (!FileSystemEntity.isFileSync(loader.shellPath)) {
-          _logging.severe('Cannot find Flutter shell at ${loader.shellPath}');
+          logging.severe('Cannot find Flutter shell at ${loader.shellPath}');
         return 1;
       }
       await _runTests(testArgs, testDir);
diff --git a/packages/flutter_tools/lib/src/commands/trace.dart b/packages/flutter_tools/lib/src/commands/trace.dart
index 6ed1407..26db7a9 100644
--- a/packages/flutter_tools/lib/src/commands/trace.dart
+++ b/packages/flutter_tools/lib/src/commands/trace.dart
@@ -4,13 +4,10 @@
 
 import 'dart:async';
 
-import 'package:logging/logging.dart';
-
 import '../application_package.dart';
+import '../base/logging.dart';
 import '../device.dart';
-import 'flutter_command.dart';
-
-final Logger _logging = new Logger('flutter_tools.trace');
+import '../runner/flutter_command.dart';
 
 class TraceCommand extends FlutterCommand {
   final String name = 'trace';
@@ -32,7 +29,7 @@
     await downloadApplicationPackagesAndConnectToDevices();
 
     if (!devices.android.isConnected()) {
-      _logging.warning('No device connected, so no trace was completed.');
+      logging.warning('No device connected, so no trace was completed.');
       return 1;
     }
 
@@ -57,7 +54,7 @@
   void _stopTracing(AndroidDevice android, AndroidApk androidApp) {
     String tracePath = android.stopTracing(androidApp);
     if (tracePath == null) {
-      _logging.warning('No trace file saved.');
+      logging.warning('No trace file saved.');
     } else {
       print('Trace file saved to $tracePath');
     }
diff --git a/packages/flutter_tools/lib/src/commands/upgrade.dart b/packages/flutter_tools/lib/src/commands/upgrade.dart
index 84b8494..104aeee 100644
--- a/packages/flutter_tools/lib/src/commands/upgrade.dart
+++ b/packages/flutter_tools/lib/src/commands/upgrade.dart
@@ -4,13 +4,9 @@
 
 import 'dart:async';
 
-import 'package:logging/logging.dart';
-
 import '../artifacts.dart';
-import '../process.dart';
-import 'flutter_command.dart';
-
-final Logger _logging = new Logger('flutter_tools.upgrade');
+import '../base/process.dart';
+import '../runner/flutter_command.dart';
 
 class UpgradeCommand extends FlutterCommand {
   final String name = 'upgrade';
diff --git a/packages/flutter_tools/lib/src/device.dart b/packages/flutter_tools/lib/src/device.dart
index e925a9d..48e2f7f 100644
--- a/packages/flutter_tools/lib/src/device.dart
+++ b/packages/flutter_tools/lib/src/device.dart
@@ -6,14 +6,12 @@
 import 'dart:io';
 
 import 'package:crypto/crypto.dart';
-import 'package:logging/logging.dart';
 import 'package:path/path.dart' as path;
 
 import 'application_package.dart';
+import 'base/logging.dart';
+import 'base/process.dart';
 import 'build_configuration.dart';
-import 'process.dart';
-
-final Logger _logging = new Logger('flutter_tools.device');
 
 abstract class Device {
   final String id;
@@ -140,11 +138,11 @@
         command = runCheckedSync(['which', command]).trim();
       } catch (e) {
         if (Platform.isMacOS) {
-          _logging.severe(macInstructions);
+          logging.severe(macInstructions);
         } else if (Platform.isLinux) {
-          _logging.severe(linuxInstructions);
+          logging.severe(linuxInstructions);
         } else {
-          _logging.severe('$command is not available on your platform.');
+          logging.severe('$command is not available on your platform.');
         }
       }
       return command;
@@ -204,7 +202,7 @@
       (_) {
         return true;
       }, onError: (e) {
-        _logging.info('Failure running $debuggerPath: ', e);
+        logging.info('Failure running $debuggerPath: ', e);
         return false;
       }
     );
@@ -297,11 +295,11 @@
       // More than one simulator is listed as booted, which is not allowed but
       // sometimes happens erroneously.  Kill them all because we don't know
       // which one is actually running.
-      _logging.warning('Multiple running simulators were detected, '
+      logging.warning('Multiple running simulators were detected, '
           'which is not supposed to happen.');
       for (Match m in matches) {
         if (m.groupCount > 0) {
-          _logging.warning('Killing simulator ${m.group(1)}');
+          logging.warning('Killing simulator ${m.group(1)}');
           runSync([xcrunPath, 'simctl', 'shutdown', m.group(1)]);
         }
       }
@@ -312,7 +310,7 @@
     if (match != null && match.groupCount > 0) {
       return match.group(1);
     } else {
-      _logging.info('No running simulators found');
+      logging.info('No running simulators found');
       return null;
     }
   }
@@ -357,11 +355,11 @@
       runDetached([iOSSimPath]);
       Future<bool> checkConnection([int attempts = 20]) async {
         if (attempts == 0) {
-          _logging.info('Timed out waiting for iOS Simulator $id to boot.');
+          logging.info('Timed out waiting for iOS Simulator $id to boot.');
           return false;
         }
         if (!isConnected()) {
-          _logging.info('Waiting for iOS Simulator $id to boot...');
+          logging.info('Waiting for iOS Simulator $id to boot...');
           return await new Future.delayed(new Duration(milliseconds: 500),
               () => checkConnection(attempts - 1));
         }
@@ -372,7 +370,7 @@
       try {
         runCheckedSync([xcrunPath, 'simctl', 'boot', id]);
       } catch (e) {
-        _logging.warning('Unable to boot iOS Simulator $id: ', e);
+        logging.warning('Unable to boot iOS Simulator $id: ', e);
         return false;
       }
     }
@@ -511,7 +509,7 @@
     try {
       runCheckedSync([adbPath, 'version']);
     } catch (e) {
-      _logging.severe('Unable to find adb. Is "adb" in your path?');
+      logging.severe('Unable to find adb. Is "adb" in your path?');
       return devices;
     }
 
@@ -554,12 +552,12 @@
       } else if (unauthorizedRegex.hasMatch(line)) {
         Match match = unauthorizedRegex.firstMatch(line);
         String deviceID = match[1];
-        _logging.warning(
+        logging.warning(
           'Device $deviceID is not authorized.\n'
           'You might need to check your device for an authorization dialog.'
         );
       } else {
-        _logging.warning(
+        logging.warning(
           'Unexpected failure parsing device information from adb output:\n'
           '$line\n'
           'Please report a bug at https://github.com/flutter/flutter/issues/new');
@@ -578,7 +576,7 @@
     _hasValidAndroid = _checkForSupportedAndroidVersion();
 
     if (!_hasAdb || !_hasValidAndroid) {
-      _logging.warning('Unable to run on Android.');
+      logging.warning('Unable to run on Android.');
     }
   }
 
@@ -592,11 +590,11 @@
           path.join(androidHomeDir, 'sdk', 'platform-tools'))) {
         return path.join(androidHomeDir, 'sdk');
       } else {
-        _logging.warning('Android SDK not found at $androidHomeDir');
+        logging.warning('Android SDK not found at $androidHomeDir');
         return null;
       }
     } else {
-      _logging.warning('Android SDK not found. The ANDROID_HOME variable must be set.');
+      logging.warning('Android SDK not found. The ANDROID_HOME variable must be set.');
       return null;
     }
   }
@@ -612,7 +610,7 @@
       } else if (FileSystemEntity.isFileSync(adbPath2)) {
         return adbPath2;
       } else {
-        _logging.info('"adb" not found at\n  "$adbPath1" or\n  "$adbPath2"\n' +
+        logging.info('"adb" not found at\n  "$adbPath1" or\n  "$adbPath2"\n' +
             'using default path "$_ADB_PATH"');
         return _ADB_PATH;
       }
@@ -649,7 +647,7 @@
       }
       return false;
     }
-    _logging.warning(
+    logging.warning(
         'Unrecognized adb version string $adbVersion. Skipping version check.');
     return true;
   }
@@ -662,16 +660,16 @@
       }
 
       String locatedAdbPath = runCheckedSync(['which', 'adb']);
-      _logging.severe('"$locatedAdbPath" is too old. '
+      logging.severe('"$locatedAdbPath" is too old. '
           'Please install version 1.0.32 or later.\n'
           'Try setting ANDROID_HOME to the path to your Android SDK install. '
           'Android builds are unavailable.');
     } catch (e, stack) {
-      _logging.severe('"adb" not found in \$PATH. '
+      logging.severe('"adb" not found in \$PATH. '
           'Please install the Android SDK or set ANDROID_HOME '
           'to the path of your Android SDK install.');
-      _logging.info(e);
-      _logging.info(stack);
+      logging.info(e);
+      logging.info(stack);
     }
     return false;
   }
@@ -686,7 +684,7 @@
 
       String ready = runSync(adbCommandForDevice(['shell', 'echo', 'ready']));
       if (ready.trim() != 'ready') {
-        _logging.info('Android device not found.');
+        logging.info('Android device not found.');
         return false;
       }
 
@@ -698,17 +696,17 @@
       int sdkVersionParsed =
           int.parse(sdkVersion, onError: (String source) => null);
       if (sdkVersionParsed == null) {
-        _logging.severe('Unexpected response from getprop: "$sdkVersion"');
+        logging.severe('Unexpected response from getprop: "$sdkVersion"');
         return false;
       }
       if (sdkVersionParsed < 16) {
-        _logging.severe('The Android version ($sdkVersion) on the target device '
+        logging.severe('The Android version ($sdkVersion) on the target device '
             'is too old. Please use a Jelly Bean (version 16 / 4.1.x) device or later.');
         return false;
       }
       return true;
     } catch (e) {
-      _logging.severe('Unexpected failure from adb: ', e);
+      logging.severe('Unexpected failure from adb: ', e);
     }
     return false;
   }
@@ -735,12 +733,12 @@
     }
     if (runCheckedSync(adbCommandForDevice(['shell', 'pm', 'path', app.id])) ==
         '') {
-      _logging.info(
+      logging.info(
           'TODO(iansf): move this log to the caller. ${app.name} is not on the device. Installing now...');
       return false;
     }
     if (_getDeviceApkSha1(app) != _getSourceSha1(app)) {
-      _logging.info(
+      logging.info(
           'TODO(iansf): move this log to the caller. ${app.name} is out of date. Installing now...');
       return false;
     }
@@ -750,11 +748,11 @@
   @override
   bool installApp(ApplicationPackage app) {
     if (!isConnected()) {
-      _logging.info('Android device not connected. Not installing.');
+      logging.info('Android device not connected. Not installing.');
       return false;
     }
     if (!FileSystemEntity.isFileSync(app.localPath)) {
-      _logging.severe('"${app.localPath}" does not exist.');
+      logging.severe('"${app.localPath}" does not exist.');
       return false;
     }
 
@@ -775,10 +773,10 @@
     bool checked,
     String route
   }) {
-    _logging.fine('$this startBundle');
+    logging.fine('$this startBundle');
 
     if (!FileSystemEntity.isFileSync(bundlePath)) {
-      _logging.severe('Cannot find $bundlePath');
+      logging.severe('Cannot find $bundlePath');
       return false;
     }
 
@@ -882,7 +880,7 @@
       runSync(adbCommandForDevice(['shell', 'rm', tracePath]));
       return path.basename(tracePath);
     }
-    _logging.warning('No trace file detected. '
+    logging.warning('No trace file detected. '
         'Did you remember to start the trace before stopping it?');
     return null;
   }
diff --git a/packages/flutter_tools/lib/src/commands/flutter_command.dart b/packages/flutter_tools/lib/src/runner/flutter_command.dart
similarity index 100%
rename from packages/flutter_tools/lib/src/commands/flutter_command.dart
rename to packages/flutter_tools/lib/src/runner/flutter_command.dart
diff --git a/packages/flutter_tools/lib/src/commands/flutter_command_runner.dart b/packages/flutter_tools/lib/src/runner/flutter_command_runner.dart
similarity index 91%
rename from packages/flutter_tools/lib/src/commands/flutter_command_runner.dart
rename to packages/flutter_tools/lib/src/runner/flutter_command_runner.dart
index e351e48..9bcf10d 100644
--- a/packages/flutter_tools/lib/src/commands/flutter_command_runner.dart
+++ b/packages/flutter_tools/lib/src/runner/flutter_command_runner.dart
@@ -11,10 +11,10 @@
 import 'package:path/path.dart' as path;
 
 import '../artifacts.dart';
+import '../base/logging.dart';
+import '../base/process.dart';
 import '../build_configuration.dart';
-import '../process.dart';
-
-final Logger _logging = new Logger('flutter_tools.flutter_command_runner');
+import 'version.dart';
 
 const String kFlutterRootEnvironmentVariableName = 'FLUTTER_ROOT'; // should point to //flutter/ (root of flutter/flutter repo)
 const String kFlutterEngineEnvironmentVariableName = 'FLUTTER_ENGINE'; // should point to //engine/src/ (root of flutter/engine repo)
@@ -45,7 +45,7 @@
         help: 'Path to your packages directory.$packagesHelp');
     argParser.addOption('flutter-root',
         help: 'The root directory of the Flutter repository. Defaults to \$$kFlutterRootEnvironmentVariableName if set,\n'
-              'otherwise defaults to a value derived from the location of this tool.', defaultsTo: defaultFlutterRoot);
+              'otherwise defaults to a value derived from the location of this tool.', defaultsTo: _defaultFlutterRoot);
 
     argParser.addOption('android-device-id',
         help: 'Serial number of the target Android device.');
@@ -128,10 +128,10 @@
 
   ArgResults _globalResults;
 
-  String get defaultFlutterRoot {
-    String script = Platform.script.toFilePath();
+  String get _defaultFlutterRoot {
     if (Platform.environment.containsKey(kFlutterRootEnvironmentVariableName))
       return Platform.environment[kFlutterRootEnvironmentVariableName];
+    String script = Platform.script.toFilePath();
     if (path.basename(script) == kSnapshotFileName)
       return path.dirname(path.dirname(path.dirname(script)));
     if (path.basename(script) == kFlutterToolsScriptFileName)
@@ -151,33 +151,14 @@
     if (globalResults.wasParsed('package-root'))
       ArtifactStore.packageRoot = globalResults['package-root'];
 
-    if (globalResults['version'])
-      return _printVersion();
+    if (globalResults['version']) {
+      print(getVersion(ArtifactStore.flutterRoot));
+      return new Future<int>.value(0);
+    }
 
     return super.runCommand(globalResults);
   }
 
-  Future<int> _printVersion() async {
-    String upstream = runSync([
-      'git', 'rev-parse', '--abbrev-ref', '--symbolic', '@{u}'
-    ], workingDirectory: ArtifactStore.flutterRoot).trim();
-    String repository = '<unknown>';
-    int slash = upstream.indexOf('/');
-    if (slash != -1) {
-      String remote = upstream.substring(0, slash);
-      repository = runSync([
-        'git', 'ls-remote', '--get-url', remote
-      ], workingDirectory: ArtifactStore.flutterRoot).trim();
-      upstream = upstream.substring(slash + 1);
-    }
-    String revision = runSync([
-      'git', 'log', '-n', '1', '--pretty=format:%H (%ar)'
-    ], workingDirectory: ArtifactStore.flutterRoot).trim();
-
-    print('Flutter\nRepository: $repository\nBranch: $upstream\nRevision: $revision');
-    return 0;
-  }
-
   String _tryEnginePath(String enginePath) {
     if (FileSystemEntity.isDirectorySync(path.join(enginePath, 'out')))
       return enginePath;
@@ -239,7 +220,7 @@
       ));
     } else {
       if (!FileSystemEntity.isDirectorySync(enginePath))
-        _logging.warning('$enginePath is not a valid directory');
+        logging.warning('$enginePath is not a valid directory');
 
       if (!isDebug && !isRelease)
         isDebug = true;
diff --git a/packages/flutter_tools/lib/src/runner/version.dart b/packages/flutter_tools/lib/src/runner/version.dart
new file mode 100644
index 0000000..134108f
--- /dev/null
+++ b/packages/flutter_tools/lib/src/runner/version.dart
@@ -0,0 +1,24 @@
+// Copyright 2015 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 '../base/process.dart';
+
+String getVersion(String flutterRoot) {
+  String upstream = runSync([
+    'git', 'rev-parse', '--abbrev-ref', '--symbolic', '@{u}'
+  ], workingDirectory: flutterRoot).trim();
+  String repository = '<unknown>';
+  int slash = upstream.indexOf('/');
+  if (slash != -1) {
+    String remote = upstream.substring(0, slash);
+    repository = runSync([
+      'git', 'ls-remote', '--get-url', remote
+    ], workingDirectory: flutterRoot).trim();
+    upstream = upstream.substring(slash + 1);
+  }
+  String revision = runSync([
+    'git', 'log', '-n', '1', '--pretty=format:%H (%ar)'
+  ], workingDirectory: flutterRoot).trim();
+  return 'Flutter\nRepository: $repository\nBranch: $upstream\nRevision: $revision';
+}
diff --git a/packages/flutter_tools/lib/src/toolchain.dart b/packages/flutter_tools/lib/src/toolchain.dart
index e88ac6b..4d249ed 100644
--- a/packages/flutter_tools/lib/src/toolchain.dart
+++ b/packages/flutter_tools/lib/src/toolchain.dart
@@ -9,7 +9,7 @@
 
 import 'artifacts.dart';
 import 'build_configuration.dart';
-import 'process.dart';
+import 'base/process.dart';
 
 class Compiler {
   Compiler(this._path);
diff --git a/packages/flutter_tools/test/init_test.dart b/packages/flutter_tools/test/init_test.dart
index d9bb623..d5ae45e 100644
--- a/packages/flutter_tools/test/init_test.dart
+++ b/packages/flutter_tools/test/init_test.dart
@@ -8,7 +8,7 @@
 import 'package:path/path.dart' as path;
 import 'package:flutter_tools/src/artifacts.dart';
 import 'package:flutter_tools/src/commands/init.dart';
-import 'package:flutter_tools/src/process.dart';
+import 'package:flutter_tools/src/base/process.dart';
 import 'package:test/test.dart';
 
 main() => defineTests();
diff --git a/packages/flutter_tools/test/os_utils_test.dart b/packages/flutter_tools/test/os_utils_test.dart
index 2509318..b4b9191 100644
--- a/packages/flutter_tools/test/os_utils_test.dart
+++ b/packages/flutter_tools/test/os_utils_test.dart
@@ -4,7 +4,7 @@
 
 import 'dart:io';
 
-import 'package:flutter_tools/src/os_utils.dart';
+import 'package:flutter_tools/src/base/os.dart';
 import 'package:test/test.dart';
 import 'package:path/path.dart' as path;
 
@@ -25,7 +25,7 @@
     test('makeExecutable', () {
       File file = new File(path.join(temp.path, 'foo.script'));
       file.writeAsStringSync('hello world');
-      osUtils.makeExecutable(file);
+      os.makeExecutable(file);
 
       // Skip this test on windows.
       if (!Platform.isWindows) {
diff --git a/packages/flutter_tools/test/src/mocks.dart b/packages/flutter_tools/test/src/mocks.dart
index 4e281ad..cf2dde1 100644
--- a/packages/flutter_tools/test/src/mocks.dart
+++ b/packages/flutter_tools/test/src/mocks.dart
@@ -2,12 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import 'package:mockito/mockito.dart';
 import 'package:flutter_tools/src/application_package.dart';
 import 'package:flutter_tools/src/build_configuration.dart';
-import 'package:flutter_tools/src/commands/flutter_command.dart';
 import 'package:flutter_tools/src/device.dart';
+import 'package:flutter_tools/src/runner/flutter_command.dart';
 import 'package:flutter_tools/src/toolchain.dart';
+import 'package:mockito/mockito.dart';
 
 class MockApplicationPackageStore extends ApplicationPackageStore {
   MockApplicationPackageStore() : super(