diff --git a/CHANGELOG.md b/CHANGELOG.md
index 458fe3d..266cce2 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,12 +6,6 @@
 
 ### Core library changes
 
-#### `dart:isolate`
-
-* Added `debugName` property to `Isolate`.
-* Added `debugName` optional parameter to `Isolate.spawn` and
-  `Isolate.spawnUri`.
-
 ### Dart VM
 
 * RegExp patterns can now use lookbehind assertions.
diff --git a/pkg/dev_compiler/tool/input_sdk/patch/isolate_patch.dart b/pkg/dev_compiler/tool/input_sdk/patch/isolate_patch.dart
index 9ccdada..999f518 100644
--- a/pkg/dev_compiler/tool/input_sdk/patch/isolate_patch.dart
+++ b/pkg/dev_compiler/tool/input_sdk/patch/isolate_patch.dart
@@ -15,9 +15,6 @@
   static Isolate get current => _unsupported();
 
   @patch
-  String get debugName => _unsupported();
-
-  @patch
   static Future<Uri> get packageRoot => _unsupported();
 
   @patch
diff --git a/runtime/bin/main.cc b/runtime/bin/main.cc
index 15f3382..f572e20 100644
--- a/runtime/bin/main.cc
+++ b/runtime/bin/main.cc
@@ -379,6 +379,7 @@
 // For now we only support the kernel isolate coming up from an
 // application snapshot or from a .dill file.
 static Dart_Isolate CreateAndSetupKernelIsolate(const char* script_uri,
+                                                const char* main,
                                                 const char* package_root,
                                                 const char* packages_config,
                                                 Dart_IsolateFlags* flags,
@@ -423,10 +424,9 @@
     isolate_data =
         new IsolateData(uri, package_root, packages_config, app_snapshot);
     isolate = Dart_CreateIsolate(
-        DART_KERNEL_ISOLATE_NAME, DART_KERNEL_ISOLATE_NAME,
-        isolate_snapshot_data, isolate_snapshot_instructions,
-        app_isolate_shared_data, app_isolate_shared_instructions, flags,
-        isolate_data, error);
+        DART_KERNEL_ISOLATE_NAME, main, isolate_snapshot_data,
+        isolate_snapshot_instructions, app_isolate_shared_data,
+        app_isolate_shared_instructions, flags, isolate_data, error);
   }
   if (isolate == NULL) {
     // Clear error from app snapshot and re-trying from kernel file.
@@ -443,9 +443,8 @@
         const_cast<uint8_t*>(kernel_service_buffer),
         kernel_service_buffer_size);
     isolate = Dart_CreateIsolateFromKernel(
-        DART_KERNEL_ISOLATE_NAME, DART_KERNEL_ISOLATE_NAME,
-        kernel_service_buffer, kernel_service_buffer_size, flags, isolate_data,
-        error);
+        DART_KERNEL_ISOLATE_NAME, main, kernel_service_buffer,
+        kernel_service_buffer_size, flags, isolate_data, error);
   }
 
   if (isolate == NULL) {
@@ -464,6 +463,7 @@
 // For now we only support the service isolate coming up from sources
 // which are compiled by the VM parser.
 static Dart_Isolate CreateAndSetupServiceIsolate(const char* script_uri,
+                                                 const char* main,
                                                  const char* package_root,
                                                  const char* packages_config,
                                                  Dart_IsolateFlags* flags,
@@ -480,9 +480,9 @@
   const uint8_t* isolate_snapshot_instructions =
       app_isolate_snapshot_instructions;
   isolate = Dart_CreateIsolate(
-      script_uri, DART_VM_SERVICE_ISOLATE_NAME, isolate_snapshot_data,
-      isolate_snapshot_instructions, app_isolate_shared_data,
-      app_isolate_shared_instructions, flags, isolate_data, error);
+      script_uri, main, isolate_snapshot_data, isolate_snapshot_instructions,
+      app_isolate_shared_data, app_isolate_shared_instructions, flags,
+      isolate_data, error);
 #else
   // JIT: Service isolate uses the core libraries snapshot.
 
@@ -493,9 +493,9 @@
   const uint8_t* isolate_snapshot_instructions =
       core_isolate_snapshot_instructions;
   isolate = Dart_CreateIsolate(
-      script_uri, DART_VM_SERVICE_ISOLATE_NAME, isolate_snapshot_data,
-      isolate_snapshot_instructions, app_isolate_shared_data,
-      app_isolate_shared_instructions, flags, isolate_data, error);
+      script_uri, NULL, isolate_snapshot_data, isolate_snapshot_instructions,
+      app_isolate_shared_data, app_isolate_shared_instructions, flags,
+      isolate_data, error);
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
   if (isolate == NULL) {
     delete isolate_data;
@@ -529,7 +529,7 @@
 // Returns newly created Isolate on success, NULL on failure.
 static Dart_Isolate CreateIsolateAndSetupHelper(bool is_main_isolate,
                                                 const char* script_uri,
-                                                const char* name,
+                                                const char* main,
                                                 const char* package_root,
                                                 const char* packages_config,
                                                 Dart_IsolateFlags* flags,
@@ -626,17 +626,17 @@
     // application kernel binary is self contained or an incremental binary.
     // Isolate should be created only if it is a self contained kernel binary.
     isolate = Dart_CreateIsolateFromKernel(
-        script_uri, name, platform_kernel_buffer, platform_kernel_buffer_size,
+        script_uri, main, platform_kernel_buffer, platform_kernel_buffer_size,
         flags, isolate_data, error);
   } else {
     isolate = Dart_CreateIsolate(
-        script_uri, name, isolate_snapshot_data, isolate_snapshot_instructions,
+        script_uri, main, isolate_snapshot_data, isolate_snapshot_instructions,
         app_isolate_shared_data, app_isolate_shared_instructions, flags,
         isolate_data, error);
   }
 #else
   isolate = Dart_CreateIsolate(
-      script_uri, name, isolate_snapshot_data, isolate_snapshot_instructions,
+      script_uri, main, isolate_snapshot_data, isolate_snapshot_instructions,
       app_isolate_shared_data, app_isolate_shared_instructions, flags,
       isolate_data, error);
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
@@ -677,13 +677,15 @@
   int exit_code = 0;
 #if !defined(EXCLUDE_CFE_AND_KERNEL_PLATFORM)
   if (strcmp(script_uri, DART_KERNEL_ISOLATE_NAME) == 0) {
-    return CreateAndSetupKernelIsolate(script_uri, package_root, package_config,
-                                       flags, error, &exit_code);
+    return CreateAndSetupKernelIsolate(script_uri, main, package_root,
+                                       package_config, flags, error,
+                                       &exit_code);
   }
 #endif  // !defined(EXCLUDE_CFE_AND_KERNEL_PLATFORM)
   if (strcmp(script_uri, DART_VM_SERVICE_ISOLATE_NAME) == 0) {
-    return CreateAndSetupServiceIsolate(
-        script_uri, package_root, package_config, flags, error, &exit_code);
+    return CreateAndSetupServiceIsolate(script_uri, main, package_root,
+                                        package_config, flags, error,
+                                        &exit_code);
   }
   bool is_main_isolate = false;
   return CreateIsolateAndSetupHelper(is_main_isolate, script_uri, main,
@@ -691,6 +693,21 @@
                                      callback_data, error, &exit_code);
 }
 
+char* BuildIsolateName(const char* script_name, const char* func_name) {
+  // Skip past any slashes in the script name.
+  const char* last_slash = strrchr(script_name, '/');
+  if (last_slash != NULL) {
+    script_name = last_slash + 1;
+  }
+
+  const char* kFormat = "%s/%s";
+  intptr_t len = strlen(script_name) + strlen(func_name) + 2;
+  char* buffer = new char[len];
+  ASSERT(buffer != NULL);
+  snprintf(buffer, len, kFormat, script_name, func_name);
+  return buffer;
+}
+
 static void OnIsolateShutdown(void* callback_data) {
   Dart_EnterScope();
 
@@ -801,6 +818,7 @@
   char* error = NULL;
   bool is_main_isolate = true;
   int exit_code = 0;
+  char* isolate_name = BuildIsolateName(script_name, "main");
   Dart_IsolateFlags flags;
   Dart_IsolateFlagsInitialize(&flags);
 
@@ -810,6 +828,7 @@
       &exit_code);
 
   if (isolate == NULL) {
+    delete[] isolate_name;
     Log::PrintErr("%s\n", error);
     free(error);
     error = NULL;
@@ -824,6 +843,7 @@
     Platform::Exit((exit_code != 0) ? exit_code : kErrorExitCode);
   }
   main_isolate = isolate;
+  delete[] isolate_name;
 
   Dart_EnterIsolate(isolate);
   ASSERT(isolate == Dart_CurrentIsolate());
diff --git a/runtime/bin/run_vm_tests.cc b/runtime/bin/run_vm_tests.cc
index 4eb653e..f024c4d 100644
--- a/runtime/bin/run_vm_tests.cc
+++ b/runtime/bin/run_vm_tests.cc
@@ -148,10 +148,9 @@
         &isolate_snapshot_data, &isolate_snapshot_instructions);
     isolate_data = new bin::IsolateData(script_uri, package_root,
                                         packages_config, app_snapshot);
-    isolate =
-        Dart_CreateIsolate(DART_KERNEL_ISOLATE_NAME, DART_KERNEL_ISOLATE_NAME,
-                           isolate_snapshot_data, isolate_snapshot_instructions,
-                           NULL, NULL, flags, isolate_data, error);
+    isolate = Dart_CreateIsolate(
+        DART_KERNEL_ISOLATE_NAME, main, isolate_snapshot_data,
+        isolate_snapshot_instructions, NULL, NULL, flags, isolate_data, error);
     if (*error != NULL) {
       free(*error);
       *error = NULL;
diff --git a/runtime/include/dart_api.h b/runtime/include/dart_api.h
index 51a1f80..1c4c151 100644
--- a/runtime/include/dart_api.h
+++ b/runtime/include/dart_api.h
@@ -836,8 +836,9 @@
  *   The VM will provide this URI to the Dart_IsolateCreateCallback when a child
  *   isolate is created by Isolate.spawn. The embedder should use a URI that
  *   allows it to load the same program into such a child isolate.
- * \param name A short name for the isolate to improve debugging messages.
- *   Typically of the format 'foo.dart:main()'.
+ * \param main The name of the main entry point this isolate will run. Provided
+ *   only for advisory purposes to improve debugging messages. Typically either
+ *   'main' or the name of the function passed to Isolate.spawn.
  * \param isolate_snapshot_data
  * \param isolate_snapshot_instructions Buffers containing a snapshot of the
  *   isolate or NULL if no snapshot is provided. If provided, the buffers must
@@ -854,7 +855,7 @@
  */
 DART_EXPORT Dart_Isolate
 Dart_CreateIsolate(const char* script_uri,
-                   const char* name,
+                   const char* main,
                    const uint8_t* isolate_snapshot_data,
                    const uint8_t* isolate_snapshot_instructions,
                    const uint8_t* shared_data,
@@ -875,8 +876,9 @@
  *   The VM will provide this URI to the Dart_IsolateCreateCallback when a child
  *   isolate is created by Isolate.spawn. The embedder should use a URI that
  *   allows it to load the same program into such a child isolate.
- * \param name A short name for the isolate to improve debugging messages.
- *   Typically of the format 'foo.dart:main()'.
+ * \param main The name of the main entry point this isolate will run. Provided
+ *   only for advisory purposes to improve debugging messages. Typically either
+ *   'main' or the name of the function passed to Isolate.spawn.
  * \param kernel_buffer
  * \param kernel_buffer_size A buffer which contains a kernel/DIL program. Must
  *   remain valid until isolate shutdown.
@@ -892,7 +894,7 @@
  */
 DART_EXPORT Dart_Isolate
 Dart_CreateIsolateFromKernel(const char* script_uri,
-                             const char* name,
+                             const char* main,
                              const uint8_t* kernel_buffer,
                              intptr_t kernel_buffer_size,
                              Dart_IsolateFlags* flags,
diff --git a/runtime/lib/isolate.cc b/runtime/lib/isolate.cc
index d0031d7..b925147 100644
--- a/runtime/lib/isolate.cc
+++ b/runtime/lib/isolate.cc
@@ -130,12 +130,9 @@
 
     // Make a copy of the state's isolate flags and hand it to the callback.
     Dart_IsolateFlags api_flags = *(state_->isolate_flags());
-    const char* name = (state_->debug_name() == NULL) ? state_->function_name()
-                                                      : state_->debug_name();
-    ASSERT(name != NULL);
 
     Isolate* isolate = reinterpret_cast<Isolate*>((callback)(
-        state_->script_url(), name, state_->package_root(),
+        state_->script_url(), state_->function_name(), state_->package_root(),
         state_->package_config(), &api_flags, state_->init_data(), &error));
     state_->DecrementSpawnCount();
     if (isolate == NULL) {
@@ -185,7 +182,7 @@
   return result;
 }
 
-DEFINE_NATIVE_ENTRY(Isolate_spawnFunction, 0, 11) {
+DEFINE_NATIVE_ENTRY(Isolate_spawnFunction, 0, 10) {
   GET_NON_NULL_NATIVE_ARGUMENT(SendPort, port, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(String, script_uri, arguments->NativeArgAt(1));
   GET_NON_NULL_NATIVE_ARGUMENT(Instance, closure, arguments->NativeArgAt(2));
@@ -196,7 +193,6 @@
   GET_NATIVE_ARGUMENT(SendPort, onError, arguments->NativeArgAt(7));
   GET_NATIVE_ARGUMENT(String, packageRoot, arguments->NativeArgAt(8));
   GET_NATIVE_ARGUMENT(String, packageConfig, arguments->NativeArgAt(9));
-  GET_NATIVE_ARGUMENT(String, debugName, arguments->NativeArgAt(10));
 
   if (closure.IsClosure()) {
     Function& func = Function::Handle();
@@ -227,15 +223,13 @@
       const char* utf8_package_root = NULL;
       const char* utf8_package_config =
           packageConfig.IsNull() ? NULL : String2UTF8(packageConfig);
-      const char* utf8_debug_name =
-          debugName.IsNull() ? NULL : String2UTF8(debugName);
 
       IsolateSpawnState* state = new IsolateSpawnState(
           port.Id(), isolate->origin_id(), isolate->init_callback_data(),
           String2UTF8(script_uri), func, &message_buffer,
           isolate->spawn_count_monitor(), isolate->spawn_count(),
           utf8_package_root, utf8_package_config, paused.value(), fatal_errors,
-          on_exit_port, on_error_port, utf8_debug_name);
+          on_exit_port, on_error_port);
 
       // Since this is a call to Isolate.spawn, copy the parent isolate's code.
       state->isolate_flags()->copy_parent_code = true;
@@ -291,7 +285,7 @@
   return result;
 }
 
-DEFINE_NATIVE_ENTRY(Isolate_spawnUri, 0, 13) {
+DEFINE_NATIVE_ENTRY(Isolate_spawnUri, 0, 12) {
   GET_NON_NULL_NATIVE_ARGUMENT(SendPort, port, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(String, uri, arguments->NativeArgAt(1));
 
@@ -310,8 +304,6 @@
   GET_NATIVE_ARGUMENT(String, packageRoot, arguments->NativeArgAt(10));
   GET_NATIVE_ARGUMENT(String, packageConfig, arguments->NativeArgAt(11));
 
-  GET_NATIVE_ARGUMENT(String, debugName, arguments->NativeArgAt(12));
-
   if (Dart::vm_snapshot_kind() == Snapshot::kFullAOT) {
     const Array& args = Array::Handle(Array::New(1));
     args.SetAt(
@@ -355,15 +347,12 @@
   const char* utf8_package_root = NULL;
   const char* utf8_package_config =
       packageConfig.IsNull() ? NULL : String2UTF8(packageConfig);
-  const char* utf8_debug_name =
-      debugName.IsNull() ? NULL : String2UTF8(debugName);
 
   IsolateSpawnState* state = new IsolateSpawnState(
       port.Id(), isolate->init_callback_data(), canonical_uri,
       utf8_package_root, utf8_package_config, &arguments_buffer,
       &message_buffer, isolate->spawn_count_monitor(), isolate->spawn_count(),
-      paused.value(), fatal_errors, on_exit_port, on_error_port,
-      utf8_debug_name);
+      paused.value(), fatal_errors, on_exit_port, on_error_port);
 
   // If we were passed a value then override the default flags state for
   // checked mode.
@@ -389,15 +378,6 @@
   return Object::null();
 }
 
-DEFINE_NATIVE_ENTRY(Isolate_getDebugName, 0, 1) {
-  GET_NON_NULL_NATIVE_ARGUMENT(SendPort, port, arguments->NativeArgAt(0));
-  Isolate* isolate_lookup = Isolate::LookupIsolateByPort(port.Id());
-  if (isolate_lookup == NULL) {
-    return Object::null();
-  }
-  return String::New(isolate_lookup->name());
-}
-
 DEFINE_NATIVE_ENTRY(Isolate_getPortAndCapabilitiesOfCurrentIsolate, 0, 0) {
   const Array& result = Array::Handle(Array::New(3));
   result.SetAt(0, SendPort::Handle(SendPort::New(isolate->main_port())));
diff --git a/runtime/lib/isolate_patch.dart b/runtime/lib/isolate_patch.dart
index cdd5394..5e5c235 100644
--- a/runtime/lib/isolate_patch.dart
+++ b/runtime/lib/isolate_patch.dart
@@ -316,9 +316,6 @@
   static Isolate get current => _currentIsolate;
 
   @patch
-  String get debugName => _getDebugName(controlPort);
-
-  @patch
   static Future<Uri> get packageRoot {
     var hook = VMLibraryHooks.packageRootUriFuture;
     if (hook == null) {
@@ -355,8 +352,7 @@
       {bool paused: false,
       bool errorsAreFatal,
       SendPort onExit,
-      SendPort onError,
-      String debugName}) async {
+      SendPort onError}) async {
     // `paused` isn't handled yet.
     RawReceivePort readyPort;
     try {
@@ -381,18 +377,8 @@
         script = await Isolate.resolvePackageUri(script);
       }
 
-      _spawnFunction(
-          readyPort.sendPort,
-          script.toString(),
-          entryPoint,
-          message,
-          paused,
-          errorsAreFatal,
-          onExit,
-          onError,
-          null,
-          packageConfig,
-          debugName);
+      _spawnFunction(readyPort.sendPort, script.toString(), entryPoint, message,
+          paused, errorsAreFatal, onExit, onError, null, packageConfig);
       return await _spawnCommon(readyPort);
     } catch (e, st) {
       if (readyPort != null) {
@@ -412,8 +398,7 @@
       Map<String, String> environment,
       Uri packageRoot,
       Uri packageConfig,
-      bool automaticPackageResolution: false,
-      String debugName}) async {
+      bool automaticPackageResolution: false}) async {
     RawReceivePort readyPort;
     if (environment != null) {
       throw new UnimplementedError("environment");
@@ -482,8 +467,7 @@
           null,
           /* environment */
           packageRootString,
-          packageConfigString,
-          debugName);
+          packageConfigString);
       return await _spawnCommon(readyPort);
     } catch (e) {
       if (readyPort != null) {
@@ -540,8 +524,7 @@
       SendPort onExit,
       SendPort onError,
       String packageRoot,
-      String packageConfig,
-      String debugName) native "Isolate_spawnFunction";
+      String packageConfig) native "Isolate_spawnFunction";
 
   static void _spawnUri(
       SendPort readyPort,
@@ -555,14 +538,10 @@
       bool checked,
       List environment,
       String packageRoot,
-      String packageConfig,
-      String debugName) native "Isolate_spawnUri";
+      String packageConfig) native "Isolate_spawnUri";
 
   static void _sendOOB(port, msg) native "Isolate_sendOOB";
 
-  static String _getDebugName(SendPort controlPort)
-      native "Isolate_getDebugName";
-
   @patch
   void _pause(Capability resumeCapability) {
     var msg = new List(4)
diff --git a/runtime/observatory/tests/service/dev_fs_spawn_test.dart b/runtime/observatory/tests/service/dev_fs_spawn_test.dart
index 1221a58..c0a182e 100644
--- a/runtime/observatory/tests/service/dev_fs_spawn_test.dart
+++ b/runtime/observatory/tests/service/dev_fs_spawn_test.dart
@@ -118,7 +118,7 @@
       if (event.kind == ServiceEvent.kIsolateSpawn) {
         expect(event.spawnToken, equals('mySpawnToken0'));
         expect(event.isolate, isNotNull);
-        expect(event.isolate.name, equals('main'));
+        expect(event.isolate.name, equals('devfs_file0.dart:main()'));
         completer.complete(event.isolate);
         sub.cancel();
       }
@@ -147,7 +147,7 @@
       if (event.kind == ServiceEvent.kIsolateSpawn) {
         expect(event.spawnToken, equals('mySpawnToken1'));
         expect(event.isolate, isNotNull);
-        expect(event.isolate.name, equals('main'));
+        expect(event.isolate.name, equals('devfs_file1.dart:main()'));
         completer.complete(event.isolate);
         sub.cancel();
       }
@@ -177,7 +177,7 @@
       if (event.kind == ServiceEvent.kIsolateSpawn) {
         expect(event.spawnToken, equals('mySpawnToken2'));
         expect(event.isolate, isNotNull);
-        expect(event.isolate.name, equals('main'));
+        expect(event.isolate.name, equals('devfs_file2.dart:main()'));
         completer.complete(event.isolate);
         sub.cancel();
       }
diff --git a/runtime/observatory/tests/service/set_name_rpc_test.dart b/runtime/observatory/tests/service/set_name_rpc_test.dart
index 186e4e0..1d743cc 100644
--- a/runtime/observatory/tests/service/set_name_rpc_test.dart
+++ b/runtime/observatory/tests/service/set_name_rpc_test.dart
@@ -10,7 +10,11 @@
 
 var tests = <IsolateTest>[
   (Isolate isolate) async {
-    expect(isolate.name == 'main', isTrue);
+    expect(
+        ((isolate.name == 'set_name_rpc_test.dart:main()') ||
+            (isolate.name == 'out.jitsnapshot:main()')),
+        isTrue);
+
     Completer completer = new Completer();
     var stream = await isolate.vm.getEventStream(VM.kIsolateStream);
     var subscription;
diff --git a/runtime/vm/bootstrap_natives.h b/runtime/vm/bootstrap_natives.h
index bedb991..194a86c 100644
--- a/runtime/vm/bootstrap_natives.h
+++ b/runtime/vm/bootstrap_natives.h
@@ -294,12 +294,11 @@
   V(Int32x4_setFlagZ, 2)                                                       \
   V(Int32x4_setFlagW, 2)                                                       \
   V(Int32x4_select, 3)                                                         \
-  V(Isolate_spawnFunction, 11)                                                 \
-  V(Isolate_spawnUri, 13)                                                      \
+  V(Isolate_spawnFunction, 10)                                                 \
+  V(Isolate_spawnUri, 12)                                                      \
   V(Isolate_getPortAndCapabilitiesOfCurrentIsolate, 0)                         \
   V(Isolate_getCurrentRootUriStr, 0)                                           \
   V(Isolate_sendOOB, 2)                                                        \
-  V(Isolate_getDebugName, 1)                                                   \
   V(GrowableList_allocate, 2)                                                  \
   V(GrowableList_getIndexed, 2)                                                \
   V(GrowableList_setIndexed, 3)                                                \
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index f407d71..0939522 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -1075,8 +1075,43 @@
 
 // --- Isolates ---
 
+static char* BuildIsolateName(const char* script_uri, const char* main) {
+  if (script_uri == NULL) {
+    // Just use the main as the name.
+    if (main == NULL) {
+      return strdup("isolate");
+    } else {
+      return strdup(main);
+    }
+  }
+
+  if (ServiceIsolate::NameEquals(script_uri) ||
+      (strcmp(script_uri, DART_KERNEL_ISOLATE_NAME) == 0)) {
+    return strdup(script_uri);
+  }
+
+  // Skip past any slashes and backslashes in the script uri.
+  const char* last_slash = strrchr(script_uri, '/');
+  if (last_slash != NULL) {
+    script_uri = last_slash + 1;
+  }
+  const char* last_backslash = strrchr(script_uri, '\\');
+  if (last_backslash != NULL) {
+    script_uri = last_backslash + 1;
+  }
+  if (main == NULL) {
+    main = "main";
+  }
+
+  char* chars = NULL;
+  intptr_t len = Utils::SNPrint(NULL, 0, "%s:%s()", script_uri, main) + 1;
+  chars = reinterpret_cast<char*>(malloc(len));
+  Utils::SNPrint(chars, len, "%s:%s()", script_uri, main);
+  return chars;
+}
+
 static Dart_Isolate CreateIsolate(const char* script_uri,
-                                  const char* name,
+                                  const char* main,
                                   const uint8_t* snapshot_data,
                                   const uint8_t* snapshot_instructions,
                                   const uint8_t* shared_data,
@@ -1087,6 +1122,7 @@
                                   void* callback_data,
                                   char** error) {
   CHECK_NO_ISOLATE(Isolate::Current());
+  char* isolate_name = BuildIsolateName(script_uri, main);
 
   // Setup default flags in case none were passed.
   Dart_IsolateFlags api_flags;
@@ -1094,7 +1130,8 @@
     Isolate::FlagsInitialize(&api_flags);
     flags = &api_flags;
   }
-  Isolate* I = Dart::CreateIsolate((name == NULL) ? "isolate" : name, *flags);
+  Isolate* I = Dart::CreateIsolate(isolate_name, *flags);
+  free(isolate_name);
   if (I == NULL) {
     if (error != NULL) {
       *error = strdup("Isolate creation failed");
@@ -1149,7 +1186,7 @@
 
 DART_EXPORT Dart_Isolate
 Dart_CreateIsolate(const char* script_uri,
-                   const char* name,
+                   const char* main,
                    const uint8_t* snapshot_data,
                    const uint8_t* snapshot_instructions,
                    const uint8_t* shared_data,
@@ -1158,21 +1195,21 @@
                    void* callback_data,
                    char** error) {
   API_TIMELINE_DURATION(Thread::Current());
-  return CreateIsolate(script_uri, name, snapshot_data, snapshot_instructions,
+  return CreateIsolate(script_uri, main, snapshot_data, snapshot_instructions,
                        shared_data, shared_instructions, NULL, 0, flags,
                        callback_data, error);
 }
 
 DART_EXPORT Dart_Isolate
 Dart_CreateIsolateFromKernel(const char* script_uri,
-                             const char* name,
+                             const char* main,
                              const uint8_t* kernel_buffer,
                              intptr_t kernel_buffer_size,
                              Dart_IsolateFlags* flags,
                              void* callback_data,
                              char** error) {
   API_TIMELINE_DURATION(Thread::Current());
-  return CreateIsolate(script_uri, name, NULL, NULL, NULL, NULL, kernel_buffer,
+  return CreateIsolate(script_uri, main, NULL, NULL, NULL, NULL, kernel_buffer,
                        kernel_buffer_size, flags, callback_data, error);
 }
 
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index a72736e..ce8ed3f 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -2641,18 +2641,6 @@
   return count;
 }
 
-Isolate* Isolate::LookupIsolateByPort(Dart_Port port) {
-  MonitorLocker ml(isolates_list_monitor_);
-  Isolate* current = isolates_list_head_;
-  while (current != NULL) {
-    if (current->main_port() == port) {
-      return current;
-    }
-    current = current->next_;
-  }
-  return NULL;
-}
-
 bool Isolate::AddIsolateToList(Isolate* isolate) {
   MonitorLocker ml(isolates_list_monitor_);
   if (!creation_enabled_) {
@@ -2938,8 +2926,7 @@
                                      bool paused,
                                      bool errors_are_fatal,
                                      Dart_Port on_exit_port,
-                                     Dart_Port on_error_port,
-                                     const char* debug_name)
+                                     Dart_Port on_error_port)
     : isolate_(NULL),
       parent_port_(parent_port),
       origin_id_(origin_id),
@@ -2952,7 +2939,6 @@
       library_url_(NULL),
       class_name_(NULL),
       function_name_(NULL),
-      debug_name_(debug_name),
       serialized_args_(NULL),
       serialized_message_(message_buffer->StealMessage()),
       spawn_count_monitor_(spawn_count_monitor),
@@ -2989,8 +2975,7 @@
                                      bool paused,
                                      bool errors_are_fatal,
                                      Dart_Port on_exit_port,
-                                     Dart_Port on_error_port,
-                                     const char* debug_name)
+                                     Dart_Port on_error_port)
     : isolate_(NULL),
       parent_port_(parent_port),
       origin_id_(ILLEGAL_PORT),
@@ -3003,7 +2988,6 @@
       library_url_(NULL),
       class_name_(NULL),
       function_name_(NULL),
-      debug_name_(debug_name),
       serialized_args_(args_buffer->StealMessage()),
       serialized_message_(message_buffer->StealMessage()),
       spawn_count_monitor_(spawn_count_monitor),
@@ -3025,7 +3009,6 @@
   delete[] library_url_;
   delete[] class_name_;
   delete[] function_name_;
-  delete[] debug_name_;
   delete serialized_args_;
   delete serialized_message_;
 }
diff --git a/runtime/vm/isolate.h b/runtime/vm/isolate.h
index c4dd373..40f0c6f 100644
--- a/runtime/vm/isolate.h
+++ b/runtime/vm/isolate.h
@@ -772,10 +772,6 @@
   static void KillAllIsolates(LibMsgId msg_id);
   static void KillIfExists(Isolate* isolate, LibMsgId msg_id);
 
-  // Lookup an isolate by its main port. Returns NULL if no matching isolate is
-  // found.
-  static Isolate* LookupIsolateByPort(Dart_Port port);
-
   static void DisableIsolateCreation();
   static void EnableIsolateCreation();
   static bool IsolateCreationEnabled();
@@ -1124,8 +1120,7 @@
                     bool paused,
                     bool errorsAreFatal,
                     Dart_Port onExit,
-                    Dart_Port onError,
-                    const char* debug_name);
+                    Dart_Port onError);
   IsolateSpawnState(Dart_Port parent_port,
                     void* init_data,
                     const char* script_url,
@@ -1138,8 +1133,7 @@
                     bool paused,
                     bool errorsAreFatal,
                     Dart_Port onExit,
-                    Dart_Port onError,
-                    const char* debug_name);
+                    Dart_Port onError);
   ~IsolateSpawnState();
 
   Isolate* isolate() const { return isolate_; }
@@ -1156,7 +1150,6 @@
   const char* library_url() const { return library_url_; }
   const char* class_name() const { return class_name_; }
   const char* function_name() const { return function_name_; }
-  const char* debug_name() const { return debug_name_; }
   bool is_spawn_uri() const { return library_url_ == NULL; }
   bool paused() const { return paused_; }
   bool errors_are_fatal() const { return errors_are_fatal_; }
@@ -1181,7 +1174,6 @@
   const char* library_url_;
   const char* class_name_;
   const char* function_name_;
-  const char* debug_name_;
   Message* serialized_args_;
   Message* serialized_message_;
 
diff --git a/runtime/vm/kernel_isolate.cc b/runtime/vm/kernel_isolate.cc
index 79fb581..ab90491 100644
--- a/runtime/vm/kernel_isolate.cc
+++ b/runtime/vm/kernel_isolate.cc
@@ -98,9 +98,8 @@
     api_flags.use_osr = true;
 #endif
 
-    isolate = reinterpret_cast<Isolate*>(
-        create_callback(KernelIsolate::kName, KernelIsolate::kName, NULL, NULL,
-                        &api_flags, NULL, &error));
+    isolate = reinterpret_cast<Isolate*>(create_callback(
+        KernelIsolate::kName, NULL, NULL, NULL, &api_flags, NULL, &error));
     if (isolate == NULL) {
       if (FLAG_trace_kernel) {
         OS::PrintErr(DART_KERNEL_ISOLATE_NAME ": Isolate creation error: %s\n",
diff --git a/sdk/lib/_internal/js_runtime/lib/isolate_patch.dart b/sdk/lib/_internal/js_runtime/lib/isolate_patch.dart
index 56bab4c..78cbf61 100644
--- a/sdk/lib/_internal/js_runtime/lib/isolate_patch.dart
+++ b/sdk/lib/_internal/js_runtime/lib/isolate_patch.dart
@@ -16,11 +16,6 @@
   }
 
   @patch
-  String get debugName {
-    throw new UnsupportedError("Isolate.debugName");
-  }
-
-  @patch
   static Future<Uri> get packageRoot {
     throw new UnsupportedError("Isolate.packageRoot");
   }
diff --git a/sdk/lib/isolate/isolate.dart b/sdk/lib/isolate/isolate.dart
index 5c5883d..6a737fe 100644
--- a/sdk/lib/isolate/isolate.dart
+++ b/sdk/lib/isolate/isolate.dart
@@ -112,20 +112,6 @@
   final Capability terminateCapability;
 
   /**
-   * The name of the [Isolate] displayed for debug purposes.
-   *
-   * This can be set using the `debugName` parameter in [spawn] and [spawnUri].
-   *
-   * This name does not uniquely identify an isolate. Multiple isolates in the
-   * same process may have the same `debugName`.
-   *
-   * For a given isolate, this value will be the same as the values returned by
-   * `Dart_DebugName` in the C embedding API and the `debugName` property in
-   * [IsolateMirror].
-   */
-  external String get debugName;
-
-  /**
    * Create a new [Isolate] object with a restricted set of capabilities.
    *
    * The port should be a control port for an isolate, as taken from
@@ -229,9 +215,6 @@
    * corresponding parameter and was processed before the isolate starts
    * running.
    *
-   * If [debugName] is provided, the spawned [Isolate] will be identifiable by
-   * this name in debuggers and logging.
-   *
    * If [errorsAreFatal] is omitted, the platform may choose a default behavior
    * or inherit the current isolate's behavior.
    *
@@ -248,8 +231,7 @@
       {bool paused: false,
       bool errorsAreFatal,
       SendPort onExit,
-      SendPort onError,
-      String debugName});
+      SendPort onError});
 
   /**
    * Creates and spawns an isolate that runs the code from the library with
@@ -317,9 +299,6 @@
    * WARNING: The [environment] parameter is not implemented on all
    * platforms yet.
    *
-   * If [debugName] is provided, the spawned [Isolate] will be identifiable by
-   * this name in debuggers and logging.
-   *
    * Returns a future that will complete with an [Isolate] instance if the
    * spawning succeeded. It will complete with an error otherwise.
    */
@@ -336,8 +315,7 @@
       @Deprecated('The packages/ dir is not supported in Dart 2')
           Uri packageRoot,
       Uri packageConfig,
-      bool automaticPackageResolution: false,
-      String debugName});
+      bool automaticPackageResolution: false});
 
   /**
    * Requests the isolate to pause.
diff --git a/tests/lib_2/isolate/spawn_function_test.dart b/tests/lib_2/isolate/spawn_function_test.dart
index 7a2a193..eba1bfa 100644
--- a/tests/lib_2/isolate/spawn_function_test.dart
+++ b/tests/lib_2/isolate/spawn_function_test.dart
@@ -17,15 +17,12 @@
 
 void main([args, port]) {
   if (testRemote(main, port)) return;
-  test('message - reply chain', () async {
+  test('message - reply chain', () {
     ReceivePort port = new ReceivePort();
+    Isolate.spawn(child, ['hi', port.sendPort]);
     port.listen(expectAsync((msg) {
       port.close();
       expect(msg, equals('re: hi'));
     }));
-    const String debugName = 'spawnedIsolate';
-    final i =
-        await Isolate.spawn(child, ['hi', port.sendPort], debugName: debugName);
-    expect(i.debugName, debugName);
   });
 }
diff --git a/tests/lib_2/isolate/spawn_uri_test.dart b/tests/lib_2/isolate/spawn_uri_test.dart
index a4d89c3..650bafa 100644
--- a/tests/lib_2/isolate/spawn_uri_test.dart
+++ b/tests/lib_2/isolate/spawn_uri_test.dart
@@ -12,17 +12,14 @@
 import 'package:expect/async_minitest.dart';
 
 main() {
-  test('isolate fromUri - send and reply', () async {
+  test('isolate fromUri - send and reply', () {
     ReceivePort port = new ReceivePort();
     port.listen(expectAsync((msg) {
       expect(msg, equals('re: hi'));
       port.close();
     }));
 
-    const String debugName = 'spawnedIsolate';
-    final i = await Isolate.spawnUri(
-        Uri.parse('spawn_uri_child_isolate.dart'), ['hi'], port.sendPort,
-        debugName: debugName);
-    expect(i.debugName, debugName);
+    Isolate.spawnUri(
+        Uri.parse('spawn_uri_child_isolate.dart'), ['hi'], port.sendPort);
   });
 }
