add a summary option to the doctor class
diff --git a/packages/flutter_tools/lib/src/android/adb.dart b/packages/flutter_tools/lib/src/android/adb.dart
index f5a5840..2392dc3 100644
--- a/packages/flutter_tools/lib/src/android/adb.dart
+++ b/packages/flutter_tools/lib/src/android/adb.dart
@@ -5,8 +5,8 @@
 import 'dart:async';
 import 'dart:io';
 
-import '../base/globals.dart';
 import '../base/process.dart';
+import '../globals.dart';
 
 // https://android.googlesource.com/platform/system/core/+/android-4.4_r1/adb/OVERVIEW.TXT
 // https://android.googlesource.com/platform/system/core/+/android-4.4_r1/adb/SERVICES.TXT
diff --git a/packages/flutter_tools/lib/src/android/android_sdk.dart b/packages/flutter_tools/lib/src/android/android_sdk.dart
index 27096f2..819f64f 100644
--- a/packages/flutter_tools/lib/src/android/android_sdk.dart
+++ b/packages/flutter_tools/lib/src/android/android_sdk.dart
@@ -7,8 +7,8 @@
 import 'package:path/path.dart' as path;
 import 'package:pub_semver/pub_semver.dart';
 
-import '../base/globals.dart';
 import '../base/os.dart';
+import '../globals.dart';
 
 // Android SDK layout:
 //
diff --git a/packages/flutter_tools/lib/src/android/android_workflow.dart b/packages/flutter_tools/lib/src/android/android_workflow.dart
index 3bbc619..52b9942 100644
--- a/packages/flutter_tools/lib/src/android/android_workflow.dart
+++ b/packages/flutter_tools/lib/src/android/android_workflow.dart
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import '../base/globals.dart';
 import '../doctor.dart';
+import '../globals.dart';
 import 'android_sdk.dart';
 
 class AndroidWorkflow extends Workflow {
@@ -15,8 +15,11 @@
 
   bool get canLaunchDevices => androidSdk != null && androidSdk.validateSdkWellFormed(complain: false);
 
-  void diagnose() {
-    Validator androidValidator = new Validator('Develop for Android devices');
+  ValidationResult validate() {
+    Validator androidValidator = new Validator(
+      '$name toolchain',
+      description: 'develop for Android devices'
+    );
 
     Function _sdkExists = () {
       return androidSdk == null ? ValidationType.missing : ValidationType.installed;
@@ -29,6 +32,8 @@
       validatorFunction: _sdkExists
     ));
 
-    androidValidator.validate().print();
+    return androidValidator.validate();
   }
+
+  void diagnose() => validate().print();
 }
diff --git a/packages/flutter_tools/lib/src/android/device_android.dart b/packages/flutter_tools/lib/src/android/device_android.dart
index 5a3ec9c..2deaa9c 100644
--- a/packages/flutter_tools/lib/src/android/device_android.dart
+++ b/packages/flutter_tools/lib/src/android/device_android.dart
@@ -11,12 +11,12 @@
 import '../android/android_sdk.dart';
 import '../application_package.dart';
 import '../base/common.dart';
-import '../base/globals.dart';
 import '../base/os.dart';
 import '../base/process.dart';
 import '../build_configuration.dart';
 import '../device.dart';
 import '../flx.dart' as flx;
+import '../globals.dart';
 import '../toolchain.dart';
 import 'adb.dart';
 import 'android.dart';
diff --git a/packages/flutter_tools/lib/src/artifacts.dart b/packages/flutter_tools/lib/src/artifacts.dart
index b57d81b..6f962a9 100644
--- a/packages/flutter_tools/lib/src/artifacts.dart
+++ b/packages/flutter_tools/lib/src/artifacts.dart
@@ -8,10 +8,10 @@
 import 'package:archive/archive.dart';
 import 'package:path/path.dart' as path;
 
-import 'base/globals.dart';
 import 'base/os.dart';
 import 'base/process.dart';
 import 'build_configuration.dart';
+import 'globals.dart';
 
 String _getNameForHostPlatform(HostPlatform platform) {
   switch (platform) {
diff --git a/packages/flutter_tools/lib/src/base/process.dart b/packages/flutter_tools/lib/src/base/process.dart
index 28b4df5..1009e96 100644
--- a/packages/flutter_tools/lib/src/base/process.dart
+++ b/packages/flutter_tools/lib/src/base/process.dart
@@ -6,7 +6,7 @@
 import 'dart:convert';
 import 'dart:io';
 
-import 'globals.dart';
+import '../globals.dart';
 
 typedef String StringConverter(String string);
 
diff --git a/packages/flutter_tools/lib/src/build_configuration.dart b/packages/flutter_tools/lib/src/build_configuration.dart
index 160334b..0dc165f 100644
--- a/packages/flutter_tools/lib/src/build_configuration.dart
+++ b/packages/flutter_tools/lib/src/build_configuration.dart
@@ -6,7 +6,7 @@
 
 import 'package:path/path.dart' as path;
 
-import 'base/globals.dart';
+import 'globals.dart';
 
 enum BuildType {
   prebuilt,
diff --git a/packages/flutter_tools/lib/src/commands/analyze.dart b/packages/flutter_tools/lib/src/commands/analyze.dart
index b50b90e..d5a929d 100644
--- a/packages/flutter_tools/lib/src/commands/analyze.dart
+++ b/packages/flutter_tools/lib/src/commands/analyze.dart
@@ -11,14 +11,14 @@
 import 'package:path/path.dart' as path;
 
 import '../artifacts.dart';
-import '../base/globals.dart';
 import '../base/process.dart';
 import '../build_configuration.dart';
+import '../globals.dart';
 import '../runner/flutter_command.dart';
 
 class AnalyzeCommand extends FlutterCommand {
   String get name => 'analyze';
-  String get description => 'Runs a carefully configured dartanalyzer over the current project\'s Dart code.';
+  String get description => 'Analyze the project\'s Dart code.';
 
   AnalyzeCommand() {
     argParser.addFlag('flutter-repo', help: 'Include all the examples and tests from the Flutter repository.', defaultsTo: false);
diff --git a/packages/flutter_tools/lib/src/commands/apk.dart b/packages/flutter_tools/lib/src/commands/apk.dart
index ffc6781..57fb54e 100644
--- a/packages/flutter_tools/lib/src/commands/apk.dart
+++ b/packages/flutter_tools/lib/src/commands/apk.dart
@@ -11,12 +11,12 @@
 import '../application_package.dart';
 import '../artifacts.dart';
 import '../base/file_system.dart';
-import '../base/globals.dart';
 import '../base/os.dart';
 import '../base/process.dart';
 import '../build_configuration.dart';
 import '../device.dart';
 import '../flx.dart' as flx;
+import '../globals.dart';
 import '../runner/flutter_command.dart';
 import '../services.dart';
 import '../toolchain.dart';
diff --git a/packages/flutter_tools/lib/src/commands/build.dart b/packages/flutter_tools/lib/src/commands/build.dart
index 5e1f763..4318334 100644
--- a/packages/flutter_tools/lib/src/commands/build.dart
+++ b/packages/flutter_tools/lib/src/commands/build.dart
@@ -4,14 +4,14 @@
 
 import 'dart:async';
 
-import '../base/globals.dart';
 import '../flx.dart';
+import '../globals.dart';
 import '../runner/flutter_command.dart';
 import '../toolchain.dart';
 
 class BuildCommand extends FlutterCommand {
   final String name = 'build';
-  final String description = 'Packages your Flutter app into an FLX.';
+  final String description = 'Package your Flutter app into an FLX.';
 
   BuildCommand() {
     argParser.addFlag('precompiled', negatable: false);
diff --git a/packages/flutter_tools/lib/src/commands/cache.dart b/packages/flutter_tools/lib/src/commands/cache.dart
index 872dc43..c33d046 100644
--- a/packages/flutter_tools/lib/src/commands/cache.dart
+++ b/packages/flutter_tools/lib/src/commands/cache.dart
@@ -7,7 +7,7 @@
 import 'package:args/command_runner.dart';
 
 import '../artifacts.dart';
-import '../base/globals.dart';
+import '../globals.dart';
 
 class CacheCommand extends Command {
   final String name = 'cache';
diff --git a/packages/flutter_tools/lib/src/commands/create.dart b/packages/flutter_tools/lib/src/commands/create.dart
index 3f9f0cf..14f6db9 100644
--- a/packages/flutter_tools/lib/src/commands/create.dart
+++ b/packages/flutter_tools/lib/src/commands/create.dart
@@ -11,8 +11,8 @@
 
 import '../android/android.dart' as android;
 import '../artifacts.dart';
-import '../base/globals.dart';
 import '../dart/pub.dart';
+import '../globals.dart';
 import '../ios/setup_xcodeproj.dart';
 
 class CreateCommand extends Command {
diff --git a/packages/flutter_tools/lib/src/commands/daemon.dart b/packages/flutter_tools/lib/src/commands/daemon.dart
index 4fdb860..252e929 100644
--- a/packages/flutter_tools/lib/src/commands/daemon.dart
+++ b/packages/flutter_tools/lib/src/commands/daemon.dart
@@ -10,9 +10,9 @@
 import '../android/android_sdk.dart';
 import '../android/device_android.dart';
 import '../base/context.dart';
-import '../base/globals.dart';
 import '../base/logger.dart';
 import '../device.dart';
+import '../globals.dart';
 import '../ios/device_ios.dart';
 import '../ios/simulator.dart';
 import '../runner/flutter_command.dart';
diff --git a/packages/flutter_tools/lib/src/commands/devices.dart b/packages/flutter_tools/lib/src/commands/devices.dart
index 3ff2697..6531c63 100644
--- a/packages/flutter_tools/lib/src/commands/devices.dart
+++ b/packages/flutter_tools/lib/src/commands/devices.dart
@@ -4,8 +4,8 @@
 
 import 'dart:async';
 
-import '../base/globals.dart';
 import '../device.dart';
+import '../globals.dart';
 import '../runner/flutter_command.dart';
 
 class DevicesCommand extends FlutterCommand {
diff --git a/packages/flutter_tools/lib/src/commands/doctor.dart b/packages/flutter_tools/lib/src/commands/doctor.dart
index ed049d0..dd30c60 100644
--- a/packages/flutter_tools/lib/src/commands/doctor.dart
+++ b/packages/flutter_tools/lib/src/commands/doctor.dart
@@ -5,20 +5,20 @@
 import 'dart:async';
 
 import '../artifacts.dart';
-import '../base/globals.dart';
+import '../globals.dart';
 import '../runner/flutter_command.dart';
 import '../runner/version.dart';
 
 class DoctorCommand extends FlutterCommand {
   final String name = 'doctor';
-  final String description = 'Diagnose the flutter tool.';
+  final String description = 'Show information about the installed tooling.';
 
   bool get requiresProjectRoot => false;
 
   Future<int> runInProject() async {
     // general info
     String flutterRoot = ArtifactStore.flutterRoot;
-    printStatus('Flutter root is $flutterRoot.');
+    printStatus('Flutter root: $flutterRoot.');
     printStatus('');
 
     // doctor
diff --git a/packages/flutter_tools/lib/src/commands/listen.dart b/packages/flutter_tools/lib/src/commands/listen.dart
index f768088..e52cfc0 100644
--- a/packages/flutter_tools/lib/src/commands/listen.dart
+++ b/packages/flutter_tools/lib/src/commands/listen.dart
@@ -5,8 +5,8 @@
 import 'dart:async';
 import 'dart:io';
 
-import '../base/globals.dart';
 import '../base/process.dart';
+import '../globals.dart';
 import 'run.dart';
 
 class ListenCommand extends RunCommandBase {
diff --git a/packages/flutter_tools/lib/src/commands/logs.dart b/packages/flutter_tools/lib/src/commands/logs.dart
index 81956b6..06d6622 100644
--- a/packages/flutter_tools/lib/src/commands/logs.dart
+++ b/packages/flutter_tools/lib/src/commands/logs.dart
@@ -4,13 +4,13 @@
 
 import 'dart:async';
 
-import '../base/globals.dart';
 import '../device.dart';
+import '../globals.dart';
 import '../runner/flutter_command.dart';
 
 class LogsCommand extends FlutterCommand {
   final String name = 'logs';
-  final String description = 'Show logs for running Flutter apps.';
+  final String description = 'Show log output for running Flutter apps.';
 
   LogsCommand() {
     argParser.addFlag('clear',
diff --git a/packages/flutter_tools/lib/src/commands/refresh.dart b/packages/flutter_tools/lib/src/commands/refresh.dart
index d4d5fc1..bed138d 100644
--- a/packages/flutter_tools/lib/src/commands/refresh.dart
+++ b/packages/flutter_tools/lib/src/commands/refresh.dart
@@ -7,8 +7,8 @@
 
 import 'package:path/path.dart' as path;
 
-import '../base/globals.dart';
 import '../flx.dart';
+import '../globals.dart';
 import '../runner/flutter_command.dart';
 
 class RefreshCommand extends FlutterCommand {
diff --git a/packages/flutter_tools/lib/src/commands/run.dart b/packages/flutter_tools/lib/src/commands/run.dart
index 1ae20a5..c4fcb7b 100644
--- a/packages/flutter_tools/lib/src/commands/run.dart
+++ b/packages/flutter_tools/lib/src/commands/run.dart
@@ -9,11 +9,11 @@
 
 import '../application_package.dart';
 import '../base/common.dart';
-import '../base/globals.dart';
 import '../build_configuration.dart';
 import '../dart/pub.dart';
 import '../device.dart';
 import '../flx.dart';
+import '../globals.dart';
 import '../runner/flutter_command.dart';
 import '../toolchain.dart';
 import 'apk.dart';
diff --git a/packages/flutter_tools/lib/src/commands/run_mojo.dart b/packages/flutter_tools/lib/src/commands/run_mojo.dart
index 28b6fbd..d6e8a92 100644
--- a/packages/flutter_tools/lib/src/commands/run_mojo.dart
+++ b/packages/flutter_tools/lib/src/commands/run_mojo.dart
@@ -8,10 +8,10 @@
 import 'package:path/path.dart' as path;
 
 import '../artifacts.dart';
-import '../base/globals.dart';
 import '../base/process.dart';
 import '../build_configuration.dart';
 import '../flx.dart' as flx;
+import '../globals.dart';
 import '../runner/flutter_command.dart';
 import 'run.dart';
 
diff --git a/packages/flutter_tools/lib/src/commands/test.dart b/packages/flutter_tools/lib/src/commands/test.dart
index 91e0fbe..fcd2324 100644
--- a/packages/flutter_tools/lib/src/commands/test.dart
+++ b/packages/flutter_tools/lib/src/commands/test.dart
@@ -9,14 +9,14 @@
 import 'package:test/src/executable.dart' as executable;
 
 import '../artifacts.dart';
-import '../base/globals.dart';
 import '../build_configuration.dart';
+import '../globals.dart';
 import '../runner/flutter_command.dart';
 import '../test/loader.dart' as loader;
 
 class TestCommand extends FlutterCommand {
   String get name => 'test';
-  String get description => 'Runs Flutter unit tests for the current project (Linux only).';
+  String get description => 'Run Flutter unit tests for the current project (Linux only).';
 
   bool get requiresProjectRoot => false;
 
diff --git a/packages/flutter_tools/lib/src/commands/trace.dart b/packages/flutter_tools/lib/src/commands/trace.dart
index 365d552..a5b0744 100644
--- a/packages/flutter_tools/lib/src/commands/trace.dart
+++ b/packages/flutter_tools/lib/src/commands/trace.dart
@@ -6,7 +6,7 @@
 
 import '../android/device_android.dart';
 import '../application_package.dart';
-import '../base/globals.dart';
+import '../globals.dart';
 import '../runner/flutter_command.dart';
 
 class TraceCommand extends FlutterCommand {
diff --git a/packages/flutter_tools/lib/src/commands/upgrade.dart b/packages/flutter_tools/lib/src/commands/upgrade.dart
index 48b4c8f..fbe67ee 100644
--- a/packages/flutter_tools/lib/src/commands/upgrade.dart
+++ b/packages/flutter_tools/lib/src/commands/upgrade.dart
@@ -5,8 +5,8 @@
 import 'dart:async';
 
 import '../artifacts.dart';
-import '../base/globals.dart';
 import '../base/process.dart';
+import '../globals.dart';
 import '../runner/flutter_command.dart';
 import '../runner/version.dart';
 
diff --git a/packages/flutter_tools/lib/src/dart/pub.dart b/packages/flutter_tools/lib/src/dart/pub.dart
index 1856561..709d034 100644
--- a/packages/flutter_tools/lib/src/dart/pub.dart
+++ b/packages/flutter_tools/lib/src/dart/pub.dart
@@ -7,8 +7,8 @@
 
 import 'package:path/path.dart' as path;
 
-import '../base/globals.dart';
 import '../base/process.dart';
+import '../globals.dart';
 
 Future<int> pubGet({
   String directory,
diff --git a/packages/flutter_tools/lib/src/device.dart b/packages/flutter_tools/lib/src/device.dart
index 274d1ff..28c9333 100644
--- a/packages/flutter_tools/lib/src/device.dart
+++ b/packages/flutter_tools/lib/src/device.dart
@@ -7,8 +7,8 @@
 import 'android/device_android.dart';
 import 'application_package.dart';
 import 'base/common.dart';
-import 'base/globals.dart';
 import 'build_configuration.dart';
+import 'globals.dart';
 import 'ios/device_ios.dart';
 import 'toolchain.dart';
 
diff --git a/packages/flutter_tools/lib/src/doctor.dart b/packages/flutter_tools/lib/src/doctor.dart
index 4fb4386..d5f1d99 100644
--- a/packages/flutter_tools/lib/src/doctor.dart
+++ b/packages/flutter_tools/lib/src/doctor.dart
@@ -4,7 +4,7 @@
 
 import 'android/android_workflow.dart';
 import 'base/context.dart';
-import 'base/globals.dart';
+import 'globals.dart';
 import 'ios/ios_workflow.dart';
 
 class Doctor {
@@ -34,6 +34,35 @@
 
   List<Workflow> get workflows => _workflows;
 
+  /// Print a summary of the state of the tooling, as well as how to get more info.
+  void summary() => printStatus(summaryText);
+
+  String get summaryText {
+    StringBuffer buffer = new StringBuffer();
+
+    bool allGood = true;
+
+    for (Workflow workflow in workflows) {
+      ValidationResult result = workflow.validate();
+      buffer.write('${result.leadingBox} The ${workflow.name} toolchain is ');
+      if (result.type == ValidationType.missing)
+        buffer.writeln('not installed.');
+      else if (result.type == ValidationType.partial)
+        buffer.writeln('partially installed; more components are available.');
+      else
+        buffer.writeln('fully installed.');
+      if (result.type != ValidationType.installed)
+        allGood = false;
+    }
+
+    if (!allGood) {
+      buffer.writeln();
+      buffer.write('Run "flutter doctor" for information about installing additional components.');
+    }
+
+    return buffer.toString();
+  }
+
   /// Print verbose information about the state of installed tooling.
   void diagnose() {
     for (int i = 0; i < workflows.length; i++) {
@@ -63,6 +92,8 @@
   /// Could this thing launch *something*? It may still have minor issues.
   bool get canLaunchDevices;
 
+  ValidationResult validate();
+
   /// Print verbose information about the state of the workflow.
   void diagnose();
 
@@ -85,20 +116,28 @@
   final String resolution;
   final ValidationFunction validatorFunction;
 
-  List<Validator> _children = [];
+  List<Validator> _children = <Validator>[];
 
   ValidationResult validate() {
+    List<ValidationResult> childResults;
+    ValidationType type;
+
     if (validatorFunction != null)
-      return new ValidationResult(validatorFunction(), this);
+      type = validatorFunction();
 
-    List<ValidationResult> results = _children.map((Validator child) {
-      return child.validate();
-    }).toList();
+    childResults = _children.map((Validator child) => child.validate()).toList();
 
-    ValidationType type = _combine(results.map((ValidationResult result) {
-      return result.type;
-    }));
-    return new ValidationResult(type, this, results);
+    // If there's no immediate validator, the result we return is synthesized
+    // from the sub-tree of children. This is so we can show that the branch is
+    // not fully installed.
+    if (type == null) {
+      type = _combine(childResults
+        .expand((ValidationResult child) => child._allResults)
+        .map((ValidationResult result) => result.type)
+      );
+    }
+
+    return new ValidationResult(type, this, childResults);
   }
 
   ValidationType _combine(Iterable<ValidationType> types) {
@@ -119,6 +158,15 @@
   final Validator validator;
   final List<ValidationResult> childResults;
 
+  String get leadingBox {
+    if (type == ValidationType.missing)
+      return '[ ]';
+    else if (type == ValidationType.installed)
+      return '[✓]';
+    else
+      return '[-]';
+  }
+
   void print([String indent = '']) {
     printSelf(indent);
 
@@ -126,15 +174,15 @@
       child.print(indent + '  ');
   }
 
-  void printSelf(String indent) {
+  void printSelf([String indent = '']) {
     String result = indent;
 
     if (type == ValidationType.missing)
-      result += '[ ] ';
+      result += '$leadingBox ';
     else if (type == ValidationType.installed)
-      result += '[✓] ';
+      result += '$leadingBox ';
     else
-      result += '[-] ';
+      result += '$leadingBox ';
 
     result += '${validator.name} ';
 
@@ -151,4 +199,10 @@
     if (type == ValidationType.missing && validator.resolution != null)
       printStatus('$indent    ${validator.resolution}');
   }
+
+  List<ValidationResult> get _allResults {
+    List<ValidationResult> results = <ValidationResult>[this];
+    results.addAll(childResults);
+    return results;
+  }
 }
diff --git a/packages/flutter_tools/lib/src/flx.dart b/packages/flutter_tools/lib/src/flx.dart
index 2e03bd1..e12c434 100644
--- a/packages/flutter_tools/lib/src/flx.dart
+++ b/packages/flutter_tools/lib/src/flx.dart
@@ -14,7 +14,7 @@
 import 'package:yaml/yaml.dart';
 
 import 'base/file_system.dart';
-import 'base/globals.dart';
+import 'globals.dart';
 import 'toolchain.dart';
 
 const String defaultMainPath = 'lib/main.dart';
diff --git a/packages/flutter_tools/lib/src/base/globals.dart b/packages/flutter_tools/lib/src/globals.dart
similarity index 86%
rename from packages/flutter_tools/lib/src/base/globals.dart
rename to packages/flutter_tools/lib/src/globals.dart
index d4f1398..efd072e 100644
--- a/packages/flutter_tools/lib/src/base/globals.dart
+++ b/packages/flutter_tools/lib/src/globals.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 '../android/android_sdk.dart';
-import '../device.dart';
-import '../doctor.dart';
-import '../ios/mac.dart';
-import 'context.dart';
-import 'logger.dart';
+import 'android/android_sdk.dart';
+import 'base/context.dart';
+import 'base/logger.dart';
+import 'device.dart';
+import 'doctor.dart';
+import 'ios/mac.dart';
 
 DeviceManager get deviceManager => context[DeviceManager];
 Logger get logger => context[Logger];
diff --git a/packages/flutter_tools/lib/src/ios/device_ios.dart b/packages/flutter_tools/lib/src/ios/device_ios.dart
index eebcf18..b6a667c 100644
--- a/packages/flutter_tools/lib/src/ios/device_ios.dart
+++ b/packages/flutter_tools/lib/src/ios/device_ios.dart
@@ -3,21 +3,21 @@
 // found in the LICENSE file.
 
 import 'dart:async';
-import 'dart:io';
 import 'dart:convert';
+import 'dart:io';
 
 import 'package:path/path.dart' as path;
 
 import '../application_package.dart';
 import '../artifacts.dart';
 import '../base/common.dart';
-import '../base/globals.dart';
 import '../base/process.dart';
 import '../build_configuration.dart';
 import '../device.dart';
+import '../globals.dart';
+import '../ios/setup_xcodeproj.dart';
 import '../services.dart';
 import '../toolchain.dart';
-import '../ios/setup_xcodeproj.dart';
 import 'simulator.dart';
 
 const String _ideviceinstallerInstructions =
diff --git a/packages/flutter_tools/lib/src/ios/ios_workflow.dart b/packages/flutter_tools/lib/src/ios/ios_workflow.dart
index 8dfc94f..5cc4f70 100644
--- a/packages/flutter_tools/lib/src/ios/ios_workflow.dart
+++ b/packages/flutter_tools/lib/src/ios/ios_workflow.dart
@@ -4,9 +4,9 @@
 
 import 'dart:io';
 
-import '../base/globals.dart';
 import '../base/process.dart';
 import '../doctor.dart';
+import '../globals.dart';
 
 class IOSWorkflow extends Workflow {
   IOSWorkflow() : super('iOS');
@@ -20,8 +20,11 @@
   // for real devices.
   bool get canLaunchDevices => xcode.isInstalled;
 
-  void diagnose() {
-    Validator iosValidator = new Validator('Develop for iOS devices');
+  ValidationResult validate() {
+    Validator iosValidator = new Validator(
+      '$name toolchain',
+      description: 'develop for iOS devices'
+    );
 
     Function _xcodeExists = () {
       return xcode.isInstalled ? ValidationType.installed : ValidationType.missing;
@@ -48,30 +51,34 @@
       validatorFunction: _xcodeExists
     ));
 
-    iosValidator.addValidator(new Validator(
+    Validator brewValidator = new Validator(
       'brew',
       description: 'install additional development packages',
       resolution: 'Download at http://brew.sh/',
       validatorFunction: _brewExists
-    ));
+    );
 
-    iosValidator.addValidator(new Validator(
+    iosValidator.addValidator(brewValidator);
+
+    brewValidator.addValidator(new Validator(
       'ideviceinstaller',
       description: 'discover connected iOS devices',
       resolution: "Install via 'brew install ideviceinstaller'",
       validatorFunction: _ideviceinstallerExists
     ));
 
-    iosValidator.addValidator(new Validator(
+    brewValidator.addValidator(new Validator(
       'ios-deploy',
       description: 'deploy to connected iOS devices',
       resolution: "Install via 'brew install ios-deploy'",
       validatorFunction: _iosdeployExists
     ));
 
-    iosValidator.validate().print();
+    return iosValidator.validate();
   }
 
+  void diagnose() => validate().print();
+
   bool get hasIdeviceId => exitsHappy(<String>['idevice_id', '-h']);
 
   /// Return whether the tooling to list and deploy to real iOS devices (not the
diff --git a/packages/flutter_tools/lib/src/ios/setup_xcodeproj.dart b/packages/flutter_tools/lib/src/ios/setup_xcodeproj.dart
index 3d39175..ce97d94 100644
--- a/packages/flutter_tools/lib/src/ios/setup_xcodeproj.dart
+++ b/packages/flutter_tools/lib/src/ios/setup_xcodeproj.dart
@@ -8,8 +8,8 @@
 import 'package:path/path.dart' as path;
 
 import '../artifacts.dart';
-import '../base/globals.dart';
 import '../base/process.dart';
+import '../globals.dart';
 import '../runner/flutter_command_runner.dart';
 
 /// A map from file path to file contents.
diff --git a/packages/flutter_tools/lib/src/ios/simulator.dart b/packages/flutter_tools/lib/src/ios/simulator.dart
index f776382..3328191 100644
--- a/packages/flutter_tools/lib/src/ios/simulator.dart
+++ b/packages/flutter_tools/lib/src/ios/simulator.dart
@@ -6,8 +6,8 @@
 import 'dart:convert' show JSON;
 import 'dart:io';
 
-import '../base/globals.dart';
 import '../base/process.dart';
+import '../globals.dart';
 
 const String _xcrunPath = '/usr/bin/xcrun';
 
diff --git a/packages/flutter_tools/lib/src/runner/flutter_command.dart b/packages/flutter_tools/lib/src/runner/flutter_command.dart
index 2e94cbc..6bc0cd2 100644
--- a/packages/flutter_tools/lib/src/runner/flutter_command.dart
+++ b/packages/flutter_tools/lib/src/runner/flutter_command.dart
@@ -9,9 +9,9 @@
 
 import '../application_package.dart';
 import '../artifacts.dart';
-import '../base/globals.dart';
 import '../build_configuration.dart';
 import '../device.dart';
+import '../globals.dart';
 import '../toolchain.dart';
 import 'flutter_command_runner.dart';
 
diff --git a/packages/flutter_tools/lib/src/runner/flutter_command_runner.dart b/packages/flutter_tools/lib/src/runner/flutter_command_runner.dart
index 9e68c79..5b5d6b6 100644
--- a/packages/flutter_tools/lib/src/runner/flutter_command_runner.dart
+++ b/packages/flutter_tools/lib/src/runner/flutter_command_runner.dart
@@ -12,9 +12,9 @@
 import '../android/android_sdk.dart';
 import '../artifacts.dart';
 import '../base/context.dart';
-import '../base/globals.dart';
 import '../base/process.dart';
 import '../build_configuration.dart';
+import '../globals.dart';
 import 'version.dart';
 
 const String kFlutterRootEnvironmentVariableName = 'FLUTTER_ROOT'; // should point to //flutter/ (root of flutter/flutter repo)
@@ -45,6 +45,7 @@
     else
       packagesHelp = '\n(required, since the current directory does not contain a "packages" subdirectory)';
     argParser.addOption('package-root',
+        hide: !verboseHelp,
         help: 'Path to your packages directory.$packagesHelp');
     argParser.addOption('flutter-root',
         help: 'The root directory of the Flutter repository. Uses \$$kFlutterRootEnvironmentVariableName if set,\n'
@@ -122,7 +123,10 @@
         defaultsTo: 'out/ios_sim_Release/');
   }
 
-  final String usageFooter = 'Run "flutter -h -v" for verbose help output, including less commonly used options.';
+  String get usageFooter =>
+    'Run "flutter -h -v" for verbose help output, including less commonly used options.\n'
+    '\n'
+    '${doctor.summaryText}';
 
   List<BuildConfiguration> get buildConfigurations {
     if (_buildConfigurations == null)
@@ -191,6 +195,8 @@
 
     if (globalResults['version']) {
       printStatus(getVersion(ArtifactStore.flutterRoot));
+      printStatus('');
+      doctor.summary();
       return new Future<int>.value(0);
     }
 
diff --git a/packages/flutter_tools/lib/src/services.dart b/packages/flutter_tools/lib/src/services.dart
index ca422b7..ce08d09 100644
--- a/packages/flutter_tools/lib/src/services.dart
+++ b/packages/flutter_tools/lib/src/services.dart
@@ -10,7 +10,7 @@
 import 'package:yaml/yaml.dart';
 
 import 'artifacts.dart';
-import 'base/globals.dart';
+import 'globals.dart';
 
 const String _kFlutterManifestPath = 'flutter.yaml';
 const String _kFlutterServicesManifestPath = 'flutter_services.yaml';
diff --git a/packages/flutter_tools/test/context_test.dart b/packages/flutter_tools/test/context_test.dart
index 74ecb0c..1de5840 100644
--- a/packages/flutter_tools/test/context_test.dart
+++ b/packages/flutter_tools/test/context_test.dart
@@ -3,8 +3,8 @@
 // found in the LICENSE file.
 
 import 'package:flutter_tools/src/base/context.dart' hide context;
-import 'package:flutter_tools/src/base/globals.dart';
 import 'package:flutter_tools/src/base/logger.dart';
+import 'package:flutter_tools/src/globals.dart';
 import 'package:test/test.dart';
 
 main() => defineTests();
diff --git a/packages/flutter_tools/test/daemon_test.dart b/packages/flutter_tools/test/daemon_test.dart
index e735bd3..70035a9 100644
--- a/packages/flutter_tools/test/daemon_test.dart
+++ b/packages/flutter_tools/test/daemon_test.dart
@@ -5,9 +5,9 @@
 import 'dart:async';
 
 import 'package:flutter_tools/src/base/context.dart';
-import 'package:flutter_tools/src/base/globals.dart';
 import 'package:flutter_tools/src/base/logger.dart';
 import 'package:flutter_tools/src/commands/daemon.dart';
+import 'package:flutter_tools/src/globals.dart';
 import 'package:mockito/mockito.dart';
 import 'package:test/test.dart';