fixes found when running through the getting started process
diff --git a/packages/flutter_tools/lib/src/android/adb.dart b/packages/flutter_tools/lib/src/android/adb.dart
index e8b0f94..f5a5840 100644
--- a/packages/flutter_tools/lib/src/android/adb.dart
+++ b/packages/flutter_tools/lib/src/android/adb.dart
@@ -181,9 +181,8 @@
       }
     }
 
-    // Convert `Nexus_7` / `Nexus_5X` style names to `Nexus 7` ones.
     if (modelID != null)
-      modelID = modelID.replaceAll('_', ' ');
+      modelID = cleanAdbDeviceName(modelID);
   }
 
   static final RegExp deviceRegex = new RegExp(r'^(\S+)\s+(\S+)(.*)');
@@ -235,6 +234,16 @@
   }
 }
 
+String cleanAdbDeviceName(String name) {
+  // Some emulators use `___` in the name as separators.
+  name = name.replaceAll('___', ', ');
+
+  // Convert `Nexus_7` / `Nexus_5X` style names to `Nexus 7` ones.
+  name = name.replaceAll('_', ' ');
+
+  return name;
+}
+
 List<int> _createAdbRequest(String payload) {
   List<int> data = payload.codeUnits;
 
diff --git a/packages/flutter_tools/lib/src/android/android_sdk.dart b/packages/flutter_tools/lib/src/android/android_sdk.dart
index 0271f3a..b67000a 100644
--- a/packages/flutter_tools/lib/src/android/android_sdk.dart
+++ b/packages/flutter_tools/lib/src/android/android_sdk.dart
@@ -23,7 +23,10 @@
 // Perhaps something like `flutter config --android-home=foo/bar`.
 
 /// Locate ADB. Prefer to use one from an Android SDK, if we can locate that.
-String getAdbPath() {
+String getAdbPath([AndroidSdk existingSdk]) {
+  if (existingSdk?.adbPath != null)
+    return existingSdk.adbPath;
+
   AndroidSdk sdk = AndroidSdk.locateAndroidSdk();
 
   if (sdk?.latestVersion == null) {
diff --git a/packages/flutter_tools/lib/src/android/device_android.dart b/packages/flutter_tools/lib/src/android/device_android.dart
index 0f7c4d0..5a3ec9c 100644
--- a/packages/flutter_tools/lib/src/android/device_android.dart
+++ b/packages/flutter_tools/lib/src/android/device_android.dart
@@ -8,6 +8,7 @@
 import 'package:crypto/crypto.dart';
 import 'package:path/path.dart' as path;
 
+import '../android/android_sdk.dart';
 import '../application_package.dart';
 import '../base/common.dart';
 import '../base/globals.dart';
@@ -17,6 +18,7 @@
 import '../device.dart';
 import '../flx.dart' as flx;
 import '../toolchain.dart';
+import 'adb.dart';
 import 'android.dart';
 
 const String _defaultAdbPath = 'adb';
@@ -249,7 +251,12 @@
     if (route != null)
       cmd.addAll(<String>['--es', 'route', route]);
     cmd.add(apk.launchActivity);
-    runCheckedSync(cmd);
+    String result = runCheckedSync(cmd);
+    // This invocation returns 0 even when it fails.
+    if (result.contains('Error: ')) {
+      printError(result.trim());
+      return false;
+    }
     return true;
   }
 
@@ -410,10 +417,10 @@
 }
 
 List<AndroidDevice> getAdbDevices() {
-  if (androidSdk == null)
+  String adbPath = getAdbPath(androidSdk);
+  if (adbPath == null)
     return <AndroidDevice>[];
 
-  String adbPath = androidSdk.adbPath;
   List<AndroidDevice> devices = [];
 
   List<String> output = runSync(<String>[adbPath, 'devices', '-l']).trim().split('\n');
@@ -445,9 +452,8 @@
       String modelID = match[3];
       String deviceCodeName = match[4];
 
-      // Convert `Nexus_7` / `Nexus_5X` style names to `Nexus 7` ones.
       if (modelID != null)
-        modelID = modelID.replaceAll('_', ' ');
+        modelID = cleanAdbDeviceName(modelID);
 
       devices.add(new AndroidDevice(
         deviceID,
diff --git a/packages/flutter_tools/lib/src/commands/apk.dart b/packages/flutter_tools/lib/src/commands/apk.dart
index 60f9861..c051ef0 100644
--- a/packages/flutter_tools/lib/src/commands/apk.dart
+++ b/packages/flutter_tools/lib/src/commands/apk.dart
@@ -369,6 +369,17 @@
   String flxPath: '',
   ApkKeystoreInfo keystore
 }) async {
+  // Validate that we can find an android sdk.
+  if (androidSdk == null) {
+    printError('No Android SDK found.');
+    return 1;
+  }
+
+  if (!androidSdk.validateSdkWellFormed(complain: true)) {
+    printError('Try re-installing or updating your Android SDK.');
+    return 1;
+  }
+
   if (!force && !_needsRebuild(outputFile, manifest)) {
     printTrace('APK up to date. Skipping build step.');
     return 0;
@@ -437,13 +448,17 @@
         continue;
       }
 
-      await buildAndroid(
+      int result = await buildAndroid(
         toolchain: toolchain,
         configs: configs,
         enginePath: enginePath,
         force: false,
         target: target
       );
+      if (result != 0)
+        return result;
     }
   }
+
+  return 0;
 }
diff --git a/packages/flutter_tools/lib/src/commands/create.dart b/packages/flutter_tools/lib/src/commands/create.dart
index 3428caa..6b439eb 100644
--- a/packages/flutter_tools/lib/src/commands/create.dart
+++ b/packages/flutter_tools/lib/src/commands/create.dart
@@ -57,7 +57,7 @@
 All done! To run your application:
 
   \$ cd ${out.path}
-  \$ flutter start
+  \$ flutter run
 ''';
 
     if (argResults['pub']) {
@@ -152,8 +152,8 @@
 
     // Android files.
     files['android/AndroidManifest.xml'] = _apkManifest;
-    // Create a file here, so we create the directory for the user and it gets committed with git.
-    files['android/res/README.md'] = _androidResReadme;
+    // Create a file here in order to create the res/ directory and ensure it gets committed to git.
+    files['android/res/.empty'] = _androidEmptyFile;
 
     // iOS files.
     files.addAll(iosTemplateFiles);
@@ -285,6 +285,6 @@
 </manifest>
 ''';
 
-final String _androidResReadme = '''
+final String _androidEmptyFile = '''
 Place Android resources here (http://developer.android.com/guide/topics/resources/overview.html).
 ''';
diff --git a/packages/flutter_tools/lib/src/commands/daemon.dart b/packages/flutter_tools/lib/src/commands/daemon.dart
index a8b5068..c3aec31 100644
--- a/packages/flutter_tools/lib/src/commands/daemon.dart
+++ b/packages/flutter_tools/lib/src/commands/daemon.dart
@@ -356,7 +356,7 @@
 
   void _initAdb() {
     if (_adb == null) {
-      _adb = new Adb(getAdbPath());
+      _adb = new Adb(getAdbPath(androidSdk));
       if (!_adb.exists())
         _adb = null;
     }
diff --git a/packages/flutter_tools/lib/src/commands/logs.dart b/packages/flutter_tools/lib/src/commands/logs.dart
index 1e31dd5..81956b6 100644
--- a/packages/flutter_tools/lib/src/commands/logs.dart
+++ b/packages/flutter_tools/lib/src/commands/logs.dart
@@ -23,9 +23,6 @@
   bool get requiresProjectRoot => false;
 
   Future<int> runInProject() async {
-    DeviceManager deviceManager = new DeviceManager();
-    deviceManager.specifiedDeviceId = globalResults['device-id'];
-
     List<Device> devices = await deviceManager.getDevices();
 
     if (devices.isEmpty && deviceManager.hasSpecifiedDeviceId) {
diff --git a/packages/flutter_tools/lib/src/commands/run.dart b/packages/flutter_tools/lib/src/commands/run.dart
index fee7a3a..7759cd6 100644
--- a/packages/flutter_tools/lib/src/commands/run.dart
+++ b/packages/flutter_tools/lib/src/commands/run.dart
@@ -131,7 +131,6 @@
   bool startPaused: false,
   int debugPort: observatoryDefaultPort
 }) async {
-
   String mainPath = findMainDartFile(target);
   if (!FileSystemEntity.isFileSync(mainPath)) {
     String message = 'Tried to run $mainPath, but that file does not exist.';
@@ -143,11 +142,13 @@
 
   if (install) {
     printTrace('Running build command.');
-    await buildAll(
+    int result = await buildAll(
       devices, applicationPackages, toolchain, configs,
       enginePath: enginePath,
       target: target
     );
+    if (result != 0)
+      return result;
   }
 
   if (stop) {
diff --git a/packages/flutter_tools/lib/src/ios/device_ios.dart b/packages/flutter_tools/lib/src/ios/device_ios.dart
index 4ab15bf..f705fd0 100644
--- a/packages/flutter_tools/lib/src/ios/device_ios.dart
+++ b/packages/flutter_tools/lib/src/ios/device_ios.dart
@@ -348,7 +348,12 @@
       args.add("--observatory-port=$debugPort");
 
     // Step 5: Launch the updated application in the simulator
-    SimControl.launch(id, app.id, args);
+    try {
+      SimControl.launch(id, app.id, args);
+    } catch (error) {
+      printError('$error');
+      return false;
+    }
 
     printTrace('Successfully started ${app.name} on $id');
 
@@ -388,6 +393,12 @@
       randomFile.closeSync();
     }
   }
+
+  void ensureLogsExists() {
+    File logFile = new File(logFilePath);
+    if (!logFile.existsSync())
+      logFile.writeAsBytesSync(<int>[]);
+  }
 }
 
 class _IOSDeviceLogReader extends DeviceLogReader {
@@ -427,6 +438,8 @@
 
   final IOSSimulator device;
 
+  bool _lastWasFiltered = false;
+
   String get name => device.name;
 
   Future<int> logs({ bool clear: false }) async {
@@ -436,6 +449,8 @@
     if (clear)
       device.clearLogs();
 
+    device.ensureLogsExists();
+
     // Match the log prefix (in order to shorten it):
     //   'Jan 29 01:31:44 devoncarew-macbookpro3 SpringBoard[96648]: ...'
     RegExp mapRegex = new RegExp(r'\S+ +\S+ +\S+ \S+ (.+)\[\d+\]\)?: (.*)$');
@@ -453,19 +468,25 @@
       mapFunction: (String string) {
         Match match = mapRegex.matchAsPrefix(string);
         if (match != null) {
+          _lastWasFiltered = true;
+
           // Filter out some messages that clearly aren't related to Flutter.
           if (string.contains(': could not find icon for representation -> com.apple.'))
             return null;
           String category = match.group(1);
           String content = match.group(2);
-          if (category == 'Game Center' || category == 'itunesstored' || category == 'nanoregistrylaunchd')
+          if (category == 'Game Center' || category == 'itunesstored' || category == 'nanoregistrylaunchd' ||
+              category == 'mstreamd' || category == 'syncdefaultsd' || category == 'companionappd' || category == 'searchd')
             return null;
-          if (category == 'FlutterRunner')
+
+          _lastWasFiltered = false;
+
+          if (category == 'FlutterRunner' || category == 'Runner')
             return content;
           return '$category: $content';
         }
         match = lastMessageRegex.matchAsPrefix(string);
-        if (match != null)
+        if (match != null && !_lastWasFiltered)
           return '(${match.group(1)})';
         return string;
       }