diff --git a/runtime/bin/process.h b/runtime/bin/process.h
index b6babd3..bd40086 100644
--- a/runtime/bin/process.h
+++ b/runtime/bin/process.h
@@ -148,7 +148,7 @@
 
 class SignalInfo {
  public:
-  SignalInfo(int fd, int signal, SignalInfo* next)
+  SignalInfo(intptr_t fd, intptr_t signal, SignalInfo* next)
       : fd_(fd),
         signal_(signal),
         // SignalInfo is expected to be created when in a isolate.
@@ -171,14 +171,14 @@
     }
   }
 
-  int fd() const { return fd_; }
-  int signal() const { return signal_; }
+  intptr_t fd() const { return fd_; }
+  intptr_t signal() const { return signal_; }
   Dart_Port port() const { return port_; }
   SignalInfo* next() const { return next_; }
 
  private:
-  int fd_;
-  int signal_;
+  intptr_t fd_;
+  intptr_t signal_;
   // The port_ is used to identify what isolate the signal-info belongs to.
   Dart_Port port_;
   SignalInfo* next_;
diff --git a/runtime/bin/vmservice/loader.dart b/runtime/bin/vmservice/loader.dart
index 6bc8c45..9b7355e 100644
--- a/runtime/bin/vmservice/loader.dart
+++ b/runtime/bin/vmservice/loader.dart
@@ -64,12 +64,16 @@
 
 void _loadDataUri(SendPort sp, int id, Uri uri) {
   try {
-    if (uri.data.mimeType != "application/dart") {
-      throw "MIME-type must be application/dart";
+    var mime = uri.data.mimeType;
+    if ((mime != "application/dart") &&
+        (mime != "text/plain")) {
+      throw "MIME-type must be application/dart or text/plain: $mime given.";
     }
-    if (uri.data.charset != "utf-8") {
+    var charset = uri.data.charset;
+    if ((charset != "utf-8") &&
+        (charset != "US-ASCII")) {
       // The C++ portion of the embedder assumes UTF-8.
-      throw "Only utf-8 encoding is supported";
+      throw "Only utf-8 or US-ASCII encodings are supported: $charset given.";
     }
     _sendResourceResponse(sp, id, uri.data.contentAsBytes());
   } catch (e) {
@@ -262,7 +266,7 @@
     if (traceLoading) {
       _log("Error loading packages: $e\n$s");
     }
-    sp.send("Uncaught error ($e) loading packags file.");
+    sp.send("Uncaught error ($e) loading packages file.");
   }
 }
 
@@ -364,6 +368,26 @@
   return false;
 }
 
+_loadPackagesData(sp, traceLoading, resource){
+  try {
+    var data = resource.data;
+    var mime = data.mimeType;
+    if (mime != "text/plain") {
+      throw "MIME-type must be text/plain: $mime given.";
+    }
+    var charset = data.charset;
+    if ((charset != "utf-8") &&
+        (charset != "US-ASCII")) {
+      // The C++ portion of the embedder assumes UTF-8.
+      throw "Only utf-8 or US-ASCII encodings are supported: $charset given.";
+    }
+    _parsePackagesFile(sp, traceLoading, resource, data.contentAsBytes());
+  } catch (e) {
+    sp.send("Uncaught error ($e) loading packages data.");
+  }
+}
+
+
 _handlePackagesRequest(SendPort sp,
                        bool traceLoading,
                        int id,
@@ -402,6 +426,8 @@
         if (!exists) {
           sp.send("Packages file '$resource' not found.");
         }
+      } else if (resource.scheme == 'data') {
+        _loadPackagesData(sp, traceLoading, resource);
       } else {
         sp.send("Unknown scheme (${resource.scheme}) for package file at "
                 "'$resource'.");
diff --git a/runtime/tests/vm/vm.status b/runtime/tests/vm/vm.status
index f0bc1ef..f5163a0 100644
--- a/runtime/tests/vm/vm.status
+++ b/runtime/tests/vm/vm.status
@@ -57,11 +57,6 @@
 # Data uri's not supported by dart2js or the analyzer.
 dart/data_uri*test: Skip
 
-[ ($runtime == vm || $runtime == dart_precompiled) ]
-dart/data_uri_import_test/wrongmime: RuntimeError, OK # VM is more restrictive than the browser
-dart/data_uri_import_test/nomime: RuntimeError, OK
-dart/data_uri_import_test/nocharset: RuntimeError, OK
-
 [ $arch == mips ]
 cc/StaticNonNullSumCallCodegen: Crash, Pass # Issue 17440
 cc/ArrayLengthMaxElements: Crash  # Issue 23275
diff --git a/tests/isolate/scenarios/package_data_uri_spec/package_resolve_test.dart b/tests/isolate/scenarios/package_data_uri_spec/package_resolve_test.dart
new file mode 100644
index 0000000..8884d4e
--- /dev/null
+++ b/tests/isolate/scenarios/package_data_uri_spec/package_resolve_test.dart
@@ -0,0 +1,60 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:io';
+import 'dart:isolate';
+
+final PACKAGE_URI = "package:foo/bar.dart";
+final PACKAGE_PATH = "file:///no/such/directory/bar.dart";
+
+final PACKAGE_SPEC = """
+# This is the content of a .packages file.
+foo:file:///no/such/directory/
+""";
+
+
+main([args, port]) async {
+  if (port != null) {
+    testPackageResolution(port);
+    return;
+  }
+  var data = new Uri.dataFromString(PACKAGE_SPEC);
+  var p = new RawReceivePort();
+  Isolate.spawnUri(Platform.script,
+                   [],
+                   p.sendPort,
+                   packageConfig: data);
+  p.handler = (msg) {
+    p.close();
+    if (msg is! List) {
+      print(msg.runtimeType);
+      throw "Failure return from spawned isolate:\n\n$msg";
+    }
+    if (msg[0] != data.toString()) {
+      throw "Bad package config in child isolate: ${msg[0]}\n"
+            "Expected: $data";
+    }
+    if (msg[1] != PACKAGE_PATH) {
+      throw "Package path not matching: ${msg[1]}";
+    }
+    print("SUCCESS");
+  };
+  print("Spawning isolate's package root: ${await Isolate.packageRoot}");
+}
+
+testPackageResolution(port) async {
+  try {
+    var packageRootStr = Platform.packageRoot;
+    var packageConfigStr = Platform.packageConfig;
+    var packageConfig = await Isolate.packageConfig;
+    var resolvedPkg = await Isolate.resolvePackageUri(Uri.parse(PACKAGE_URI));
+    print("Spawned isolate's package root flag: $packageRootStr");
+    print("Spawned isolate's package config flag: $packageConfigStr");
+    print("Spawned isolate's loaded package config: $packageConfig");
+    print("Spawned isolate's resolved package path: $resolvedPkg");
+    port.send([packageConfig?.toString(), resolvedPkg?.toString()]);
+  } catch (e, s) {
+    port.send("$e\n$s\n");
+  }
+}
diff --git a/tools/VERSION b/tools/VERSION
index 3964b63..4c7a8a0 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -28,4 +28,4 @@
 MINOR 14
 PATCH 0
 PRERELEASE 7
-PRERELEASE_PATCH 1
+PRERELEASE_PATCH 2
