diff --git a/test/cctest/test-debug.cc b/test/cctest/test-debug.cc
index c3c65fd..914bda1 100644
--- a/test/cctest/test-debug.cc
+++ b/test/cctest/test-debug.cc
@@ -33,7 +33,7 @@
 #include "src/base/platform/condition-variable.h"
 #include "src/base/platform/platform.h"
 #include "src/compilation-cache.h"
-#include "src/debug.h"
+#include "src/debug/debug.h"
 #include "src/deoptimizer.h"
 #include "src/frames.h"
 #include "src/utils.h"
@@ -52,7 +52,6 @@
 using ::v8::internal::JSGlobalProxy;
 using ::v8::internal::Code;
 using ::v8::internal::Debug;
-using ::v8::internal::Debugger;
 using ::v8::internal::CommandMessage;
 using ::v8::internal::CommandMessageQueue;
 using ::v8::internal::StackFrame;
@@ -74,9 +73,9 @@
  public:
   inline DebugLocalContext(
       v8::Isolate* isolate, v8::ExtensionConfiguration* extensions = 0,
-      v8::Handle<v8::ObjectTemplate> global_template =
-          v8::Handle<v8::ObjectTemplate>(),
-      v8::Handle<v8::Value> global_object = v8::Handle<v8::Value>())
+      v8::Local<v8::ObjectTemplate> global_template =
+          v8::Local<v8::ObjectTemplate>(),
+      v8::Local<v8::Value> global_object = v8::Local<v8::Value>())
       : scope_(isolate),
         context_(v8::Context::New(isolate, extensions, global_template,
                                   global_object)) {
@@ -84,9 +83,9 @@
   }
   inline DebugLocalContext(
       v8::ExtensionConfiguration* extensions = 0,
-      v8::Handle<v8::ObjectTemplate> global_template =
-          v8::Handle<v8::ObjectTemplate>(),
-      v8::Handle<v8::Value> global_object = v8::Handle<v8::Value>())
+      v8::Local<v8::ObjectTemplate> global_template =
+          v8::Local<v8::ObjectTemplate>(),
+      v8::Local<v8::Value> global_object = v8::Local<v8::Value>())
       : scope_(CcTest::isolate()),
         context_(v8::Context::New(CcTest::isolate(), extensions,
                                   global_template, global_object)) {
@@ -115,8 +114,10 @@
         v8::Utils::OpenHandle(*context_->Global())));
     Handle<v8::internal::String> debug_string =
         factory->InternalizeOneByteString(STATIC_CHAR_VECTOR("debug"));
-    v8::internal::Runtime::DefineObjectProperty(global, debug_string,
-        handle(debug_context->global_proxy(), isolate), DONT_ENUM).Check();
+    v8::internal::JSObject::SetOwnPropertyIgnoreAttributes(
+        global, debug_string, handle(debug_context->global_proxy()),
+        v8::internal::DONT_ENUM)
+        .Check();
   }
 
  private:
@@ -127,34 +128,33 @@
 
 // --- H e l p e r   F u n c t i o n s
 
-
-// Compile and run the supplied source and return the fequested function.
-static v8::Local<v8::Function> CompileFunction(DebugLocalContext* env,
-                                               const char* source,
-                                               const char* function_name) {
-  v8::Script::Compile(v8::String::NewFromUtf8(env->GetIsolate(), source))
-      ->Run();
-  return v8::Local<v8::Function>::Cast((*env)->Global()->Get(
-      v8::String::NewFromUtf8(env->GetIsolate(), function_name)));
-}
-
-
 // Compile and run the supplied source and return the requested function.
 static v8::Local<v8::Function> CompileFunction(v8::Isolate* isolate,
                                                const char* source,
                                                const char* function_name) {
-  v8::Script::Compile(v8::String::NewFromUtf8(isolate, source))->Run();
-  v8::Local<v8::Object> global = isolate->GetCurrentContext()->Global();
-  return v8::Local<v8::Function>::Cast(
-      global->Get(v8::String::NewFromUtf8(isolate, function_name)));
+  CompileRunChecked(isolate, source);
+  v8::Local<v8::String> name = v8_str(isolate, function_name);
+  v8::Local<v8::Context> context = isolate->GetCurrentContext();
+  v8::MaybeLocal<v8::Value> maybe_function =
+      context->Global()->Get(context, name);
+  return v8::Local<v8::Function>::Cast(maybe_function.ToLocalChecked());
+}
+
+
+// Compile and run the supplied source and return the requested function.
+static v8::Local<v8::Function> CompileFunction(DebugLocalContext* env,
+                                               const char* source,
+                                               const char* function_name) {
+  return CompileFunction(env->GetIsolate(), source, function_name);
 }
 
 
 // Is there any debug info for the function?
-static bool HasDebugInfo(v8::Handle<v8::Function> fun) {
-  Handle<v8::internal::JSFunction> f = v8::Utils::OpenHandle(*fun);
+static bool HasDebugInfo(v8::Local<v8::Function> fun) {
+  Handle<v8::internal::JSFunction> f =
+      Handle<v8::internal::JSFunction>::cast(v8::Utils::OpenHandle(*fun));
   Handle<v8::internal::SharedFunctionInfo> shared(f->shared());
-  return Debug::HasDebugInfo(shared);
+  return shared->HasDebugInfo();
 }
 
 
@@ -174,8 +174,9 @@
 
 // Set a break point in a function and return the associated break point
 // number.
-static int SetBreakPoint(v8::Handle<v8::Function> fun, int position) {
-  return SetBreakPoint(v8::Utils::OpenHandle(*fun), position);
+static int SetBreakPoint(v8::Local<v8::Function> fun, int position) {
+  return SetBreakPoint(
+      i::Handle<i::JSFunction>::cast(v8::Utils::OpenHandle(*fun)), position);
 }
 
 
@@ -189,8 +190,8 @@
            "debug.Debug.setBreakPoint(%s,%d,%d)",
            function_name, line, position);
   buffer[SMALL_STRING_BUFFER_SIZE - 1] = '\0';
-  v8::Handle<v8::String> str = v8::String::NewFromUtf8(isolate, buffer.start());
-  return v8::Script::Compile(str)->Run()->Int32Value();
+  v8::Local<v8::Value> value = CompileRunChecked(isolate, buffer.start());
+  return value->Int32Value(isolate->GetCurrentContext()).FromJust();
 }
 
 
@@ -211,12 +212,10 @@
   }
   buffer[SMALL_STRING_BUFFER_SIZE - 1] = '\0';
   {
-    v8::TryCatch try_catch;
-    v8::Handle<v8::String> str =
-        v8::String::NewFromUtf8(isolate, buffer.start());
-    v8::Handle<v8::Value> value = v8::Script::Compile(str)->Run();
+    v8::TryCatch try_catch(isolate);
+    v8::Local<v8::Value> value = CompileRunChecked(isolate, buffer.start());
     CHECK(!try_catch.HasCaught());
-    return value->Int32Value();
+    return value->Int32Value(isolate->GetCurrentContext()).FromJust();
   }
 }
 
@@ -240,12 +239,10 @@
   }
   buffer[SMALL_STRING_BUFFER_SIZE - 1] = '\0';
   {
-    v8::TryCatch try_catch;
-    v8::Handle<v8::String> str =
-        v8::String::NewFromUtf8(isolate, buffer.start());
-    v8::Handle<v8::Value> value = v8::Script::Compile(str)->Run();
+    v8::TryCatch try_catch(isolate);
+    v8::Local<v8::Value> value = CompileRunChecked(isolate, buffer.start());
     CHECK(!try_catch.HasCaught());
-    return value->Int32Value();
+    return value->Int32Value(isolate->GetCurrentContext()).FromJust();
   }
 }
 
@@ -267,7 +264,7 @@
            "debug.Debug.clearBreakPoint(%d)",
            break_point_number);
   buffer[SMALL_STRING_BUFFER_SIZE - 1] = '\0';
-  v8::Script::Compile(v8::String::NewFromUtf8(isolate, buffer.start()))->Run();
+  CompileRunChecked(isolate, buffer.start());
 }
 
 
@@ -278,7 +275,7 @@
            "debug.Debug.enableScriptBreakPoint(%d)",
            break_point_number);
   buffer[SMALL_STRING_BUFFER_SIZE - 1] = '\0';
-  v8::Script::Compile(v8::String::NewFromUtf8(isolate, buffer.start()))->Run();
+  CompileRunChecked(isolate, buffer.start());
 }
 
 
@@ -289,7 +286,7 @@
            "debug.Debug.disableScriptBreakPoint(%d)",
            break_point_number);
   buffer[SMALL_STRING_BUFFER_SIZE - 1] = '\0';
-  v8::Script::Compile(v8::String::NewFromUtf8(isolate, buffer.start()))->Run();
+  CompileRunChecked(isolate, buffer.start());
 }
 
 
@@ -301,7 +298,7 @@
            "debug.Debug.changeScriptBreakPointCondition(%d, \"%s\")",
            break_point_number, condition);
   buffer[SMALL_STRING_BUFFER_SIZE - 1] = '\0';
-  v8::Script::Compile(v8::String::NewFromUtf8(isolate, buffer.start()))->Run();
+  CompileRunChecked(isolate, buffer.start());
 }
 
 
@@ -313,7 +310,7 @@
            "debug.Debug.changeScriptBreakPointIgnoreCount(%d, %d)",
            break_point_number, ignoreCount);
   buffer[SMALL_STRING_BUFFER_SIZE - 1] = '\0';
-  v8::Script::Compile(v8::String::NewFromUtf8(isolate, buffer.start()))->Run();
+  CompileRunChecked(isolate, buffer.start());
 }
 
 
@@ -329,22 +326,14 @@
 static void ChangeBreakOnExceptionFromJS(v8::Isolate* isolate, bool caught,
                                          bool uncaught) {
   if (caught) {
-    v8::Script::Compile(
-        v8::String::NewFromUtf8(isolate, "debug.Debug.setBreakOnException()"))
-        ->Run();
+    CompileRunChecked(isolate, "debug.Debug.setBreakOnException()");
   } else {
-    v8::Script::Compile(
-        v8::String::NewFromUtf8(isolate, "debug.Debug.clearBreakOnException()"))
-        ->Run();
+    CompileRunChecked(isolate, "debug.Debug.clearBreakOnException()");
   }
   if (uncaught) {
-    v8::Script::Compile(
-        v8::String::NewFromUtf8(
-            isolate, "debug.Debug.setBreakOnUncaughtException()"))->Run();
+    CompileRunChecked(isolate, "debug.Debug.setBreakOnUncaughtException()");
   } else {
-    v8::Script::Compile(
-        v8::String::NewFromUtf8(
-            isolate, "debug.Debug.clearBreakOnUncaughtException()"))->Run();
+    CompileRunChecked(isolate, "debug.Debug.clearBreakOnUncaughtException()");
   }
 }
 
@@ -352,10 +341,13 @@
 // Prepare to step to next break location.
 static void PrepareStep(StepAction step_action) {
   v8::internal::Debug* debug = CcTest::i_isolate()->debug();
-  debug->PrepareStep(step_action, 1, StackFrame::NO_ID);
+  debug->PrepareStep(step_action);
 }
 
 
+static void ClearStepping() { CcTest::i_isolate()->debug()->ClearStepping(); }
+
+
 // This function is in namespace v8::internal to be friend with class
 // v8::internal::Debug.
 namespace v8 {
@@ -394,10 +386,10 @@
   // Check that the debugger context is cleared and that there is no debug
   // information stored for the debugger.
   CHECK(CcTest::i_isolate()->debug()->debug_context().is_null());
-  CHECK_EQ(NULL, CcTest::i_isolate()->debug()->debug_info_list_);
+  CHECK(!CcTest::i_isolate()->debug()->debug_info_list_);
 
   // Collect garbage to ensure weak handles are cleared.
-  CcTest::heap()->CollectAllGarbage(Heap::kNoGCFlags);
+  CcTest::heap()->CollectAllGarbage();
   CcTest::heap()->CollectAllGarbage(Heap::kMakeHeapIterableMask);
 
   // Iterate the head and check that there are no debugger related objects left.
@@ -411,13 +403,10 @@
     if (check_functions) {
       if (obj->IsJSFunction()) {
         JSFunction* fun = JSFunction::cast(obj);
-        for (RelocIterator it(fun->shared()->code()); !it.done(); it.next()) {
-          RelocInfo::Mode rmode = it.rinfo()->rmode();
-          if (RelocInfo::IsCodeTarget(rmode)) {
-            CHECK(!Debug::IsDebugBreak(it.rinfo()->target_address()));
-          } else if (RelocInfo::IsJSReturn(rmode)) {
-            CHECK(!Debug::IsDebugBreakAtReturn(it.rinfo()));
-          }
+        for (RelocIterator it(fun->shared()->code(),
+                              RelocInfo::kDebugBreakSlotMask);
+             !it.done(); it.next()) {
+          CHECK(!it.rinfo()->IsPatchedDebugBreakSlotSequence());
         }
       }
     }
@@ -425,79 +414,20 @@
 }
 
 
-} }  // namespace v8::internal
+}  // namespace internal
+}  // namespace v8
 
 
 // Check that the debugger has been fully unloaded.
-static void CheckDebuggerUnloaded(bool check_functions = false) {
+static void CheckDebuggerUnloaded(v8::Isolate* isolate,
+                                  bool check_functions = false) {
   // Let debugger to unload itself synchronously
-  v8::Debug::ProcessDebugMessages();
+  v8::Debug::ProcessDebugMessages(isolate);
 
   v8::internal::CheckDebuggerUnloaded(check_functions);
 }
 
 
-// Inherit from BreakLocationIterator to get access to protected parts for
-// testing.
-class TestBreakLocationIterator: public v8::internal::BreakLocationIterator {
- public:
-  explicit TestBreakLocationIterator(Handle<v8::internal::DebugInfo> debug_info)
-    : BreakLocationIterator(debug_info, v8::internal::SOURCE_BREAK_LOCATIONS) {}
-  v8::internal::RelocIterator* it() { return reloc_iterator_; }
-  v8::internal::RelocIterator* it_original() {
-    return reloc_iterator_original_;
-  }
-};
-
-
-// Compile a function, set a break point and check that the call at the break
-// location in the code is the expected debug_break function.
-void CheckDebugBreakFunction(DebugLocalContext* env,
-                             const char* source, const char* name,
-                             int position, v8::internal::RelocInfo::Mode mode,
-                             Code* debug_break) {
-  v8::internal::Debug* debug = CcTest::i_isolate()->debug();
-
-  // Create function and set the break point.
-  Handle<v8::internal::JSFunction> fun = v8::Utils::OpenHandle(
-      *CompileFunction(env, source, name));
-  int bp = SetBreakPoint(fun, position);
-
-  // Check that the debug break function is as expected.
-  Handle<v8::internal::SharedFunctionInfo> shared(fun->shared());
-  CHECK(Debug::HasDebugInfo(shared));
-  TestBreakLocationIterator it1(Debug::GetDebugInfo(shared));
-  it1.FindBreakLocationFromPosition(position, v8::internal::STATEMENT_ALIGNED);
-  v8::internal::RelocInfo::Mode actual_mode = it1.it()->rinfo()->rmode();
-  if (actual_mode == v8::internal::RelocInfo::CODE_TARGET_WITH_ID) {
-    actual_mode = v8::internal::RelocInfo::CODE_TARGET;
-  }
-  CHECK_EQ(mode, actual_mode);
-  if (mode != v8::internal::RelocInfo::JS_RETURN) {
-    CHECK_EQ(debug_break,
-        Code::GetCodeFromTargetAddress(it1.it()->rinfo()->target_address()));
-  } else {
-    CHECK(Debug::IsDebugBreakAtReturn(it1.it()->rinfo()));
-  }
-
-  // Clear the break point and check that the debug break function is no longer
-  // there
-  ClearBreakPoint(bp);
-  CHECK(!debug->HasDebugInfo(shared));
-  CHECK(debug->EnsureDebugInfo(shared, fun));
-  TestBreakLocationIterator it2(Debug::GetDebugInfo(shared));
-  it2.FindBreakLocationFromPosition(position, v8::internal::STATEMENT_ALIGNED);
-  actual_mode = it2.it()->rinfo()->rmode();
-  if (actual_mode == v8::internal::RelocInfo::CODE_TARGET_WITH_ID) {
-    actual_mode = v8::internal::RelocInfo::CODE_TARGET;
-  }
-  CHECK_EQ(mode, actual_mode);
-  if (mode == v8::internal::RelocInfo::JS_RETURN) {
-    CHECK(!Debug::IsDebugBreakAtReturn(it2.it()->rinfo()));
-  }
-}
-
-
 // --- D e b u g   E v e n t   H a n d l e r s
 // ---
 // --- The different tests uses a number of debug event handlers.
@@ -581,7 +511,7 @@
     "function frame_count(exec_state) {"
     "  return exec_state.frameCount();"
     "}";
-v8::Handle<v8::Function> frame_count;
+v8::Local<v8::Function> frame_count;
 
 
 // Global variable to store the last function hit - used by some tests.
@@ -600,7 +530,8 @@
 static void DebugEventBreakPointHitCount(
     const v8::Debug::EventDetails& event_details) {
   v8::DebugEvent event = event_details.GetEvent();
-  v8::Handle<v8::Object> exec_state = event_details.GetExecutionState();
+  v8::Local<v8::Object> exec_state = event_details.GetExecutionState();
+  v8::Local<v8::Context> context = CcTest::isolate()->GetCurrentContext();
   v8::internal::Isolate* isolate = CcTest::i_isolate();
   Debug* debug = isolate->debug();
   // When hitting a debug event listener there must be a break set.
@@ -612,16 +543,16 @@
     if (!frame_function_name.IsEmpty()) {
       // Get the name of the function.
       const int argc = 2;
-      v8::Handle<v8::Value> argv[argc] = {
-        exec_state, v8::Integer::New(CcTest::isolate(), 0)
-      };
-      v8::Handle<v8::Value> result = frame_function_name->Call(exec_state,
-                                                               argc, argv);
+      v8::Local<v8::Value> argv[argc] = {
+          exec_state, v8::Integer::New(CcTest::isolate(), 0)};
+      v8::Local<v8::Value> result =
+          frame_function_name->Call(context, exec_state, argc, argv)
+              .ToLocalChecked();
       if (result->IsUndefined()) {
         last_function_hit[0] = '\0';
       } else {
         CHECK(result->IsString());
-        v8::Handle<v8::String> function_name(result.As<v8::String>());
+        v8::Local<v8::String> function_name(result.As<v8::String>());
         function_name->WriteUtf8(last_function_hit);
       }
     }
@@ -629,34 +560,37 @@
     if (!frame_source_line.IsEmpty()) {
       // Get the source line.
       const int argc = 1;
-      v8::Handle<v8::Value> argv[argc] = { exec_state };
-      v8::Handle<v8::Value> result = frame_source_line->Call(exec_state,
-                                                             argc, argv);
+      v8::Local<v8::Value> argv[argc] = {exec_state};
+      v8::Local<v8::Value> result =
+          frame_source_line->Call(context, exec_state, argc, argv)
+              .ToLocalChecked();
       CHECK(result->IsNumber());
-      last_source_line = result->Int32Value();
+      last_source_line = result->Int32Value(context).FromJust();
     }
 
     if (!frame_source_column.IsEmpty()) {
       // Get the source column.
       const int argc = 1;
-      v8::Handle<v8::Value> argv[argc] = { exec_state };
-      v8::Handle<v8::Value> result = frame_source_column->Call(exec_state,
-                                                               argc, argv);
+      v8::Local<v8::Value> argv[argc] = {exec_state};
+      v8::Local<v8::Value> result =
+          frame_source_column->Call(context, exec_state, argc, argv)
+              .ToLocalChecked();
       CHECK(result->IsNumber());
-      last_source_column = result->Int32Value();
+      last_source_column = result->Int32Value(context).FromJust();
     }
 
     if (!frame_script_name.IsEmpty()) {
       // Get the script name of the function script.
       const int argc = 1;
-      v8::Handle<v8::Value> argv[argc] = { exec_state };
-      v8::Handle<v8::Value> result = frame_script_name->Call(exec_state,
-                                                             argc, argv);
+      v8::Local<v8::Value> argv[argc] = {exec_state};
+      v8::Local<v8::Value> result =
+          frame_script_name->Call(context, exec_state, argc, argv)
+              .ToLocalChecked();
       if (result->IsUndefined()) {
         last_script_name_hit[0] = '\0';
       } else {
         CHECK(result->IsString());
-        v8::Handle<v8::String> script_name(result.As<v8::String>());
+        v8::Local<v8::String> script_name(result.As<v8::String>());
         script_name->WriteUtf8(last_script_name_hit);
       }
     }
@@ -675,7 +609,7 @@
 int exception_hit_count = 0;
 int uncaught_exception_hit_count = 0;
 int last_js_stack_height = -1;
-v8::Handle<v8::Function> debug_event_listener_callback;
+v8::Local<v8::Function> debug_event_listener_callback;
 int debug_event_listener_callback_result;
 
 static void DebugEventCounterClear() {
@@ -687,8 +621,9 @@
 static void DebugEventCounter(
     const v8::Debug::EventDetails& event_details) {
   v8::DebugEvent event = event_details.GetEvent();
-  v8::Handle<v8::Object> exec_state = event_details.GetExecutionState();
-  v8::Handle<v8::Object> event_data = event_details.GetEventData();
+  v8::Local<v8::Object> exec_state = event_details.GetExecutionState();
+  v8::Local<v8::Object> event_data = event_details.GetEventData();
+  v8::Local<v8::Context> context = CcTest::isolate()->GetCurrentContext();
   v8::internal::Debug* debug = CcTest::i_isolate()->debug();
 
   // When hitting a debug event listener there must be a break set.
@@ -701,11 +636,11 @@
     exception_hit_count++;
 
     // Check whether the exception was uncaught.
-    v8::Local<v8::String> fun_name =
-        v8::String::NewFromUtf8(CcTest::isolate(), "uncaught");
-    v8::Local<v8::Function> fun =
-        v8::Local<v8::Function>::Cast(event_data->Get(fun_name));
-    v8::Local<v8::Value> result = fun->Call(event_data, 0, NULL);
+    v8::Local<v8::String> fun_name = v8_str(CcTest::isolate(), "uncaught");
+    v8::Local<v8::Function> fun = v8::Local<v8::Function>::Cast(
+        event_data->Get(context, fun_name).ToLocalChecked());
+    v8::Local<v8::Value> result =
+        fun->Call(context, event_data, 0, NULL).ToLocalChecked();
     if (result->IsTrue()) {
       uncaught_exception_hit_count++;
     }
@@ -715,18 +650,21 @@
   // compiled.
   if (!frame_count.IsEmpty()) {
     static const int kArgc = 1;
-    v8::Handle<v8::Value> argv[kArgc] = { exec_state };
+    v8::Local<v8::Value> argv[kArgc] = {exec_state};
     // Using exec_state as receiver is just to have a receiver.
-    v8::Handle<v8::Value> result = frame_count->Call(exec_state, kArgc, argv);
-    last_js_stack_height = result->Int32Value();
+    v8::Local<v8::Value> result =
+        frame_count->Call(context, exec_state, kArgc, argv).ToLocalChecked();
+    last_js_stack_height = result->Int32Value(context).FromJust();
   }
 
   // Run callback from DebugEventListener and check the result.
   if (!debug_event_listener_callback.IsEmpty()) {
-    v8::Handle<v8::Value> result =
-        debug_event_listener_callback->Call(event_data, 0, NULL);
+    v8::Local<v8::Value> result =
+        debug_event_listener_callback->Call(context, event_data, 0, NULL)
+            .ToLocalChecked();
     CHECK(!result.IsEmpty());
-    CHECK_EQ(debug_event_listener_callback_result, result->Int32Value());
+    CHECK_EQ(debug_event_listener_callback_result,
+             result->Int32Value(context).FromJust());
   }
 }
 
@@ -741,7 +679,7 @@
 // Structure for holding checks to do.
 struct EvaluateCheck {
   const char* expr;  // An expression to evaluate when a break point is hit.
-  v8::Handle<v8::Value> expected;  // The expected result.
+  v8::Local<v8::Value> expected;  // The expected result.
 };
 
 
@@ -759,7 +697,9 @@
 static void DebugEventEvaluate(
     const v8::Debug::EventDetails& event_details) {
   v8::DebugEvent event = event_details.GetEvent();
-  v8::Handle<v8::Object> exec_state = event_details.GetExecutionState();
+  v8::Local<v8::Object> exec_state = event_details.GetExecutionState();
+  v8::Isolate* isolate = CcTest::isolate();
+  v8::Local<v8::Context> context = isolate->GetCurrentContext();
   v8::internal::Debug* debug = CcTest::i_isolate()->debug();
   // When hitting a debug event listener there must be a break set.
   CHECK_NE(debug->break_id(), 0);
@@ -768,12 +708,12 @@
     break_point_hit_count++;
     for (int i = 0; checks[i].expr != NULL; i++) {
       const int argc = 3;
-      v8::Handle<v8::Value> argv[argc] = {
-          exec_state,
-          v8::String::NewFromUtf8(CcTest::isolate(), checks[i].expr),
-          checks[i].expected};
-      v8::Handle<v8::Value> result =
-          evaluate_check_function->Call(exec_state, argc, argv);
+      v8::Local<v8::String> string = v8_str(isolate, checks[i].expr);
+      v8::Local<v8::Value> argv[argc] = {exec_state, string,
+                                         checks[i].expected};
+      v8::Local<v8::Value> result =
+          evaluate_check_function->Call(context, exec_state, argc, argv)
+              .ToLocalChecked();
       if (!result->IsTrue()) {
         v8::String::Utf8Value utf8(checks[i].expected);
         V8_Fatal(__FILE__, __LINE__, "%s != %s", checks[i].expr, *utf8);
@@ -788,7 +728,7 @@
 static void DebugEventRemoveBreakPoint(
     const v8::Debug::EventDetails& event_details) {
   v8::DebugEvent event = event_details.GetEvent();
-  v8::Handle<v8::Value> data = event_details.GetCallbackData();
+  v8::Local<v8::Value> data = event_details.GetCallbackData();
   v8::internal::Debug* debug = CcTest::i_isolate()->debug();
   // When hitting a debug event listener there must be a break set.
   CHECK_NE(debug->break_id(), 0);
@@ -833,7 +773,7 @@
 static void DebugEventStepSequence(
     const v8::Debug::EventDetails& event_details) {
   v8::DebugEvent event = event_details.GetEvent();
-  v8::Handle<v8::Object> exec_state = event_details.GetExecutionState();
+  v8::Local<v8::Object> exec_state = event_details.GetExecutionState();
   v8::internal::Debug* debug = CcTest::i_isolate()->debug();
   // When hitting a debug event listener there must be a break set.
   CHECK_NE(debug->break_id(), 0);
@@ -843,13 +783,15 @@
     CHECK(break_point_hit_count <
           StrLength(expected_step_sequence));
     const int argc = 2;
-    v8::Handle<v8::Value> argv[argc] = {
-      exec_state, v8::Integer::New(CcTest::isolate(), 0)
-    };
-    v8::Handle<v8::Value> result = frame_function_name->Call(exec_state,
-                                                             argc, argv);
+    v8::Local<v8::Value> argv[argc] = {exec_state,
+                                       v8::Integer::New(CcTest::isolate(), 0)};
+    v8::Local<v8::Context> context = CcTest::isolate()->GetCurrentContext();
+    v8::Local<v8::Value> result =
+        frame_function_name->Call(context, exec_state, argc, argv)
+            .ToLocalChecked();
     CHECK(result->IsString());
-    v8::String::Utf8Value function_name(result->ToString(CcTest::isolate()));
+    v8::String::Utf8Value function_name(
+        result->ToString(context).ToLocalChecked());
     CHECK_EQ(1, StrLength(*function_name));
     CHECK_EQ((*function_name)[0],
               expected_step_sequence[break_point_hit_count]);
@@ -879,7 +821,7 @@
       CcTest::heap()->CollectGarbage(v8::internal::NEW_SPACE);
     } else {
       // Mark sweep compact.
-      CcTest::heap()->CollectAllGarbage(Heap::kNoGCFlags);
+      CcTest::heap()->CollectAllGarbage();
     }
   }
 }
@@ -915,7 +857,6 @@
 static void DebugEventBreakMax(
     const v8::Debug::EventDetails& event_details) {
   v8::DebugEvent event = event_details.GetEvent();
-  v8::Handle<v8::Object> exec_state = event_details.GetExecutionState();
   v8::Isolate* v8_isolate = CcTest::isolate();
   v8::internal::Isolate* isolate = CcTest::i_isolate();
   v8::internal::Debug* debug = isolate->debug();
@@ -927,23 +868,12 @@
       // Count the number of breaks.
       break_point_hit_count++;
 
-      // Collect the JavsScript stack height if the function frame_count is
-      // compiled.
-      if (!frame_count.IsEmpty()) {
-        static const int kArgc = 1;
-        v8::Handle<v8::Value> argv[kArgc] = { exec_state };
-        // Using exec_state as receiver is just to have a receiver.
-        v8::Handle<v8::Value> result =
-            frame_count->Call(exec_state, kArgc, argv);
-        last_js_stack_height = result->Int32Value();
-      }
-
       // Set the break flag again to come back here as soon as possible.
       v8::Debug::DebugBreak(v8_isolate);
 
     } else if (terminate_after_max_break_point_hit) {
       // Terminate execution after the last break if requested.
-      v8::V8::TerminateExecution(v8_isolate);
+      v8_isolate->TerminateExecution();
     }
 
     // Perform a full deoptimization when the specified number of
@@ -965,100 +895,14 @@
   message_callback_count = 0;
 }
 
-static void MessageCallbackCount(v8::Handle<v8::Message> message,
-                                 v8::Handle<v8::Value> data) {
+static void MessageCallbackCount(v8::Local<v8::Message> message,
+                                 v8::Local<v8::Value> data) {
   message_callback_count++;
 }
 
 
 // --- T h e   A c t u a l   T e s t s
 
-
-// Test that the debug break function is the expected one for different kinds
-// of break locations.
-TEST(DebugStub) {
-  using ::v8::internal::Builtins;
-  using ::v8::internal::Isolate;
-  DebugLocalContext env;
-  v8::HandleScope scope(env->GetIsolate());
-
-  CheckDebugBreakFunction(&env,
-                          "function f1(){}", "f1",
-                          0,
-                          v8::internal::RelocInfo::JS_RETURN,
-                          NULL);
-  CheckDebugBreakFunction(&env,
-                          "function f2(){x=1;}", "f2",
-                          0,
-                          v8::internal::RelocInfo::CODE_TARGET,
-                          CcTest::i_isolate()->builtins()->builtin(
-                              Builtins::kStoreIC_DebugBreak));
-  CheckDebugBreakFunction(&env,
-                          "function f3(){var a=x;}", "f3",
-                          0,
-                          v8::internal::RelocInfo::CODE_TARGET,
-                          CcTest::i_isolate()->builtins()->builtin(
-                              Builtins::kLoadIC_DebugBreak));
-
-// TODO(1240753): Make the test architecture independent or split
-// parts of the debugger into architecture dependent files. This
-// part currently disabled as it is not portable between IA32/ARM.
-// Currently on ICs for keyed store/load on ARM.
-#if !defined (__arm__) && !defined(__thumb__)
-  CheckDebugBreakFunction(
-      &env,
-      "function f4(){var index='propertyName'; var a={}; a[index] = 'x';}",
-      "f4",
-      0,
-      v8::internal::RelocInfo::CODE_TARGET,
-      CcTest::i_isolate()->builtins()->builtin(
-          Builtins::kKeyedStoreIC_DebugBreak));
-  CheckDebugBreakFunction(
-      &env,
-      "function f5(){var index='propertyName'; var a={}; return a[index];}",
-      "f5",
-      0,
-      v8::internal::RelocInfo::CODE_TARGET,
-      CcTest::i_isolate()->builtins()->builtin(
-          Builtins::kKeyedLoadIC_DebugBreak));
-#endif
-
-  CheckDebugBreakFunction(
-      &env,
-      "function f6(a){return a==null;}",
-      "f6",
-      0,
-      v8::internal::RelocInfo::CODE_TARGET,
-      CcTest::i_isolate()->builtins()->builtin(
-          Builtins::kCompareNilIC_DebugBreak));
-
-  // Check the debug break code stubs for call ICs with different number of
-  // parameters.
-  // TODO(verwaest): XXX update test.
-  // Handle<Code> debug_break_0 = v8::internal::ComputeCallDebugBreak(0);
-  // Handle<Code> debug_break_1 = v8::internal::ComputeCallDebugBreak(1);
-  // Handle<Code> debug_break_4 = v8::internal::ComputeCallDebugBreak(4);
-
-  // CheckDebugBreakFunction(&env,
-  //                         "function f4_0(){x();}", "f4_0",
-  //                         0,
-  //                         v8::internal::RelocInfo::CODE_TARGET,
-  //                         *debug_break_0);
-
-  // CheckDebugBreakFunction(&env,
-  //                         "function f4_1(){x(1);}", "f4_1",
-  //                         0,
-  //                         v8::internal::RelocInfo::CODE_TARGET,
-  //                         *debug_break_1);
-
-  // CheckDebugBreakFunction(&env,
-  //                         "function f4_4(){x(1,2,3,4);}", "f4_4",
-  //                         0,
-  //                         v8::internal::RelocInfo::CODE_TARGET,
-  //                         *debug_break_4);
-}
-
-
 // Test that the debug info in the VM is in sync with the functions being
 // debugged.
 TEST(DebugInfo) {
@@ -1073,6 +917,7 @@
   CHECK_EQ(0, v8::internal::GetDebuggedFunctions()->length());
   CHECK(!HasDebugInfo(foo));
   CHECK(!HasDebugInfo(bar));
+  EnableDebugger(env->GetIsolate());
   // One function (foo) is debugged.
   int bp1 = SetBreakPoint(foo, 0);
   CHECK_EQ(1, v8::internal::GetDebuggedFunctions()->length());
@@ -1090,6 +935,7 @@
   CHECK(HasDebugInfo(bar));
   // No functions are debugged.
   ClearBreakPoint(bp2);
+  DisableDebugger(env->GetIsolate());
   CHECK_EQ(0, v8::internal::GetDebuggedFunctions()->length());
   CHECK(!HasDebugInfo(foo));
   CHECK(!HasDebugInfo(bar));
@@ -1102,30 +948,29 @@
   DebugLocalContext env;
   v8::HandleScope scope(env->GetIsolate());
 
-  v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount);
-  v8::Script::Compile(v8::String::NewFromUtf8(env->GetIsolate(),
-                                              "function foo(){bar=0;}"))->Run();
-  v8::Local<v8::Function> foo = v8::Local<v8::Function>::Cast(
-      env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "foo")));
+  v8::Debug::SetDebugEventListener(env->GetIsolate(),
+                                   DebugEventBreakPointHitCount);
+  v8::Local<v8::Function> foo =
+      CompileFunction(&env, "function foo(){bar=0;}", "foo");
 
   // Run without breakpoints.
-  foo->Call(env->Global(), 0, NULL);
+  foo->Call(env.context(), env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(0, break_point_hit_count);
 
   // Run with breakpoint
   int bp = SetBreakPoint(foo, 0);
-  foo->Call(env->Global(), 0, NULL);
+  foo->Call(env.context(), env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(1, break_point_hit_count);
-  foo->Call(env->Global(), 0, NULL);
+  foo->Call(env.context(), env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(2, break_point_hit_count);
 
   // Run without breakpoints.
   ClearBreakPoint(bp);
-  foo->Call(env->Global(), 0, NULL);
+  foo->Call(env.context(), env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(2, break_point_hit_count);
 
-  v8::Debug::SetDebugEventListener(NULL);
-  CheckDebuggerUnloaded();
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr);
+  CheckDebuggerUnloaded(env->GetIsolate());
 }
 
 
@@ -1134,33 +979,31 @@
   break_point_hit_count = 0;
   DebugLocalContext env;
   v8::HandleScope scope(env->GetIsolate());
-  v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount);
-  v8::Script::Compile(v8::String::NewFromUtf8(env->GetIsolate(), "bar=1"))
-      ->Run();
-  v8::Script::Compile(
-      v8::String::NewFromUtf8(env->GetIsolate(), "function foo(){var x=bar;}"))
-      ->Run();
-  v8::Local<v8::Function> foo = v8::Local<v8::Function>::Cast(
-      env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "foo")));
+  v8::Debug::SetDebugEventListener(env->GetIsolate(),
+                                   DebugEventBreakPointHitCount);
+
+  CompileRunChecked(env->GetIsolate(), "bar=1");
+  v8::Local<v8::Function> foo =
+      CompileFunction(&env, "function foo(){var x=bar;}", "foo");
 
   // Run without breakpoints.
-  foo->Call(env->Global(), 0, NULL);
+  foo->Call(env.context(), env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(0, break_point_hit_count);
 
   // Run with breakpoint.
   int bp = SetBreakPoint(foo, 0);
-  foo->Call(env->Global(), 0, NULL);
+  foo->Call(env.context(), env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(1, break_point_hit_count);
-  foo->Call(env->Global(), 0, NULL);
+  foo->Call(env.context(), env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(2, break_point_hit_count);
 
   // Run without breakpoints.
   ClearBreakPoint(bp);
-  foo->Call(env->Global(), 0, NULL);
+  foo->Call(env.context(), env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(2, break_point_hit_count);
 
-  v8::Debug::SetDebugEventListener(NULL);
-  CheckDebuggerUnloaded();
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr);
+  CheckDebuggerUnloaded(env->GetIsolate());
 }
 
 
@@ -1169,32 +1012,30 @@
   break_point_hit_count = 0;
   DebugLocalContext env;
   v8::HandleScope scope(env->GetIsolate());
-  v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount);
-  v8::Script::Compile(
-      v8::String::NewFromUtf8(env->GetIsolate(), "function bar(){}"))->Run();
-  v8::Script::Compile(v8::String::NewFromUtf8(env->GetIsolate(),
-                                              "function foo(){bar();}"))->Run();
-  v8::Local<v8::Function> foo = v8::Local<v8::Function>::Cast(
-      env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "foo")));
+  v8::Debug::SetDebugEventListener(env->GetIsolate(),
+                                   DebugEventBreakPointHitCount);
+  CompileRunChecked(env->GetIsolate(), "function bar(){}");
+  v8::Local<v8::Function> foo =
+      CompileFunction(&env, "function foo(){bar();}", "foo");
 
   // Run without breakpoints.
-  foo->Call(env->Global(), 0, NULL);
+  foo->Call(env.context(), env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(0, break_point_hit_count);
 
   // Run with breakpoint
   int bp = SetBreakPoint(foo, 0);
-  foo->Call(env->Global(), 0, NULL);
+  foo->Call(env.context(), env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(1, break_point_hit_count);
-  foo->Call(env->Global(), 0, NULL);
+  foo->Call(env.context(), env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(2, break_point_hit_count);
 
   // Run without breakpoints.
   ClearBreakPoint(bp);
-  foo->Call(env->Global(), 0, NULL);
+  foo->Call(env.context(), env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(2, break_point_hit_count);
 
-  v8::Debug::SetDebugEventListener(NULL);
-  CheckDebuggerUnloaded();
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr);
+  CheckDebuggerUnloaded(env->GetIsolate());
 }
 
 
@@ -1203,34 +1044,40 @@
   break_point_hit_count = 0;
   DebugLocalContext env;
   v8::HandleScope scope(env->GetIsolate());
-  v8::Debug::SetDebugEventListener(DebugEventBreakPointCollectGarbage);
-  v8::Script::Compile(
-      v8::String::NewFromUtf8(env->GetIsolate(), "function bar(){return 1;}"))
-      ->Run();
-  v8::Script::Compile(v8::String::NewFromUtf8(env->GetIsolate(),
-                                              "function foo(){return bar();}"))
-      ->Run();
-  v8::Local<v8::Function> foo = v8::Local<v8::Function>::Cast(
-      env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "foo")));
+  v8::Debug::SetDebugEventListener(env->GetIsolate(),
+                                   DebugEventBreakPointCollectGarbage);
+  CompileRunChecked(env->GetIsolate(), "function bar(){return 1;}");
+  v8::Local<v8::Function> foo =
+      CompileFunction(&env, "function foo(){return bar();}", "foo");
+  v8::Local<v8::Context> context = env.context();
 
   // Run without breakpoints.
-  CHECK_EQ(1, foo->Call(env->Global(), 0, NULL)->Int32Value());
+  CHECK_EQ(1, foo->Call(context, env->Global(), 0, NULL)
+                  .ToLocalChecked()
+                  ->Int32Value(context)
+                  .FromJust());
   CHECK_EQ(0, break_point_hit_count);
 
   // Run with breakpoint.
   int bp = SetBreakPoint(foo, 0);
-  CHECK_EQ(1, foo->Call(env->Global(), 0, NULL)->Int32Value());
+  CHECK_EQ(1, foo->Call(context, env->Global(), 0, NULL)
+                  .ToLocalChecked()
+                  ->Int32Value(context)
+                  .FromJust());
   CHECK_EQ(1, break_point_hit_count);
-  CHECK_EQ(1, foo->Call(env->Global(), 0, NULL)->Int32Value());
+  CHECK_EQ(1, foo->Call(context, env->Global(), 0, NULL)
+                  .ToLocalChecked()
+                  ->Int32Value(context)
+                  .FromJust());
   CHECK_EQ(2, break_point_hit_count);
 
   // Run without breakpoints.
   ClearBreakPoint(bp);
-  foo->Call(env->Global(), 0, NULL);
+  foo->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(2, break_point_hit_count);
 
-  v8::Debug::SetDebugEventListener(NULL);
-  CheckDebuggerUnloaded();
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr);
+  CheckDebuggerUnloaded(env->GetIsolate());
 }
 
 
@@ -1239,34 +1086,40 @@
   break_point_hit_count = 0;
   DebugLocalContext env;
   v8::HandleScope scope(env->GetIsolate());
-  v8::Debug::SetDebugEventListener(DebugEventBreakPointCollectGarbage);
-  v8::Script::Compile(v8::String::NewFromUtf8(env->GetIsolate(),
-                                              "function bar(){ this.x = 1;}"))
-      ->Run();
-  v8::Script::Compile(
-      v8::String::NewFromUtf8(env->GetIsolate(),
-                              "function foo(){return new bar(1).x;}"))->Run();
-  v8::Local<v8::Function> foo = v8::Local<v8::Function>::Cast(
-      env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "foo")));
+  v8::Debug::SetDebugEventListener(env->GetIsolate(),
+                                   DebugEventBreakPointCollectGarbage);
+  CompileRunChecked(env->GetIsolate(), "function bar(){ this.x = 1;}");
+  v8::Local<v8::Function> foo =
+      CompileFunction(&env, "function foo(){return new bar(1).x;}", "foo");
+  v8::Local<v8::Context> context = env.context();
 
   // Run without breakpoints.
-  CHECK_EQ(1, foo->Call(env->Global(), 0, NULL)->Int32Value());
+  CHECK_EQ(1, foo->Call(context, env->Global(), 0, NULL)
+                  .ToLocalChecked()
+                  ->Int32Value(context)
+                  .FromJust());
   CHECK_EQ(0, break_point_hit_count);
 
   // Run with breakpoint.
   int bp = SetBreakPoint(foo, 0);
-  CHECK_EQ(1, foo->Call(env->Global(), 0, NULL)->Int32Value());
+  CHECK_EQ(1, foo->Call(context, env->Global(), 0, NULL)
+                  .ToLocalChecked()
+                  ->Int32Value(context)
+                  .FromJust());
   CHECK_EQ(1, break_point_hit_count);
-  CHECK_EQ(1, foo->Call(env->Global(), 0, NULL)->Int32Value());
+  CHECK_EQ(1, foo->Call(context, env->Global(), 0, NULL)
+                  .ToLocalChecked()
+                  ->Int32Value(context)
+                  .FromJust());
   CHECK_EQ(2, break_point_hit_count);
 
   // Run without breakpoints.
   ClearBreakPoint(bp);
-  foo->Call(env->Global(), 0, NULL);
+  foo->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(2, break_point_hit_count);
 
-  v8::Debug::SetDebugEventListener(NULL);
-  CheckDebuggerUnloaded();
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr);
+  CheckDebuggerUnloaded(env->GetIsolate());
 }
 
 
@@ -1286,44 +1139,44 @@
                                         "frame_source_column");
 
 
-  v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount);
-  v8::Script::Compile(
-      v8::String::NewFromUtf8(env->GetIsolate(), "function foo(){}"))->Run();
-  v8::Local<v8::Function> foo = v8::Local<v8::Function>::Cast(
-      env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "foo")));
+  v8::Debug::SetDebugEventListener(env->GetIsolate(),
+                                   DebugEventBreakPointHitCount);
+  v8::Local<v8::Function> foo =
+      CompileFunction(&env, "function foo(){}", "foo");
+  v8::Local<v8::Context> context = env.context();
 
   // Run without breakpoints.
-  foo->Call(env->Global(), 0, NULL);
+  foo->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(0, break_point_hit_count);
 
   // Run with breakpoint
   int bp = SetBreakPoint(foo, 0);
-  foo->Call(env->Global(), 0, NULL);
+  foo->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(1, break_point_hit_count);
   CHECK_EQ(0, last_source_line);
   CHECK_EQ(15, last_source_column);
-  foo->Call(env->Global(), 0, NULL);
+  foo->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(2, break_point_hit_count);
   CHECK_EQ(0, last_source_line);
   CHECK_EQ(15, last_source_column);
 
   // Run without breakpoints.
   ClearBreakPoint(bp);
-  foo->Call(env->Global(), 0, NULL);
+  foo->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(2, break_point_hit_count);
 
-  v8::Debug::SetDebugEventListener(NULL);
-  CheckDebuggerUnloaded();
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr);
+  CheckDebuggerUnloaded(env->GetIsolate());
 }
 
 
-static void CallWithBreakPoints(v8::Local<v8::Object> recv,
+static void CallWithBreakPoints(v8::Local<v8::Context> context,
+                                v8::Local<v8::Object> recv,
                                 v8::Local<v8::Function> f,
-                                int break_point_count,
-                                int call_count) {
+                                int break_point_count, int call_count) {
   break_point_hit_count = 0;
   for (int i = 0; i < call_count; i++) {
-    f->Call(recv, 0, NULL);
+    f->Call(context, recv, 0, NULL).ToLocalChecked();
     CHECK_EQ((i + 1) * break_point_count, break_point_hit_count);
   }
 }
@@ -1334,59 +1187,61 @@
   break_point_hit_count = 0;
   DebugLocalContext env;
   v8::HandleScope scope(env->GetIsolate());
+  v8::Local<v8::Context> context = env.context();
 
-  v8::Debug::SetDebugEventListener(DebugEventBreakPointCollectGarbage);
+  v8::Debug::SetDebugEventListener(env->GetIsolate(),
+                                   DebugEventBreakPointCollectGarbage);
   v8::Local<v8::Function> foo;
 
   // Test IC store break point with garbage collection.
   foo = CompileFunction(&env, "function foo(){bar=0;}", "foo");
   SetBreakPoint(foo, 0);
-  CallWithBreakPoints(env->Global(), foo, 1, 10);
+  CallWithBreakPoints(context, env->Global(), foo, 1, 10);
 
   // Test IC load break point with garbage collection.
   foo = CompileFunction(&env, "bar=1;function foo(){var x=bar;}", "foo");
   SetBreakPoint(foo, 0);
-  CallWithBreakPoints(env->Global(), foo, 1, 10);
+  CallWithBreakPoints(context, env->Global(), foo, 1, 10);
 
   // Test IC call break point with garbage collection.
   foo = CompileFunction(&env, "function bar(){};function foo(){bar();}", "foo");
   SetBreakPoint(foo, 0);
-  CallWithBreakPoints(env->Global(), foo, 1, 10);
+  CallWithBreakPoints(context, env->Global(), foo, 1, 10);
 
   // Test return break point with garbage collection.
   foo = CompileFunction(&env, "function foo(){}", "foo");
   SetBreakPoint(foo, 0);
-  CallWithBreakPoints(env->Global(), foo, 1, 25);
+  CallWithBreakPoints(context, env->Global(), foo, 1, 25);
 
   // Test debug break slot break point with garbage collection.
   foo = CompileFunction(&env, "function foo(){var a;}", "foo");
   SetBreakPoint(foo, 0);
-  CallWithBreakPoints(env->Global(), foo, 1, 25);
+  CallWithBreakPoints(context, env->Global(), foo, 1, 25);
 
-  v8::Debug::SetDebugEventListener(NULL);
-  CheckDebuggerUnloaded();
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr);
+  CheckDebuggerUnloaded(env->GetIsolate());
 }
 
 
 // Call the function three times with different garbage collections in between
 // and make sure that the break point survives.
-static void CallAndGC(v8::Local<v8::Object> recv,
-                      v8::Local<v8::Function> f) {
+static void CallAndGC(v8::Local<v8::Context> context,
+                      v8::Local<v8::Object> recv, v8::Local<v8::Function> f) {
   break_point_hit_count = 0;
 
   for (int i = 0; i < 3; i++) {
     // Call function.
-    f->Call(recv, 0, NULL);
+    f->Call(context, recv, 0, NULL).ToLocalChecked();
     CHECK_EQ(1 + i * 3, break_point_hit_count);
 
     // Scavenge and call function.
     CcTest::heap()->CollectGarbage(v8::internal::NEW_SPACE);
-    f->Call(recv, 0, NULL);
+    f->Call(context, recv, 0, NULL).ToLocalChecked();
     CHECK_EQ(2 + i * 3, break_point_hit_count);
 
     // Mark sweep (and perhaps compact) and call function.
-    CcTest::heap()->CollectAllGarbage(Heap::kNoGCFlags);
-    f->Call(recv, 0, NULL);
+    CcTest::heap()->CollectAllGarbage();
+    f->Call(context, recv, 0, NULL).ToLocalChecked();
     CHECK_EQ(3 + i * 3, break_point_hit_count);
   }
 }
@@ -1397,8 +1252,10 @@
   break_point_hit_count = 0;
   DebugLocalContext env;
   v8::HandleScope scope(env->GetIsolate());
+  v8::Local<v8::Context> context = env.context();
 
-  v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount);
+  v8::Debug::SetDebugEventListener(env->GetIsolate(),
+                                   DebugEventBreakPointHitCount);
   v8::Local<v8::Function> foo;
 
   // Test IC store break point with garbage collection.
@@ -1407,7 +1264,7 @@
     foo = CompileFunction(&env, "function foo(){bar=0;}", "foo");
     SetBreakPoint(foo, 0);
   }
-  CallAndGC(env->Global(), foo);
+  CallAndGC(context, env->Global(), foo);
 
   // Test IC load break point with garbage collection.
   {
@@ -1415,7 +1272,7 @@
     foo = CompileFunction(&env, "bar=1;function foo(){var x=bar;}", "foo");
     SetBreakPoint(foo, 0);
   }
-  CallAndGC(env->Global(), foo);
+  CallAndGC(context, env->Global(), foo);
 
   // Test IC call break point with garbage collection.
   {
@@ -1425,7 +1282,7 @@
                           "foo");
     SetBreakPoint(foo, 0);
   }
-  CallAndGC(env->Global(), foo);
+  CallAndGC(context, env->Global(), foo);
 
   // Test return break point with garbage collection.
   {
@@ -1433,7 +1290,7 @@
     foo = CompileFunction(&env, "function foo(){}", "foo");
     SetBreakPoint(foo, 0);
   }
-  CallAndGC(env->Global(), foo);
+  CallAndGC(context, env->Global(), foo);
 
   // Test non IC break point with garbage collection.
   {
@@ -1441,11 +1298,11 @@
     foo = CompileFunction(&env, "function foo(){var bar=0;}", "foo");
     SetBreakPoint(foo, 0);
   }
-  CallAndGC(env->Global(), foo);
+  CallAndGC(context, env->Global(), foo);
 
 
-  v8::Debug::SetDebugEventListener(NULL);
-  CheckDebuggerUnloaded();
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr);
+  CheckDebuggerUnloaded(env->GetIsolate());
 }
 
 
@@ -1453,53 +1310,51 @@
 TEST(BreakPointThroughJavaScript) {
   break_point_hit_count = 0;
   DebugLocalContext env;
-  v8::HandleScope scope(env->GetIsolate());
+  v8::Isolate* isolate = env->GetIsolate();
+  v8::HandleScope scope(isolate);
+  v8::Local<v8::Context> context = env.context();
   env.ExposeDebug();
 
-  v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount);
-  v8::Script::Compile(
-      v8::String::NewFromUtf8(env->GetIsolate(), "function bar(){}"))->Run();
-  v8::Script::Compile(v8::String::NewFromUtf8(env->GetIsolate(),
-                                              "function foo(){bar();bar();}"))
-      ->Run();
-  //                                               012345678901234567890
-  //                                                         1         2
+  v8::Debug::SetDebugEventListener(isolate, DebugEventBreakPointHitCount);
+  CompileRunChecked(isolate, "function bar(){}");
+  CompileFunction(isolate, "function foo(){bar();bar();}", "foo");
+  //                        012345678901234567890
+  //                                  1         2
   // Break points are set at position 3 and 9
+  v8::Local<v8::String> source = v8_str(env->GetIsolate(), "foo()");
   v8::Local<v8::Script> foo =
-      v8::Script::Compile(v8::String::NewFromUtf8(env->GetIsolate(), "foo()"));
+      v8::Script::Compile(context, source).ToLocalChecked();
 
-  // Run without breakpoints.
-  foo->Run();
   CHECK_EQ(0, break_point_hit_count);
 
   // Run with one breakpoint
   int bp1 = SetBreakPointFromJS(env->GetIsolate(), "foo", 0, 3);
-  foo->Run();
+  foo->Run(context).ToLocalChecked();
   CHECK_EQ(1, break_point_hit_count);
-  foo->Run();
+  foo->Run(context).ToLocalChecked();
   CHECK_EQ(2, break_point_hit_count);
 
   // Run with two breakpoints
   int bp2 = SetBreakPointFromJS(env->GetIsolate(), "foo", 0, 9);
-  foo->Run();
+  foo->Run(context).ToLocalChecked();
   CHECK_EQ(4, break_point_hit_count);
-  foo->Run();
+  foo->Run(context).ToLocalChecked();
   CHECK_EQ(6, break_point_hit_count);
 
   // Run with one breakpoint
   ClearBreakPointFromJS(env->GetIsolate(), bp2);
-  foo->Run();
+  foo->Run(context).ToLocalChecked();
   CHECK_EQ(7, break_point_hit_count);
-  foo->Run();
+  foo->Run(context).ToLocalChecked();
   CHECK_EQ(8, break_point_hit_count);
 
   // Run without breakpoints.
   ClearBreakPointFromJS(env->GetIsolate(), bp1);
-  foo->Run();
+  foo->Run(context).ToLocalChecked();
   CHECK_EQ(8, break_point_hit_count);
 
-  v8::Debug::SetDebugEventListener(NULL);
-  CheckDebuggerUnloaded();
+  v8::Debug::SetDebugEventListener(isolate, nullptr);
+  CheckDebuggerUnloaded(isolate);
 
   // Make sure that the break point numbers are consecutive.
   CHECK_EQ(1, bp1);
@@ -1512,96 +1367,99 @@
 TEST(ScriptBreakPointByNameThroughJavaScript) {
   break_point_hit_count = 0;
   DebugLocalContext env;
-  v8::HandleScope scope(env->GetIsolate());
+  v8::Isolate* isolate = env->GetIsolate();
+  v8::HandleScope scope(isolate);
+  v8::Local<v8::Context> context = env.context();
   env.ExposeDebug();
 
-  v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount);
+  v8::Debug::SetDebugEventListener(isolate, DebugEventBreakPointHitCount);
 
-  v8::Local<v8::String> script = v8::String::NewFromUtf8(
-    env->GetIsolate(),
-    "function f() {\n"
-    "  function h() {\n"
-    "    a = 0;  // line 2\n"
-    "  }\n"
-    "  b = 1;  // line 4\n"
-    "  return h();\n"
-    "}\n"
-    "\n"
-    "function g() {\n"
-    "  function h() {\n"
-    "    a = 0;\n"
-    "  }\n"
-    "  b = 2;  // line 12\n"
-    "  h();\n"
-    "  b = 3;  // line 14\n"
-    "  f();    // line 15\n"
-    "}");
+  v8::Local<v8::String> script = v8_str(isolate,
+                                        "function f() {\n"
+                                        "  function h() {\n"
+                                        "    a = 0;  // line 2\n"
+                                        "  }\n"
+                                        "  b = 1;  // line 4\n"
+                                        "  return h();\n"
+                                        "}\n"
+                                        "\n"
+                                        "function g() {\n"
+                                        "  function h() {\n"
+                                        "    a = 0;\n"
+                                        "  }\n"
+                                        "  b = 2;  // line 12\n"
+                                        "  h();\n"
+                                        "  b = 3;  // line 14\n"
+                                        "  f();    // line 15\n"
+                                        "}");
 
   // Compile the script and get the two functions.
-  v8::ScriptOrigin origin =
-      v8::ScriptOrigin(v8::String::NewFromUtf8(env->GetIsolate(), "test"));
-  v8::Script::Compile(script, &origin)->Run();
+  v8::ScriptOrigin origin = v8::ScriptOrigin(v8_str(isolate, "test"));
+  v8::Script::Compile(context, script, &origin)
+      .ToLocalChecked()
+      ->Run(context)
+      .ToLocalChecked();
   v8::Local<v8::Function> f = v8::Local<v8::Function>::Cast(
-      env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "f")));
+      env->Global()->Get(context, v8_str(isolate, "f")).ToLocalChecked());
   v8::Local<v8::Function> g = v8::Local<v8::Function>::Cast(
-      env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "g")));
+      env->Global()->Get(context, v8_str(isolate, "g")).ToLocalChecked());
 
   // Call f and g without break points.
   break_point_hit_count = 0;
-  f->Call(env->Global(), 0, NULL);
+  f->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(0, break_point_hit_count);
-  g->Call(env->Global(), 0, NULL);
+  g->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(0, break_point_hit_count);
 
   // Call f and g with break point on line 12.
-  int sbp1 = SetScriptBreakPointByNameFromJS(env->GetIsolate(), "test", 12, 0);
+  int sbp1 = SetScriptBreakPointByNameFromJS(isolate, "test", 12, 0);
   break_point_hit_count = 0;
-  f->Call(env->Global(), 0, NULL);
+  f->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(0, break_point_hit_count);
-  g->Call(env->Global(), 0, NULL);
+  g->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(1, break_point_hit_count);
 
   // Remove the break point again.
   break_point_hit_count = 0;
   ClearBreakPointFromJS(env->GetIsolate(), sbp1);
-  f->Call(env->Global(), 0, NULL);
+  f->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(0, break_point_hit_count);
-  g->Call(env->Global(), 0, NULL);
+  g->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(0, break_point_hit_count);
 
   // Call f and g with break point on line 2.
   int sbp2 = SetScriptBreakPointByNameFromJS(env->GetIsolate(), "test", 2, 0);
   break_point_hit_count = 0;
-  f->Call(env->Global(), 0, NULL);
+  f->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(1, break_point_hit_count);
-  g->Call(env->Global(), 0, NULL);
+  g->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(2, break_point_hit_count);
 
   // Call f and g with break point on line 2, 4, 12, 14 and 15.
-  int sbp3 = SetScriptBreakPointByNameFromJS(env->GetIsolate(), "test", 4, 0);
-  int sbp4 = SetScriptBreakPointByNameFromJS(env->GetIsolate(), "test", 12, 0);
-  int sbp5 = SetScriptBreakPointByNameFromJS(env->GetIsolate(), "test", 14, 0);
-  int sbp6 = SetScriptBreakPointByNameFromJS(env->GetIsolate(), "test", 15, 0);
+  int sbp3 = SetScriptBreakPointByNameFromJS(isolate, "test", 4, 0);
+  int sbp4 = SetScriptBreakPointByNameFromJS(isolate, "test", 12, 0);
+  int sbp5 = SetScriptBreakPointByNameFromJS(isolate, "test", 14, 0);
+  int sbp6 = SetScriptBreakPointByNameFromJS(isolate, "test", 15, 0);
   break_point_hit_count = 0;
-  f->Call(env->Global(), 0, NULL);
+  f->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(2, break_point_hit_count);
-  g->Call(env->Global(), 0, NULL);
+  g->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(7, break_point_hit_count);
 
   // Remove all the break points again.
   break_point_hit_count = 0;
-  ClearBreakPointFromJS(env->GetIsolate(), sbp2);
-  ClearBreakPointFromJS(env->GetIsolate(), sbp3);
-  ClearBreakPointFromJS(env->GetIsolate(), sbp4);
-  ClearBreakPointFromJS(env->GetIsolate(), sbp5);
-  ClearBreakPointFromJS(env->GetIsolate(), sbp6);
-  f->Call(env->Global(), 0, NULL);
+  ClearBreakPointFromJS(isolate, sbp2);
+  ClearBreakPointFromJS(isolate, sbp3);
+  ClearBreakPointFromJS(isolate, sbp4);
+  ClearBreakPointFromJS(isolate, sbp5);
+  ClearBreakPointFromJS(isolate, sbp6);
+  f->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(0, break_point_hit_count);
-  g->Call(env->Global(), 0, NULL);
+  g->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(0, break_point_hit_count);
 
-  v8::Debug::SetDebugEventListener(NULL);
-  CheckDebuggerUnloaded();
+  v8::Debug::SetDebugEventListener(isolate, nullptr);
+  CheckDebuggerUnloaded(isolate);
 
   // Make sure that the break point numbers are consecutive.
   CHECK_EQ(1, sbp1);
@@ -1616,73 +1474,74 @@
 TEST(ScriptBreakPointByIdThroughJavaScript) {
   break_point_hit_count = 0;
   DebugLocalContext env;
-  v8::HandleScope scope(env->GetIsolate());
+  v8::Isolate* isolate = env->GetIsolate();
+  v8::HandleScope scope(isolate);
+  v8::Local<v8::Context> context = env.context();
   env.ExposeDebug();
 
-  v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount);
+  v8::Debug::SetDebugEventListener(isolate, DebugEventBreakPointHitCount);
 
-  v8::Local<v8::String> source = v8::String::NewFromUtf8(
-    env->GetIsolate(),
-    "function f() {\n"
-    "  function h() {\n"
-    "    a = 0;  // line 2\n"
-    "  }\n"
-    "  b = 1;  // line 4\n"
-    "  return h();\n"
-    "}\n"
-    "\n"
-    "function g() {\n"
-    "  function h() {\n"
-    "    a = 0;\n"
-    "  }\n"
-    "  b = 2;  // line 12\n"
-    "  h();\n"
-    "  b = 3;  // line 14\n"
-    "  f();    // line 15\n"
-    "}");
+  v8::Local<v8::String> source = v8_str(isolate,
+                                        "function f() {\n"
+                                        "  function h() {\n"
+                                        "    a = 0;  // line 2\n"
+                                        "  }\n"
+                                        "  b = 1;  // line 4\n"
+                                        "  return h();\n"
+                                        "}\n"
+                                        "\n"
+                                        "function g() {\n"
+                                        "  function h() {\n"
+                                        "    a = 0;\n"
+                                        "  }\n"
+                                        "  b = 2;  // line 12\n"
+                                        "  h();\n"
+                                        "  b = 3;  // line 14\n"
+                                        "  f();    // line 15\n"
+                                        "}");
 
   // Compile the script and get the two functions.
-  v8::ScriptOrigin origin =
-      v8::ScriptOrigin(v8::String::NewFromUtf8(env->GetIsolate(), "test"));
-  v8::Local<v8::Script> script = v8::Script::Compile(source, &origin);
-  script->Run();
+  v8::ScriptOrigin origin = v8::ScriptOrigin(v8_str(isolate, "test"));
+  v8::Local<v8::Script> script =
+      v8::Script::Compile(context, source, &origin).ToLocalChecked();
+  script->Run(context).ToLocalChecked();
   v8::Local<v8::Function> f = v8::Local<v8::Function>::Cast(
-      env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "f")));
+      env->Global()->Get(context, v8_str(isolate, "f")).ToLocalChecked());
   v8::Local<v8::Function> g = v8::Local<v8::Function>::Cast(
-      env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "g")));
+      env->Global()->Get(context, v8_str(isolate, "g")).ToLocalChecked());
 
   // Get the script id knowing that internally it is a 32 integer.
   int script_id = script->GetUnboundScript()->GetId();
 
   // Call f and g without break points.
   break_point_hit_count = 0;
-  f->Call(env->Global(), 0, NULL);
+  f->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(0, break_point_hit_count);
-  g->Call(env->Global(), 0, NULL);
+  g->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(0, break_point_hit_count);
 
   // Call f and g with break point on line 12.
   int sbp1 = SetScriptBreakPointByIdFromJS(env->GetIsolate(), script_id, 12, 0);
   break_point_hit_count = 0;
-  f->Call(env->Global(), 0, NULL);
+  f->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(0, break_point_hit_count);
-  g->Call(env->Global(), 0, NULL);
+  g->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(1, break_point_hit_count);
 
   // Remove the break point again.
   break_point_hit_count = 0;
   ClearBreakPointFromJS(env->GetIsolate(), sbp1);
-  f->Call(env->Global(), 0, NULL);
+  f->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(0, break_point_hit_count);
-  g->Call(env->Global(), 0, NULL);
+  g->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(0, break_point_hit_count);
 
   // Call f and g with break point on line 2.
   int sbp2 = SetScriptBreakPointByIdFromJS(env->GetIsolate(), script_id, 2, 0);
   break_point_hit_count = 0;
-  f->Call(env->Global(), 0, NULL);
+  f->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(1, break_point_hit_count);
-  g->Call(env->Global(), 0, NULL);
+  g->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(2, break_point_hit_count);
 
   // Call f and g with break point on line 2, 4, 12, 14 and 15.
@@ -1691,9 +1550,9 @@
   int sbp5 = SetScriptBreakPointByIdFromJS(env->GetIsolate(), script_id, 14, 0);
   int sbp6 = SetScriptBreakPointByIdFromJS(env->GetIsolate(), script_id, 15, 0);
   break_point_hit_count = 0;
-  f->Call(env->Global(), 0, NULL);
+  f->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(2, break_point_hit_count);
-  g->Call(env->Global(), 0, NULL);
+  g->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(7, break_point_hit_count);
 
   // Remove all the break points again.
@@ -1703,13 +1562,13 @@
   ClearBreakPointFromJS(env->GetIsolate(), sbp4);
   ClearBreakPointFromJS(env->GetIsolate(), sbp5);
   ClearBreakPointFromJS(env->GetIsolate(), sbp6);
-  f->Call(env->Global(), 0, NULL);
+  f->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(0, break_point_hit_count);
-  g->Call(env->Global(), 0, NULL);
+  g->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(0, break_point_hit_count);
 
-  v8::Debug::SetDebugEventListener(NULL);
-  CheckDebuggerUnloaded();
+  v8::Debug::SetDebugEventListener(isolate, nullptr);
+  CheckDebuggerUnloaded(isolate);
 
   // Make sure that the break point numbers are consecutive.
   CHECK_EQ(1, sbp1);
@@ -1725,57 +1584,63 @@
 TEST(EnableDisableScriptBreakPoint) {
   break_point_hit_count = 0;
   DebugLocalContext env;
-  v8::HandleScope scope(env->GetIsolate());
+  v8::Isolate* isolate = env->GetIsolate();
+  v8::HandleScope scope(isolate);
+  v8::Local<v8::Context> context = env.context();
   env.ExposeDebug();
 
-  v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount);
+  v8::Debug::SetDebugEventListener(isolate, DebugEventBreakPointHitCount);
 
-  v8::Local<v8::String> script = v8::String::NewFromUtf8(
-    env->GetIsolate(),
-    "function f() {\n"
-    "  a = 0;  // line 1\n"
-    "};");
+  v8::Local<v8::String> script = v8_str(isolate,
+                                        "function f() {\n"
+                                        "  a = 0;  // line 1\n"
+                                        "};");
 
   // Compile the script and get function f.
-  v8::ScriptOrigin origin =
-      v8::ScriptOrigin(v8::String::NewFromUtf8(env->GetIsolate(), "test"));
-  v8::Script::Compile(script, &origin)->Run();
+  v8::ScriptOrigin origin = v8::ScriptOrigin(v8_str(isolate, "test"));
+  v8::Script::Compile(context, script, &origin)
+      .ToLocalChecked()
+      ->Run(context)
+      .ToLocalChecked();
   v8::Local<v8::Function> f = v8::Local<v8::Function>::Cast(
-      env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "f")));
+      env->Global()->Get(context, v8_str(isolate, "f")).ToLocalChecked());
 
   // Set script break point on line 1 (in function f).
-  int sbp = SetScriptBreakPointByNameFromJS(env->GetIsolate(), "test", 1, 0);
+  int sbp = SetScriptBreakPointByNameFromJS(isolate, "test", 1, 0);
 
   // Call f while enabeling and disabling the script break point.
   break_point_hit_count = 0;
-  f->Call(env->Global(), 0, NULL);
+  f->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(1, break_point_hit_count);
 
-  DisableScriptBreakPointFromJS(env->GetIsolate(), sbp);
-  f->Call(env->Global(), 0, NULL);
+  DisableScriptBreakPointFromJS(isolate, sbp);
+  f->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(1, break_point_hit_count);
 
-  EnableScriptBreakPointFromJS(env->GetIsolate(), sbp);
-  f->Call(env->Global(), 0, NULL);
+  EnableScriptBreakPointFromJS(isolate, sbp);
+  f->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(2, break_point_hit_count);
 
-  DisableScriptBreakPointFromJS(env->GetIsolate(), sbp);
-  f->Call(env->Global(), 0, NULL);
+  DisableScriptBreakPointFromJS(isolate, sbp);
+  f->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(2, break_point_hit_count);
 
-  // Reload the script and get f again checking that the disabeling survives.
-  v8::Script::Compile(script, &origin)->Run();
+  // Reload the script and get f again checking that the disabling survives.
+  v8::Script::Compile(context, script, &origin)
+      .ToLocalChecked()
+      ->Run(context)
+      .ToLocalChecked();
   f = v8::Local<v8::Function>::Cast(
-      env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "f")));
-  f->Call(env->Global(), 0, NULL);
+      env->Global()->Get(context, v8_str(isolate, "f")).ToLocalChecked());
+  f->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(2, break_point_hit_count);
 
-  EnableScriptBreakPointFromJS(env->GetIsolate(), sbp);
-  f->Call(env->Global(), 0, NULL);
+  EnableScriptBreakPointFromJS(isolate, sbp);
+  f->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(3, break_point_hit_count);
 
-  v8::Debug::SetDebugEventListener(NULL);
-  CheckDebuggerUnloaded();
+  v8::Debug::SetDebugEventListener(isolate, nullptr);
+  CheckDebuggerUnloaded(isolate);
 }
 
 
@@ -1786,24 +1651,29 @@
   v8::HandleScope scope(env->GetIsolate());
   env.ExposeDebug();
 
-  v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount);
+  v8::Debug::SetDebugEventListener(env->GetIsolate(),
+                                   DebugEventBreakPointHitCount);
 
-  v8::Local<v8::String> script = v8::String::NewFromUtf8(
-    env->GetIsolate(),
-    "count = 0;\n"
-    "function f() {\n"
-    "  g(count++);  // line 2\n"
-    "};\n"
-    "function g(x) {\n"
-    "  var a=x;  // line 5\n"
-    "};");
+  v8::Local<v8::String> script = v8_str(env->GetIsolate(),
+                                        "count = 0;\n"
+                                        "function f() {\n"
+                                        "  g(count++);  // line 2\n"
+                                        "};\n"
+                                        "function g(x) {\n"
+                                        "  var a=x;  // line 5\n"
+                                        "};");
 
   // Compile the script and get function f.
-  v8::ScriptOrigin origin =
-      v8::ScriptOrigin(v8::String::NewFromUtf8(env->GetIsolate(), "test"));
-  v8::Script::Compile(script, &origin)->Run();
+  v8::Local<v8::Context> context = env.context();
+  v8::ScriptOrigin origin = v8::ScriptOrigin(v8_str(env->GetIsolate(), "test"));
+  v8::Script::Compile(context, script, &origin)
+      .ToLocalChecked()
+      ->Run(context)
+      .ToLocalChecked();
   v8::Local<v8::Function> f = v8::Local<v8::Function>::Cast(
-      env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "f")));
+      env->Global()
+          ->Get(context, v8_str(env->GetIsolate(), "f"))
+          .ToLocalChecked());
 
   // Set script break point on line 5 (in function g).
   int sbp1 = SetScriptBreakPointByNameFromJS(env->GetIsolate(), "test", 5, 0);
@@ -1811,34 +1681,39 @@
   // Call f with different conditions on the script break point.
   break_point_hit_count = 0;
   ChangeScriptBreakPointConditionFromJS(env->GetIsolate(), sbp1, "false");
-  f->Call(env->Global(), 0, NULL);
+  f->Call(env.context(), env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(0, break_point_hit_count);
 
   ChangeScriptBreakPointConditionFromJS(env->GetIsolate(), sbp1, "true");
   break_point_hit_count = 0;
-  f->Call(env->Global(), 0, NULL);
+  f->Call(env.context(), env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(1, break_point_hit_count);
 
   ChangeScriptBreakPointConditionFromJS(env->GetIsolate(), sbp1, "x % 2 == 0");
   break_point_hit_count = 0;
   for (int i = 0; i < 10; i++) {
-    f->Call(env->Global(), 0, NULL);
+    f->Call(env.context(), env->Global(), 0, NULL).ToLocalChecked();
   }
   CHECK_EQ(5, break_point_hit_count);
 
   // Reload the script and get f again checking that the condition survives.
-  v8::Script::Compile(script, &origin)->Run();
+  v8::Script::Compile(context, script, &origin)
+      .ToLocalChecked()
+      ->Run(context)
+      .ToLocalChecked();
   f = v8::Local<v8::Function>::Cast(
-      env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "f")));
+      env->Global()
+          ->Get(context, v8_str(env->GetIsolate(), "f"))
+          .ToLocalChecked());
 
   break_point_hit_count = 0;
   for (int i = 0; i < 10; i++) {
-    f->Call(env->Global(), 0, NULL);
+    f->Call(env.context(), env->Global(), 0, NULL).ToLocalChecked();
   }
   CHECK_EQ(5, break_point_hit_count);
 
-  v8::Debug::SetDebugEventListener(NULL);
-  CheckDebuggerUnloaded();
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr);
+  CheckDebuggerUnloaded(env->GetIsolate());
 }
 
 
@@ -1849,20 +1724,25 @@
   v8::HandleScope scope(env->GetIsolate());
   env.ExposeDebug();
 
-  v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount);
+  v8::Debug::SetDebugEventListener(env->GetIsolate(),
+                                   DebugEventBreakPointHitCount);
 
-  v8::Local<v8::String> script = v8::String::NewFromUtf8(
-    env->GetIsolate(),
-    "function f() {\n"
-    "  a = 0;  // line 1\n"
-    "};");
+  v8::Local<v8::String> script = v8_str(env->GetIsolate(),
+                                        "function f() {\n"
+                                        "  a = 0;  // line 1\n"
+                                        "};");
 
   // Compile the script and get function f.
-  v8::ScriptOrigin origin =
-      v8::ScriptOrigin(v8::String::NewFromUtf8(env->GetIsolate(), "test"));
-  v8::Script::Compile(script, &origin)->Run();
+  v8::Local<v8::Context> context = env.context();
+  v8::ScriptOrigin origin = v8::ScriptOrigin(v8_str(env->GetIsolate(), "test"));
+  v8::Script::Compile(context, script, &origin)
+      .ToLocalChecked()
+      ->Run(context)
+      .ToLocalChecked();
   v8::Local<v8::Function> f = v8::Local<v8::Function>::Cast(
-      env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "f")));
+      env->Global()
+          ->Get(context, v8_str(env->GetIsolate(), "f"))
+          .ToLocalChecked());
 
   // Set script break point on line 1 (in function f).
   int sbp = SetScriptBreakPointByNameFromJS(env->GetIsolate(), "test", 1, 0);
@@ -1870,31 +1750,36 @@
   // Call f with different ignores on the script break point.
   break_point_hit_count = 0;
   ChangeScriptBreakPointIgnoreCountFromJS(env->GetIsolate(), sbp, 1);
-  f->Call(env->Global(), 0, NULL);
+  f->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(0, break_point_hit_count);
-  f->Call(env->Global(), 0, NULL);
+  f->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(1, break_point_hit_count);
 
   ChangeScriptBreakPointIgnoreCountFromJS(env->GetIsolate(), sbp, 5);
   break_point_hit_count = 0;
   for (int i = 0; i < 10; i++) {
-    f->Call(env->Global(), 0, NULL);
+    f->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   }
   CHECK_EQ(5, break_point_hit_count);
 
   // Reload the script and get f again checking that the ignore survives.
-  v8::Script::Compile(script, &origin)->Run();
+  v8::Script::Compile(context, script, &origin)
+      .ToLocalChecked()
+      ->Run(context)
+      .ToLocalChecked();
   f = v8::Local<v8::Function>::Cast(
-      env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "f")));
+      env->Global()
+          ->Get(context, v8_str(env->GetIsolate(), "f"))
+          .ToLocalChecked());
 
   break_point_hit_count = 0;
   for (int i = 0; i < 10; i++) {
-    f->Call(env->Global(), 0, NULL);
+    f->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   }
   CHECK_EQ(5, break_point_hit_count);
 
-  v8::Debug::SetDebugEventListener(NULL);
-  CheckDebuggerUnloaded();
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr);
+  CheckDebuggerUnloaded(env->GetIsolate());
 }
 
 
@@ -1905,60 +1790,74 @@
   v8::HandleScope scope(env->GetIsolate());
   env.ExposeDebug();
 
-  v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount);
+  v8::Debug::SetDebugEventListener(env->GetIsolate(),
+                                   DebugEventBreakPointHitCount);
 
+  v8::Local<v8::Context> context = env.context();
   v8::Local<v8::Function> f;
-  v8::Local<v8::String> script = v8::String::NewFromUtf8(
-    env->GetIsolate(),
-    "function f() {\n"
-    "  function h() {\n"
-    "    a = 0;  // line 2\n"
-    "  }\n"
-    "  b = 1;  // line 4\n"
-    "  return h();\n"
-    "}");
+  v8::Local<v8::String> script = v8_str(env->GetIsolate(),
+                                        "function f() {\n"
+                                        "  function h() {\n"
+                                        "    a = 0;  // line 2\n"
+                                        "  }\n"
+                                        "  b = 1;  // line 4\n"
+                                        "  return h();\n"
+                                        "}");
 
-  v8::ScriptOrigin origin_1 =
-      v8::ScriptOrigin(v8::String::NewFromUtf8(env->GetIsolate(), "1"));
-  v8::ScriptOrigin origin_2 =
-      v8::ScriptOrigin(v8::String::NewFromUtf8(env->GetIsolate(), "2"));
+  v8::ScriptOrigin origin_1 = v8::ScriptOrigin(v8_str(env->GetIsolate(), "1"));
+  v8::ScriptOrigin origin_2 = v8::ScriptOrigin(v8_str(env->GetIsolate(), "2"));
 
   // Set a script break point before the script is loaded.
   SetScriptBreakPointByNameFromJS(env->GetIsolate(), "1", 2, 0);
 
   // Compile the script and get the function.
-  v8::Script::Compile(script, &origin_1)->Run();
+  v8::Script::Compile(context, script, &origin_1)
+      .ToLocalChecked()
+      ->Run(context)
+      .ToLocalChecked();
   f = v8::Local<v8::Function>::Cast(
-      env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "f")));
+      env->Global()
+          ->Get(context, v8_str(env->GetIsolate(), "f"))
+          .ToLocalChecked());
 
   // Call f and check that the script break point is active.
   break_point_hit_count = 0;
-  f->Call(env->Global(), 0, NULL);
+  f->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(1, break_point_hit_count);
 
   // Compile the script again with a different script data and get the
   // function.
-  v8::Script::Compile(script, &origin_2)->Run();
+  v8::Script::Compile(context, script, &origin_2)
+      .ToLocalChecked()
+      ->Run(context)
+      .ToLocalChecked();
   f = v8::Local<v8::Function>::Cast(
-      env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "f")));
+      env->Global()
+          ->Get(context, v8_str(env->GetIsolate(), "f"))
+          .ToLocalChecked());
 
   // Call f and check that no break points are set.
   break_point_hit_count = 0;
-  f->Call(env->Global(), 0, NULL);
+  f->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(0, break_point_hit_count);
 
   // Compile the script again and get the function.
-  v8::Script::Compile(script, &origin_1)->Run();
+  v8::Script::Compile(context, script, &origin_1)
+      .ToLocalChecked()
+      ->Run(context)
+      .ToLocalChecked();
   f = v8::Local<v8::Function>::Cast(
-      env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "f")));
+      env->Global()
+          ->Get(context, v8_str(env->GetIsolate(), "f"))
+          .ToLocalChecked());
 
   // Call f and check that the script break point is active.
   break_point_hit_count = 0;
-  f->Call(env->Global(), 0, NULL);
+  f->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(1, break_point_hit_count);
 
-  v8::Debug::SetDebugEventListener(NULL);
-  CheckDebuggerUnloaded();
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr);
+  CheckDebuggerUnloaded(env->GetIsolate());
 }
 
 
@@ -1969,41 +1868,50 @@
   v8::HandleScope scope(env->GetIsolate());
   env.ExposeDebug();
 
-  v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount);
+  v8::Debug::SetDebugEventListener(env->GetIsolate(),
+                                   DebugEventBreakPointHitCount);
 
+  v8::Local<v8::Context> context = env.context();
   v8::Local<v8::Function> f;
-  v8::Local<v8::String> script_f =
-      v8::String::NewFromUtf8(env->GetIsolate(),
-                              "function f() {\n"
-                              "  a = 0;  // line 1\n"
-                              "}");
+  v8::Local<v8::String> script_f = v8_str(env->GetIsolate(),
+                                          "function f() {\n"
+                                          "  a = 0;  // line 1\n"
+                                          "}");
 
   v8::Local<v8::Function> g;
-  v8::Local<v8::String> script_g =
-      v8::String::NewFromUtf8(env->GetIsolate(),
-                              "function g() {\n"
-                              "  b = 0;  // line 1\n"
-                              "}");
+  v8::Local<v8::String> script_g = v8_str(env->GetIsolate(),
+                                          "function g() {\n"
+                                          "  b = 0;  // line 1\n"
+                                          "}");
 
-  v8::ScriptOrigin origin =
-      v8::ScriptOrigin(v8::String::NewFromUtf8(env->GetIsolate(), "test"));
+  v8::ScriptOrigin origin = v8::ScriptOrigin(v8_str(env->GetIsolate(), "test"));
 
   // Set a script break point before the scripts are loaded.
   int sbp = SetScriptBreakPointByNameFromJS(env->GetIsolate(), "test", 1, 0);
 
   // Compile the scripts with same script data and get the functions.
-  v8::Script::Compile(script_f, &origin)->Run();
+  v8::Script::Compile(context, script_f, &origin)
+      .ToLocalChecked()
+      ->Run(context)
+      .ToLocalChecked();
   f = v8::Local<v8::Function>::Cast(
-      env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "f")));
-  v8::Script::Compile(script_g, &origin)->Run();
+      env->Global()
+          ->Get(context, v8_str(env->GetIsolate(), "f"))
+          .ToLocalChecked());
+  v8::Script::Compile(context, script_g, &origin)
+      .ToLocalChecked()
+      ->Run(context)
+      .ToLocalChecked();
   g = v8::Local<v8::Function>::Cast(
-      env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "g")));
+      env->Global()
+          ->Get(context, v8_str(env->GetIsolate(), "g"))
+          .ToLocalChecked());
 
   // Call f and g and check that the script break point is active.
   break_point_hit_count = 0;
-  f->Call(env->Global(), 0, NULL);
+  f->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(1, break_point_hit_count);
-  g->Call(env->Global(), 0, NULL);
+  g->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(2, break_point_hit_count);
 
   // Clear the script break point.
@@ -2011,9 +1919,9 @@
 
   // Call f and g and check that the script break point is no longer active.
   break_point_hit_count = 0;
-  f->Call(env->Global(), 0, NULL);
+  f->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(0, break_point_hit_count);
-  g->Call(env->Global(), 0, NULL);
+  g->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(0, break_point_hit_count);
 
   // Set script break point with the scripts loaded.
@@ -2021,13 +1929,13 @@
 
   // Call f and g and check that the script break point is active.
   break_point_hit_count = 0;
-  f->Call(env->Global(), 0, NULL);
+  f->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(1, break_point_hit_count);
-  g->Call(env->Global(), 0, NULL);
+  g->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(2, break_point_hit_count);
 
-  v8::Debug::SetDebugEventListener(NULL);
-  CheckDebuggerUnloaded();
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr);
+  CheckDebuggerUnloaded(env->GetIsolate());
 }
 
 
@@ -2038,20 +1946,21 @@
   v8::HandleScope scope(env->GetIsolate());
   env.ExposeDebug();
 
-  v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount);
+  v8::Debug::SetDebugEventListener(env->GetIsolate(),
+                                   DebugEventBreakPointHitCount);
 
+  v8::Local<v8::Context> context = env.context();
   v8::Local<v8::Function> f;
-  v8::Local<v8::String> script = v8::String::NewFromUtf8(
-      env->GetIsolate(),
-      "function f() {\n"
-      "  a = 0;  // line 8 as this script has line offset 7\n"
-      "  b = 0;  // line 9 as this script has line offset 7\n"
-      "}");
+  v8::Local<v8::String> script =
+      v8_str(env->GetIsolate(),
+             "function f() {\n"
+             "  a = 0;  // line 8 as this script has line offset 7\n"
+             "  b = 0;  // line 9 as this script has line offset 7\n"
+             "}");
 
   // Create script origin both name and line offset.
-  v8::ScriptOrigin origin(
-      v8::String::NewFromUtf8(env->GetIsolate(), "test.html"),
-      v8::Integer::New(env->GetIsolate(), 7));
+  v8::ScriptOrigin origin(v8_str(env->GetIsolate(), "test.html"),
+                          v8::Integer::New(env->GetIsolate(), 7));
 
   // Set two script break points before the script is loaded.
   int sbp1 =
@@ -2060,13 +1969,18 @@
       SetScriptBreakPointByNameFromJS(env->GetIsolate(), "test.html", 9, 0);
 
   // Compile the script and get the function.
-  v8::Script::Compile(script, &origin)->Run();
+  v8::Script::Compile(context, script, &origin)
+      .ToLocalChecked()
+      ->Run(context)
+      .ToLocalChecked();
   f = v8::Local<v8::Function>::Cast(
-      env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "f")));
+      env->Global()
+          ->Get(context, v8_str(env->GetIsolate(), "f"))
+          .ToLocalChecked());
 
   // Call f and check that the script break point is active.
   break_point_hit_count = 0;
-  f->Call(env->Global(), 0, NULL);
+  f->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(2, break_point_hit_count);
 
   // Clear the script break points.
@@ -2075,7 +1989,7 @@
 
   // Call f and check that no script break points are active.
   break_point_hit_count = 0;
-  f->Call(env->Global(), 0, NULL);
+  f->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(0, break_point_hit_count);
 
   // Set a script break point with the script loaded.
@@ -2083,11 +1997,11 @@
 
   // Call f and check that the script break point is active.
   break_point_hit_count = 0;
-  f->Call(env->Global(), 0, NULL);
+  f->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(1, break_point_hit_count);
 
-  v8::Debug::SetDebugEventListener(NULL);
-  CheckDebuggerUnloaded();
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr);
+  CheckDebuggerUnloaded(env->GetIsolate());
 }
 
 
@@ -2102,25 +2016,27 @@
                                         frame_function_name_source,
                                         "frame_function_name");
 
-  v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount);
+  v8::Debug::SetDebugEventListener(env->GetIsolate(),
+                                   DebugEventBreakPointHitCount);
 
+  v8::Local<v8::Context> context = env.context();
   v8::Local<v8::Function> f;
   v8::Local<v8::Function> g;
   v8::Local<v8::String> script =
-      v8::String::NewFromUtf8(env->GetIsolate(),
-                              "a = 0                      // line 0\n"
-                              "function f() {\n"
-                              "  a = 1;                   // line 2\n"
-                              "}\n"
-                              " a = 2;                    // line 4\n"
-                              "  /* xx */ function g() {  // line 5\n"
-                              "    function h() {         // line 6\n"
-                              "      a = 3;               // line 7\n"
-                              "    }\n"
-                              "    h();                   // line 9\n"
-                              "    a = 4;                 // line 10\n"
-                              "  }\n"
-                              " a=5;                      // line 12");
+      v8_str(env->GetIsolate(),
+             "a = 0                      // line 0\n"
+             "function f() {\n"
+             "  a = 1;                   // line 2\n"
+             "}\n"
+             " a = 2;                    // line 4\n"
+             "  /* xx */ function g() {  // line 5\n"
+             "    function h() {         // line 6\n"
+             "      a = 3;               // line 7\n"
+             "    }\n"
+             "    h();                   // line 9\n"
+             "    a = 4;                 // line 10\n"
+             "  }\n"
+             " a=5;                      // line 12");
 
   // Set a couple script break point before the script is loaded.
   int sbp1 =
@@ -2132,28 +2048,34 @@
 
   // Compile the script and get the function.
   break_point_hit_count = 0;
-  v8::ScriptOrigin origin(
-      v8::String::NewFromUtf8(env->GetIsolate(), "test.html"),
-      v8::Integer::New(env->GetIsolate(), 0));
-  v8::Script::Compile(script, &origin)->Run();
+  v8::ScriptOrigin origin(v8_str(env->GetIsolate(), "test.html"),
+                          v8::Integer::New(env->GetIsolate(), 0));
+  v8::Script::Compile(context, script, &origin)
+      .ToLocalChecked()
+      ->Run(context)
+      .ToLocalChecked();
   f = v8::Local<v8::Function>::Cast(
-      env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "f")));
+      env->Global()
+          ->Get(context, v8_str(env->GetIsolate(), "f"))
+          .ToLocalChecked());
   g = v8::Local<v8::Function>::Cast(
-      env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "g")));
+      env->Global()
+          ->Get(context, v8_str(env->GetIsolate(), "g"))
+          .ToLocalChecked());
 
   // Check that a break point was hit when the script was run.
   CHECK_EQ(1, break_point_hit_count);
   CHECK_EQ(0, StrLength(last_function_hit));
 
   // Call f and check that the script break point.
-  f->Call(env->Global(), 0, NULL);
+  f->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(2, break_point_hit_count);
-  CHECK_EQ("f", last_function_hit);
+  CHECK_EQ(0, strcmp("f", last_function_hit));
 
   // Call g and check that the script break point.
-  g->Call(env->Global(), 0, NULL);
+  g->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(3, break_point_hit_count);
-  CHECK_EQ("g", last_function_hit);
+  CHECK_EQ(0, strcmp("g", last_function_hit));
 
   // Clear the script break point on g and set one on h.
   ClearBreakPointFromJS(env->GetIsolate(), sbp3);
@@ -2161,9 +2083,9 @@
       SetScriptBreakPointByNameFromJS(env->GetIsolate(), "test.html", 6, -1);
 
   // Call g and check that the script break point in h is hit.
-  g->Call(env->Global(), 0, NULL);
+  g->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(4, break_point_hit_count);
-  CHECK_EQ("h", last_function_hit);
+  CHECK_EQ(0, strcmp("h", last_function_hit));
 
   // Clear break points in f and h. Set a new one in the script between
   // functions f and g and test that there is no break points in f and g any
@@ -2173,13 +2095,16 @@
   int sbp5 =
       SetScriptBreakPointByNameFromJS(env->GetIsolate(), "test.html", 4, -1);
   break_point_hit_count = 0;
-  f->Call(env->Global(), 0, NULL);
-  g->Call(env->Global(), 0, NULL);
+  f->Call(context, env->Global(), 0, NULL).ToLocalChecked();
+  g->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(0, break_point_hit_count);
 
   // Reload the script which should hit two break points.
   break_point_hit_count = 0;
-  v8::Script::Compile(script, &origin)->Run();
+  v8::Script::Compile(context, script, &origin)
+      .ToLocalChecked()
+      ->Run(context)
+      .ToLocalChecked();
   CHECK_EQ(2, break_point_hit_count);
   CHECK_EQ(0, StrLength(last_function_hit));
 
@@ -2189,7 +2114,10 @@
 
   // Reload the script which should hit three break points.
   break_point_hit_count = 0;
-  v8::Script::Compile(script, &origin)->Run();
+  v8::Script::Compile(context, script, &origin)
+      .ToLocalChecked()
+      ->Run(context)
+      .ToLocalChecked();
   CHECK_EQ(3, break_point_hit_count);
   CHECK_EQ(0, StrLength(last_function_hit));
 
@@ -2199,11 +2127,14 @@
   ClearBreakPointFromJS(env->GetIsolate(), sbp5);
   ClearBreakPointFromJS(env->GetIsolate(), sbp6);
   break_point_hit_count = 0;
-  v8::Script::Compile(script, &origin)->Run();
+  v8::Script::Compile(context, script, &origin)
+      .ToLocalChecked()
+      ->Run(context)
+      .ToLocalChecked();
   CHECK_EQ(0, break_point_hit_count);
 
-  v8::Debug::SetDebugEventListener(NULL);
-  CheckDebuggerUnloaded();
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr);
+  CheckDebuggerUnloaded(env->GetIsolate());
 }
 
 
@@ -2213,29 +2144,33 @@
   v8::HandleScope scope(env->GetIsolate());
   env.ExposeDebug();
 
-  v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount);
+  v8::Debug::SetDebugEventListener(env->GetIsolate(),
+                                   DebugEventBreakPointHitCount);
 
+  v8::Local<v8::Context> context = env.context();
   v8::Local<v8::String> script =
-      v8::String::NewFromUtf8(env->GetIsolate(),
-                              "function f() {\n"
-                              "  a = 1;                   // line 1\n"
-                              "}\n"
-                              "a = 2;                     // line 3\n");
+      v8_str(env->GetIsolate(),
+             "function f() {\n"
+             "  a = 1;                   // line 1\n"
+             "}\n"
+             "a = 2;                     // line 3\n");
   v8::Local<v8::Function> f;
   {
     v8::HandleScope scope(env->GetIsolate());
     CompileRunWithOrigin(script, "test.html");
   }
   f = v8::Local<v8::Function>::Cast(
-      env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "f")));
+      env->Global()
+          ->Get(context, v8_str(env->GetIsolate(), "f"))
+          .ToLocalChecked());
 
-  CcTest::heap()->CollectAllGarbage(Heap::kNoGCFlags);
+  CcTest::heap()->CollectAllGarbage();
 
   SetScriptBreakPointByNameFromJS(env->GetIsolate(), "test.html", 3, -1);
 
   // Call f and check that there was no break points.
   break_point_hit_count = 0;
-  f->Call(env->Global(), 0, NULL);
+  f->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(0, break_point_hit_count);
 
   // Recompile and run script and check that break point was hit.
@@ -2246,11 +2181,13 @@
   // Call f and check that there are still no break points.
   break_point_hit_count = 0;
   f = v8::Local<v8::Function>::Cast(
-      env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "f")));
+      env->Global()
+          ->Get(context, v8_str(env->GetIsolate(), "f"))
+          .ToLocalChecked());
   CHECK_EQ(0, break_point_hit_count);
 
-  v8::Debug::SetDebugEventListener(NULL);
-  CheckDebuggerUnloaded();
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr);
+  CheckDebuggerUnloaded(env->GetIsolate());
 }
 
 
@@ -2261,14 +2198,14 @@
   v8::HandleScope scope(env->GetIsolate());
   env.ExposeDebug();
 
-  v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount);
+  v8::Debug::SetDebugEventListener(env->GetIsolate(),
+                                   DebugEventBreakPointHitCount);
 
-  v8::Local<v8::String> script_source =
-      v8::String::NewFromUtf8(env->GetIsolate(),
-                              "function f() {\n"
-                              "  return 0;\n"
-                              "}\n"
-                              "f()");
+  v8::Local<v8::String> script_source = v8_str(env->GetIsolate(),
+                                               "function f() {\n"
+                                               "  return 0;\n"
+                                               "}\n"
+                                               "f()");
 
   int sbp1 =
       SetScriptBreakPointByNameFromJS(env->GetIsolate(), "test.html", 3, -1);
@@ -2284,8 +2221,8 @@
   ClearBreakPointFromJS(env->GetIsolate(), sbp1);
   ClearBreakPointFromJS(env->GetIsolate(), sbp2);
 
-  v8::Debug::SetDebugEventListener(NULL);
-  CheckDebuggerUnloaded();
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr);
+  CheckDebuggerUnloaded(env->GetIsolate());
 }
 
 
@@ -2295,23 +2232,26 @@
   DebugLocalContext env;
   v8::HandleScope scope(env->GetIsolate());
 
+  v8::Local<v8::Context> context = env.context();
   v8::Local<v8::Function> foo =
       CompileFunction(&env, "function foo(){a=1;}", "foo");
-  debug_event_remove_break_point = SetBreakPoint(foo, 0);
 
   // Register the debug event listener pasing the function
-  v8::Debug::SetDebugEventListener(DebugEventRemoveBreakPoint, foo);
+  v8::Debug::SetDebugEventListener(env->GetIsolate(),
+                                   DebugEventRemoveBreakPoint, foo);
+
+  debug_event_remove_break_point = SetBreakPoint(foo, 0);
 
   break_point_hit_count = 0;
-  foo->Call(env->Global(), 0, NULL);
+  foo->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(1, break_point_hit_count);
 
   break_point_hit_count = 0;
-  foo->Call(env->Global(), 0, NULL);
+  foo->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(0, break_point_hit_count);
 
-  v8::Debug::SetDebugEventListener(NULL);
-  CheckDebuggerUnloaded();
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr);
+  CheckDebuggerUnloaded(env->GetIsolate());
 }
 
 
@@ -2320,28 +2260,38 @@
   break_point_hit_count = 0;
   DebugLocalContext env;
   v8::HandleScope scope(env->GetIsolate());
-  v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount);
+  v8::Debug::SetDebugEventListener(env->GetIsolate(),
+                                   DebugEventBreakPointHitCount);
+  v8::Local<v8::Context> context = env.context();
+  v8::Script::Compile(context,
+                      v8_str(env->GetIsolate(), "function bar(){debugger}"))
+      .ToLocalChecked()
+      ->Run(context)
+      .ToLocalChecked();
   v8::Script::Compile(
-      v8::String::NewFromUtf8(env->GetIsolate(), "function bar(){debugger}"))
-      ->Run();
-  v8::Script::Compile(
-      v8::String::NewFromUtf8(env->GetIsolate(),
-                              "function foo(){debugger;debugger;}"))->Run();
+      context, v8_str(env->GetIsolate(), "function foo(){debugger;debugger;}"))
+      .ToLocalChecked()
+      ->Run(context)
+      .ToLocalChecked();
   v8::Local<v8::Function> foo = v8::Local<v8::Function>::Cast(
-      env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "foo")));
+      env->Global()
+          ->Get(context, v8_str(env->GetIsolate(), "foo"))
+          .ToLocalChecked());
   v8::Local<v8::Function> bar = v8::Local<v8::Function>::Cast(
-      env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "bar")));
+      env->Global()
+          ->Get(context, v8_str(env->GetIsolate(), "bar"))
+          .ToLocalChecked());
 
   // Run function with debugger statement
-  bar->Call(env->Global(), 0, NULL);
+  bar->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(1, break_point_hit_count);
 
   // Run function with two debugger statement
-  foo->Call(env->Global(), 0, NULL);
+  foo->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(3, break_point_hit_count);
 
-  v8::Debug::SetDebugEventListener(NULL);
-  CheckDebuggerUnloaded();
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr);
+  CheckDebuggerUnloaded(env->GetIsolate());
 }
 
 
@@ -2350,26 +2300,32 @@
     break_point_hit_count = 0;
     DebugLocalContext env;
     v8::HandleScope scope(env->GetIsolate());
-    v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount);
-    v8::Script::Compile(
-        v8::String::NewFromUtf8(env->GetIsolate(), "function foo(){debugger;}"))
-        ->Run();
+    v8::Local<v8::Context> context = env.context();
+    v8::Debug::SetDebugEventListener(env->GetIsolate(),
+                                     DebugEventBreakPointHitCount);
+    v8::Script::Compile(context,
+                        v8_str(env->GetIsolate(), "function foo(){debugger;}"))
+        .ToLocalChecked()
+        ->Run(context)
+        .ToLocalChecked();
     v8::Local<v8::Function> foo = v8::Local<v8::Function>::Cast(
-        env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "foo")));
+        env->Global()
+            ->Get(context, v8_str(env->GetIsolate(), "foo"))
+            .ToLocalChecked());
 
-    // The debugger statement triggers breakpint hit
-    foo->Call(env->Global(), 0, NULL);
+    // The debugger statement triggers breakpoint hit
+    foo->Call(context, env->Global(), 0, NULL).ToLocalChecked();
     CHECK_EQ(1, break_point_hit_count);
 
     int bp = SetBreakPoint(foo, 0);
 
     // Set breakpoint does not duplicate hits
-    foo->Call(env->Global(), 0, NULL);
+    foo->Call(context, env->Global(), 0, NULL).ToLocalChecked();
     CHECK_EQ(2, break_point_hit_count);
 
     ClearBreakPoint(bp);
-    v8::Debug::SetDebugEventListener(NULL);
-    CheckDebuggerUnloaded();
+    v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr);
+    CheckDebuggerUnloaded(env->GetIsolate());
 }
 
 
@@ -2386,25 +2342,21 @@
                                             evaluate_check_source,
                                             "evaluate_check");
   // Register the debug event listener
-  v8::Debug::SetDebugEventListener(DebugEventEvaluate);
+  v8::Debug::SetDebugEventListener(isolate, DebugEventEvaluate);
 
   // Different expected vaules of x and a when in a break point (u = undefined,
   // d = Hello, world!).
-  struct EvaluateCheck checks_uu[] = {
-    {"x", v8::Undefined(isolate)},
-    {"a", v8::Undefined(isolate)},
-    {NULL, v8::Handle<v8::Value>()}
-  };
+  struct EvaluateCheck checks_uu[] = {{"x", v8::Undefined(isolate)},
+                                      {"a", v8::Undefined(isolate)},
+                                      {NULL, v8::Local<v8::Value>()}};
   struct EvaluateCheck checks_hu[] = {
-    {"x", v8::String::NewFromUtf8(env->GetIsolate(), "Hello, world!")},
-    {"a", v8::Undefined(isolate)},
-    {NULL, v8::Handle<v8::Value>()}
-  };
+      {"x", v8_str(env->GetIsolate(), "Hello, world!")},
+      {"a", v8::Undefined(isolate)},
+      {NULL, v8::Local<v8::Value>()}};
   struct EvaluateCheck checks_hh[] = {
-    {"x", v8::String::NewFromUtf8(env->GetIsolate(), "Hello, world!")},
-    {"a", v8::String::NewFromUtf8(env->GetIsolate(), "Hello, world!")},
-    {NULL, v8::Handle<v8::Value>()}
-  };
+      {"x", v8_str(env->GetIsolate(), "Hello, world!")},
+      {"a", v8_str(env->GetIsolate(), "Hello, world!")},
+      {NULL, v8::Local<v8::Value>()}};
 
   // Simple test function. The "y=0" is in the function foo to provide a break
   // location. For "y=0" the "y" is at position 15 in the foo function
@@ -2421,24 +2373,25 @@
   const int foo_break_position_1 = 15;
   const int foo_break_position_2 = 29;
 
+  v8::Local<v8::Context> context = env.context();
   // Arguments with one parameter "Hello, world!"
-  v8::Handle<v8::Value> argv_foo[1] = {
-      v8::String::NewFromUtf8(env->GetIsolate(), "Hello, world!")};
+  v8::Local<v8::Value> argv_foo[1] = {
+      v8_str(env->GetIsolate(), "Hello, world!")};
 
   // Call foo with breakpoint set before a=x and undefined as parameter.
   int bp = SetBreakPoint(foo, foo_break_position_1);
   checks = checks_uu;
-  foo->Call(env->Global(), 0, NULL);
+  foo->Call(context, env->Global(), 0, NULL).ToLocalChecked();
 
   // Call foo with breakpoint set before a=x and parameter "Hello, world!".
   checks = checks_hu;
-  foo->Call(env->Global(), 1, argv_foo);
+  foo->Call(context, env->Global(), 1, argv_foo).ToLocalChecked();
 
   // Call foo with breakpoint set after a=x and parameter "Hello, world!".
   ClearBreakPoint(bp);
   SetBreakPoint(foo, foo_break_position_2);
   checks = checks_hh;
-  foo->Call(env->Global(), 1, argv_foo);
+  foo->Call(context, env->Global(), 1, argv_foo).ToLocalChecked();
 
   // Test that overriding Object.prototype will not interfere into evaluation
   // on call frame.
@@ -2457,14 +2410,14 @@
   const int zoo_break_position = 50;
 
   // Arguments with one parameter "Hello, world!"
-  v8::Handle<v8::Value> argv_zoo[1] = {
-      v8::String::NewFromUtf8(env->GetIsolate(), "Hello, world!")};
+  v8::Local<v8::Value> argv_zoo[1] = {
+      v8_str(env->GetIsolate(), "Hello, world!")};
 
   // Call zoo with breakpoint set at y=0.
   DebugEventCounterClear();
   bp = SetBreakPoint(zoo, zoo_break_position);
   checks = checks_hu;
-  zoo->Call(env->Global(), 1, argv_zoo);
+  zoo->Call(context, env->Global(), 1, argv_zoo).ToLocalChecked();
   CHECK_EQ(1, break_point_hit_count);
   ClearBreakPoint(bp);
 
@@ -2491,32 +2444,28 @@
   // Call bar setting breakpoint before a=x in barbar and undefined as
   // parameter.
   checks = checks_uu;
-  v8::Handle<v8::Value> argv_bar_1[2] = {
-    v8::Undefined(isolate),
-    v8::Number::New(isolate, barbar_break_position)
-  };
-  bar->Call(env->Global(), 2, argv_bar_1);
+  v8::Local<v8::Value> argv_bar_1[2] = {
+      v8::Undefined(isolate), v8::Number::New(isolate, barbar_break_position)};
+  bar->Call(context, env->Global(), 2, argv_bar_1).ToLocalChecked();
 
   // Call bar setting breakpoint before a=x in barbar and parameter
   // "Hello, world!".
   checks = checks_hu;
-  v8::Handle<v8::Value> argv_bar_2[2] = {
-    v8::String::NewFromUtf8(env->GetIsolate(), "Hello, world!"),
-    v8::Number::New(env->GetIsolate(), barbar_break_position)
-  };
-  bar->Call(env->Global(), 2, argv_bar_2);
+  v8::Local<v8::Value> argv_bar_2[2] = {
+      v8_str(env->GetIsolate(), "Hello, world!"),
+      v8::Number::New(env->GetIsolate(), barbar_break_position)};
+  bar->Call(context, env->Global(), 2, argv_bar_2).ToLocalChecked();
 
   // Call bar setting breakpoint after a=x in barbar and parameter
   // "Hello, world!".
   checks = checks_hh;
-  v8::Handle<v8::Value> argv_bar_3[2] = {
-    v8::String::NewFromUtf8(env->GetIsolate(), "Hello, world!"),
-    v8::Number::New(env->GetIsolate(), barbar_break_position + 1)
-  };
-  bar->Call(env->Global(), 2, argv_bar_3);
+  v8::Local<v8::Value> argv_bar_3[2] = {
+      v8_str(env->GetIsolate(), "Hello, world!"),
+      v8::Number::New(env->GetIsolate(), barbar_break_position + 1)};
+  bar->Call(context, env->Global(), 2, argv_bar_3).ToLocalChecked();
 
-  v8::Debug::SetDebugEventListener(NULL);
-  CheckDebuggerUnloaded();
+  v8::Debug::SetDebugEventListener(isolate, nullptr);
+  CheckDebuggerUnloaded(isolate);
 }
 
 
@@ -2533,8 +2482,9 @@
   v8::HandleScope scope(env->GetIsolate());
   env.ExposeDebug();
 
-  v8::Debug::SetDebugEventListener(CheckDebugEvent);
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), CheckDebugEvent);
 
+  v8::Local<v8::Context> context = env.context();
   v8::Local<v8::Function> foo = CompileFunction(&env,
     "function foo(x) {\n"
     "  var s = 'String value2';\n"
@@ -2547,27 +2497,34 @@
 
   debugEventCount = 0;
   env->AllowCodeGenerationFromStrings(false);
-  foo->Call(env->Global(), 0, NULL);
+  foo->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(1, debugEventCount);
 
-  v8::Debug::SetDebugEventListener(NULL);
-  CheckDebuggerUnloaded();
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr);
+  CheckDebuggerUnloaded(env->GetIsolate());
 }
 
 
 bool checkedDebugEvals = true;
-v8::Handle<v8::Function> checkGlobalEvalFunction;
-v8::Handle<v8::Function> checkFrameEvalFunction;
+v8::Local<v8::Function> checkGlobalEvalFunction;
+v8::Local<v8::Function> checkFrameEvalFunction;
 static void CheckDebugEval(const v8::Debug::EventDetails& eventDetails) {
   if (eventDetails.GetEvent() == v8::Break) {
     ++debugEventCount;
     v8::HandleScope handleScope(CcTest::isolate());
 
-    v8::Handle<v8::Value> args[] = { eventDetails.GetExecutionState() };
-    CHECK(checkGlobalEvalFunction->Call(
-        eventDetails.GetEventContext()->Global(), 1, args)->IsTrue());
-    CHECK(checkFrameEvalFunction->Call(
-        eventDetails.GetEventContext()->Global(), 1, args)->IsTrue());
+    v8::Local<v8::Value> args[] = {eventDetails.GetExecutionState()};
+    CHECK(
+        checkGlobalEvalFunction->Call(eventDetails.GetEventContext(),
+                                      eventDetails.GetEventContext()->Global(),
+                                      1, args)
+            .ToLocalChecked()
+            ->IsTrue());
+    CHECK(checkFrameEvalFunction->Call(eventDetails.GetEventContext(),
+                                       eventDetails.GetEventContext()->Global(),
+                                       1, args)
+              .ToLocalChecked()
+              ->IsTrue());
   }
 }
 
@@ -2580,8 +2537,9 @@
   v8::HandleScope scope(env->GetIsolate());
   env.ExposeDebug();
 
-  v8::Debug::SetDebugEventListener(CheckDebugEval);
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), CheckDebugEval);
 
+  v8::Local<v8::Context> context = env.context();
   v8::Local<v8::Function> foo = CompileFunction(&env,
     "var global = 'Global';\n"
     "function foo(x) {\n"
@@ -2603,13 +2561,13 @@
     "checkFrameEval");
   debugEventCount = 0;
   env->AllowCodeGenerationFromStrings(false);
-  foo->Call(env->Global(), 0, NULL);
+  foo->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(1, debugEventCount);
 
   checkGlobalEvalFunction.Clear();
   checkFrameEvalFunction.Clear();
-  v8::Debug::SetDebugEventListener(NULL);
-  CheckDebuggerUnloaded();
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr);
+  CheckDebuggerUnloaded(env->GetIsolate());
 }
 
 
@@ -2697,7 +2655,7 @@
 
 static void DebugProcessDebugMessagesHandler(
     const v8::Debug::Message& message) {
-  v8::Handle<v8::String> json = message.GetJSON();
+  v8::Local<v8::String> json = message.GetJSON();
   v8::String::Utf8Value utf8(json);
   EvaluateResult* array_item = process_debug_messages_data.current();
 
@@ -2713,18 +2671,21 @@
 // Test that the evaluation of expressions works even from ProcessDebugMessages
 // i.e. with empty stack.
 TEST(DebugEvaluateWithoutStack) {
-  v8::Debug::SetMessageHandler(DebugProcessDebugMessagesHandler);
-
   DebugLocalContext env;
+  v8::Debug::SetMessageHandler(env->GetIsolate(),
+                               DebugProcessDebugMessagesHandler);
   v8::HandleScope scope(env->GetIsolate());
 
   const char* source =
       "var v1 = 'Pinguin';\n function getAnimal() { return 'Capy' + 'bara'; }";
 
-  v8::Script::Compile(v8::String::NewFromUtf8(env->GetIsolate(), source))
-      ->Run();
+  v8::Local<v8::Context> context = env.context();
+  v8::Script::Compile(context, v8_str(env->GetIsolate(), source))
+      .ToLocalChecked()
+      ->Run(context)
+      .ToLocalChecked();
 
-  v8::Debug::ProcessDebugMessages();
+  v8::Debug::ProcessDebugMessages(env->GetIsolate());
 
   const int kBufferSize = 1000;
   uint16_t buffer[kBufferSize];
@@ -2760,7 +2721,7 @@
 
   v8::Debug::SendCommand(isolate, buffer, AsciiToUtf16(command_113, buffer));
 
-  v8::Debug::ProcessDebugMessages();
+  v8::Debug::ProcessDebugMessages(isolate);
 
   CHECK_EQ(3, process_debug_messages_data.counter);
 
@@ -2769,9 +2730,9 @@
            0);
   CHECK_EQ(strcmp("805", process_debug_messages_data.results[2].buffer), 0);
 
-  v8::Debug::SetMessageHandler(NULL);
-  v8::Debug::SetDebugEventListener(NULL);
-  CheckDebuggerUnloaded();
+  v8::Debug::SetMessageHandler(env->GetIsolate(), nullptr);
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr);
+  CheckDebuggerUnloaded(env->GetIsolate());
 }
 
 
@@ -2788,33 +2749,35 @@
   // Run foo to allow it to get optimized.
   CompileRun("a=0; b=0; c=0; foo();");
 
-  SetBreakPoint(foo, 3);
-
   // Register a debug event listener which steps and counts.
-  v8::Debug::SetDebugEventListener(DebugEventStep);
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventStep);
+
+  SetBreakPoint(foo, 3);
 
   step_action = StepIn;
   break_point_hit_count = 0;
-  foo->Call(env->Global(), 0, NULL);
+  v8::Local<v8::Context> context = env.context();
+  foo->Call(context, env->Global(), 0, NULL).ToLocalChecked();
 
   // With stepping all break locations are hit.
   CHECK_EQ(4, break_point_hit_count);
 
-  v8::Debug::SetDebugEventListener(NULL);
-  CheckDebuggerUnloaded();
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr);
+  CheckDebuggerUnloaded(env->GetIsolate());
 
   // Register a debug event listener which just counts.
-  v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount);
+  v8::Debug::SetDebugEventListener(env->GetIsolate(),
+                                   DebugEventBreakPointHitCount);
 
   SetBreakPoint(foo, 3);
   break_point_hit_count = 0;
-  foo->Call(env->Global(), 0, NULL);
+  foo->Call(context, env->Global(), 0, NULL).ToLocalChecked();
 
   // Without stepping only active break points are hit.
   CHECK_EQ(1, break_point_hit_count);
 
-  v8::Debug::SetDebugEventListener(NULL);
-  CheckDebuggerUnloaded();
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr);
+  CheckDebuggerUnloaded(env->GetIsolate());
 }
 
 
@@ -2824,7 +2787,7 @@
   v8::HandleScope scope(env->GetIsolate());
 
   // Register a debug event listener which steps and counts.
-  v8::Debug::SetDebugEventListener(DebugEventStep);
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventStep);
 
   // Create a function for testing stepping of keyed load. The statement 'y=1'
   // is there to have more than one breakable statement in the loop, TODO(315).
@@ -2841,29 +2804,31 @@
       "y=0\n",
       "foo");
 
+  v8::Local<v8::Context> context = env.context();
   // Create array [0,1,2,3,4,5,6,7,8,9]
   v8::Local<v8::Array> a = v8::Array::New(env->GetIsolate(), 10);
   for (int i = 0; i < 10; i++) {
-    a->Set(v8::Number::New(env->GetIsolate(), i),
-           v8::Number::New(env->GetIsolate(), i));
+    CHECK(a->Set(context, v8::Number::New(env->GetIsolate(), i),
+                 v8::Number::New(env->GetIsolate(), i))
+              .FromJust());
   }
 
   // Call function without any break points to ensure inlining is in place.
   const int kArgc = 1;
-  v8::Handle<v8::Value> args[kArgc] = { a };
-  foo->Call(env->Global(), kArgc, args);
+  v8::Local<v8::Value> args[kArgc] = {a};
+  foo->Call(context, env->Global(), kArgc, args).ToLocalChecked();
 
   // Set up break point and step through the function.
   SetBreakPoint(foo, 3);
   step_action = StepNext;
   break_point_hit_count = 0;
-  foo->Call(env->Global(), kArgc, args);
+  foo->Call(context, env->Global(), kArgc, args).ToLocalChecked();
 
   // With stepping all break locations are hit.
   CHECK_EQ(45, break_point_hit_count);
 
-  v8::Debug::SetDebugEventListener(NULL);
-  CheckDebuggerUnloaded();
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr);
+  CheckDebuggerUnloaded(env->GetIsolate());
 }
 
 
@@ -2873,7 +2838,7 @@
   v8::HandleScope scope(env->GetIsolate());
 
   // Register a debug event listener which steps and counts.
-  v8::Debug::SetDebugEventListener(DebugEventStep);
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventStep);
 
   // Create a function for testing stepping of keyed store. The statement 'y=1'
   // is there to have more than one breakable statement in the loop, TODO(315).
@@ -2889,29 +2854,31 @@
       "y=0\n",
       "foo");
 
+  v8::Local<v8::Context> context = env.context();
   // Create array [0,1,2,3,4,5,6,7,8,9]
   v8::Local<v8::Array> a = v8::Array::New(env->GetIsolate(), 10);
   for (int i = 0; i < 10; i++) {
-    a->Set(v8::Number::New(env->GetIsolate(), i),
-           v8::Number::New(env->GetIsolate(), i));
+    CHECK(a->Set(context, v8::Number::New(env->GetIsolate(), i),
+                 v8::Number::New(env->GetIsolate(), i))
+              .FromJust());
   }
 
   // Call function without any break points to ensure inlining is in place.
   const int kArgc = 1;
-  v8::Handle<v8::Value> args[kArgc] = { a };
-  foo->Call(env->Global(), kArgc, args);
+  v8::Local<v8::Value> args[kArgc] = {a};
+  foo->Call(context, env->Global(), kArgc, args).ToLocalChecked();
 
   // Set up break point and step through the function.
   SetBreakPoint(foo, 3);
   step_action = StepNext;
   break_point_hit_count = 0;
-  foo->Call(env->Global(), kArgc, args);
+  foo->Call(context, env->Global(), kArgc, args).ToLocalChecked();
 
   // With stepping all break locations are hit.
   CHECK_EQ(44, break_point_hit_count);
 
-  v8::Debug::SetDebugEventListener(NULL);
-  CheckDebuggerUnloaded();
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr);
+  CheckDebuggerUnloaded(env->GetIsolate());
 }
 
 
@@ -2921,8 +2888,9 @@
   v8::HandleScope scope(env->GetIsolate());
 
   // Register a debug event listener which steps and counts.
-  v8::Debug::SetDebugEventListener(DebugEventStep);
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventStep);
 
+  v8::Local<v8::Context> context = env.context();
   // Create a function for testing stepping of named load.
   v8::Local<v8::Function> foo = CompileFunction(
       &env,
@@ -2943,19 +2911,19 @@
           "foo");
 
   // Call function without any break points to ensure inlining is in place.
-  foo->Call(env->Global(), 0, NULL);
+  foo->Call(context, env->Global(), 0, NULL).ToLocalChecked();
 
   // Set up break point and step through the function.
   SetBreakPoint(foo, 4);
   step_action = StepNext;
   break_point_hit_count = 0;
-  foo->Call(env->Global(), 0, NULL);
+  foo->Call(context, env->Global(), 0, NULL).ToLocalChecked();
 
   // With stepping all break locations are hit.
   CHECK_EQ(65, break_point_hit_count);
 
-  v8::Debug::SetDebugEventListener(NULL);
-  CheckDebuggerUnloaded();
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr);
+  CheckDebuggerUnloaded(env->GetIsolate());
 }
 
 
@@ -2964,9 +2932,10 @@
   v8::HandleScope scope(env->GetIsolate());
 
   // Register a debug event listener which steps and counts.
-  v8::Debug::SetDebugEventListener(DebugEventStep);
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventStep);
 
   // Create a function for testing stepping of named store.
+  v8::Local<v8::Context> context = env.context();
   v8::Local<v8::Function> foo = CompileFunction(
       &env,
       "function foo() {\n"
@@ -2978,19 +2947,19 @@
           "foo");
 
   // Call function without any break points to ensure inlining is in place.
-  foo->Call(env->Global(), 0, NULL);
+  foo->Call(context, env->Global(), 0, NULL).ToLocalChecked();
 
   // Set up break point and step through the function.
   SetBreakPoint(foo, 3);
   step_action = StepNext;
   break_point_hit_count = 0;
-  foo->Call(env->Global(), 0, NULL);
+  foo->Call(context, env->Global(), 0, NULL).ToLocalChecked();
 
   // With stepping all expected break locations are hit.
   CHECK_EQ(expected, break_point_hit_count);
 
-  v8::Debug::SetDebugEventListener(NULL);
-  CheckDebuggerUnloaded();
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr);
+  CheckDebuggerUnloaded(env->GetIsolate());
 }
 
 
@@ -3004,8 +2973,9 @@
   v8::HandleScope scope(env->GetIsolate());
 
   // Register a debug event listener which steps and counts.
-  v8::Debug::SetDebugEventListener(DebugEventStep);
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventStep);
 
+  v8::Local<v8::Context> context = env.context();
   // Create a function for testing stepping.
   v8::Local<v8::Function> foo = CompileFunction(&env,
       "function bar() {};"
@@ -3022,26 +2992,27 @@
 
   step_action = StepIn;
   break_point_hit_count = 0;
-  foo->Call(env->Global(), 0, NULL);
+  foo->Call(context, env->Global(), 0, NULL).ToLocalChecked();
 
   // With stepping all break locations are hit.
   CHECK_EQ(11, break_point_hit_count);
 
-  v8::Debug::SetDebugEventListener(NULL);
-  CheckDebuggerUnloaded();
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr);
+  CheckDebuggerUnloaded(env->GetIsolate());
 
   // Register a debug event listener which just counts.
-  v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount);
+  v8::Debug::SetDebugEventListener(env->GetIsolate(),
+                                   DebugEventBreakPointHitCount);
 
   SetBreakPoint(foo, 0);
   break_point_hit_count = 0;
-  foo->Call(env->Global(), 0, NULL);
+  foo->Call(context, env->Global(), 0, NULL).ToLocalChecked();
 
   // Without stepping only active break points are hit.
   CHECK_EQ(1, break_point_hit_count);
 
-  v8::Debug::SetDebugEventListener(NULL);
-  CheckDebuggerUnloaded();
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr);
+  CheckDebuggerUnloaded(env->GetIsolate());
 }
 
 
@@ -3050,8 +3021,9 @@
   v8::HandleScope scope(env->GetIsolate());
 
   // Register a debug event listener which steps and counts.
-  v8::Debug::SetDebugEventListener(DebugEventStep);
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventStep);
 
+  v8::Local<v8::Context> context = env.context();
   // Create a function for testing stepping. Run it to allow it to get
   // optimized.
   const char* src = "function foo() { "
@@ -3069,12 +3041,12 @@
   // Stepping through the declarations.
   step_action = StepIn;
   break_point_hit_count = 0;
-  foo->Call(env->Global(), 0, NULL);
+  foo->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(6, break_point_hit_count);
 
   // Get rid of the debug event listener.
-  v8::Debug::SetDebugEventListener(NULL);
-  CheckDebuggerUnloaded();
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr);
+  CheckDebuggerUnloaded(env->GetIsolate());
 }
 
 
@@ -3083,8 +3055,9 @@
   v8::HandleScope scope(env->GetIsolate());
 
   // Register a debug event listener which steps and counts.
-  v8::Debug::SetDebugEventListener(DebugEventStep);
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventStep);
 
+  v8::Local<v8::Context> context = env.context();
   // Create a function for testing stepping. Run it to allow it to get
   // optimized.
   const char* src = "function foo() { "
@@ -3102,12 +3075,12 @@
   // Stepping through the declarations.
   step_action = StepIn;
   break_point_hit_count = 0;
-  foo->Call(env->Global(), 0, NULL);
+  foo->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(6, break_point_hit_count);
 
   // Get rid of the debug event listener.
-  v8::Debug::SetDebugEventListener(NULL);
-  CheckDebuggerUnloaded();
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr);
+  CheckDebuggerUnloaded(env->GetIsolate());
 }
 
 
@@ -3117,8 +3090,9 @@
   v8::HandleScope scope(isolate);
 
   // Register a debug event listener which steps and counts.
-  v8::Debug::SetDebugEventListener(DebugEventStep);
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventStep);
 
+  v8::Local<v8::Context> context = env.context();
   // Create a function for testing stepping. Run it to allow it to get
   // optimized.
   const int argc = 1;
@@ -3138,20 +3112,20 @@
   // Stepping through the true part.
   step_action = StepIn;
   break_point_hit_count = 0;
-  v8::Handle<v8::Value> argv_true[argc] = { v8::True(isolate) };
-  foo->Call(env->Global(), argc, argv_true);
+  v8::Local<v8::Value> argv_true[argc] = {v8::True(isolate)};
+  foo->Call(context, env->Global(), argc, argv_true).ToLocalChecked();
   CHECK_EQ(4, break_point_hit_count);
 
   // Stepping through the false part.
   step_action = StepIn;
   break_point_hit_count = 0;
-  v8::Handle<v8::Value> argv_false[argc] = { v8::False(isolate) };
-  foo->Call(env->Global(), argc, argv_false);
+  v8::Local<v8::Value> argv_false[argc] = {v8::False(isolate)};
+  foo->Call(context, env->Global(), argc, argv_false).ToLocalChecked();
   CHECK_EQ(5, break_point_hit_count);
 
   // Get rid of the debug event listener.
-  v8::Debug::SetDebugEventListener(NULL);
-  CheckDebuggerUnloaded();
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr);
+  CheckDebuggerUnloaded(isolate);
 }
 
 
@@ -3161,8 +3135,9 @@
   v8::HandleScope scope(isolate);
 
   // Register a debug event listener which steps and counts.
-  v8::Debug::SetDebugEventListener(DebugEventStep);
+  v8::Debug::SetDebugEventListener(isolate, DebugEventStep);
 
+  v8::Local<v8::Context> context = env.context();
   // Create a function for testing stepping. Run it to allow it to get
   // optimized.
   const int argc = 1;
@@ -3188,27 +3163,27 @@
   // One case with fall-through.
   step_action = StepIn;
   break_point_hit_count = 0;
-  v8::Handle<v8::Value> argv_1[argc] = { v8::Number::New(isolate, 1) };
-  foo->Call(env->Global(), argc, argv_1);
+  v8::Local<v8::Value> argv_1[argc] = {v8::Number::New(isolate, 1)};
+  foo->Call(context, env->Global(), argc, argv_1).ToLocalChecked();
   CHECK_EQ(6, break_point_hit_count);
 
   // Another case.
   step_action = StepIn;
   break_point_hit_count = 0;
-  v8::Handle<v8::Value> argv_2[argc] = { v8::Number::New(isolate, 2) };
-  foo->Call(env->Global(), argc, argv_2);
+  v8::Local<v8::Value> argv_2[argc] = {v8::Number::New(isolate, 2)};
+  foo->Call(context, env->Global(), argc, argv_2).ToLocalChecked();
   CHECK_EQ(5, break_point_hit_count);
 
   // Last case.
   step_action = StepIn;
   break_point_hit_count = 0;
-  v8::Handle<v8::Value> argv_3[argc] = { v8::Number::New(isolate, 3) };
-  foo->Call(env->Global(), argc, argv_3);
+  v8::Local<v8::Value> argv_3[argc] = {v8::Number::New(isolate, 3)};
+  foo->Call(context, env->Global(), argc, argv_3).ToLocalChecked();
   CHECK_EQ(7, break_point_hit_count);
 
   // Get rid of the debug event listener.
-  v8::Debug::SetDebugEventListener(NULL);
-  CheckDebuggerUnloaded();
+  v8::Debug::SetDebugEventListener(isolate, nullptr);
+  CheckDebuggerUnloaded(isolate);
 }
 
 
@@ -3218,8 +3193,9 @@
   v8::HandleScope scope(isolate);
 
   // Register a debug event listener which steps and counts.
-  v8::Debug::SetDebugEventListener(DebugEventStep);
+  v8::Debug::SetDebugEventListener(isolate, DebugEventStep);
 
+  v8::Local<v8::Context> context = env.context();
   // Create a function for testing stepping. Run it to allow it to get
   // optimized.
   const int argc = 1;
@@ -3236,27 +3212,27 @@
   // Looping 0 times.  We still should break at the while-condition once.
   step_action = StepIn;
   break_point_hit_count = 0;
-  v8::Handle<v8::Value> argv_0[argc] = { v8::Number::New(isolate, 0) };
-  foo->Call(env->Global(), argc, argv_0);
+  v8::Local<v8::Value> argv_0[argc] = {v8::Number::New(isolate, 0)};
+  foo->Call(context, env->Global(), argc, argv_0).ToLocalChecked();
   CHECK_EQ(3, break_point_hit_count);
 
   // Looping 10 times.
   step_action = StepIn;
   break_point_hit_count = 0;
-  v8::Handle<v8::Value> argv_10[argc] = { v8::Number::New(isolate, 10) };
-  foo->Call(env->Global(), argc, argv_10);
+  v8::Local<v8::Value> argv_10[argc] = {v8::Number::New(isolate, 10)};
+  foo->Call(context, env->Global(), argc, argv_10).ToLocalChecked();
   CHECK_EQ(23, break_point_hit_count);
 
   // Looping 100 times.
   step_action = StepIn;
   break_point_hit_count = 0;
-  v8::Handle<v8::Value> argv_100[argc] = { v8::Number::New(isolate, 100) };
-  foo->Call(env->Global(), argc, argv_100);
+  v8::Local<v8::Value> argv_100[argc] = {v8::Number::New(isolate, 100)};
+  foo->Call(context, env->Global(), argc, argv_100).ToLocalChecked();
   CHECK_EQ(203, break_point_hit_count);
 
   // Get rid of the debug event listener.
-  v8::Debug::SetDebugEventListener(NULL);
-  CheckDebuggerUnloaded();
+  v8::Debug::SetDebugEventListener(isolate, nullptr);
+  CheckDebuggerUnloaded(isolate);
 }
 
 
@@ -3266,8 +3242,9 @@
   v8::HandleScope scope(isolate);
 
   // Register a debug event listener which steps and counts.
-  v8::Debug::SetDebugEventListener(DebugEventStep);
+  v8::Debug::SetDebugEventListener(isolate, DebugEventStep);
 
+  v8::Local<v8::Context> context = env.context();
   // Create a function for testing stepping. Run it to allow it to get
   // optimized.
   const int argc = 1;
@@ -3281,23 +3258,30 @@
   v8::Local<v8::Function> foo = CompileFunction(&env, src, "foo");
   SetBreakPoint(foo, 8);  // "var a = 0;"
 
+  // Looping 0 times.
+  step_action = StepIn;
+  break_point_hit_count = 0;
+  v8::Local<v8::Value> argv_0[argc] = {v8::Number::New(isolate, 0)};
+  foo->Call(context, env->Global(), argc, argv_0).ToLocalChecked();
+  CHECK_EQ(4, break_point_hit_count);
+
   // Looping 10 times.
   step_action = StepIn;
   break_point_hit_count = 0;
-  v8::Handle<v8::Value> argv_10[argc] = { v8::Number::New(isolate, 10) };
-  foo->Call(env->Global(), argc, argv_10);
+  v8::Local<v8::Value> argv_10[argc] = {v8::Number::New(isolate, 10)};
+  foo->Call(context, env->Global(), argc, argv_10).ToLocalChecked();
   CHECK_EQ(22, break_point_hit_count);
 
   // Looping 100 times.
   step_action = StepIn;
   break_point_hit_count = 0;
-  v8::Handle<v8::Value> argv_100[argc] = { v8::Number::New(isolate, 100) };
-  foo->Call(env->Global(), argc, argv_100);
+  v8::Local<v8::Value> argv_100[argc] = {v8::Number::New(isolate, 100)};
+  foo->Call(context, env->Global(), argc, argv_100).ToLocalChecked();
   CHECK_EQ(202, break_point_hit_count);
 
   // Get rid of the debug event listener.
-  v8::Debug::SetDebugEventListener(NULL);
-  CheckDebuggerUnloaded();
+  v8::Debug::SetDebugEventListener(isolate, nullptr);
+  CheckDebuggerUnloaded(isolate);
 }
 
 
@@ -3307,8 +3291,9 @@
   v8::HandleScope scope(isolate);
 
   // Register a debug event listener which steps and counts.
-  v8::Debug::SetDebugEventListener(DebugEventStep);
+  v8::Debug::SetDebugEventListener(isolate, DebugEventStep);
 
+  v8::Local<v8::Context> context = env.context();
   // Create a function for testing stepping. Run it to allow it to get
   // optimized.
   const int argc = 1;
@@ -3323,23 +3308,30 @@
 
   SetBreakPoint(foo, 8);  // "a = 1;"
 
+  // Looping 0 times.
+  step_action = StepIn;
+  break_point_hit_count = 0;
+  v8::Local<v8::Value> argv_0[argc] = {v8::Number::New(isolate, 0)};
+  foo->Call(context, env->Global(), argc, argv_0).ToLocalChecked();
+  CHECK_EQ(4, break_point_hit_count);
+
   // Looping 10 times.
   step_action = StepIn;
   break_point_hit_count = 0;
-  v8::Handle<v8::Value> argv_10[argc] = { v8::Number::New(isolate, 10) };
-  foo->Call(env->Global(), argc, argv_10);
-  CHECK_EQ(45, break_point_hit_count);
+  v8::Local<v8::Value> argv_10[argc] = {v8::Number::New(isolate, 10)};
+  foo->Call(context, env->Global(), argc, argv_10).ToLocalChecked();
+  CHECK_EQ(34, break_point_hit_count);
 
   // Looping 100 times.
   step_action = StepIn;
   break_point_hit_count = 0;
-  v8::Handle<v8::Value> argv_100[argc] = { v8::Number::New(isolate, 100) };
-  foo->Call(env->Global(), argc, argv_100);
-  CHECK_EQ(405, break_point_hit_count);
+  v8::Local<v8::Value> argv_100[argc] = {v8::Number::New(isolate, 100)};
+  foo->Call(context, env->Global(), argc, argv_100).ToLocalChecked();
+  CHECK_EQ(304, break_point_hit_count);
 
   // Get rid of the debug event listener.
-  v8::Debug::SetDebugEventListener(NULL);
-  CheckDebuggerUnloaded();
+  v8::Debug::SetDebugEventListener(isolate, nullptr);
+  CheckDebuggerUnloaded(isolate);
 }
 
 
@@ -3349,8 +3341,9 @@
   v8::HandleScope scope(isolate);
 
   // Register a debug event listener which steps and counts.
-  v8::Debug::SetDebugEventListener(DebugEventStep);
+  v8::Debug::SetDebugEventListener(isolate, DebugEventStep);
 
+  v8::Local<v8::Context> context = env.context();
   // Create a function for testing stepping. Run it to allow it to get
   // optimized.
   const int argc = 1;
@@ -3368,7 +3361,7 @@
                     "}"
                     "foo()";
   v8::Local<v8::Function> foo = CompileFunction(&env, src, "foo");
-  v8::Handle<v8::Value> result;
+  v8::Local<v8::Value> result;
   SetBreakPoint(foo, 8);  // "var a = 0;"
 
   // Each loop generates 4 or 5 steps depending on whether a is equal.
@@ -3376,22 +3369,22 @@
   // Looping 10 times.
   step_action = StepIn;
   break_point_hit_count = 0;
-  v8::Handle<v8::Value> argv_10[argc] = { v8::Number::New(isolate, 10) };
-  result = foo->Call(env->Global(), argc, argv_10);
-  CHECK_EQ(5, result->Int32Value());
+  v8::Local<v8::Value> argv_10[argc] = {v8::Number::New(isolate, 10)};
+  result = foo->Call(context, env->Global(), argc, argv_10).ToLocalChecked();
+  CHECK_EQ(5, result->Int32Value(context).FromJust());
   CHECK_EQ(62, break_point_hit_count);
 
   // Looping 100 times.
   step_action = StepIn;
   break_point_hit_count = 0;
-  v8::Handle<v8::Value> argv_100[argc] = { v8::Number::New(isolate, 100) };
-  result = foo->Call(env->Global(), argc, argv_100);
-  CHECK_EQ(50, result->Int32Value());
+  v8::Local<v8::Value> argv_100[argc] = {v8::Number::New(isolate, 100)};
+  result = foo->Call(context, env->Global(), argc, argv_100).ToLocalChecked();
+  CHECK_EQ(50, result->Int32Value(context).FromJust());
   CHECK_EQ(557, break_point_hit_count);
 
   // Get rid of the debug event listener.
-  v8::Debug::SetDebugEventListener(NULL);
-  CheckDebuggerUnloaded();
+  v8::Debug::SetDebugEventListener(isolate, nullptr);
+  CheckDebuggerUnloaded(isolate);
 }
 
 
@@ -3401,8 +3394,9 @@
   v8::HandleScope scope(isolate);
 
   // Register a debug event listener which steps and counts.
-  v8::Debug::SetDebugEventListener(DebugEventStep);
+  v8::Debug::SetDebugEventListener(isolate, DebugEventStep);
 
+  v8::Local<v8::Context> context = env.context();
   // Create a function for testing stepping. Run it to allow it to get
   // optimized.
   const int argc = 1;
@@ -3420,7 +3414,7 @@
                     "}"
                     "foo()";
   v8::Local<v8::Function> foo = CompileFunction(&env, src, "foo");
-  v8::Handle<v8::Value> result;
+  v8::Local<v8::Value> result;
   SetBreakPoint(foo, 8);  // "var a = 0;"
 
   // Each loop generates 5 steps except for the last (when break is executed)
@@ -3429,22 +3423,22 @@
   // Looping 10 times.
   step_action = StepIn;
   break_point_hit_count = 0;
-  v8::Handle<v8::Value> argv_10[argc] = { v8::Number::New(isolate, 10) };
-  result = foo->Call(env->Global(), argc, argv_10);
-  CHECK_EQ(9, result->Int32Value());
+  v8::Local<v8::Value> argv_10[argc] = {v8::Number::New(isolate, 10)};
+  result = foo->Call(context, env->Global(), argc, argv_10).ToLocalChecked();
+  CHECK_EQ(9, result->Int32Value(context).FromJust());
   CHECK_EQ(64, break_point_hit_count);
 
   // Looping 100 times.
   step_action = StepIn;
   break_point_hit_count = 0;
-  v8::Handle<v8::Value> argv_100[argc] = { v8::Number::New(isolate, 100) };
-  result = foo->Call(env->Global(), argc, argv_100);
-  CHECK_EQ(99, result->Int32Value());
+  v8::Local<v8::Value> argv_100[argc] = {v8::Number::New(isolate, 100)};
+  result = foo->Call(context, env->Global(), argc, argv_100).ToLocalChecked();
+  CHECK_EQ(99, result->Int32Value(context).FromJust());
   CHECK_EQ(604, break_point_hit_count);
 
   // Get rid of the debug event listener.
-  v8::Debug::SetDebugEventListener(NULL);
-  CheckDebuggerUnloaded();
+  v8::Debug::SetDebugEventListener(isolate, nullptr);
+  CheckDebuggerUnloaded(isolate);
 }
 
 
@@ -3453,8 +3447,9 @@
   v8::HandleScope scope(env->GetIsolate());
 
   // Register a debug event listener which steps and counts.
-  v8::Debug::SetDebugEventListener(DebugEventStep);
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventStep);
 
+  v8::Local<v8::Context> context = env.context();
   // Create a function for testing stepping. Run it to allow it to get
   // optimized.
   v8::Local<v8::Function> foo;
@@ -3470,7 +3465,7 @@
 
   step_action = StepIn;
   break_point_hit_count = 0;
-  foo->Call(env->Global(), 0, NULL);
+  foo->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(8, break_point_hit_count);
 
   // Create a function for testing stepping. Run it to allow it to get
@@ -3487,12 +3482,12 @@
 
   step_action = StepIn;
   break_point_hit_count = 0;
-  foo->Call(env->Global(), 0, NULL);
+  foo->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(10, break_point_hit_count);
 
   // Get rid of the debug event listener.
-  v8::Debug::SetDebugEventListener(NULL);
-  CheckDebuggerUnloaded();
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr);
+  CheckDebuggerUnloaded(env->GetIsolate());
 }
 
 
@@ -3501,8 +3496,9 @@
   v8::HandleScope scope(env->GetIsolate());
 
   // Register a debug event listener which steps and counts.
-  v8::Debug::SetDebugEventListener(DebugEventStep);
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventStep);
 
+  v8::Local<v8::Context> context = env.context();
   // Create a function for testing stepping. Run it to allow it to get
   // optimized.
   const char* src = "function foo(x) { "
@@ -3511,20 +3507,22 @@
                     "  with (b) {}"
                     "}"
                     "foo()";
-  env->Global()->Set(v8::String::NewFromUtf8(env->GetIsolate(), "b"),
-                     v8::Object::New(env->GetIsolate()));
+  CHECK(env->Global()
+            ->Set(context, v8_str(env->GetIsolate(), "b"),
+                  v8::Object::New(env->GetIsolate()))
+            .FromJust());
   v8::Local<v8::Function> foo = CompileFunction(&env, src, "foo");
-  v8::Handle<v8::Value> result;
+  v8::Local<v8::Value> result;
   SetBreakPoint(foo, 8);  // "var a = {};"
 
   step_action = StepIn;
   break_point_hit_count = 0;
-  foo->Call(env->Global(), 0, NULL);
+  foo->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(4, break_point_hit_count);
 
   // Get rid of the debug event listener.
-  v8::Debug::SetDebugEventListener(NULL);
-  CheckDebuggerUnloaded();
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr);
+  CheckDebuggerUnloaded(env->GetIsolate());
 }
 
 
@@ -3534,8 +3532,9 @@
   v8::HandleScope scope(isolate);
 
   // Register a debug event listener which steps and counts.
-  v8::Debug::SetDebugEventListener(DebugEventStep);
+  v8::Debug::SetDebugEventListener(isolate, DebugEventStep);
 
+  v8::Local<v8::Context> context = env.context();
   // Create a function for testing stepping. Run it to allow it to get
   // optimized.
   const char* src = "function foo(x) { "
@@ -3549,19 +3548,19 @@
 
   step_action = StepIn;
   break_point_hit_count = 0;
-  foo->Call(env->Global(), 0, NULL);
-  CHECK_EQ(5, break_point_hit_count);
+  foo->Call(context, env->Global(), 0, NULL).ToLocalChecked();
+  CHECK_EQ(4, break_point_hit_count);
 
   step_action = StepIn;
   break_point_hit_count = 0;
   const int argc = 1;
-  v8::Handle<v8::Value> argv_true[argc] = { v8::True(isolate) };
-  foo->Call(env->Global(), argc, argv_true);
-  CHECK_EQ(5, break_point_hit_count);
+  v8::Local<v8::Value> argv_true[argc] = {v8::True(isolate)};
+  foo->Call(context, env->Global(), argc, argv_true).ToLocalChecked();
+  CHECK_EQ(4, break_point_hit_count);
 
   // Get rid of the debug event listener.
-  v8::Debug::SetDebugEventListener(NULL);
-  CheckDebuggerUnloaded();
+  v8::Debug::SetDebugEventListener(isolate, nullptr);
+  CheckDebuggerUnloaded(isolate);
 }
 
 
@@ -3575,8 +3574,9 @@
                                         "frame_function_name");
 
   // Register a debug event listener which steps and counts.
-  v8::Debug::SetDebugEventListener(DebugEventStepSequence);
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventStepSequence);
 
+  v8::Local<v8::Context> context = env.context();
   // Create a function for testing stepping. Run it to allow it to get
   // optimized.
   const char* src = "function a() {b();c();}; "
@@ -3590,7 +3590,7 @@
   step_action = StepIn;
   break_point_hit_count = 0;
   expected_step_sequence = "abcbaca";
-  a->Call(env->Global(), 0, NULL);
+  a->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(StrLength(expected_step_sequence),
            break_point_hit_count);
 
@@ -3598,7 +3598,7 @@
   step_action = StepNext;
   break_point_hit_count = 0;
   expected_step_sequence = "aaa";
-  a->Call(env->Global(), 0, NULL);
+  a->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(StrLength(expected_step_sequence),
            break_point_hit_count);
 
@@ -3606,13 +3606,13 @@
   step_action = StepOut;
   break_point_hit_count = 0;
   expected_step_sequence = "a";
-  a->Call(env->Global(), 0, NULL);
+  a->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(StrLength(expected_step_sequence),
            break_point_hit_count);
 
   // Get rid of the debug event listener.
-  v8::Debug::SetDebugEventListener(NULL);
-  CheckDebuggerUnloaded();
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr);
+  CheckDebuggerUnloaded(env->GetIsolate());
 }
 
 
@@ -3626,8 +3626,9 @@
                                         "frame_function_name");
 
   // Register a debug event listener which steps and counts.
-  v8::Debug::SetDebugEventListener(DebugEventStepSequence);
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventStepSequence);
 
+  v8::Local<v8::Context> context = env.context();
   // Create a function for testing stepping. Run it to allow it to get
   // optimized.
   const char* src = "function a() {b(c(d()),d());c(d());d()}; "
@@ -3642,7 +3643,7 @@
   step_action = StepIn;
   break_point_hit_count = 0;
   expected_step_sequence = "adacadabcbadacada";
-  a->Call(env->Global(), 0, NULL);
+  a->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(StrLength(expected_step_sequence),
            break_point_hit_count);
 
@@ -3650,7 +3651,7 @@
   step_action = StepNext;
   break_point_hit_count = 0;
   expected_step_sequence = "aaaa";
-  a->Call(env->Global(), 0, NULL);
+  a->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(StrLength(expected_step_sequence),
            break_point_hit_count);
 
@@ -3658,13 +3659,13 @@
   step_action = StepOut;
   break_point_hit_count = 0;
   expected_step_sequence = "a";
-  a->Call(env->Global(), 0, NULL);
+  a->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(StrLength(expected_step_sequence),
            break_point_hit_count);
 
   // Get rid of the debug event listener.
-  v8::Debug::SetDebugEventListener(NULL);
-  CheckDebuggerUnloaded(true);
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr);
+  CheckDebuggerUnloaded(env->GetIsolate(), true);
 }
 
 
@@ -3678,8 +3679,9 @@
                                         "frame_function_name");
 
   // Register a debug event listener which steps and counts.
-  v8::Debug::SetDebugEventListener(DebugEventStepSequence);
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventStepSequence);
 
+  v8::Local<v8::Context> context = env.context();
   // Create a function for testing stepping. Run it to allow it to get
   // optimized.
   const char* src = "function a() {b(false);c();}; "
@@ -3693,13 +3695,13 @@
   step_action = StepIn;
   break_point_hit_count = 0;
   expected_step_sequence = "abbaca";
-  a->Call(env->Global(), 0, NULL);
+  a->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(StrLength(expected_step_sequence),
            break_point_hit_count);
 
   // Get rid of the debug event listener.
-  v8::Debug::SetDebugEventListener(NULL);
-  CheckDebuggerUnloaded();
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr);
+  CheckDebuggerUnloaded(env->GetIsolate());
 }
 
 
@@ -3715,29 +3717,31 @@
       "foo");
 
   // Register a debug event listener which steps and counts.
-  v8::Debug::SetDebugEventListener(DebugEventStep);
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventStep);
 
+  v8::Local<v8::Context> context = env.context();
   step_action = StepIn;
   break_point_hit_count = 0;
-  foo->Call(env->Global(), 0, NULL);
+  foo->Call(context, env->Global(), 0, NULL).ToLocalChecked();
 
   // With stepping all break locations are hit.
   CHECK_EQ(3, break_point_hit_count);
 
-  v8::Debug::SetDebugEventListener(NULL);
-  CheckDebuggerUnloaded();
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr);
+  CheckDebuggerUnloaded(env->GetIsolate());
 
   // Register a debug event listener which just counts.
-  v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount);
+  v8::Debug::SetDebugEventListener(env->GetIsolate(),
+                                   DebugEventBreakPointHitCount);
 
   break_point_hit_count = 0;
-  foo->Call(env->Global(), 0, NULL);
+  foo->Call(context, env->Global(), 0, NULL).ToLocalChecked();
 
   // Without stepping only active break points are hit.
   CHECK_EQ(1, break_point_hit_count);
 
-  v8::Debug::SetDebugEventListener(NULL);
-  CheckDebuggerUnloaded();
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr);
+  CheckDebuggerUnloaded(env->GetIsolate());
 }
 
 
@@ -3754,29 +3758,31 @@
       "foo");
 
   // Register a debug event listener which steps and counts.
-  v8::Debug::SetDebugEventListener(DebugEventStep);
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventStep);
 
+  v8::Local<v8::Context> context = env.context();
   step_action = StepIn;
   break_point_hit_count = 0;
-  foo->Call(env->Global(), 0, NULL);
+  foo->Call(context, env->Global(), 0, NULL).ToLocalChecked();
 
   // With stepping all break locations are hit.
   CHECK_EQ(7, break_point_hit_count);
 
-  v8::Debug::SetDebugEventListener(NULL);
-  CheckDebuggerUnloaded();
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr);
+  CheckDebuggerUnloaded(env->GetIsolate());
 
   // Register a debug event listener which just counts.
-  v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount);
+  v8::Debug::SetDebugEventListener(env->GetIsolate(),
+                                   DebugEventBreakPointHitCount);
 
   break_point_hit_count = 0;
-  foo->Call(env->Global(), 0, NULL);
+  foo->Call(context, env->Global(), 0, NULL).ToLocalChecked();
 
   // Without stepping only the debugger statement is hit.
   CHECK_EQ(1, break_point_hit_count);
 
-  v8::Debug::SetDebugEventListener(NULL);
-  CheckDebuggerUnloaded();
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr);
+  CheckDebuggerUnloaded(env->GetIsolate());
 }
 
 
@@ -3786,6 +3792,7 @@
   v8::Isolate* isolate = env->GetIsolate();
   v8::HandleScope scope(isolate);
 
+  v8::Local<v8::Context> context = env.context();
   // Create a function for testing stepping.
   v8::Local<v8::Function> foo = CompileFunction(
       &env,
@@ -3800,35 +3807,78 @@
       "foo");
 
   // Register a debug event listener which steps and counts.
-  v8::Debug::SetDebugEventListener(DebugEventStep);
+  v8::Debug::SetDebugEventListener(isolate, DebugEventStep);
   step_action = StepIn;
 
   // Check stepping where the if condition in bar is false.
   break_point_hit_count = 0;
-  foo->Call(env->Global(), 0, NULL);
+  foo->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(6, break_point_hit_count);
 
   // Check stepping where the if condition in bar is true.
   break_point_hit_count = 0;
   const int argc = 1;
-  v8::Handle<v8::Value> argv[argc] = { v8::True(isolate) };
-  foo->Call(env->Global(), argc, argv);
+  v8::Local<v8::Value> argv[argc] = {v8::True(isolate)};
+  foo->Call(context, env->Global(), argc, argv).ToLocalChecked();
   CHECK_EQ(8, break_point_hit_count);
 
-  v8::Debug::SetDebugEventListener(NULL);
-  CheckDebuggerUnloaded();
+  v8::Debug::SetDebugEventListener(isolate, nullptr);
+  CheckDebuggerUnloaded(isolate);
 
   // Register a debug event listener which just counts.
-  v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount);
+  v8::Debug::SetDebugEventListener(isolate, DebugEventBreakPointHitCount);
 
   break_point_hit_count = 0;
-  foo->Call(env->Global(), 0, NULL);
+  foo->Call(context, env->Global(), 0, NULL).ToLocalChecked();
 
   // Without stepping only the debugger statement is hit.
   CHECK_EQ(1, break_point_hit_count);
 
-  v8::Debug::SetDebugEventListener(NULL);
-  CheckDebuggerUnloaded();
+  v8::Debug::SetDebugEventListener(isolate, nullptr);
+  CheckDebuggerUnloaded(isolate);
+}
+
+
+// Test that step in works with Function.call.apply.
+TEST(DebugStepFunctionCallApply) {
+  DebugLocalContext env;
+  v8::Isolate* isolate = env->GetIsolate();
+  v8::HandleScope scope(isolate);
+
+  v8::Local<v8::Context> context = env.context();
+  // Create a function for testing stepping.
+  v8::Local<v8::Function> foo =
+      CompileFunction(&env,
+                      "function bar() { }"
+                      "function foo(){ debugger;"
+                      "                Function.call.apply(bar);"
+                      "                Function.call.apply(Function.call, "
+                      "[Function.call, bar]);"
+                      "}",
+                      "foo");
+
+  // Register a debug event listener which steps and counts.
+  v8::Debug::SetDebugEventListener(isolate, DebugEventStep);
+  step_action = StepIn;
+
+  break_point_hit_count = 0;
+  foo->Call(context, env->Global(), 0, NULL).ToLocalChecked();
+  CHECK_EQ(6, break_point_hit_count);
+
+  v8::Debug::SetDebugEventListener(isolate, nullptr);
+  CheckDebuggerUnloaded(isolate);
+
+  // Register a debug event listener which just counts.
+  v8::Debug::SetDebugEventListener(isolate, DebugEventBreakPointHitCount);
+
+  break_point_hit_count = 0;
+  foo->Call(context, env->Global(), 0, NULL).ToLocalChecked();
+
+  // Without stepping only the debugger statement is hit.
+  CHECK_EQ(1, break_point_hit_count);
+
+  v8::Debug::SetDebugEventListener(isolate, nullptr);
+  CheckDebuggerUnloaded(isolate);
 }
 
 
@@ -3839,8 +3889,9 @@
   env.ExposeDebug();
 
   // Register a debug event listener which counts.
-  v8::Debug::SetDebugEventListener(DebugEventCounter);
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventCounter);
 
+  v8::Local<v8::Context> context = env.context();
   // Create a script that returns a function.
   const char* src = "(function (evt) {})";
   const char* script_name = "StepInHandlerTest";
@@ -3849,19 +3900,26 @@
   SetScriptBreakPointByNameFromJS(env->GetIsolate(), script_name, 0, -1);
   break_point_hit_count = 0;
 
-  v8::ScriptOrigin origin(
-      v8::String::NewFromUtf8(env->GetIsolate(), script_name),
-      v8::Integer::New(env->GetIsolate(), 0));
-  v8::Handle<v8::Script> script = v8::Script::Compile(
-      v8::String::NewFromUtf8(env->GetIsolate(), src), &origin);
-  v8::Local<v8::Value> r = script->Run();
+  v8::ScriptOrigin origin(v8_str(env->GetIsolate(), script_name),
+                          v8::Integer::New(env->GetIsolate(), 0));
+  v8::Local<v8::Script> script =
+      v8::Script::Compile(context, v8_str(env->GetIsolate(), src), &origin)
+          .ToLocalChecked();
+  v8::Local<v8::Value> r = script->Run(context).ToLocalChecked();
 
   CHECK(r->IsFunction());
   CHECK_EQ(1, break_point_hit_count);
 
   // Get rid of the debug event listener.
-  v8::Debug::SetDebugEventListener(NULL);
-  CheckDebuggerUnloaded();
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr);
+  CheckDebuggerUnloaded(env->GetIsolate());
+}
+
+
+static void DebugEventCounterCheck(int caught, int uncaught, int message) {
+  CHECK_EQ(caught, exception_hit_count);
+  CHECK_EQ(uncaught, uncaught_exception_hit_count);
+  CHECK_EQ(message, message_callback_count);
 }
 
 
@@ -3876,6 +3934,7 @@
   v8::HandleScope scope(env->GetIsolate());
   env.ExposeDebug();
 
+  v8::Local<v8::Context> context = env.context();
   // Create functions for testing break on exception.
   CompileFunction(&env, "function throws(){throw 1;}", "throws");
   v8::Local<v8::Function> caught =
@@ -3884,129 +3943,168 @@
                       "caught");
   v8::Local<v8::Function> notCaught =
       CompileFunction(&env, "function notCaught(){throws();}", "notCaught");
+  v8::Local<v8::Function> notCaughtFinally = CompileFunction(
+      &env, "function notCaughtFinally(){try{throws();}finally{}}",
+      "notCaughtFinally");
+  // In this edge case, even though this finally does not propagate the
+  // exception, the debugger considers this uncaught, since we want to break
+  // at the first throw for the general case where finally implicitly rethrows.
+  v8::Local<v8::Function> edgeCaseFinally = CompileFunction(
+      &env, "function caughtFinally(){L:try{throws();}finally{break L;}}",
+      "caughtFinally");
 
-  v8::V8::AddMessageListener(MessageCallbackCount);
-  v8::Debug::SetDebugEventListener(DebugEventCounter);
+  env->GetIsolate()->AddMessageListener(MessageCallbackCount);
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventCounter);
 
   // Initial state should be no break on exceptions.
   DebugEventCounterClear();
   MessageCallbackCountClear();
-  caught->Call(env->Global(), 0, NULL);
-  CHECK_EQ(0, exception_hit_count);
-  CHECK_EQ(0, uncaught_exception_hit_count);
-  CHECK_EQ(0, message_callback_count);
-  notCaught->Call(env->Global(), 0, NULL);
-  CHECK_EQ(0, exception_hit_count);
-  CHECK_EQ(0, uncaught_exception_hit_count);
-  CHECK_EQ(1, message_callback_count);
+  caught->Call(context, env->Global(), 0, NULL).ToLocalChecked();
+  DebugEventCounterCheck(0, 0, 0);
+  CHECK(notCaught->Call(context, env->Global(), 0, NULL).IsEmpty());
+  DebugEventCounterCheck(0, 0, 1);
+  CHECK(notCaughtFinally->Call(context, env->Global(), 0, NULL).IsEmpty());
+  DebugEventCounterCheck(0, 0, 2);
+  edgeCaseFinally->Call(context, env->Global(), 0, NULL).ToLocalChecked();
+  DebugEventCounterCheck(0, 0, 2);
 
   // No break on exception
   DebugEventCounterClear();
   MessageCallbackCountClear();
   ChangeBreakOnException(false, false);
-  caught->Call(env->Global(), 0, NULL);
-  CHECK_EQ(0, exception_hit_count);
-  CHECK_EQ(0, uncaught_exception_hit_count);
-  CHECK_EQ(0, message_callback_count);
-  notCaught->Call(env->Global(), 0, NULL);
-  CHECK_EQ(0, exception_hit_count);
-  CHECK_EQ(0, uncaught_exception_hit_count);
-  CHECK_EQ(1, message_callback_count);
+  caught->Call(context, env->Global(), 0, NULL).ToLocalChecked();
+  DebugEventCounterCheck(0, 0, 0);
+  CHECK(notCaught->Call(context, env->Global(), 0, NULL).IsEmpty());
+  DebugEventCounterCheck(0, 0, 1);
+  CHECK(notCaughtFinally->Call(context, env->Global(), 0, NULL).IsEmpty());
+  DebugEventCounterCheck(0, 0, 2);
+  edgeCaseFinally->Call(context, env->Global(), 0, NULL).ToLocalChecked();
+  DebugEventCounterCheck(0, 0, 2);
 
   // Break on uncaught exception
   DebugEventCounterClear();
   MessageCallbackCountClear();
   ChangeBreakOnException(false, true);
-  caught->Call(env->Global(), 0, NULL);
-  CHECK_EQ(0, exception_hit_count);
-  CHECK_EQ(0, uncaught_exception_hit_count);
-  CHECK_EQ(0, message_callback_count);
-  notCaught->Call(env->Global(), 0, NULL);
-  CHECK_EQ(1, exception_hit_count);
-  CHECK_EQ(1, uncaught_exception_hit_count);
-  CHECK_EQ(1, message_callback_count);
+  caught->Call(context, env->Global(), 0, NULL).ToLocalChecked();
+  DebugEventCounterCheck(0, 0, 0);
+  CHECK(notCaught->Call(context, env->Global(), 0, NULL).IsEmpty());
+  DebugEventCounterCheck(1, 1, 1);
+  CHECK(notCaughtFinally->Call(context, env->Global(), 0, NULL).IsEmpty());
+  DebugEventCounterCheck(2, 2, 2);
+  edgeCaseFinally->Call(context, env->Global(), 0, NULL).ToLocalChecked();
+  DebugEventCounterCheck(3, 3, 2);
 
   // Break on exception and uncaught exception
   DebugEventCounterClear();
   MessageCallbackCountClear();
   ChangeBreakOnException(true, true);
-  caught->Call(env->Global(), 0, NULL);
-  CHECK_EQ(1, exception_hit_count);
-  CHECK_EQ(0, uncaught_exception_hit_count);
-  CHECK_EQ(0, message_callback_count);
-  notCaught->Call(env->Global(), 0, NULL);
-  CHECK_EQ(2, exception_hit_count);
-  CHECK_EQ(1, uncaught_exception_hit_count);
-  CHECK_EQ(1, message_callback_count);
+  caught->Call(context, env->Global(), 0, NULL).ToLocalChecked();
+  DebugEventCounterCheck(1, 0, 0);
+  CHECK(notCaught->Call(context, env->Global(), 0, NULL).IsEmpty());
+  DebugEventCounterCheck(2, 1, 1);
+  CHECK(notCaughtFinally->Call(context, env->Global(), 0, NULL).IsEmpty());
+  DebugEventCounterCheck(3, 2, 2);
+  edgeCaseFinally->Call(context, env->Global(), 0, NULL).ToLocalChecked();
+  DebugEventCounterCheck(4, 3, 2);
 
   // Break on exception
   DebugEventCounterClear();
   MessageCallbackCountClear();
   ChangeBreakOnException(true, false);
-  caught->Call(env->Global(), 0, NULL);
-  CHECK_EQ(1, exception_hit_count);
-  CHECK_EQ(0, uncaught_exception_hit_count);
-  CHECK_EQ(0, message_callback_count);
-  notCaught->Call(env->Global(), 0, NULL);
-  CHECK_EQ(2, exception_hit_count);
-  CHECK_EQ(1, uncaught_exception_hit_count);
-  CHECK_EQ(1, message_callback_count);
+  caught->Call(context, env->Global(), 0, NULL).ToLocalChecked();
+  DebugEventCounterCheck(1, 0, 0);
+  CHECK(notCaught->Call(context, env->Global(), 0, NULL).IsEmpty());
+  DebugEventCounterCheck(2, 1, 1);
+  CHECK(notCaughtFinally->Call(context, env->Global(), 0, NULL).IsEmpty());
+  DebugEventCounterCheck(3, 2, 2);
+  edgeCaseFinally->Call(context, env->Global(), 0, NULL).ToLocalChecked();
+  DebugEventCounterCheck(4, 3, 2);
 
   // No break on exception using JavaScript
   DebugEventCounterClear();
   MessageCallbackCountClear();
   ChangeBreakOnExceptionFromJS(env->GetIsolate(), false, false);
-  caught->Call(env->Global(), 0, NULL);
-  CHECK_EQ(0, exception_hit_count);
-  CHECK_EQ(0, uncaught_exception_hit_count);
-  CHECK_EQ(0, message_callback_count);
-  notCaught->Call(env->Global(), 0, NULL);
-  CHECK_EQ(0, exception_hit_count);
-  CHECK_EQ(0, uncaught_exception_hit_count);
-  CHECK_EQ(1, message_callback_count);
+  caught->Call(context, env->Global(), 0, NULL).ToLocalChecked();
+  DebugEventCounterCheck(0, 0, 0);
+  CHECK(notCaught->Call(context, env->Global(), 0, NULL).IsEmpty());
+  DebugEventCounterCheck(0, 0, 1);
+  CHECK(notCaughtFinally->Call(context, env->Global(), 0, NULL).IsEmpty());
+  DebugEventCounterCheck(0, 0, 2);
+  edgeCaseFinally->Call(context, env->Global(), 0, NULL).ToLocalChecked();
+  DebugEventCounterCheck(0, 0, 2);
 
   // Break on uncaught exception using JavaScript
   DebugEventCounterClear();
   MessageCallbackCountClear();
   ChangeBreakOnExceptionFromJS(env->GetIsolate(), false, true);
-  caught->Call(env->Global(), 0, NULL);
-  CHECK_EQ(0, exception_hit_count);
-  CHECK_EQ(0, uncaught_exception_hit_count);
-  CHECK_EQ(0, message_callback_count);
-  notCaught->Call(env->Global(), 0, NULL);
-  CHECK_EQ(1, exception_hit_count);
-  CHECK_EQ(1, uncaught_exception_hit_count);
-  CHECK_EQ(1, message_callback_count);
+  caught->Call(context, env->Global(), 0, NULL).ToLocalChecked();
+  DebugEventCounterCheck(0, 0, 0);
+  CHECK(notCaught->Call(context, env->Global(), 0, NULL).IsEmpty());
+  DebugEventCounterCheck(1, 1, 1);
+  CHECK(notCaughtFinally->Call(context, env->Global(), 0, NULL).IsEmpty());
+  DebugEventCounterCheck(2, 2, 2);
+  edgeCaseFinally->Call(context, env->Global(), 0, NULL).ToLocalChecked();
+  DebugEventCounterCheck(3, 3, 2);
 
   // Break on exception and uncaught exception using JavaScript
   DebugEventCounterClear();
   MessageCallbackCountClear();
   ChangeBreakOnExceptionFromJS(env->GetIsolate(), true, true);
-  caught->Call(env->Global(), 0, NULL);
-  CHECK_EQ(1, exception_hit_count);
-  CHECK_EQ(0, message_callback_count);
-  CHECK_EQ(0, uncaught_exception_hit_count);
-  notCaught->Call(env->Global(), 0, NULL);
-  CHECK_EQ(2, exception_hit_count);
-  CHECK_EQ(1, uncaught_exception_hit_count);
-  CHECK_EQ(1, message_callback_count);
+  caught->Call(context, env->Global(), 0, NULL).ToLocalChecked();
+  DebugEventCounterCheck(1, 0, 0);
+  CHECK(notCaught->Call(context, env->Global(), 0, NULL).IsEmpty());
+  DebugEventCounterCheck(2, 1, 1);
+  CHECK(notCaughtFinally->Call(context, env->Global(), 0, NULL).IsEmpty());
+  DebugEventCounterCheck(3, 2, 2);
+  edgeCaseFinally->Call(context, env->Global(), 0, NULL).ToLocalChecked();
+  DebugEventCounterCheck(4, 3, 2);
 
   // Break on exception using JavaScript
   DebugEventCounterClear();
   MessageCallbackCountClear();
   ChangeBreakOnExceptionFromJS(env->GetIsolate(), true, false);
-  caught->Call(env->Global(), 0, NULL);
-  CHECK_EQ(1, exception_hit_count);
-  CHECK_EQ(0, uncaught_exception_hit_count);
-  CHECK_EQ(0, message_callback_count);
-  notCaught->Call(env->Global(), 0, NULL);
-  CHECK_EQ(2, exception_hit_count);
-  CHECK_EQ(1, uncaught_exception_hit_count);
-  CHECK_EQ(1, message_callback_count);
+  caught->Call(context, env->Global(), 0, NULL).ToLocalChecked();
+  DebugEventCounterCheck(1, 0, 0);
+  CHECK(notCaught->Call(context, env->Global(), 0, NULL).IsEmpty());
+  DebugEventCounterCheck(2, 1, 1);
+  CHECK(notCaughtFinally->Call(context, env->Global(), 0, NULL).IsEmpty());
+  DebugEventCounterCheck(3, 2, 2);
+  edgeCaseFinally->Call(context, env->Global(), 0, NULL).ToLocalChecked();
+  DebugEventCounterCheck(4, 3, 2);
 
-  v8::Debug::SetDebugEventListener(NULL);
-  CheckDebuggerUnloaded();
-  v8::V8::RemoveMessageListeners(MessageCallbackCount);
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr);
+  CheckDebuggerUnloaded(env->GetIsolate());
+  env->GetIsolate()->RemoveMessageListeners(MessageCallbackCount);
+}
+
+
+static void try_finally_original_message(v8::Local<v8::Message> message,
+                                         v8::Local<v8::Value> data) {
+  v8::Local<v8::Context> context = CcTest::isolate()->GetCurrentContext();
+  CHECK_EQ(2, message->GetLineNumber(context).FromJust());
+  CHECK_EQ(2, message->GetStartColumn(context).FromJust());
+  message_callback_count++;
+}
+
+
+TEST(TryFinallyOriginalMessage) {
+  // Test that the debugger plays nicely with the pending message.
+  message_callback_count = 0;
+  DebugEventCounterClear();
+  DebugLocalContext env;
+  v8::Isolate* isolate = CcTest::isolate();
+  isolate->AddMessageListener(try_finally_original_message);
+  v8::Debug::SetDebugEventListener(isolate, DebugEventCounter);
+  ChangeBreakOnException(true, true);
+  v8::HandleScope scope(isolate);
+  CompileRun(
+      "try {\n"
+      "  throw 1;\n"
+      "} finally {\n"
+      "}\n");
+  DebugEventCounterCheck(1, 1, 1);
+  v8::Debug::SetDebugEventListener(isolate, nullptr);
+  isolate->RemoveMessageListeners(try_finally_original_message);
 }
 
 
@@ -4023,8 +4121,8 @@
   debug_event_listener_callback = noThrowJS;
   debug_event_listener_callback_result = 2;
 
-  v8::V8::AddMessageListener(MessageCallbackCount);
-  v8::Debug::SetDebugEventListener(DebugEventCounter);
+  env->GetIsolate()->AddMessageListener(MessageCallbackCount);
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventCounter);
   // Break on uncaught exception
   ChangeBreakOnException(false, true);
   DebugEventCounterClear();
@@ -4032,9 +4130,9 @@
 
   // ReThrow native error
   {
-    v8::TryCatch tryCatch;
-    env->GetIsolate()->ThrowException(v8::Exception::TypeError(
-        v8::String::NewFromUtf8(env->GetIsolate(), "Type error")));
+    v8::TryCatch tryCatch(env->GetIsolate());
+    env->GetIsolate()->ThrowException(
+        v8::Exception::TypeError(v8_str(env->GetIsolate(), "Type error")));
     CHECK(tryCatch.HasCaught());
     tryCatch.ReThrow();
   }
@@ -4054,14 +4152,15 @@
   DebugLocalContext env;
   v8::HandleScope scope(env->GetIsolate());
 
+  v8::Local<v8::Context> context = env.context();
   // For this test, we want to break on uncaught exceptions:
   ChangeBreakOnException(false, true);
 
   // Create a function for checking the function when hitting a break point.
   frame_count = CompileFunction(&env, frame_count_source, "frame_count");
 
-  v8::V8::AddMessageListener(MessageCallbackCount);
-  v8::Debug::SetDebugEventListener(DebugEventCounter);
+  env->GetIsolate()->AddMessageListener(MessageCallbackCount);
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventCounter);
 
   DebugEventCounterClear();
   MessageCallbackCountClear();
@@ -4073,30 +4172,36 @@
   CHECK_EQ(-1, last_js_stack_height);
 
   // Throws SyntaxError: Unexpected end of input
-  v8::Script::Compile(v8::String::NewFromUtf8(env->GetIsolate(), "+++"));
+  CHECK(
+      v8::Script::Compile(context, v8_str(env->GetIsolate(), "+++")).IsEmpty());
   CHECK_EQ(1, exception_hit_count);
   CHECK_EQ(1, uncaught_exception_hit_count);
   CHECK_EQ(1, message_callback_count);
   CHECK_EQ(0, last_js_stack_height);  // No JavaScript stack.
 
   // Throws SyntaxError: Unexpected identifier
-  v8::Script::Compile(v8::String::NewFromUtf8(env->GetIsolate(), "x x"));
+  CHECK(
+      v8::Script::Compile(context, v8_str(env->GetIsolate(), "x x")).IsEmpty());
   CHECK_EQ(2, exception_hit_count);
   CHECK_EQ(2, uncaught_exception_hit_count);
   CHECK_EQ(2, message_callback_count);
   CHECK_EQ(0, last_js_stack_height);  // No JavaScript stack.
 
   // Throws SyntaxError: Unexpected end of input
-  v8::Script::Compile(v8::String::NewFromUtf8(env->GetIsolate(), "eval('+++')"))
-      ->Run();
+  CHECK(v8::Script::Compile(context, v8_str(env->GetIsolate(), "eval('+++')"))
+            .ToLocalChecked()
+            ->Run(context)
+            .IsEmpty());
   CHECK_EQ(3, exception_hit_count);
   CHECK_EQ(3, uncaught_exception_hit_count);
   CHECK_EQ(3, message_callback_count);
   CHECK_EQ(1, last_js_stack_height);
 
   // Throws SyntaxError: Unexpected identifier
-  v8::Script::Compile(v8::String::NewFromUtf8(env->GetIsolate(), "eval('x x')"))
-      ->Run();
+  CHECK(v8::Script::Compile(context, v8_str(env->GetIsolate(), "eval('x x')"))
+            .ToLocalChecked()
+            ->Run(context)
+            .IsEmpty());
   CHECK_EQ(4, exception_hit_count);
   CHECK_EQ(4, uncaught_exception_hit_count);
   CHECK_EQ(4, message_callback_count);
@@ -4117,8 +4222,9 @@
                                         "frame_function_name");
 
   // Register a debug event listener which steps and counts.
-  v8::Debug::SetDebugEventListener(DebugEventStepSequence);
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventStepSequence);
 
+  v8::Local<v8::Context> context = env.context();
   // Create functions for testing stepping.
   const char* src = "function a() { n(); }; "
                     "function b() { c(); }; "
@@ -4130,32 +4236,36 @@
                     "function h() { x = 1; throw 1; }; ";
 
   // Step through invocation of a.
+  ClearStepping();
   v8::Local<v8::Function> a = CompileFunction(&env, src, "a");
   SetBreakPoint(a, 0);
   step_action = StepIn;
   break_point_hit_count = 0;
   expected_step_sequence = "aa";
-  a->Call(env->Global(), 0, NULL);
+  CHECK(a->Call(context, env->Global(), 0, NULL).IsEmpty());
   CHECK_EQ(StrLength(expected_step_sequence),
            break_point_hit_count);
 
   // Step through invocation of b + c.
+  ClearStepping();
   v8::Local<v8::Function> b = CompileFunction(&env, src, "b");
   SetBreakPoint(b, 0);
   step_action = StepIn;
   break_point_hit_count = 0;
   expected_step_sequence = "bcc";
-  b->Call(env->Global(), 0, NULL);
+  CHECK(b->Call(context, env->Global(), 0, NULL).IsEmpty());
   CHECK_EQ(StrLength(expected_step_sequence),
            break_point_hit_count);
+
   // Step through invocation of d + e.
+  ClearStepping();
   v8::Local<v8::Function> d = CompileFunction(&env, src, "d");
   SetBreakPoint(d, 0);
   ChangeBreakOnException(false, true);
   step_action = StepIn;
   break_point_hit_count = 0;
   expected_step_sequence = "ddedd";
-  d->Call(env->Global(), 0, NULL);
+  d->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(StrLength(expected_step_sequence),
            break_point_hit_count);
 
@@ -4164,18 +4274,19 @@
   step_action = StepIn;
   break_point_hit_count = 0;
   expected_step_sequence = "ddeedd";
-  d->Call(env->Global(), 0, NULL);
+  d->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(StrLength(expected_step_sequence),
            break_point_hit_count);
 
   // Step through invocation of f + g + h.
+  ClearStepping();
   v8::Local<v8::Function> f = CompileFunction(&env, src, "f");
   SetBreakPoint(f, 0);
   ChangeBreakOnException(false, true);
   step_action = StepIn;
   break_point_hit_count = 0;
   expected_step_sequence = "ffghhff";
-  f->Call(env->Global(), 0, NULL);
+  f->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(StrLength(expected_step_sequence),
            break_point_hit_count);
 
@@ -4184,13 +4295,13 @@
   step_action = StepIn;
   break_point_hit_count = 0;
   expected_step_sequence = "ffghhhff";
-  f->Call(env->Global(), 0, NULL);
+  f->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(StrLength(expected_step_sequence),
            break_point_hit_count);
 
   // Get rid of the debug event listener.
-  v8::Debug::SetDebugEventListener(NULL);
-  CheckDebuggerUnloaded();
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr);
+  CheckDebuggerUnloaded(env->GetIsolate());
 }
 
 
@@ -4204,8 +4315,9 @@
   v8::HandleScope scope(isolate);
 
   // Register a debug event listener which sets the break flag and counts.
-  v8::Debug::SetDebugEventListener(DebugEventBreak);
+  v8::Debug::SetDebugEventListener(isolate, DebugEventBreak);
 
+  v8::Local<v8::Context> context = env.context();
   // Create a function for testing stepping.
   const char* src = "function f0() {}"
                     "function f1(x1) {}"
@@ -4217,16 +4329,15 @@
   v8::Local<v8::Function> f3 = CompileFunction(&env, src, "f3");
 
   // Call the function to make sure it is compiled.
-  v8::Handle<v8::Value> argv[] = { v8::Number::New(isolate, 1),
-                                   v8::Number::New(isolate, 1),
-                                   v8::Number::New(isolate, 1),
-                                   v8::Number::New(isolate, 1) };
+  v8::Local<v8::Value> argv[] = {
+      v8::Number::New(isolate, 1), v8::Number::New(isolate, 1),
+      v8::Number::New(isolate, 1), v8::Number::New(isolate, 1)};
 
   // Call all functions to make sure that they are compiled.
-  f0->Call(env->Global(), 0, NULL);
-  f1->Call(env->Global(), 0, NULL);
-  f2->Call(env->Global(), 0, NULL);
-  f3->Call(env->Global(), 0, NULL);
+  f0->Call(context, env->Global(), 0, NULL).ToLocalChecked();
+  f1->Call(context, env->Global(), 0, NULL).ToLocalChecked();
+  f2->Call(context, env->Global(), 0, NULL).ToLocalChecked();
+  f3->Call(context, env->Global(), 0, NULL).ToLocalChecked();
 
   // Set the debug break flag.
   v8::Debug::DebugBreak(env->GetIsolate());
@@ -4235,18 +4346,18 @@
   // Call all functions with different argument count.
   break_point_hit_count = 0;
   for (unsigned int i = 0; i < arraysize(argv); i++) {
-    f0->Call(env->Global(), i, argv);
-    f1->Call(env->Global(), i, argv);
-    f2->Call(env->Global(), i, argv);
-    f3->Call(env->Global(), i, argv);
+    f0->Call(context, env->Global(), i, argv).ToLocalChecked();
+    f1->Call(context, env->Global(), i, argv).ToLocalChecked();
+    f2->Call(context, env->Global(), i, argv).ToLocalChecked();
+    f3->Call(context, env->Global(), i, argv).ToLocalChecked();
   }
 
   // One break for each function called.
-  CHECK_EQ(4 * arraysize(argv), break_point_hit_count);
+  CHECK(4 * arraysize(argv) == break_point_hit_count);
 
   // Get rid of the debug event listener.
-  v8::Debug::SetDebugEventListener(NULL);
-  CheckDebuggerUnloaded();
+  v8::Debug::SetDebugEventListener(isolate, nullptr);
+  CheckDebuggerUnloaded(isolate);
 }
 
 
@@ -4257,8 +4368,9 @@
   v8::HandleScope scope(env->GetIsolate());
 
   // Register a debug event listener which sets the break flag and counts.
-  v8::Debug::SetDebugEventListener(DebugEventCounter);
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventCounter);
 
+  v8::Local<v8::Context> context = env.context();
   // Create a function for testing stepping.
   const char* src = "function f() {g()};function g(){i=0; while(i<10){i++}}";
   v8::Local<v8::Function> f = CompileFunction(&env, src, "f");
@@ -4274,23 +4386,40 @@
 
   // Call all functions with different argument count.
   break_point_hit_count = 0;
-  f->Call(env->Global(), 0, NULL);
+  f->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(1, break_point_hit_count);
 
   {
     v8::Debug::DebugBreak(env->GetIsolate());
     i::Isolate* isolate = reinterpret_cast<i::Isolate*>(env->GetIsolate());
     v8::internal::DisableBreak disable_break(isolate->debug(), true);
-    f->Call(env->Global(), 0, NULL);
+    f->Call(context, env->Global(), 0, NULL).ToLocalChecked();
     CHECK_EQ(1, break_point_hit_count);
   }
 
-  f->Call(env->Global(), 0, NULL);
+  f->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(2, break_point_hit_count);
 
   // Get rid of the debug event listener.
-  v8::Debug::SetDebugEventListener(NULL);
-  CheckDebuggerUnloaded();
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr);
+  CheckDebuggerUnloaded(env->GetIsolate());
+}
+
+
+TEST(DisableDebuggerStatement) {
+  DebugLocalContext env;
+  v8::HandleScope scope(env->GetIsolate());
+
+  // Register a debug event listener which sets the break flag and counts.
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventCounter);
+  CompileRun("debugger;");
+  CHECK_EQ(1, break_point_hit_count);
+
+  // Check that we ignore debugger statement when breakpoints aren't active.
+  i::Isolate* isolate = reinterpret_cast<i::Isolate*>(env->GetIsolate());
+  isolate->debug()->set_break_points_active(false);
+  CompileRun("debugger;");
+  CHECK_EQ(1, break_point_hit_count);
 }
 
 static const char* kSimpleExtensionSource =
@@ -4305,7 +4434,7 @@
   v8::HandleScope scope(isolate);
 
   // Register a debug event listener which sets the break flag and counts.
-  v8::Debug::SetDebugEventListener(DebugEventCounter);
+  v8::Debug::SetDebugEventListener(isolate, DebugEventCounter);
 
   // Set the debug break flag.
   v8::Debug::DebugBreak(isolate);
@@ -4324,28 +4453,37 @@
   CHECK_EQ(0, break_point_hit_count);
 
   // Get rid of the debug event listener.
-  v8::Debug::SetDebugEventListener(NULL);
-  CheckDebuggerUnloaded();
+  v8::Debug::SetDebugEventListener(isolate, nullptr);
+  CheckDebuggerUnloaded(isolate);
 }
 
 
 static void NamedEnum(const v8::PropertyCallbackInfo<v8::Array>& info) {
-  v8::Handle<v8::Array> result = v8::Array::New(info.GetIsolate(), 3);
-  result->Set(v8::Integer::New(info.GetIsolate(), 0),
-              v8::String::NewFromUtf8(info.GetIsolate(), "a"));
-  result->Set(v8::Integer::New(info.GetIsolate(), 1),
-              v8::String::NewFromUtf8(info.GetIsolate(), "b"));
-  result->Set(v8::Integer::New(info.GetIsolate(), 2),
-              v8::String::NewFromUtf8(info.GetIsolate(), "c"));
+  v8::Local<v8::Array> result = v8::Array::New(info.GetIsolate(), 3);
+  v8::Local<v8::Context> context = info.GetIsolate()->GetCurrentContext();
+  CHECK(result->Set(context, v8::Integer::New(info.GetIsolate(), 0),
+                    v8_str(info.GetIsolate(), "a"))
+            .FromJust());
+  CHECK(result->Set(context, v8::Integer::New(info.GetIsolate(), 1),
+                    v8_str(info.GetIsolate(), "b"))
+            .FromJust());
+  CHECK(result->Set(context, v8::Integer::New(info.GetIsolate(), 2),
+                    v8_str(info.GetIsolate(), "c"))
+            .FromJust());
   info.GetReturnValue().Set(result);
 }
 
 
 static void IndexedEnum(const v8::PropertyCallbackInfo<v8::Array>& info) {
   v8::Isolate* isolate = info.GetIsolate();
-  v8::Handle<v8::Array> result = v8::Array::New(isolate, 2);
-  result->Set(v8::Integer::New(isolate, 0), v8::Number::New(isolate, 1));
-  result->Set(v8::Integer::New(isolate, 1), v8::Number::New(isolate, 10));
+  v8::Local<v8::Array> result = v8::Array::New(isolate, 2);
+  v8::Local<v8::Context> context = info.GetIsolate()->GetCurrentContext();
+  CHECK(result->Set(context, v8::Integer::New(isolate, 0),
+                    v8::Number::New(isolate, 1))
+            .FromJust());
+  CHECK(result->Set(context, v8::Integer::New(isolate, 1),
+                    v8::Number::New(isolate, 10))
+            .FromJust());
   info.GetReturnValue().Set(result);
 }
 
@@ -4355,13 +4493,13 @@
   if (name->IsSymbol()) return;
   v8::String::Utf8Value n(v8::Local<v8::String>::Cast(name));
   if (strcmp(*n, "a") == 0) {
-    info.GetReturnValue().Set(v8::String::NewFromUtf8(info.GetIsolate(), "AA"));
+    info.GetReturnValue().Set(v8_str(info.GetIsolate(), "AA"));
     return;
   } else if (strcmp(*n, "b") == 0) {
-    info.GetReturnValue().Set(v8::String::NewFromUtf8(info.GetIsolate(), "BB"));
+    info.GetReturnValue().Set(v8_str(info.GetIsolate(), "BB"));
     return;
   } else if (strcmp(*n, "c") == 0) {
-    info.GetReturnValue().Set(v8::String::NewFromUtf8(info.GetIsolate(), "CC"));
+    info.GetReturnValue().Set(v8_str(info.GetIsolate(), "CC"));
     return;
   } else {
     info.GetReturnValue().SetUndefined();
@@ -4384,75 +4522,71 @@
   v8::HandleScope scope(isolate);
   env.ExposeDebug();
 
+  v8::Local<v8::Context> context = env.context();
   // Create object with named interceptor.
-  v8::Handle<v8::ObjectTemplate> named = v8::ObjectTemplate::New(isolate);
+  v8::Local<v8::ObjectTemplate> named = v8::ObjectTemplate::New(isolate);
   named->SetHandler(v8::NamedPropertyHandlerConfiguration(
       NamedGetter, NULL, NULL, NULL, NamedEnum));
-  env->Global()->Set(
-      v8::String::NewFromUtf8(isolate, "intercepted_named"),
-      named->NewInstance());
+  CHECK(env->Global()
+            ->Set(context, v8_str(isolate, "intercepted_named"),
+                  named->NewInstance(context).ToLocalChecked())
+            .FromJust());
 
   // Create object with indexed interceptor.
-  v8::Handle<v8::ObjectTemplate> indexed = v8::ObjectTemplate::New(isolate);
+  v8::Local<v8::ObjectTemplate> indexed = v8::ObjectTemplate::New(isolate);
   indexed->SetHandler(v8::IndexedPropertyHandlerConfiguration(
       IndexedGetter, NULL, NULL, NULL, IndexedEnum));
-  env->Global()->Set(
-      v8::String::NewFromUtf8(isolate, "intercepted_indexed"),
-      indexed->NewInstance());
+  CHECK(env->Global()
+            ->Set(context, v8_str(isolate, "intercepted_indexed"),
+                  indexed->NewInstance(context).ToLocalChecked())
+            .FromJust());
 
   // Create object with both named and indexed interceptor.
-  v8::Handle<v8::ObjectTemplate> both = v8::ObjectTemplate::New(isolate);
+  v8::Local<v8::ObjectTemplate> both = v8::ObjectTemplate::New(isolate);
   both->SetHandler(v8::NamedPropertyHandlerConfiguration(
       NamedGetter, NULL, NULL, NULL, NamedEnum));
   both->SetHandler(v8::IndexedPropertyHandlerConfiguration(
       IndexedGetter, NULL, NULL, NULL, IndexedEnum));
-  env->Global()->Set(
-      v8::String::NewFromUtf8(isolate, "intercepted_both"),
-      both->NewInstance());
+  CHECK(env->Global()
+            ->Set(context, v8_str(isolate, "intercepted_both"),
+                  both->NewInstance(context).ToLocalChecked())
+            .FromJust());
 
   // Get mirrors for the three objects with interceptor.
   CompileRun(
       "var named_mirror = debug.MakeMirror(intercepted_named);"
       "var indexed_mirror = debug.MakeMirror(intercepted_indexed);"
       "var both_mirror = debug.MakeMirror(intercepted_both)");
-  CHECK(CompileRun(
-       "named_mirror instanceof debug.ObjectMirror")->BooleanValue());
-  CHECK(CompileRun(
-        "indexed_mirror instanceof debug.ObjectMirror")->BooleanValue());
-  CHECK(CompileRun(
-        "both_mirror instanceof debug.ObjectMirror")->BooleanValue());
+  CHECK(CompileRun("named_mirror instanceof debug.ObjectMirror")
+            ->BooleanValue(context)
+            .FromJust());
+  CHECK(CompileRun("indexed_mirror instanceof debug.ObjectMirror")
+            ->BooleanValue(context)
+            .FromJust());
+  CHECK(CompileRun("both_mirror instanceof debug.ObjectMirror")
+            ->BooleanValue(context)
+            .FromJust());
 
   // Get the property names from the interceptors
   CompileRun(
       "named_names = named_mirror.propertyNames();"
       "indexed_names = indexed_mirror.propertyNames();"
       "both_names = both_mirror.propertyNames()");
-  CHECK_EQ(3, CompileRun("named_names.length")->Int32Value());
-  CHECK_EQ(2, CompileRun("indexed_names.length")->Int32Value());
-  CHECK_EQ(5, CompileRun("both_names.length")->Int32Value());
+  CHECK_EQ(3, CompileRun("named_names.length")->Int32Value(context).FromJust());
+  CHECK_EQ(2,
+           CompileRun("indexed_names.length")->Int32Value(context).FromJust());
+  CHECK_EQ(5, CompileRun("both_names.length")->Int32Value(context).FromJust());
 
   // Check the expected number of properties.
   const char* source;
   source = "named_mirror.properties().length";
-  CHECK_EQ(3, CompileRun(source)->Int32Value());
+  CHECK_EQ(3, CompileRun(source)->Int32Value(context).FromJust());
 
   source = "indexed_mirror.properties().length";
-  CHECK_EQ(2, CompileRun(source)->Int32Value());
+  CHECK_EQ(2, CompileRun(source)->Int32Value(context).FromJust());
 
   source = "both_mirror.properties().length";
-  CHECK_EQ(5, CompileRun(source)->Int32Value());
-
-  // 1 is PropertyKind.Named;
-  source = "both_mirror.properties(1).length";
-  CHECK_EQ(3, CompileRun(source)->Int32Value());
-
-  // 2 is PropertyKind.Indexed;
-  source = "both_mirror.properties(2).length";
-  CHECK_EQ(2, CompileRun(source)->Int32Value());
-
-  // 3 is PropertyKind.Named  | PropertyKind.Indexed;
-  source = "both_mirror.properties(3).length";
-  CHECK_EQ(5, CompileRun(source)->Int32Value());
+  CHECK_EQ(5, CompileRun(source)->Int32Value(context).FromJust());
 
   // Get the interceptor properties for the object with only named interceptor.
   CompileRun("var named_values = named_mirror.properties()");
@@ -4462,10 +4596,10 @@
     EmbeddedVector<char, SMALL_STRING_BUFFER_SIZE> buffer;
     SNPrintF(buffer,
              "named_values[%d] instanceof debug.PropertyMirror", i);
-    CHECK(CompileRun(buffer.start())->BooleanValue());
+    CHECK(CompileRun(buffer.start())->BooleanValue(context).FromJust());
 
     SNPrintF(buffer, "named_values[%d].isNative()", i);
-    CHECK(CompileRun(buffer.start())->BooleanValue());
+    CHECK(CompileRun(buffer.start())->BooleanValue(context).FromJust());
   }
 
   // Get the interceptor properties for the object with only indexed
@@ -4477,7 +4611,7 @@
     EmbeddedVector<char, SMALL_STRING_BUFFER_SIZE> buffer;
     SNPrintF(buffer,
              "indexed_values[%d] instanceof debug.PropertyMirror", i);
-    CHECK(CompileRun(buffer.start())->BooleanValue());
+    CHECK(CompileRun(buffer.start())->BooleanValue(context).FromJust());
   }
 
   // Get the interceptor properties for the object with both types of
@@ -4488,24 +4622,24 @@
   for (int i = 0; i < 5; i++) {
     EmbeddedVector<char, SMALL_STRING_BUFFER_SIZE> buffer;
     SNPrintF(buffer, "both_values[%d] instanceof debug.PropertyMirror", i);
-    CHECK(CompileRun(buffer.start())->BooleanValue());
+    CHECK(CompileRun(buffer.start())->BooleanValue(context).FromJust());
   }
 
   // Check the property names.
-  source = "both_values[0].name() == 'a'";
-  CHECK(CompileRun(source)->BooleanValue());
+  source = "both_values[0].name() == '1'";
+  CHECK(CompileRun(source)->BooleanValue(context).FromJust());
 
-  source = "both_values[1].name() == 'b'";
-  CHECK(CompileRun(source)->BooleanValue());
+  source = "both_values[1].name() == '10'";
+  CHECK(CompileRun(source)->BooleanValue(context).FromJust());
 
-  source = "both_values[2].name() == 'c'";
-  CHECK(CompileRun(source)->BooleanValue());
+  source = "both_values[2].name() == 'a'";
+  CHECK(CompileRun(source)->BooleanValue(context).FromJust());
 
-  source = "both_values[3].name() == 1";
-  CHECK(CompileRun(source)->BooleanValue());
+  source = "both_values[3].name() == 'b'";
+  CHECK(CompileRun(source)->BooleanValue(context).FromJust());
 
-  source = "both_values[4].name() == 10";
-  CHECK(CompileRun(source)->BooleanValue());
+  source = "both_values[4].name() == 'c'";
+  CHECK(CompileRun(source)->BooleanValue(context).FromJust());
 }
 
 
@@ -4516,30 +4650,43 @@
   v8::HandleScope scope(isolate);
   env.ExposeDebug();
 
-  v8::Handle<v8::FunctionTemplate> t0 = v8::FunctionTemplate::New(isolate);
-  t0->InstanceTemplate()->Set(v8::String::NewFromUtf8(isolate, "x"),
+  v8::Local<v8::FunctionTemplate> t0 = v8::FunctionTemplate::New(isolate);
+  t0->InstanceTemplate()->Set(v8_str(isolate, "x"),
                               v8::Number::New(isolate, 0));
-  v8::Handle<v8::FunctionTemplate> t1 = v8::FunctionTemplate::New(isolate);
+  v8::Local<v8::FunctionTemplate> t1 = v8::FunctionTemplate::New(isolate);
   t1->SetHiddenPrototype(true);
-  t1->InstanceTemplate()->Set(v8::String::NewFromUtf8(isolate, "y"),
+  t1->InstanceTemplate()->Set(v8_str(isolate, "y"),
                               v8::Number::New(isolate, 1));
-  v8::Handle<v8::FunctionTemplate> t2 = v8::FunctionTemplate::New(isolate);
+  v8::Local<v8::FunctionTemplate> t2 = v8::FunctionTemplate::New(isolate);
   t2->SetHiddenPrototype(true);
-  t2->InstanceTemplate()->Set(v8::String::NewFromUtf8(isolate, "z"),
+  t2->InstanceTemplate()->Set(v8_str(isolate, "z"),
                               v8::Number::New(isolate, 2));
-  v8::Handle<v8::FunctionTemplate> t3 = v8::FunctionTemplate::New(isolate);
-  t3->InstanceTemplate()->Set(v8::String::NewFromUtf8(isolate, "u"),
+  v8::Local<v8::FunctionTemplate> t3 = v8::FunctionTemplate::New(isolate);
+  t3->InstanceTemplate()->Set(v8_str(isolate, "u"),
                               v8::Number::New(isolate, 3));
 
+  v8::Local<v8::Context> context = env.context();
   // Create object and set them on the global object.
-  v8::Handle<v8::Object> o0 = t0->GetFunction()->NewInstance();
-  env->Global()->Set(v8::String::NewFromUtf8(isolate, "o0"), o0);
-  v8::Handle<v8::Object> o1 = t1->GetFunction()->NewInstance();
-  env->Global()->Set(v8::String::NewFromUtf8(isolate, "o1"), o1);
-  v8::Handle<v8::Object> o2 = t2->GetFunction()->NewInstance();
-  env->Global()->Set(v8::String::NewFromUtf8(isolate, "o2"), o2);
-  v8::Handle<v8::Object> o3 = t3->GetFunction()->NewInstance();
-  env->Global()->Set(v8::String::NewFromUtf8(isolate, "o3"), o3);
+  v8::Local<v8::Object> o0 = t0->GetFunction(context)
+                                 .ToLocalChecked()
+                                 ->NewInstance(context)
+                                 .ToLocalChecked();
+  CHECK(env->Global()->Set(context, v8_str(isolate, "o0"), o0).FromJust());
+  v8::Local<v8::Object> o1 = t1->GetFunction(context)
+                                 .ToLocalChecked()
+                                 ->NewInstance(context)
+                                 .ToLocalChecked();
+  CHECK(env->Global()->Set(context, v8_str(isolate, "o1"), o1).FromJust());
+  v8::Local<v8::Object> o2 = t2->GetFunction(context)
+                                 .ToLocalChecked()
+                                 ->NewInstance(context)
+                                 .ToLocalChecked();
+  CHECK(env->Global()->Set(context, v8_str(isolate, "o2"), o2).FromJust());
+  v8::Local<v8::Object> o3 = t3->GetFunction(context)
+                                 .ToLocalChecked()
+                                 ->NewInstance(context)
+                                 .ToLocalChecked();
+  CHECK(env->Global()->Set(context, v8_str(isolate, "o3"), o3).FromJust());
 
   // Get mirrors for the four objects.
   CompileRun(
@@ -4547,43 +4694,62 @@
       "var o1_mirror = debug.MakeMirror(o1);"
       "var o2_mirror = debug.MakeMirror(o2);"
       "var o3_mirror = debug.MakeMirror(o3)");
-  CHECK(CompileRun("o0_mirror instanceof debug.ObjectMirror")->BooleanValue());
-  CHECK(CompileRun("o1_mirror instanceof debug.ObjectMirror")->BooleanValue());
-  CHECK(CompileRun("o2_mirror instanceof debug.ObjectMirror")->BooleanValue());
-  CHECK(CompileRun("o3_mirror instanceof debug.ObjectMirror")->BooleanValue());
+  CHECK(CompileRun("o0_mirror instanceof debug.ObjectMirror")
+            ->BooleanValue(context)
+            .FromJust());
+  CHECK(CompileRun("o1_mirror instanceof debug.ObjectMirror")
+            ->BooleanValue(context)
+            .FromJust());
+  CHECK(CompileRun("o2_mirror instanceof debug.ObjectMirror")
+            ->BooleanValue(context)
+            .FromJust());
+  CHECK(CompileRun("o3_mirror instanceof debug.ObjectMirror")
+            ->BooleanValue(context)
+            .FromJust());
 
   // Check that each object has one property.
-  CHECK_EQ(1, CompileRun(
-              "o0_mirror.propertyNames().length")->Int32Value());
-  CHECK_EQ(1, CompileRun(
-              "o1_mirror.propertyNames().length")->Int32Value());
-  CHECK_EQ(1, CompileRun(
-              "o2_mirror.propertyNames().length")->Int32Value());
-  CHECK_EQ(1, CompileRun(
-              "o3_mirror.propertyNames().length")->Int32Value());
+  CHECK_EQ(1, CompileRun("o0_mirror.propertyNames().length")
+                  ->Int32Value(context)
+                  .FromJust());
+  CHECK_EQ(1, CompileRun("o1_mirror.propertyNames().length")
+                  ->Int32Value(context)
+                  .FromJust());
+  CHECK_EQ(1, CompileRun("o2_mirror.propertyNames().length")
+                  ->Int32Value(context)
+                  .FromJust());
+  CHECK_EQ(1, CompileRun("o3_mirror.propertyNames().length")
+                  ->Int32Value(context)
+                  .FromJust());
 
   // Set o1 as prototype for o0. o1 has the hidden prototype flag so all
   // properties on o1 should be seen on o0.
-  o0->Set(v8::String::NewFromUtf8(isolate, "__proto__"), o1);
-  CHECK_EQ(2, CompileRun(
-              "o0_mirror.propertyNames().length")->Int32Value());
-  CHECK_EQ(0, CompileRun(
-              "o0_mirror.property('x').value().value()")->Int32Value());
-  CHECK_EQ(1, CompileRun(
-              "o0_mirror.property('y').value().value()")->Int32Value());
+  CHECK(o0->Set(context, v8_str(isolate, "__proto__"), o1).FromJust());
+  CHECK_EQ(2, CompileRun("o0_mirror.propertyNames().length")
+                  ->Int32Value(context)
+                  .FromJust());
+  CHECK_EQ(0, CompileRun("o0_mirror.property('x').value().value()")
+                  ->Int32Value(context)
+                  .FromJust());
+  CHECK_EQ(1, CompileRun("o0_mirror.property('y').value().value()")
+                  ->Int32Value(context)
+                  .FromJust());
 
   // Set o2 as prototype for o0 (it will end up after o1 as o1 has the hidden
   // prototype flag. o2 also has the hidden prototype flag so all properties
   // on o2 should be seen on o0 as well as properties on o1.
-  o0->Set(v8::String::NewFromUtf8(isolate, "__proto__"), o2);
-  CHECK_EQ(3, CompileRun(
-              "o0_mirror.propertyNames().length")->Int32Value());
-  CHECK_EQ(0, CompileRun(
-              "o0_mirror.property('x').value().value()")->Int32Value());
-  CHECK_EQ(1, CompileRun(
-              "o0_mirror.property('y').value().value()")->Int32Value());
-  CHECK_EQ(2, CompileRun(
-              "o0_mirror.property('z').value().value()")->Int32Value());
+  CHECK(o0->Set(context, v8_str(isolate, "__proto__"), o2).FromJust());
+  CHECK_EQ(3, CompileRun("o0_mirror.propertyNames().length")
+                  ->Int32Value(context)
+                  .FromJust());
+  CHECK_EQ(0, CompileRun("o0_mirror.property('x').value().value()")
+                  ->Int32Value(context)
+                  .FromJust());
+  CHECK_EQ(1, CompileRun("o0_mirror.property('y').value().value()")
+                  ->Int32Value(context)
+                  .FromJust());
+  CHECK_EQ(2, CompileRun("o0_mirror.property('z').value().value()")
+                  ->Int32Value(context)
+                  .FromJust());
 
   // Set o3 as prototype for o0 (it will end up after o1 and o2 as both o1 and
   // o2 has the hidden prototype flag. o3 does not have the hidden prototype
@@ -4591,21 +4757,30 @@
   // from o1 and o2 should still be seen on o0.
   // Final prototype chain: o0 -> o1 -> o2 -> o3
   // Hidden prototypes:           ^^    ^^
-  o0->Set(v8::String::NewFromUtf8(isolate, "__proto__"), o3);
-  CHECK_EQ(3, CompileRun(
-              "o0_mirror.propertyNames().length")->Int32Value());
-  CHECK_EQ(1, CompileRun(
-              "o3_mirror.propertyNames().length")->Int32Value());
-  CHECK_EQ(0, CompileRun(
-              "o0_mirror.property('x').value().value()")->Int32Value());
-  CHECK_EQ(1, CompileRun(
-              "o0_mirror.property('y').value().value()")->Int32Value());
-  CHECK_EQ(2, CompileRun(
-              "o0_mirror.property('z').value().value()")->Int32Value());
-  CHECK(CompileRun("o0_mirror.property('u').isUndefined()")->BooleanValue());
+  CHECK(o0->Set(context, v8_str(isolate, "__proto__"), o3).FromJust());
+  CHECK_EQ(3, CompileRun("o0_mirror.propertyNames().length")
+                  ->Int32Value(context)
+                  .FromJust());
+  CHECK_EQ(1, CompileRun("o3_mirror.propertyNames().length")
+                  ->Int32Value(context)
+                  .FromJust());
+  CHECK_EQ(0, CompileRun("o0_mirror.property('x').value().value()")
+                  ->Int32Value(context)
+                  .FromJust());
+  CHECK_EQ(1, CompileRun("o0_mirror.property('y').value().value()")
+                  ->Int32Value(context)
+                  .FromJust());
+  CHECK_EQ(2, CompileRun("o0_mirror.property('z').value().value()")
+                  ->Int32Value(context)
+                  .FromJust());
+  CHECK(CompileRun("o0_mirror.property('u').isUndefined()")
+            ->BooleanValue(context)
+            .FromJust());
 
   // The prototype (__proto__) for o0 should be o3 as o1 and o2 are hidden.
-  CHECK(CompileRun("o0_mirror.protoObject() == o3_mirror")->BooleanValue());
+  CHECK(CompileRun("o0_mirror.protoObject() == o3_mirror")
+            ->BooleanValue(context)
+            .FromJust());
 }
 
 
@@ -4623,29 +4798,35 @@
   v8::HandleScope scope(isolate);
   env.ExposeDebug();
 
-  v8::Handle<v8::String> name = v8::String::NewFromUtf8(isolate, "x");
+  v8::Local<v8::Context> context = env.context();
+  v8::Local<v8::String> name = v8_str(isolate, "x");
   // Create object with named accessor.
-  v8::Handle<v8::ObjectTemplate> named = v8::ObjectTemplate::New(isolate);
-  named->SetAccessor(name, &ProtperyXNativeGetter, NULL,
-      v8::Handle<v8::Value>(), v8::DEFAULT, v8::None);
+  v8::Local<v8::ObjectTemplate> named = v8::ObjectTemplate::New(isolate);
+  named->SetAccessor(name, &ProtperyXNativeGetter, NULL, v8::Local<v8::Value>(),
+                     v8::DEFAULT, v8::None);
 
   // Create object with named property getter.
-  env->Global()->Set(v8::String::NewFromUtf8(isolate, "instance"),
-                     named->NewInstance());
-  CHECK_EQ(10, CompileRun("instance.x")->Int32Value());
+  CHECK(env->Global()
+            ->Set(context, v8_str(isolate, "instance"),
+                  named->NewInstance(context).ToLocalChecked())
+            .FromJust());
+  CHECK_EQ(10, CompileRun("instance.x")->Int32Value(context).FromJust());
 
   // Get mirror for the object with property getter.
   CompileRun("var instance_mirror = debug.MakeMirror(instance);");
-  CHECK(CompileRun(
-      "instance_mirror instanceof debug.ObjectMirror")->BooleanValue());
+  CHECK(CompileRun("instance_mirror instanceof debug.ObjectMirror")
+            ->BooleanValue(context)
+            .FromJust());
 
   CompileRun("var named_names = instance_mirror.propertyNames();");
-  CHECK_EQ(1, CompileRun("named_names.length")->Int32Value());
-  CHECK(CompileRun("named_names[0] == 'x'")->BooleanValue());
-  CHECK(CompileRun(
-      "instance_mirror.property('x').value().isNumber()")->BooleanValue());
-  CHECK(CompileRun(
-      "instance_mirror.property('x').value().value() == 10")->BooleanValue());
+  CHECK_EQ(1, CompileRun("named_names.length")->Int32Value(context).FromJust());
+  CHECK(CompileRun("named_names[0] == 'x'")->BooleanValue(context).FromJust());
+  CHECK(CompileRun("instance_mirror.property('x').value().isNumber()")
+            ->BooleanValue(context)
+            .FromJust());
+  CHECK(CompileRun("instance_mirror.property('x').value().value() == 10")
+            ->BooleanValue(context)
+            .FromJust());
 }
 
 
@@ -4663,30 +4844,37 @@
   v8::HandleScope scope(isolate);
   env.ExposeDebug();
 
-  v8::Handle<v8::String> name = v8::String::NewFromUtf8(isolate, "x");
+  v8::Local<v8::Context> context = env.context();
+  v8::Local<v8::String> name = v8_str(isolate, "x");
   // Create object with named accessor.
-  v8::Handle<v8::ObjectTemplate> named = v8::ObjectTemplate::New(isolate);
+  v8::Local<v8::ObjectTemplate> named = v8::ObjectTemplate::New(isolate);
   named->SetAccessor(name, &ProtperyXNativeGetterThrowingError, NULL,
-      v8::Handle<v8::Value>(), v8::DEFAULT, v8::None);
+                     v8::Local<v8::Value>(), v8::DEFAULT, v8::None);
 
   // Create object with named property getter.
-  env->Global()->Set(v8::String::NewFromUtf8(isolate, "instance"),
-                     named->NewInstance());
+  CHECK(env->Global()
+            ->Set(context, v8_str(isolate, "instance"),
+                  named->NewInstance(context).ToLocalChecked())
+            .FromJust());
 
   // Get mirror for the object with property getter.
   CompileRun("var instance_mirror = debug.MakeMirror(instance);");
-  CHECK(CompileRun(
-      "instance_mirror instanceof debug.ObjectMirror")->BooleanValue());
+  CHECK(CompileRun("instance_mirror instanceof debug.ObjectMirror")
+            ->BooleanValue(context)
+            .FromJust());
   CompileRun("named_names = instance_mirror.propertyNames();");
-  CHECK_EQ(1, CompileRun("named_names.length")->Int32Value());
-  CHECK(CompileRun("named_names[0] == 'x'")->BooleanValue());
-  CHECK(CompileRun(
-      "instance_mirror.property('x').value().isError()")->BooleanValue());
+  CHECK_EQ(1, CompileRun("named_names.length")->Int32Value(context).FromJust());
+  CHECK(CompileRun("named_names[0] == 'x'")->BooleanValue(context).FromJust());
+  CHECK(CompileRun("instance_mirror.property('x').value().isError()")
+            ->BooleanValue(context)
+            .FromJust());
 
   // Check that the message is that passed to the Error constructor.
-  CHECK(CompileRun(
-      "instance_mirror.property('x').value().message() == 'Error message'")->
-          BooleanValue());
+  CHECK(
+      CompileRun(
+          "instance_mirror.property('x').value().message() == 'Error message'")
+          ->BooleanValue(context)
+          .FromJust());
 }
 
 
@@ -4700,74 +4888,97 @@
   v8::HandleScope scope(isolate);
   env.ExposeDebug();
 
+  v8::Local<v8::Context> context = env.context();
   // Create an object in the global scope.
   const char* source = "var obj = {a: 1};";
-  v8::Script::Compile(v8::String::NewFromUtf8(isolate, source))
-      ->Run();
+  v8::Script::Compile(context, v8_str(isolate, source))
+      .ToLocalChecked()
+      ->Run(context)
+      .ToLocalChecked();
   v8::Local<v8::Object> obj = v8::Local<v8::Object>::Cast(
-      env->Global()->Get(v8::String::NewFromUtf8(isolate, "obj")));
+      env->Global()->Get(context, v8_str(isolate, "obj")).ToLocalChecked());
   // Set a hidden property on the object.
-  obj->SetHiddenValue(
-      v8::String::NewFromUtf8(isolate, "v8::test-debug::a"),
-      v8::Int32::New(isolate, 11));
+  obj->SetPrivate(
+         env.context(),
+         v8::Private::New(isolate, v8_str(isolate, "v8::test-debug::a")),
+         v8::Int32::New(isolate, 11))
+      .FromJust();
 
   // Get mirror for the object with property getter.
   CompileRun("var obj_mirror = debug.MakeMirror(obj);");
-  CHECK(CompileRun(
-      "obj_mirror instanceof debug.ObjectMirror")->BooleanValue());
+  CHECK(CompileRun("obj_mirror instanceof debug.ObjectMirror")
+            ->BooleanValue(context)
+            .FromJust());
   CompileRun("var named_names = obj_mirror.propertyNames();");
   // There should be exactly one property. But there is also an unnamed
   // property whose value is hidden properties dictionary. The latter
   // property should not be in the list of reguar properties.
-  CHECK_EQ(1, CompileRun("named_names.length")->Int32Value());
-  CHECK(CompileRun("named_names[0] == 'a'")->BooleanValue());
-  CHECK(CompileRun(
-      "obj_mirror.property('a').value().value() == 1")->BooleanValue());
+  CHECK_EQ(1, CompileRun("named_names.length")->Int32Value(context).FromJust());
+  CHECK(CompileRun("named_names[0] == 'a'")->BooleanValue(context).FromJust());
+  CHECK(CompileRun("obj_mirror.property('a').value().value() == 1")
+            ->BooleanValue(context)
+            .FromJust());
 
   // Object created by t0 will become hidden prototype of object 'obj'.
-  v8::Handle<v8::FunctionTemplate> t0 = v8::FunctionTemplate::New(isolate);
-  t0->InstanceTemplate()->Set(v8::String::NewFromUtf8(isolate, "b"),
+  v8::Local<v8::FunctionTemplate> t0 = v8::FunctionTemplate::New(isolate);
+  t0->InstanceTemplate()->Set(v8_str(isolate, "b"),
                               v8::Number::New(isolate, 2));
   t0->SetHiddenPrototype(true);
-  v8::Handle<v8::FunctionTemplate> t1 = v8::FunctionTemplate::New(isolate);
-  t1->InstanceTemplate()->Set(v8::String::NewFromUtf8(isolate, "c"),
+  v8::Local<v8::FunctionTemplate> t1 = v8::FunctionTemplate::New(isolate);
+  t1->InstanceTemplate()->Set(v8_str(isolate, "c"),
                               v8::Number::New(isolate, 3));
 
   // Create proto objects, add hidden properties to them and set them on
   // the global object.
-  v8::Handle<v8::Object> protoObj = t0->GetFunction()->NewInstance();
-  protoObj->SetHiddenValue(
-      v8::String::NewFromUtf8(isolate, "v8::test-debug::b"),
-      v8::Int32::New(isolate, 12));
-  env->Global()->Set(v8::String::NewFromUtf8(isolate, "protoObj"),
-                     protoObj);
-  v8::Handle<v8::Object> grandProtoObj = t1->GetFunction()->NewInstance();
-  grandProtoObj->SetHiddenValue(
-      v8::String::NewFromUtf8(isolate, "v8::test-debug::c"),
-      v8::Int32::New(isolate, 13));
-  env->Global()->Set(
-      v8::String::NewFromUtf8(isolate, "grandProtoObj"),
-      grandProtoObj);
+  v8::Local<v8::Object> protoObj = t0->GetFunction(context)
+                                       .ToLocalChecked()
+                                       ->NewInstance(context)
+                                       .ToLocalChecked();
+  protoObj->SetPrivate(
+              env.context(),
+              v8::Private::New(isolate, v8_str(isolate, "v8::test-debug::b")),
+              v8::Int32::New(isolate, 12))
+      .FromJust();
+  CHECK(env->Global()
+            ->Set(context, v8_str(isolate, "protoObj"), protoObj)
+            .FromJust());
+  v8::Local<v8::Object> grandProtoObj = t1->GetFunction(context)
+                                            .ToLocalChecked()
+                                            ->NewInstance(context)
+                                            .ToLocalChecked();
+  grandProtoObj->SetPrivate(env.context(),
+                            v8::Private::New(
+                                isolate, v8_str(isolate, "v8::test-debug::c")),
+                            v8::Int32::New(isolate, 13))
+      .FromJust();
+  CHECK(env->Global()
+            ->Set(context, v8_str(isolate, "grandProtoObj"), grandProtoObj)
+            .FromJust());
 
   // Setting prototypes: obj->protoObj->grandProtoObj
-  protoObj->Set(v8::String::NewFromUtf8(isolate, "__proto__"),
-                grandProtoObj);
-  obj->Set(v8::String::NewFromUtf8(isolate, "__proto__"), protoObj);
+  CHECK(protoObj->Set(context, v8_str(isolate, "__proto__"), grandProtoObj)
+            .FromJust());
+  CHECK(obj->Set(context, v8_str(isolate, "__proto__"), protoObj).FromJust());
 
   // Get mirror for the object with property getter.
   CompileRun("var obj_mirror = debug.MakeMirror(obj);");
-  CHECK(CompileRun(
-      "obj_mirror instanceof debug.ObjectMirror")->BooleanValue());
+  CHECK(CompileRun("obj_mirror instanceof debug.ObjectMirror")
+            ->BooleanValue(context)
+            .FromJust());
   CompileRun("var named_names = obj_mirror.propertyNames();");
   // There should be exactly two properties - one from the object itself and
   // another from its hidden prototype.
-  CHECK_EQ(2, CompileRun("named_names.length")->Int32Value());
+  CHECK_EQ(2, CompileRun("named_names.length")->Int32Value(context).FromJust());
   CHECK(CompileRun("named_names.sort(); named_names[0] == 'a' &&"
-                   "named_names[1] == 'b'")->BooleanValue());
-  CHECK(CompileRun(
-      "obj_mirror.property('a').value().value() == 1")->BooleanValue());
-  CHECK(CompileRun(
-      "obj_mirror.property('b').value().value() == 2")->BooleanValue());
+                   "named_names[1] == 'b'")
+            ->BooleanValue(context)
+            .FromJust());
+  CHECK(CompileRun("obj_mirror.property('a').value().value() == 1")
+            ->BooleanValue(context)
+            .FromJust());
+  CHECK(CompileRun("obj_mirror.property('b').value().value() == 2")
+            ->BooleanValue(context)
+            .FromJust());
 }
 
 
@@ -4779,7 +4990,7 @@
 // The Wait() call blocks a thread until it is called for the Nth time, then all
 // calls return.  Each ThreadBarrier object can only be used once.
 template <int N>
-class ThreadBarrier FINAL {
+class ThreadBarrier final {
  public:
   ThreadBarrier() : num_blocked_(0) {}
 
@@ -4937,7 +5148,7 @@
 
 
 static void MessageHandler(const v8::Debug::Message& message) {
-  v8::Handle<v8::String> json = message.GetJSON();
+  v8::Local<v8::String> json = message.GetJSON();
   v8::String::Utf8Value utf8(json);
   if (IsBreakEventMessage(*utf8)) {
     // Lets test script wait until break occurs to send commands.
@@ -5043,7 +5254,7 @@
   // Create a V8 environment
   DebugLocalContext env;
   v8::HandleScope scope(env->GetIsolate());
-  v8::Debug::SetMessageHandler(MessageHandler);
+  v8::Debug::SetMessageHandler(env->GetIsolate(), MessageHandler);
   message_queue_debugger_thread.Start();
 
   const char* source_1 = "a = 3; b = 4; c = new Object(); c.d = 5;";
@@ -5137,7 +5348,7 @@
   v8::HandleScope scope(isolate);
   TestClientData::ResetCounters();
   handled_client_data_instances_count = 0;
-  v8::Debug::SetMessageHandler(MessageHandlerCountingClientData);
+  v8::Debug::SetMessageHandler(isolate, MessageHandlerCountingClientData);
   const char* source_1 = "a = 3; b = 4; c = new Object(); c.d = 5;";
   const int kBufferSize = 1000;
   uint16_t buffer[kBufferSize];
@@ -5219,7 +5430,7 @@
   if (IsBreakEventMessage(print_buffer)) {
     // Check that we are inside the while loop.
     int source_line = GetSourceLineFromBreakEventMessage(print_buffer);
-    CHECK(8 <= source_line && source_line <= 13);
+    CHECK(4 <= source_line && source_line <= 10);
     threaded_debugging_barriers.barrier_2.Wait();
   }
 }
@@ -5228,10 +5439,6 @@
 void V8Thread::Run() {
   const char* source =
       "flag = true;\n"
-      "function bar( new_value ) {\n"
-      "  flag = new_value;\n"
-      "  return \"Return from bar(\" + new_value + \")\";\n"
-      "}\n"
       "\n"
       "function foo() {\n"
       "  var x = 1;\n"
@@ -5245,19 +5452,21 @@
       "\n"
       "foo();\n";
 
-  isolate_ = v8::Isolate::New();
+  v8::Isolate::CreateParams create_params;
+  create_params.array_buffer_allocator = CcTest::array_buffer_allocator();
+  isolate_ = v8::Isolate::New(create_params);
   threaded_debugging_barriers.barrier_3.Wait();
   {
     v8::Isolate::Scope isolate_scope(isolate_);
     DebugLocalContext env(isolate_);
     v8::HandleScope scope(isolate_);
-    v8::Debug::SetMessageHandler(&ThreadedMessageHandler);
-    v8::Handle<v8::ObjectTemplate> global_template =
+    v8::Debug::SetMessageHandler(isolate_, &ThreadedMessageHandler);
+    v8::Local<v8::ObjectTemplate> global_template =
         v8::ObjectTemplate::New(env->GetIsolate());
     global_template->Set(
-        v8::String::NewFromUtf8(env->GetIsolate(), "ThreadedAtBarrier1"),
+        v8_str(env->GetIsolate(), "ThreadedAtBarrier1"),
         v8::FunctionTemplate::New(isolate_, ThreadedAtBarrier1));
-    v8::Handle<v8::Context> context =
+    v8::Local<v8::Context> context =
         v8::Context::New(isolate_, NULL, global_template);
     v8::Context::Scope context_scope(context);
 
@@ -5272,10 +5481,11 @@
   const int kBufSize = 1000;
   uint16_t buffer[kBufSize];
 
-  const char* command_1 = "{\"seq\":102,"
+  const char* command_1 =
+      "{\"seq\":102,"
       "\"type\":\"request\","
       "\"command\":\"evaluate\","
-      "\"arguments\":{\"expression\":\"bar(false)\"}}";
+      "\"arguments\":{\"expression\":\"flag = false\"}}";
   const char* command_2 = "{\"seq\":103,"
       "\"type\":\"request\","
       "\"command\":\"continue\"}";
@@ -5376,13 +5586,15 @@
   const char* source_2 = "cat(17);\n"
     "cat(19);\n";
 
-  isolate_ = v8::Isolate::New();
+  v8::Isolate::CreateParams create_params;
+  create_params.array_buffer_allocator = CcTest::array_buffer_allocator();
+  isolate_ = v8::Isolate::New(create_params);
   breakpoints_barriers->barrier_3.Wait();
   {
     v8::Isolate::Scope isolate_scope(isolate_);
     DebugLocalContext env(isolate_);
     v8::HandleScope scope(isolate_);
-    v8::Debug::SetMessageHandler(&BreakpointsMessageHandler);
+    v8::Debug::SetMessageHandler(isolate_, &BreakpointsMessageHandler);
 
     CompileRun(source_1);
     breakpoints_barriers->barrier_1.Wait();
@@ -5537,13 +5749,8 @@
 }
 
 
-static void DummyDebugEventListener(
-    const v8::Debug::EventDetails& event_details) {
-}
-
-
 TEST(SetDebugEventListenerOnUninitializedVM) {
-  v8::Debug::SetDebugEventListener(DummyDebugEventListener);
+  v8::Debug::SetDebugEventListener(CcTest::isolate(), DummyDebugEventListener);
 }
 
 
@@ -5552,7 +5759,7 @@
 
 
 TEST(SetMessageHandlerOnUninitializedVM) {
-  v8::Debug::SetMessageHandler(DummyMessageHandler);
+  v8::Debug::SetMessageHandler(CcTest::isolate(), DummyMessageHandler);
 }
 
 
@@ -5564,7 +5771,7 @@
     "  if (data) return data;"
     "  throw 'No data!'"
     "}";
-v8::Handle<v8::Function> debugger_call_with_data;
+v8::Local<v8::Function> debugger_call_with_data;
 
 
 // Source for a JavaScript function which returns the data parameter of a
@@ -5577,23 +5784,32 @@
     "  exec_state.y = x;"
     "  return exec_state.y"
     "})";
-v8::Handle<v8::Function> debugger_call_with_closure;
+v8::Local<v8::Function> debugger_call_with_closure;
 
 // Function to retrieve the number of JavaScript frames by calling a JavaScript
 // in the debugger.
 static void CheckFrameCount(const v8::FunctionCallbackInfo<v8::Value>& args) {
-  CHECK(v8::Debug::Call(frame_count)->IsNumber());
-  CHECK_EQ(args[0]->Int32Value(),
-           v8::Debug::Call(frame_count)->Int32Value());
+  v8::Local<v8::Context> context = args.GetIsolate()->GetCurrentContext();
+  CHECK(v8::Debug::Call(context, frame_count).ToLocalChecked()->IsNumber());
+  CHECK_EQ(args[0]->Int32Value(context).FromJust(),
+           v8::Debug::Call(context, frame_count)
+               .ToLocalChecked()
+               ->Int32Value(context)
+               .FromJust());
 }
 
 
 // Function to retrieve the source line of the top JavaScript frame by calling a
 // JavaScript function in the debugger.
 static void CheckSourceLine(const v8::FunctionCallbackInfo<v8::Value>& args) {
-  CHECK(v8::Debug::Call(frame_source_line)->IsNumber());
-  CHECK_EQ(args[0]->Int32Value(),
-           v8::Debug::Call(frame_source_line)->Int32Value());
+  v8::Local<v8::Context> context = args.GetIsolate()->GetCurrentContext();
+  CHECK(
+      v8::Debug::Call(context, frame_source_line).ToLocalChecked()->IsNumber());
+  CHECK_EQ(args[0]->Int32Value(context).FromJust(),
+           v8::Debug::Call(context, frame_source_line)
+               .ToLocalChecked()
+               ->Int32Value(context)
+               .FromJust());
 }
 
 
@@ -5602,13 +5818,15 @@
 // can throw exceptions.
 static void CheckDataParameter(
     const v8::FunctionCallbackInfo<v8::Value>& args) {
-  v8::Handle<v8::String> data =
-      v8::String::NewFromUtf8(args.GetIsolate(), "Test");
-  CHECK(v8::Debug::Call(debugger_call_with_data, data)->IsString());
+  v8::Local<v8::String> data = v8_str(args.GetIsolate(), "Test");
+  v8::Local<v8::Context> context = args.GetIsolate()->GetCurrentContext();
+  CHECK(v8::Debug::Call(context, debugger_call_with_data, data)
+            .ToLocalChecked()
+            ->IsString());
 
   for (int i = 0; i < 3; i++) {
-    v8::TryCatch catcher;
-    CHECK(v8::Debug::Call(debugger_call_with_data).IsEmpty());
+    v8::TryCatch catcher(args.GetIsolate());
+    CHECK(v8::Debug::Call(context, debugger_call_with_data).IsEmpty());
     CHECK(catcher.HasCaught());
     CHECK(catcher.Exception()->IsString());
   }
@@ -5617,8 +5835,14 @@
 
 // Function to test using a JavaScript with closure in the debugger.
 static void CheckClosure(const v8::FunctionCallbackInfo<v8::Value>& args) {
-  CHECK(v8::Debug::Call(debugger_call_with_closure)->IsNumber());
-  CHECK_EQ(3, v8::Debug::Call(debugger_call_with_closure)->Int32Value());
+  v8::Local<v8::Context> context = args.GetIsolate()->GetCurrentContext();
+  CHECK(v8::Debug::Call(context, debugger_call_with_closure)
+            .ToLocalChecked()
+            ->IsNumber());
+  CHECK_EQ(3, v8::Debug::Call(context, debugger_call_with_closure)
+                  .ToLocalChecked()
+                  ->Int32Value(context)
+                  .FromJust());
 }
 
 
@@ -5628,95 +5852,122 @@
   // CheckSourceLine and CheckDataParameter installed.
   v8::Isolate* isolate = CcTest::isolate();
   v8::HandleScope scope(isolate);
-  v8::Handle<v8::ObjectTemplate> global_template =
+  v8::Local<v8::ObjectTemplate> global_template =
       v8::ObjectTemplate::New(isolate);
-  global_template->Set(
-      v8::String::NewFromUtf8(isolate, "CheckFrameCount"),
-      v8::FunctionTemplate::New(isolate, CheckFrameCount));
-  global_template->Set(
-      v8::String::NewFromUtf8(isolate, "CheckSourceLine"),
-      v8::FunctionTemplate::New(isolate, CheckSourceLine));
-  global_template->Set(
-      v8::String::NewFromUtf8(isolate, "CheckDataParameter"),
-      v8::FunctionTemplate::New(isolate, CheckDataParameter));
-  global_template->Set(
-      v8::String::NewFromUtf8(isolate, "CheckClosure"),
-      v8::FunctionTemplate::New(isolate, CheckClosure));
-  v8::Handle<v8::Context> context = v8::Context::New(isolate,
-                                                     NULL,
-                                                     global_template);
+  global_template->Set(v8_str(isolate, "CheckFrameCount"),
+                       v8::FunctionTemplate::New(isolate, CheckFrameCount));
+  global_template->Set(v8_str(isolate, "CheckSourceLine"),
+                       v8::FunctionTemplate::New(isolate, CheckSourceLine));
+  global_template->Set(v8_str(isolate, "CheckDataParameter"),
+                       v8::FunctionTemplate::New(isolate, CheckDataParameter));
+  global_template->Set(v8_str(isolate, "CheckClosure"),
+                       v8::FunctionTemplate::New(isolate, CheckClosure));
+  v8::Local<v8::Context> context =
+      v8::Context::New(isolate, NULL, global_template);
   v8::Context::Scope context_scope(context);
 
   // Compile a function for checking the number of JavaScript frames.
-  v8::Script::Compile(
-      v8::String::NewFromUtf8(isolate, frame_count_source))->Run();
-  frame_count = v8::Local<v8::Function>::Cast(context->Global()->Get(
-      v8::String::NewFromUtf8(isolate, "frame_count")));
+  v8::Script::Compile(context, v8_str(isolate, frame_count_source))
+      .ToLocalChecked()
+      ->Run(context)
+      .ToLocalChecked();
+  frame_count = v8::Local<v8::Function>::Cast(
+      context->Global()
+          ->Get(context, v8_str(isolate, "frame_count"))
+          .ToLocalChecked());
 
   // Compile a function for returning the source line for the top frame.
-  v8::Script::Compile(v8::String::NewFromUtf8(isolate,
-                                              frame_source_line_source))->Run();
-  frame_source_line = v8::Local<v8::Function>::Cast(context->Global()->Get(
-      v8::String::NewFromUtf8(isolate, "frame_source_line")));
+  v8::Script::Compile(context, v8_str(isolate, frame_source_line_source))
+      .ToLocalChecked()
+      ->Run(context)
+      .ToLocalChecked();
+  frame_source_line = v8::Local<v8::Function>::Cast(
+      context->Global()
+          ->Get(context, v8_str(isolate, "frame_source_line"))
+          .ToLocalChecked());
 
   // Compile a function returning the data parameter.
-  v8::Script::Compile(v8::String::NewFromUtf8(isolate,
-                                              debugger_call_with_data_source))
-      ->Run();
+  v8::Script::Compile(context, v8_str(isolate, debugger_call_with_data_source))
+      .ToLocalChecked()
+      ->Run(context)
+      .ToLocalChecked();
   debugger_call_with_data = v8::Local<v8::Function>::Cast(
-      context->Global()->Get(v8::String::NewFromUtf8(
-          isolate, "debugger_call_with_data")));
+      context->Global()
+          ->Get(context, v8_str(isolate, "debugger_call_with_data"))
+          .ToLocalChecked());
 
   // Compile a function capturing closure.
-  debugger_call_with_closure =
-      v8::Local<v8::Function>::Cast(v8::Script::Compile(
-          v8::String::NewFromUtf8(isolate,
-                                  debugger_call_with_closure_source))->Run());
+  debugger_call_with_closure = v8::Local<v8::Function>::Cast(
+      v8::Script::Compile(context,
+                          v8_str(isolate, debugger_call_with_closure_source))
+          .ToLocalChecked()
+          ->Run(context)
+          .ToLocalChecked());
 
   // Calling a function through the debugger returns 0 frames if there are
   // no JavaScript frames.
-  CHECK_EQ(v8::Integer::New(isolate, 0),
-           v8::Debug::Call(frame_count));
+  CHECK(v8::Integer::New(isolate, 0)
+            ->Equals(context,
+                     v8::Debug::Call(context, frame_count).ToLocalChecked())
+            .FromJust());
 
   // Test that the number of frames can be retrieved.
-  v8::Script::Compile(
-      v8::String::NewFromUtf8(isolate, "CheckFrameCount(1)"))->Run();
-  v8::Script::Compile(v8::String::NewFromUtf8(isolate,
-                                              "function f() {"
-                                              "  CheckFrameCount(2);"
-                                              "}; f()"))->Run();
+  v8::Script::Compile(context, v8_str(isolate, "CheckFrameCount(1)"))
+      .ToLocalChecked()
+      ->Run(context)
+      .ToLocalChecked();
+  v8::Script::Compile(context, v8_str(isolate,
+                                      "function f() {"
+                                      "  CheckFrameCount(2);"
+                                      "}; f()"))
+      .ToLocalChecked()
+      ->Run(context)
+      .ToLocalChecked();
 
   // Test that the source line can be retrieved.
-  v8::Script::Compile(
-      v8::String::NewFromUtf8(isolate, "CheckSourceLine(0)"))->Run();
-  v8::Script::Compile(v8::String::NewFromUtf8(isolate,
-                                              "function f() {\n"
-                                              "  CheckSourceLine(1)\n"
-                                              "  CheckSourceLine(2)\n"
-                                              "  CheckSourceLine(3)\n"
-                                              "}; f()"))->Run();
+  v8::Script::Compile(context, v8_str(isolate, "CheckSourceLine(0)"))
+      .ToLocalChecked()
+      ->Run(context)
+      .ToLocalChecked();
+  v8::Script::Compile(context, v8_str(isolate,
+                                      "function f() {\n"
+                                      "  CheckSourceLine(1)\n"
+                                      "  CheckSourceLine(2)\n"
+                                      "  CheckSourceLine(3)\n"
+                                      "}; f()"))
+      .ToLocalChecked()
+      ->Run(context)
+      .ToLocalChecked();
 
   // Test that a parameter can be passed to a function called in the debugger.
-  v8::Script::Compile(v8::String::NewFromUtf8(isolate,
-                                              "CheckDataParameter()"))->Run();
+  v8::Script::Compile(context, v8_str(isolate, "CheckDataParameter()"))
+      .ToLocalChecked()
+      ->Run(context)
+      .ToLocalChecked();
 
   // Test that a function with closure can be run in the debugger.
-  v8::Script::Compile(
-      v8::String::NewFromUtf8(isolate, "CheckClosure()"))->Run();
+  v8::Script::Compile(context, v8_str(isolate, "CheckClosure()"))
+      .ToLocalChecked()
+      ->Run(context)
+      .ToLocalChecked();
 
   // Test that the source line is correct when there is a line offset.
-  v8::ScriptOrigin origin(v8::String::NewFromUtf8(isolate, "test"),
+  v8::ScriptOrigin origin(v8_str(isolate, "test"),
                           v8::Integer::New(isolate, 7));
-  v8::Script::Compile(
-      v8::String::NewFromUtf8(isolate, "CheckSourceLine(7)"), &origin)
-      ->Run();
-  v8::Script::Compile(v8::String::NewFromUtf8(isolate,
-                                              "function f() {\n"
-                                              "  CheckSourceLine(8)\n"
-                                              "  CheckSourceLine(9)\n"
-                                              "  CheckSourceLine(10)\n"
-                                              "}; f()"),
-                      &origin)->Run();
+  v8::Script::Compile(context, v8_str(isolate, "CheckSourceLine(7)"), &origin)
+      .ToLocalChecked()
+      ->Run(context)
+      .ToLocalChecked();
+  v8::Script::Compile(context, v8_str(isolate,
+                                      "function f() {\n"
+                                      "  CheckSourceLine(8)\n"
+                                      "  CheckSourceLine(9)\n"
+                                      "  CheckSourceLine(10)\n"
+                                      "}; f()"),
+                      &origin)
+      .ToLocalChecked()
+      ->Run(context)
+      .ToLocalChecked();
 }
 
 
@@ -5739,11 +5990,13 @@
   DebugLocalContext env;
 
   // Check debugger is unloaded before it is used.
-  CheckDebuggerUnloaded();
+  CheckDebuggerUnloaded(env->GetIsolate());
 
   // Set a debug event listener.
   break_point_hit_count = 0;
-  v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount);
+  v8::Debug::SetDebugEventListener(env->GetIsolate(),
+                                   DebugEventBreakPointHitCount);
+  v8::Local<v8::Context> context = env.context();
   {
     v8::HandleScope scope(env->GetIsolate());
     // Create a couple of functions for the test.
@@ -5760,41 +6013,44 @@
 
     // Make sure that the break points are there.
     break_point_hit_count = 0;
-    foo->Call(env->Global(), 0, NULL);
+    foo->Call(context, env->Global(), 0, NULL).ToLocalChecked();
     CHECK_EQ(2, break_point_hit_count);
-    bar->Call(env->Global(), 0, NULL);
+    bar->Call(context, env->Global(), 0, NULL).ToLocalChecked();
     CHECK_EQ(4, break_point_hit_count);
   }
 
   // Remove the debug event listener without clearing breakpoints. Do this
   // outside a handle scope.
-  v8::Debug::SetDebugEventListener(NULL);
-  CheckDebuggerUnloaded(true);
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr);
+  CheckDebuggerUnloaded(env->GetIsolate(), true);
 
   // Now set a debug message handler.
   break_point_hit_count = 0;
-  v8::Debug::SetMessageHandler(MessageHandlerBreakPointHitCount);
+  v8::Debug::SetMessageHandler(env->GetIsolate(),
+                               MessageHandlerBreakPointHitCount);
   {
     v8::HandleScope scope(env->GetIsolate());
 
     // Get the test functions again.
     v8::Local<v8::Function> foo(v8::Local<v8::Function>::Cast(
-        env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "foo"))));
+        env->Global()
+            ->Get(context, v8_str(env->GetIsolate(), "foo"))
+            .ToLocalChecked()));
 
-    foo->Call(env->Global(), 0, NULL);
+    foo->Call(context, env->Global(), 0, NULL).ToLocalChecked();
     CHECK_EQ(0, break_point_hit_count);
 
     // Set break points and run again.
     SetBreakPoint(foo, 0);
     SetBreakPoint(foo, 4);
-    foo->Call(env->Global(), 0, NULL);
+    foo->Call(context, env->Global(), 0, NULL).ToLocalChecked();
     CHECK_EQ(2, break_point_hit_count);
   }
 
   // Remove the debug message handler without clearing breakpoints. Do this
   // outside a handle scope.
-  v8::Debug::SetMessageHandler(NULL);
-  CheckDebuggerUnloaded(true);
+  v8::Debug::SetMessageHandler(env->GetIsolate(), nullptr);
+  CheckDebuggerUnloaded(env->GetIsolate(), true);
 }
 
 
@@ -5833,10 +6089,10 @@
   v8::HandleScope scope(env->GetIsolate());
 
   // Check debugger is unloaded before it is used.
-  CheckDebuggerUnloaded();
+  CheckDebuggerUnloaded(env->GetIsolate());
 
   // Set a debug message handler.
-  v8::Debug::SetMessageHandler(MessageHandlerHitCount);
+  v8::Debug::SetMessageHandler(env->GetIsolate(), MessageHandlerHitCount);
 
   // Run code to throw a unhandled exception. This should end up in the message
   // handler.
@@ -5847,7 +6103,7 @@
 
   // Clear debug message handler.
   message_handler_hit_count = 0;
-  v8::Debug::SetMessageHandler(NULL);
+  v8::Debug::SetMessageHandler(env->GetIsolate(), nullptr);
 
   // Run code to throw a unhandled exception. This should end up in the message
   // handler.
@@ -5856,7 +6112,7 @@
   // The message handler should not be called more.
   CHECK_EQ(0, message_handler_hit_count);
 
-  CheckDebuggerUnloaded(true);
+  CheckDebuggerUnloaded(env->GetIsolate(), true);
 }
 
 
@@ -5866,7 +6122,7 @@
   message_handler_hit_count++;
 
   // Clear debug message handler.
-  v8::Debug::SetMessageHandler(NULL);
+  v8::Debug::SetMessageHandler(message.GetIsolate(), nullptr);
 }
 
 
@@ -5876,10 +6132,11 @@
   v8::HandleScope scope(env->GetIsolate());
 
   // Check debugger is unloaded before it is used.
-  CheckDebuggerUnloaded();
+  CheckDebuggerUnloaded(env->GetIsolate());
 
   // Set a debug message handler.
-  v8::Debug::SetMessageHandler(MessageHandlerClearingMessageHandler);
+  v8::Debug::SetMessageHandler(env->GetIsolate(),
+                               MessageHandlerClearingMessageHandler);
 
   // Run code to throw a unhandled exception. This should end up in the message
   // handler.
@@ -5888,7 +6145,7 @@
   // The message handler should be called.
   CHECK_EQ(1, message_handler_hit_count);
 
-  CheckDebuggerUnloaded(true);
+  CheckDebuggerUnloaded(env->GetIsolate(), true);
 }
 
 
@@ -5911,12 +6168,12 @@
   v8::HandleScope scope(env->GetIsolate());
   env.ExposeDebug();
 
+  v8::Local<v8::Context> context = env.context();
   EmptyExternalStringResource source_ext_str;
   v8::Local<v8::String> source =
-      v8::String::NewExternal(env->GetIsolate(), &source_ext_str);
-  v8::Handle<v8::Script> evil_script(v8::Script::Compile(source));
-  // "use" evil_script to make the compiler happy.
-  (void) evil_script;
+      v8::String::NewExternalTwoByte(env->GetIsolate(), &source_ext_str)
+          .ToLocalChecked();
+  CHECK(v8::Script::Compile(context, source).IsEmpty());
   Handle<i::ExternalTwoByteString> i_source(
       i::ExternalTwoByteString::cast(*v8::Utils::OpenHandle(*source)));
   // This situation can happen if source was an external string disposed
@@ -5925,20 +6182,32 @@
 
   bool allow_natives_syntax = i::FLAG_allow_natives_syntax;
   i::FLAG_allow_natives_syntax = true;
-  CompileRun(
-      "var scripts = %DebugGetLoadedScripts();"
-      "var count = scripts.length;"
-      "for (var i = 0; i < count; ++i) {"
-      "  scripts[i].line_ends;"
-      "}");
+  EnableDebugger(env->GetIsolate());
+  v8::MaybeLocal<v8::Value> result =
+      CompileRun(env.context(),
+                 "var scripts = %DebugGetLoadedScripts();"
+                 "var count = scripts.length;"
+                 "for (var i = 0; i < count; ++i) {"
+                 "  var lines = scripts[i].lineCount();"
+                 "  if (lines < 1) throw 'lineCount';"
+                 "  var last = -1;"
+                 "  for (var j = 0; j < lines; ++j) {"
+                 "    var end = scripts[i].lineEnd(j);"
+                 "    if (last >= end) throw 'lineEnd';"
+                 "    last = end;"
+                 "  }"
+                 "}");
+  CHECK(!result.IsEmpty());
+  DisableDebugger(env->GetIsolate());
   // Must not crash while accessing line_ends.
   i::FLAG_allow_natives_syntax = allow_natives_syntax;
 
   // Some scripts are retrieved - at least the number of native scripts.
-  CHECK_GT((*env)
-               ->Global()
-               ->Get(v8::String::NewFromUtf8(env->GetIsolate(), "count"))
-               ->Int32Value(),
+  CHECK_GT(env->Global()
+               ->Get(context, v8_str(env->GetIsolate(), "count"))
+               .ToLocalChecked()
+               ->Int32Value(context)
+               .FromJust(),
            8);
 }
 
@@ -5955,63 +6224,82 @@
                                       frame_script_name_source,
                                       "frame_script_name");
 
-  v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount);
+  v8::Debug::SetDebugEventListener(env->GetIsolate(),
+                                   DebugEventBreakPointHitCount);
 
+  v8::Local<v8::Context> context = env.context();
   // Test function source.
-  v8::Local<v8::String> script = v8::String::NewFromUtf8(env->GetIsolate(),
-                                                         "function f() {\n"
-                                                         "  debugger;\n"
-                                                         "}\n");
+  v8::Local<v8::String> script = v8_str(env->GetIsolate(),
+                                        "function f() {\n"
+                                        "  debugger;\n"
+                                        "}\n");
 
   v8::ScriptOrigin origin1 =
-      v8::ScriptOrigin(v8::String::NewFromUtf8(env->GetIsolate(), "name"));
-  v8::Handle<v8::Script> script1 = v8::Script::Compile(script, &origin1);
-  script1->Run();
+      v8::ScriptOrigin(v8_str(env->GetIsolate(), "name"));
+  v8::Local<v8::Script> script1 =
+      v8::Script::Compile(context, script, &origin1).ToLocalChecked();
+  script1->Run(context).ToLocalChecked();
   v8::Local<v8::Function> f;
   f = v8::Local<v8::Function>::Cast(
-      env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "f")));
+      env->Global()
+          ->Get(context, v8_str(env->GetIsolate(), "f"))
+          .ToLocalChecked());
 
-  f->Call(env->Global(), 0, NULL);
+  f->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(1, break_point_hit_count);
-  CHECK_EQ("name", last_script_name_hit);
+  CHECK_EQ(0, strcmp("name", last_script_name_hit));
 
   // Compile the same script again without setting data. As the compilation
   // cache is disabled when debugging expect the data to be missing.
-  v8::Script::Compile(script, &origin1)->Run();
+  v8::Script::Compile(context, script, &origin1)
+      .ToLocalChecked()
+      ->Run(context)
+      .ToLocalChecked();
   f = v8::Local<v8::Function>::Cast(
-      env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "f")));
-  f->Call(env->Global(), 0, NULL);
+      env->Global()
+          ->Get(context, v8_str(env->GetIsolate(), "f"))
+          .ToLocalChecked());
+  f->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(2, break_point_hit_count);
-  CHECK_EQ("name", last_script_name_hit);
+  CHECK_EQ(0, strcmp("name", last_script_name_hit));
 
-  v8::Local<v8::String> data_obj_source = v8::String::NewFromUtf8(
-      env->GetIsolate(),
-      "({ a: 'abc',\n"
-      "  b: 123,\n"
-      "  toString: function() { return this.a + ' ' + this.b; }\n"
-      "})\n");
-  v8::Script::Compile(data_obj_source)->Run();
+  v8::Local<v8::String> data_obj_source =
+      v8_str(env->GetIsolate(),
+             "({ a: 'abc',\n"
+             "  b: 123,\n"
+             "  toString: function() { return this.a + ' ' + this.b; }\n"
+             "})\n");
+  v8::Script::Compile(context, data_obj_source)
+      .ToLocalChecked()
+      ->Run(context)
+      .ToLocalChecked();
   v8::ScriptOrigin origin2 =
-      v8::ScriptOrigin(v8::String::NewFromUtf8(env->GetIsolate(), "new name"));
-  v8::Handle<v8::Script> script2 = v8::Script::Compile(script, &origin2);
-  script2->Run();
+      v8::ScriptOrigin(v8_str(env->GetIsolate(), "new name"));
+  v8::Local<v8::Script> script2 =
+      v8::Script::Compile(context, script, &origin2).ToLocalChecked();
+  script2->Run(context).ToLocalChecked();
   f = v8::Local<v8::Function>::Cast(
-      env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "f")));
-  f->Call(env->Global(), 0, NULL);
+      env->Global()
+          ->Get(context, v8_str(env->GetIsolate(), "f"))
+          .ToLocalChecked());
+  f->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(3, break_point_hit_count);
-  CHECK_EQ("new name", last_script_name_hit);
+  CHECK_EQ(0, strcmp("new name", last_script_name_hit));
 
-  v8::Handle<v8::Script> script3 = v8::Script::Compile(script, &origin2);
-  script3->Run();
+  v8::Local<v8::Script> script3 =
+      v8::Script::Compile(context, script, &origin2).ToLocalChecked();
+  script3->Run(context).ToLocalChecked();
   f = v8::Local<v8::Function>::Cast(
-      env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "f")));
-  f->Call(env->Global(), 0, NULL);
+      env->Global()
+          ->Get(context, v8_str(env->GetIsolate(), "f"))
+          .ToLocalChecked());
+  f->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(4, break_point_hit_count);
 }
 
 
-static v8::Handle<v8::Context> expected_context;
-static v8::Handle<v8::Value> expected_context_data;
+static v8::Local<v8::Context> expected_context;
+static v8::Local<v8::Value> expected_context_data;
 
 
 // Check that the expected context is the one generating the debug event.
@@ -6040,23 +6328,23 @@
   v8::HandleScope scope(isolate);
 
   // Create two contexts.
-  v8::Handle<v8::Context> context_1;
-  v8::Handle<v8::Context> context_2;
-  v8::Handle<v8::ObjectTemplate> global_template =
-      v8::Handle<v8::ObjectTemplate>();
-  v8::Handle<v8::Value> global_object = v8::Handle<v8::Value>();
+  v8::Local<v8::Context> context_1;
+  v8::Local<v8::Context> context_2;
+  v8::Local<v8::ObjectTemplate> global_template =
+      v8::Local<v8::ObjectTemplate>();
+  v8::Local<v8::Value> global_object = v8::Local<v8::Value>();
   context_1 = v8::Context::New(isolate, NULL, global_template, global_object);
   context_2 = v8::Context::New(isolate, NULL, global_template, global_object);
 
-  v8::Debug::SetMessageHandler(ContextCheckMessageHandler);
+  v8::Debug::SetMessageHandler(isolate, ContextCheckMessageHandler);
 
   // Default data value is undefined.
   CHECK(context_1->GetEmbedderData(0)->IsUndefined());
   CHECK(context_2->GetEmbedderData(0)->IsUndefined());
 
   // Set and check different data values.
-  v8::Handle<v8::String> data_1 = v8::String::NewFromUtf8(isolate, "1");
-  v8::Handle<v8::String> data_2 = v8::String::NewFromUtf8(isolate, "2");
+  v8::Local<v8::String> data_1 = v8_str(isolate, "1");
+  v8::Local<v8::String> data_2 = v8_str(isolate, "2");
   context_1->SetEmbedderData(0, data_1);
   context_2->SetEmbedderData(0, data_2);
   CHECK(context_1->GetEmbedderData(0)->StrictEquals(data_1));
@@ -6071,7 +6359,7 @@
     expected_context = context_1;
     expected_context_data = data_1;
     v8::Local<v8::Function> f = CompileFunction(isolate, source, "f");
-    f->Call(context_1->Global(), 0, NULL);
+    f->Call(context_1, context_1->Global(), 0, NULL).ToLocalChecked();
   }
 
 
@@ -6081,14 +6369,14 @@
     expected_context = context_2;
     expected_context_data = data_2;
     v8::Local<v8::Function> f = CompileFunction(isolate, source, "f");
-    f->Call(context_2->Global(), 0, NULL);
+    f->Call(context_2, context_2->Global(), 0, NULL).ToLocalChecked();
   }
 
   // Two times compile event and two times break event.
   CHECK_GT(message_handler_hit_count, 4);
 
-  v8::Debug::SetMessageHandler(NULL);
-  CheckDebuggerUnloaded();
+  v8::Debug::SetMessageHandler(isolate, nullptr);
+  CheckDebuggerUnloaded(isolate);
 }
 
 
@@ -6113,25 +6401,31 @@
 
 // Test that a debug break can be scheduled while in a message handler.
 TEST(DebugBreakInMessageHandler) {
+  i::FLAG_turbo_inlining = false;  // Make sure g is not inlined into f.
   DebugLocalContext env;
   v8::HandleScope scope(env->GetIsolate());
 
-  v8::Debug::SetMessageHandler(DebugBreakMessageHandler);
+  v8::Debug::SetMessageHandler(env->GetIsolate(), DebugBreakMessageHandler);
 
+  v8::Local<v8::Context> context = env.context();
   // Test functions.
   const char* script = "function f() { debugger; g(); } function g() { }";
   CompileRun(script);
   v8::Local<v8::Function> f = v8::Local<v8::Function>::Cast(
-      env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "f")));
+      env->Global()
+          ->Get(context, v8_str(env->GetIsolate(), "f"))
+          .ToLocalChecked());
   v8::Local<v8::Function> g = v8::Local<v8::Function>::Cast(
-      env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "g")));
+      env->Global()
+          ->Get(context, v8_str(env->GetIsolate(), "g"))
+          .ToLocalChecked());
 
-  // Call f then g. The debugger statement in f will casue a break which will
+  // Call f then g. The debugger statement in f will cause a break which will
   // cause another break.
-  f->Call(env->Global(), 0, NULL);
+  f->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(2, message_handler_break_hit_count);
   // Calling g will not cause any additional breaks.
-  g->Call(env->Global(), 0, NULL);
+  g->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(2, message_handler_break_hit_count);
 }
 
@@ -6142,8 +6436,8 @@
 static void DebugEventDebugBreak(
     const v8::Debug::EventDetails& event_details) {
   v8::DebugEvent event = event_details.GetEvent();
-  v8::Handle<v8::Object> exec_state = event_details.GetExecutionState();
-
+  v8::Local<v8::Object> exec_state = event_details.GetExecutionState();
+  v8::Local<v8::Context> context = CcTest::isolate()->GetCurrentContext();
   if (event == v8::Break) {
     break_point_hit_count++;
 
@@ -6151,17 +6445,17 @@
     if (!frame_function_name.IsEmpty()) {
       // Get the name of the function.
       const int argc = 2;
-      v8::Handle<v8::Value> argv[argc] = {
-        exec_state, v8::Integer::New(CcTest::isolate(), 0)
-      };
-      v8::Handle<v8::Value> result = frame_function_name->Call(exec_state,
-                                                               argc, argv);
+      v8::Local<v8::Value> argv[argc] = {
+          exec_state, v8::Integer::New(CcTest::isolate(), 0)};
+      v8::Local<v8::Value> result =
+          frame_function_name->Call(context, exec_state, argc, argv)
+              .ToLocalChecked();
       if (result->IsUndefined()) {
         last_function_hit[0] = '\0';
       } else {
         CHECK(result->IsString());
-        v8::Handle<v8::String> function_name(
-            result->ToString(CcTest::isolate()));
+        v8::Local<v8::String> function_name(
+            result->ToString(context).ToLocalChecked());
         function_name->WriteUtf8(last_function_hit);
       }
     }
@@ -6178,7 +6472,7 @@
   // This test only applies to native regexps.
   DebugLocalContext env;
   v8::HandleScope scope(env->GetIsolate());
-
+  v8::Local<v8::Context> context = env.context();
   // Create a function for checking the function when hitting a break point.
   frame_function_name = CompileFunction(&env,
                                         frame_function_name_source,
@@ -6192,19 +6486,20 @@
 
   v8::Local<v8::Function> f = CompileFunction(env->GetIsolate(), script, "f");
   const int argc = 1;
-  v8::Handle<v8::Value> argv[argc] = {
-      v8::String::NewFromUtf8(env->GetIsolate(), "  /* xxx */ a=0;")};
-  v8::Local<v8::Value> result = f->Call(env->Global(), argc, argv);
-  CHECK_EQ(12, result->Int32Value());
+  v8::Local<v8::Value> argv[argc] = {
+      v8_str(env->GetIsolate(), "  /* xxx */ a=0;")};
+  v8::Local<v8::Value> result =
+      f->Call(context, env->Global(), argc, argv).ToLocalChecked();
+  CHECK_EQ(12, result->Int32Value(context).FromJust());
 
-  v8::Debug::SetDebugEventListener(DebugEventDebugBreak);
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventDebugBreak);
   v8::Debug::DebugBreak(env->GetIsolate());
-  result = f->Call(env->Global(), argc, argv);
+  result = f->Call(context, env->Global(), argc, argv).ToLocalChecked();
 
   // Check that there was only one break event. Matching RegExp should not
   // cause Break events.
   CHECK_EQ(1, break_point_hit_count);
-  CHECK_EQ("f", last_function_hit);
+  CHECK_EQ(0, strcmp("f", last_function_hit));
 }
 #endif  // V8_INTERPRETED_REGEXP
 
@@ -6213,20 +6508,19 @@
 static void ExecuteScriptForContextCheck(
     v8::Debug::MessageHandler message_handler) {
   // Create a context.
-  v8::Handle<v8::Context> context_1;
-  v8::Handle<v8::ObjectTemplate> global_template =
-      v8::Handle<v8::ObjectTemplate>();
+  v8::Local<v8::Context> context_1;
+  v8::Local<v8::ObjectTemplate> global_template =
+      v8::Local<v8::ObjectTemplate>();
   context_1 =
       v8::Context::New(CcTest::isolate(), NULL, global_template);
 
-  v8::Debug::SetMessageHandler(message_handler);
+  v8::Debug::SetMessageHandler(CcTest::isolate(), message_handler);
 
   // Default data value is undefined.
   CHECK(context_1->GetEmbedderData(0)->IsUndefined());
 
   // Set and check a data value.
-  v8::Handle<v8::String> data_1 =
-      v8::String::NewFromUtf8(CcTest::isolate(), "1");
+  v8::Local<v8::String> data_1 = v8_str(CcTest::isolate(), "1");
   context_1->SetEmbedderData(0, data_1);
   CHECK(context_1->GetEmbedderData(0)->StrictEquals(data_1));
 
@@ -6239,10 +6533,10 @@
     expected_context = context_1;
     expected_context_data = data_1;
     v8::Local<v8::Function> f = CompileFunction(CcTest::isolate(), source, "f");
-    f->Call(context_1->Global(), 0, NULL);
+    f->Call(context_1, context_1->Global(), 0, NULL).ToLocalChecked();
   }
 
-  v8::Debug::SetMessageHandler(NULL);
+  v8::Debug::SetMessageHandler(CcTest::isolate(), nullptr);
 }
 
 
@@ -6257,7 +6551,7 @@
 
   // One time compile event and one time break event.
   CHECK_GT(message_handler_hit_count, 2);
-  CheckDebuggerUnloaded();
+  CheckDebuggerUnloaded(CcTest::isolate());
 }
 
 
@@ -6325,7 +6619,7 @@
 
   // One break from the source and another from the evaluate request.
   CHECK_EQ(break_count, 2);
-  CheckDebuggerUnloaded();
+  CheckDebuggerUnloaded(CcTest::isolate());
 }
 
 
@@ -6348,22 +6642,27 @@
 TEST(AfterCompileMessageWhenMessageHandlerIsReset) {
   DebugLocalContext env;
   v8::HandleScope scope(env->GetIsolate());
+  v8::Local<v8::Context> context = env.context();
   after_compile_message_count = 0;
   const char* script = "var a=1";
 
-  v8::Debug::SetMessageHandler(AfterCompileMessageHandler);
-  v8::Script::Compile(v8::String::NewFromUtf8(env->GetIsolate(), script))
-      ->Run();
-  v8::Debug::SetMessageHandler(NULL);
+  v8::Debug::SetMessageHandler(env->GetIsolate(), AfterCompileMessageHandler);
+  v8::Script::Compile(context, v8_str(env->GetIsolate(), script))
+      .ToLocalChecked()
+      ->Run(context)
+      .ToLocalChecked();
+  v8::Debug::SetMessageHandler(env->GetIsolate(), nullptr);
 
-  v8::Debug::SetMessageHandler(AfterCompileMessageHandler);
+  v8::Debug::SetMessageHandler(env->GetIsolate(), AfterCompileMessageHandler);
   v8::Debug::DebugBreak(env->GetIsolate());
-  v8::Script::Compile(v8::String::NewFromUtf8(env->GetIsolate(), script))
-      ->Run();
+  v8::Script::Compile(context, v8_str(env->GetIsolate(), script))
+      .ToLocalChecked()
+      ->Run(context)
+      .ToLocalChecked();
 
   // Setting listener to NULL should cause debugger unload.
-  v8::Debug::SetMessageHandler(NULL);
-  CheckDebuggerUnloaded();
+  v8::Debug::SetMessageHandler(env->GetIsolate(), nullptr);
+  CheckDebuggerUnloaded(env->GetIsolate());
 
   // Compilation cache should be disabled when debugger is active.
   CHECK_EQ(2, after_compile_message_count);
@@ -6396,7 +6695,8 @@
   // For this test, we want to break on uncaught exceptions:
   ChangeBreakOnException(false, true);
 
-  v8::Debug::SetDebugEventListener(CompileErrorEventCounter);
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), CompileErrorEventCounter);
+  v8::Local<v8::Context> context = env.context();
 
   CompileErrorEventCounterClear();
 
@@ -6404,23 +6704,30 @@
   CHECK_EQ(0, compile_error_event_count);
 
   // Throws SyntaxError: Unexpected end of input
-  v8::Script::Compile(v8::String::NewFromUtf8(env->GetIsolate(), "+++"));
+  CHECK(
+      v8::Script::Compile(context, v8_str(env->GetIsolate(), "+++")).IsEmpty());
   CHECK_EQ(1, compile_error_event_count);
 
-  v8::Script::Compile(
-    v8::String::NewFromUtf8(env->GetIsolate(), "/sel\\/: \\"));
+  CHECK(v8::Script::Compile(context, v8_str(env->GetIsolate(), "/sel\\/: \\"))
+            .IsEmpty());
   CHECK_EQ(2, compile_error_event_count);
 
-  v8::Script::Compile(
-    v8::String::NewFromUtf8(env->GetIsolate(), "JSON.parse('1234:')"));
+  v8::Local<v8::Script> script =
+      v8::Script::Compile(context,
+                          v8_str(env->GetIsolate(), "JSON.parse('1234:')"))
+          .ToLocalChecked();
   CHECK_EQ(2, compile_error_event_count);
+  CHECK(script->Run(context).IsEmpty());
+  CHECK_EQ(3, compile_error_event_count);
 
-  v8::Script::Compile(
-    v8::String::NewFromUtf8(env->GetIsolate(), "new RegExp('/\\/\\\\');"));
-  CHECK_EQ(2, compile_error_event_count);
+  v8::Script::Compile(context,
+                      v8_str(env->GetIsolate(), "new RegExp('/\\/\\\\');"))
+      .ToLocalChecked();
+  CHECK_EQ(3, compile_error_event_count);
 
-  v8::Script::Compile(v8::String::NewFromUtf8(env->GetIsolate(), "throw 1;"));
-  CHECK_EQ(2, compile_error_event_count);
+  v8::Script::Compile(context, v8_str(env->GetIsolate(), "throw 1;"))
+      .ToLocalChecked();
+  CHECK_EQ(3, compile_error_event_count);
 }
 
 
@@ -6428,23 +6735,28 @@
 TEST(BreakMessageWhenMessageHandlerIsReset) {
   DebugLocalContext env;
   v8::HandleScope scope(env->GetIsolate());
+  v8::Local<v8::Context> context = env.context();
   after_compile_message_count = 0;
   const char* script = "function f() {};";
 
-  v8::Debug::SetMessageHandler(AfterCompileMessageHandler);
-  v8::Script::Compile(v8::String::NewFromUtf8(env->GetIsolate(), script))
-      ->Run();
-  v8::Debug::SetMessageHandler(NULL);
+  v8::Debug::SetMessageHandler(env->GetIsolate(), AfterCompileMessageHandler);
+  v8::Script::Compile(context, v8_str(env->GetIsolate(), script))
+      .ToLocalChecked()
+      ->Run(context)
+      .ToLocalChecked();
+  v8::Debug::SetMessageHandler(env->GetIsolate(), nullptr);
 
-  v8::Debug::SetMessageHandler(AfterCompileMessageHandler);
+  v8::Debug::SetMessageHandler(env->GetIsolate(), AfterCompileMessageHandler);
   v8::Debug::DebugBreak(env->GetIsolate());
   v8::Local<v8::Function> f = v8::Local<v8::Function>::Cast(
-      env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "f")));
-  f->Call(env->Global(), 0, NULL);
+      env->Global()
+          ->Get(context, v8_str(env->GetIsolate(), "f"))
+          .ToLocalChecked());
+  f->Call(context, env->Global(), 0, NULL).ToLocalChecked();
 
   // Setting message handler to NULL should cause debugger unload.
-  v8::Debug::SetMessageHandler(NULL);
-  CheckDebuggerUnloaded();
+  v8::Debug::SetMessageHandler(env->GetIsolate(), nullptr);
+  CheckDebuggerUnloaded(env->GetIsolate());
 
   // Compilation cache should be disabled when debugger is active.
   CHECK_EQ(1, after_compile_message_count);
@@ -6465,25 +6777,30 @@
   DebugLocalContext env;
   v8::HandleScope scope(env->GetIsolate());
 
+  v8::Local<v8::Context> context = env.context();
   // For this test, we want to break on uncaught exceptions:
   ChangeBreakOnException(false, true);
 
   exception_event_count = 0;
   const char* script = "function f() {throw new Error()};";
 
-  v8::Debug::SetMessageHandler(AfterCompileMessageHandler);
-  v8::Script::Compile(v8::String::NewFromUtf8(env->GetIsolate(), script))
-      ->Run();
-  v8::Debug::SetMessageHandler(NULL);
+  v8::Debug::SetMessageHandler(env->GetIsolate(), AfterCompileMessageHandler);
+  v8::Script::Compile(context, v8_str(env->GetIsolate(), script))
+      .ToLocalChecked()
+      ->Run(context)
+      .ToLocalChecked();
+  v8::Debug::SetMessageHandler(env->GetIsolate(), nullptr);
 
-  v8::Debug::SetMessageHandler(ExceptionMessageHandler);
+  v8::Debug::SetMessageHandler(env->GetIsolate(), ExceptionMessageHandler);
   v8::Local<v8::Function> f = v8::Local<v8::Function>::Cast(
-      env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "f")));
-  f->Call(env->Global(), 0, NULL);
+      env->Global()
+          ->Get(context, v8_str(env->GetIsolate(), "f"))
+          .ToLocalChecked());
+  CHECK(f->Call(context, env->Global(), 0, NULL).IsEmpty());
 
   // Setting message handler to NULL should cause debugger unload.
-  v8::Debug::SetMessageHandler(NULL);
-  CheckDebuggerUnloaded();
+  v8::Debug::SetMessageHandler(env->GetIsolate(), nullptr);
+  CheckDebuggerUnloaded(env->GetIsolate());
 
   CHECK_EQ(1, exception_event_count);
 }
@@ -6498,6 +6815,9 @@
   const char* script = "function f() {};";
   const char* resource_name = "test_resource";
 
+  v8::Debug::SetMessageHandler(env->GetIsolate(), AfterCompileMessageHandler);
+  v8::Local<v8::Context> context = env.context();
+
   // Set a couple of provisional breakpoint on lines out of the script lines
   // range.
   int sbp1 = SetScriptBreakPointByNameFromJS(env->GetIsolate(), resource_name,
@@ -6506,16 +6826,16 @@
       SetScriptBreakPointByNameFromJS(env->GetIsolate(), resource_name, 5, 5);
 
   after_compile_message_count = 0;
-  v8::Debug::SetMessageHandler(AfterCompileMessageHandler);
 
-  v8::ScriptOrigin origin(
-      v8::String::NewFromUtf8(env->GetIsolate(), resource_name),
-      v8::Integer::New(env->GetIsolate(), 10),
-      v8::Integer::New(env->GetIsolate(), 1));
+  v8::ScriptOrigin origin(v8_str(env->GetIsolate(), resource_name),
+                          v8::Integer::New(env->GetIsolate(), 10),
+                          v8::Integer::New(env->GetIsolate(), 1));
   // Compile a script whose first line number is greater than the breakpoints'
   // lines.
-  v8::Script::Compile(v8::String::NewFromUtf8(env->GetIsolate(), script),
-                      &origin)->Run();
+  v8::Script::Compile(context, v8_str(env->GetIsolate(), script), &origin)
+      .ToLocalChecked()
+      ->Run(context)
+      .ToLocalChecked();
 
   // If the script is compiled successfully there is exactly one after compile
   // event. In case of an exception in debugger code after compile event is not
@@ -6524,7 +6844,7 @@
 
   ClearBreakPointFromJS(env->GetIsolate(), sbp1);
   ClearBreakPointFromJS(env->GetIsolate(), sbp2);
-  v8::Debug::SetMessageHandler(NULL);
+  v8::Debug::SetMessageHandler(env->GetIsolate(), nullptr);
 }
 
 
@@ -6556,9 +6876,10 @@
 TEST(NoDebugBreakInAfterCompileMessageHandler) {
   DebugLocalContext env;
   v8::HandleScope scope(env->GetIsolate());
+  v8::Local<v8::Context> context = env.context();
 
   // Register a debug event listener which sets the break flag and counts.
-  v8::Debug::SetMessageHandler(BreakMessageHandler);
+  v8::Debug::SetMessageHandler(env->GetIsolate(), BreakMessageHandler);
 
   // Set the debug break flag.
   v8::Debug::DebugBreak(env->GetIsolate());
@@ -6572,13 +6893,13 @@
 
   // Set the debug break flag again.
   v8::Debug::DebugBreak(env->GetIsolate());
-  f->Call(env->Global(), 0, NULL);
+  f->Call(context, env->Global(), 0, NULL).ToLocalChecked();
   // There should be one more break event when the script is evaluated in 'f'.
   CHECK_EQ(2, break_point_hit_count);
 
   // Get rid of the debug message handler.
-  v8::Debug::SetMessageHandler(NULL);
-  CheckDebuggerUnloaded();
+  v8::Debug::SetMessageHandler(env->GetIsolate(), nullptr);
+  CheckDebuggerUnloaded(env->GetIsolate());
 }
 
 
@@ -6597,7 +6918,7 @@
 
   counting_message_handler_counter = 0;
 
-  v8::Debug::SetMessageHandler(CountingMessageHandler);
+  v8::Debug::SetMessageHandler(isolate, CountingMessageHandler);
 
   const int kBufferSize = 1000;
   uint16_t buffer[kBufferSize];
@@ -6611,7 +6932,7 @@
       isolate, buffer, AsciiToUtf16(scripts_command, buffer));
 
   CHECK_EQ(0, counting_message_handler_counter);
-  v8::Debug::ProcessDebugMessages();
+  v8::Debug::ProcessDebugMessages(isolate);
   // At least one message should come
   CHECK_GE(counting_message_handler_counter, 1);
 
@@ -6622,13 +6943,13 @@
   v8::Debug::SendCommand(
       isolate, buffer, AsciiToUtf16(scripts_command, buffer));
   CHECK_EQ(0, counting_message_handler_counter);
-  v8::Debug::ProcessDebugMessages();
+  v8::Debug::ProcessDebugMessages(isolate);
   // At least two messages should come
   CHECK_GE(counting_message_handler_counter, 2);
 
   // Get rid of the debug message handler.
-  v8::Debug::SetMessageHandler(NULL);
-  CheckDebuggerUnloaded();
+  v8::Debug::SetMessageHandler(isolate, nullptr);
+  CheckDebuggerUnloaded(isolate);
 }
 
 
@@ -6674,7 +6995,7 @@
                 timer.Elapsed().InMillisecondsF());
     }
 
-    v8::V8::TerminateExecution(isolate_);
+    isolate_->TerminateExecution();
   }
 
   void StartSending() { semaphore_.Signal(); }
@@ -6695,24 +7016,28 @@
   DebugLocalContext env;
   v8::Isolate* isolate = env->GetIsolate();
   v8::HandleScope scope(isolate);
+  v8::Local<v8::Context> context = env.context();
 
   counting_message_handler_counter = 0;
 
   v8::Debug::SetMessageHandler(
-      SendCommandThread::CountingAndSignallingMessageHandler);
+      isolate, SendCommandThread::CountingAndSignallingMessageHandler);
   send_command_thread_ = new SendCommandThread(isolate);
   send_command_thread_->Start();
 
-  v8::Handle<v8::FunctionTemplate> start =
+  v8::Local<v8::FunctionTemplate> start =
       v8::FunctionTemplate::New(isolate, StartSendingCommands);
-  env->Global()->Set(v8_str("start"), start->GetFunction());
+  CHECK(env->Global()
+            ->Set(context, v8_str("start"),
+                  start->GetFunction(context).ToLocalChecked())
+            .FromJust());
 
   CompileRun("start(); while (true) { }");
 
   CHECK_EQ(20, counting_message_handler_counter);
 
-  v8::Debug::SetMessageHandler(NULL);
-  CheckDebuggerUnloaded();
+  v8::Debug::SetMessageHandler(isolate, nullptr);
+  CheckDebuggerUnloaded(isolate);
 }
 
 
@@ -6738,8 +7063,9 @@
   DebugLocalContext env;
   v8::Isolate* isolate = env->GetIsolate();
   v8::HandleScope scope(isolate);
+  v8::Local<v8::Context> context = env.context();
 
-  v8::Debug::SetMessageHandler(BacktraceData::MessageHandler);
+  v8::Debug::SetMessageHandler(isolate, BacktraceData::MessageHandler);
 
   const int kBufferSize = 1000;
   uint16_t buffer[kBufferSize];
@@ -6755,12 +7081,11 @@
       buffer,
       AsciiToUtf16(scripts_command, buffer),
       NULL);
-  v8::Debug::ProcessDebugMessages();
+  v8::Debug::ProcessDebugMessages(isolate);
   CHECK_EQ(BacktraceData::frame_counter, 0);
 
-  v8::Handle<v8::String> void0 =
-      v8::String::NewFromUtf8(env->GetIsolate(), "void(0)");
-  v8::Handle<v8::Script> script = CompileWithOrigin(void0, void0);
+  v8::Local<v8::String> void0 = v8_str(env->GetIsolate(), "void(0)");
+  v8::Local<v8::Script> script = CompileWithOrigin(void0, void0);
 
   // Check backtrace from "void(0)" script.
   BacktraceData::frame_counter = -10;
@@ -6769,12 +7094,12 @@
       buffer,
       AsciiToUtf16(scripts_command, buffer),
       NULL);
-  script->Run();
+  script->Run(context).ToLocalChecked();
   CHECK_EQ(BacktraceData::frame_counter, 1);
 
   // Get rid of the debug message handler.
-  v8::Debug::SetMessageHandler(NULL);
-  CheckDebuggerUnloaded();
+  v8::Debug::SetMessageHandler(isolate, nullptr);
+  CheckDebuggerUnloaded(isolate);
 }
 
 
@@ -6782,19 +7107,23 @@
   DebugLocalContext env;
   v8::Isolate* isolate = env->GetIsolate();
   v8::HandleScope scope(isolate);
-  v8::Handle<v8::Value> obj =
-      v8::Debug::GetMirror(v8::String::NewFromUtf8(isolate, "hodja"));
+  v8::Local<v8::Context> context = env.context();
+  v8::Local<v8::Value> obj =
+      v8::Debug::GetMirror(context, v8_str(isolate, "hodja")).ToLocalChecked();
   v8::ScriptCompiler::Source source(v8_str(
       "function runTest(mirror) {"
       "  return mirror.isString() && (mirror.length() == 5);"
       "}"
       ""
       "runTest;"));
-  v8::Handle<v8::Function> run_test = v8::Handle<v8::Function>::Cast(
-      v8::ScriptCompiler::CompileUnbound(isolate, &source)
+  v8::Local<v8::Function> run_test = v8::Local<v8::Function>::Cast(
+      v8::ScriptCompiler::CompileUnboundScript(isolate, &source)
+          .ToLocalChecked()
           ->BindToCurrentContext()
-          ->Run());
-  v8::Handle<v8::Value> result = run_test->Call(env->Global(), 1, &obj);
+          ->Run(context)
+          .ToLocalChecked());
+  v8::Local<v8::Value> result =
+      run_test->Call(context, env->Global(), 1, &obj).ToLocalChecked();
   CHECK(result->IsTrue());
 }
 
@@ -6803,6 +7132,7 @@
 TEST(DebugBreakFunctionApply) {
   DebugLocalContext env;
   v8::HandleScope scope(env->GetIsolate());
+  v8::Local<v8::Context> context = env.context();
 
   // Create a function for testing breaking in apply.
   v8::Local<v8::Function> foo = CompileFunction(
@@ -6813,7 +7143,7 @@
       "foo");
 
   // Register a debug event listener which steps and counts.
-  v8::Debug::SetDebugEventListener(DebugEventBreakMax);
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventBreakMax);
 
   // Set the debug break flag before calling the code using function.apply.
   v8::Debug::DebugBreak(env->GetIsolate());
@@ -6822,18 +7152,18 @@
   // where this test would enter an infinite loop.
   break_point_hit_count = 0;
   max_break_point_hit_count = 10000;  // 10000 => infinite loop.
-  foo->Call(env->Global(), 0, NULL);
+  foo->Call(context, env->Global(), 0, NULL).ToLocalChecked();
 
   // When keeping the debug break several break will happen.
   CHECK_GT(break_point_hit_count, 1);
 
-  v8::Debug::SetDebugEventListener(NULL);
-  CheckDebuggerUnloaded();
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr);
+  CheckDebuggerUnloaded(env->GetIsolate());
 }
 
 
-v8::Handle<v8::Context> debugee_context;
-v8::Handle<v8::Context> debugger_context;
+v8::Local<v8::Context> debugee_context;
+v8::Local<v8::Context> debugger_context;
 
 
 // Property getter that checks that current and calling contexts
@@ -6842,12 +7172,9 @@
     v8::Local<v8::String> name,
     const v8::PropertyCallbackInfo<v8::Value>& info) {
   CHECK_EQ(0, strcmp(*v8::String::Utf8Value(name), "a"));
-  v8::Handle<v8::Context> current = info.GetIsolate()->GetCurrentContext();
+  v8::Local<v8::Context> current = info.GetIsolate()->GetCurrentContext();
   CHECK(current == debugee_context);
   CHECK(current != debugger_context);
-  v8::Handle<v8::Context> calling = info.GetIsolate()->GetCallingContext();
-  CHECK(calling == debugee_context);
-  CHECK(calling != debugger_context);
   info.GetReturnValue().Set(1);
 }
 
@@ -6858,18 +7185,19 @@
 static void DebugEventGetAtgumentPropertyValue(
     const v8::Debug::EventDetails& event_details) {
   v8::DebugEvent event = event_details.GetEvent();
-  v8::Handle<v8::Object> exec_state = event_details.GetExecutionState();
+  v8::Local<v8::Object> exec_state = event_details.GetExecutionState();
   if (event == v8::Break) {
     break_point_hit_count++;
     CHECK(debugger_context == CcTest::isolate()->GetCurrentContext());
-    v8::Handle<v8::Function> func = v8::Handle<v8::Function>::Cast(CompileRun(
+    v8::Local<v8::Function> func = v8::Local<v8::Function>::Cast(CompileRun(
         "(function(exec_state) {\n"
         "    return (exec_state.frame(0).argumentValue(0).property('a').\n"
         "            value().value() == 1);\n"
         "})"));
     const int argc = 1;
-    v8::Handle<v8::Value> argv[argc] = { exec_state };
-    v8::Handle<v8::Value> result = func->Call(exec_state, argc, argv);
+    v8::Local<v8::Value> argv[argc] = {exec_state};
+    v8::Local<v8::Value> result =
+        func->Call(debugger_context, exec_state, argc, argv).ToLocalChecked();
     CHECK(result->IsTrue());
   }
 }
@@ -6889,14 +7217,15 @@
   debugger_context = v8::Utils::ToLocal(debug->debug_context());
 
   // Create object with 'a' property accessor.
-  v8::Handle<v8::ObjectTemplate> named = v8::ObjectTemplate::New(isolate);
-  named->SetAccessor(v8::String::NewFromUtf8(isolate, "a"),
-                     NamedGetterWithCallingContextCheck);
-  env->Global()->Set(v8::String::NewFromUtf8(isolate, "obj"),
-                     named->NewInstance());
+  v8::Local<v8::ObjectTemplate> named = v8::ObjectTemplate::New(isolate);
+  named->SetAccessor(v8_str(isolate, "a"), NamedGetterWithCallingContextCheck);
+  CHECK(env->Global()
+            ->Set(debugee_context, v8_str(isolate, "obj"),
+                  named->NewInstance(debugee_context).ToLocalChecked())
+            .FromJust());
 
   // Register the debug event listener
-  v8::Debug::SetDebugEventListener(DebugEventGetAtgumentPropertyValue);
+  v8::Debug::SetDebugEventListener(isolate, DebugEventGetAtgumentPropertyValue);
 
   // Create a function that invokes debugger.
   v8::Local<v8::Function> foo = CompileFunction(
@@ -6906,31 +7235,44 @@
       "foo");
 
   break_point_hit_count = 0;
-  foo->Call(env->Global(), 0, NULL);
+  foo->Call(debugee_context, env->Global(), 0, NULL).ToLocalChecked();
   CHECK_EQ(1, break_point_hit_count);
 
-  v8::Debug::SetDebugEventListener(NULL);
-  debugee_context = v8::Handle<v8::Context>();
-  debugger_context = v8::Handle<v8::Context>();
-  CheckDebuggerUnloaded();
+  v8::Debug::SetDebugEventListener(isolate, nullptr);
+  debugee_context = v8::Local<v8::Context>();
+  debugger_context = v8::Local<v8::Context>();
+  CheckDebuggerUnloaded(isolate);
 }
 
 
 TEST(DebugContextIsPreservedBetweenAccesses) {
   v8::HandleScope scope(CcTest::isolate());
-  v8::Debug::SetDebugEventListener(DebugEventBreakPointHitCount);
-  v8::Local<v8::Context> context1 = v8::Debug::GetDebugContext();
-  v8::Local<v8::Context> context2 = v8::Debug::GetDebugContext();
+  v8::Debug::SetDebugEventListener(CcTest::isolate(),
+                                   DebugEventBreakPointHitCount);
+  v8::Local<v8::Context> context1 =
+      v8::Debug::GetDebugContext(CcTest::isolate());
+  v8::Local<v8::Context> context2 =
+      v8::Debug::GetDebugContext(CcTest::isolate());
   CHECK(v8::Utils::OpenHandle(*context1).is_identical_to(
             v8::Utils::OpenHandle(*context2)));
-  v8::Debug::SetDebugEventListener(NULL);
+  v8::Debug::SetDebugEventListener(CcTest::isolate(), nullptr);
 }
 
 
-static v8::Handle<v8::Value> expected_callback_data;
+TEST(NoDebugContextWhenDebuggerDisabled) {
+  v8::HandleScope scope(CcTest::isolate());
+  v8::Local<v8::Context> context =
+      v8::Debug::GetDebugContext(CcTest::isolate());
+  CHECK(context.IsEmpty());
+}
+
+
+static v8::Local<v8::Value> expected_callback_data;
 static void DebugEventContextChecker(const v8::Debug::EventDetails& details) {
   CHECK(details.GetEventContext() == expected_context);
-  CHECK_EQ(expected_callback_data, details.GetCallbackData());
+  CHECK(expected_callback_data->Equals(details.GetEventContext(),
+                                       details.GetCallbackData())
+            .FromJust());
 }
 
 
@@ -6940,112 +7282,42 @@
   v8::HandleScope scope(isolate);
   expected_context = v8::Context::New(isolate);
   expected_callback_data = v8::Int32::New(isolate, 2010);
-  v8::Debug::SetDebugEventListener(DebugEventContextChecker,
-                                    expected_callback_data);
+  v8::Debug::SetDebugEventListener(isolate, DebugEventContextChecker,
+                                   expected_callback_data);
   v8::Context::Scope context_scope(expected_context);
-  v8::Script::Compile(
-      v8::String::NewFromUtf8(isolate, "(function(){debugger;})();"))->Run();
+  v8::Script::Compile(expected_context,
+                      v8_str(isolate, "(function(){debugger;})();"))
+      .ToLocalChecked()
+      ->Run(expected_context)
+      .ToLocalChecked();
   expected_context.Clear();
-  v8::Debug::SetDebugEventListener(NULL);
-  expected_context_data = v8::Handle<v8::Value>();
-  CheckDebuggerUnloaded();
+  v8::Debug::SetDebugEventListener(isolate, nullptr);
+  expected_context_data = v8::Local<v8::Value>();
+  CheckDebuggerUnloaded(isolate);
 }
 
 
-static void* expected_break_data;
-static bool was_debug_break_called;
-static bool was_debug_event_called;
-static void DebugEventBreakDataChecker(const v8::Debug::EventDetails& details) {
-  if (details.GetEvent() == v8::BreakForCommand) {
-    CHECK_EQ(expected_break_data, details.GetClientData());
-    was_debug_event_called = true;
-  } else if (details.GetEvent() == v8::Break) {
-    was_debug_break_called = true;
-  }
-}
-
-
-// Check that event details contain context where debug event occured.
-TEST(DebugEventBreakData) {
-  DebugLocalContext env;
-  v8::Isolate* isolate = env->GetIsolate();
-  v8::HandleScope scope(isolate);
-  v8::Debug::SetDebugEventListener(DebugEventBreakDataChecker);
-
-  TestClientData::constructor_call_counter = 0;
-  TestClientData::destructor_call_counter = 0;
-
-  expected_break_data = NULL;
-  was_debug_event_called = false;
-  was_debug_break_called = false;
-  v8::Debug::DebugBreakForCommand(isolate, NULL);
-  v8::Script::Compile(v8::String::NewFromUtf8(env->GetIsolate(),
-                                              "(function(x){return x;})(1);"))
-      ->Run();
-  CHECK(was_debug_event_called);
-  CHECK(!was_debug_break_called);
-
-  TestClientData* data1 = new TestClientData();
-  expected_break_data = data1;
-  was_debug_event_called = false;
-  was_debug_break_called = false;
-  v8::Debug::DebugBreakForCommand(isolate, data1);
-  v8::Script::Compile(v8::String::NewFromUtf8(env->GetIsolate(),
-                                              "(function(x){return x+1;})(1);"))
-      ->Run();
-  CHECK(was_debug_event_called);
-  CHECK(!was_debug_break_called);
-
-  expected_break_data = NULL;
-  was_debug_event_called = false;
-  was_debug_break_called = false;
-  v8::Debug::DebugBreak(isolate);
-  v8::Script::Compile(v8::String::NewFromUtf8(env->GetIsolate(),
-                                              "(function(x){return x+2;})(1);"))
-      ->Run();
-  CHECK(!was_debug_event_called);
-  CHECK(was_debug_break_called);
-
-  TestClientData* data2 = new TestClientData();
-  expected_break_data = data2;
-  was_debug_event_called = false;
-  was_debug_break_called = false;
-  v8::Debug::DebugBreak(isolate);
-  v8::Debug::DebugBreakForCommand(isolate, data2);
-  v8::Script::Compile(v8::String::NewFromUtf8(env->GetIsolate(),
-                                              "(function(x){return x+3;})(1);"))
-      ->Run();
-  CHECK(was_debug_event_called);
-  CHECK(was_debug_break_called);
-
-  CHECK_EQ(2, TestClientData::constructor_call_counter);
-  CHECK_EQ(TestClientData::constructor_call_counter,
-           TestClientData::destructor_call_counter);
-
-  v8::Debug::SetDebugEventListener(NULL);
-  CheckDebuggerUnloaded();
-}
-
 static bool debug_event_break_deoptimize_done = false;
 
 static void DebugEventBreakDeoptimize(
     const v8::Debug::EventDetails& event_details) {
   v8::DebugEvent event = event_details.GetEvent();
-  v8::Handle<v8::Object> exec_state = event_details.GetExecutionState();
+  v8::Local<v8::Object> exec_state = event_details.GetExecutionState();
+  v8::Local<v8::Context> context = CcTest::isolate()->GetCurrentContext();
   if (event == v8::Break) {
     if (!frame_function_name.IsEmpty()) {
       // Get the name of the function.
       const int argc = 2;
-      v8::Handle<v8::Value> argv[argc] = {
-        exec_state, v8::Integer::New(CcTest::isolate(), 0)
-      };
-      v8::Handle<v8::Value> result =
-          frame_function_name->Call(exec_state, argc, argv);
+      v8::Local<v8::Value> argv[argc] = {
+          exec_state, v8::Integer::New(CcTest::isolate(), 0)};
+      v8::Local<v8::Value> result =
+          frame_function_name->Call(context, exec_state, argc, argv)
+              .ToLocalChecked();
       if (!result->IsUndefined()) {
         char fn[80];
         CHECK(result->IsString());
-        v8::Handle<v8::String> function_name(
-            result->ToString(CcTest::isolate()));
+        v8::Local<v8::String> function_name(
+            result->ToString(context).ToLocalChecked());
         function_name->WriteUtf8(fn);
         if (strcmp(fn, "bar") == 0) {
           i::Deoptimizer::DeoptimizeAll(CcTest::i_isolate());
@@ -7065,32 +7337,32 @@
   DebugLocalContext env;
   v8::HandleScope scope(env->GetIsolate());
   env.ExposeDebug();
+  v8::Local<v8::Context> context = env.context();
 
   // Create a function for checking the function when hitting a break point.
   frame_function_name = CompileFunction(&env,
                                         frame_function_name_source,
                                         "frame_function_name");
 
-
   // Set a debug event listener which will keep interrupting execution until
   // debug break. When inside function bar it will deoptimize all functions.
   // This tests lazy deoptimization bailout for the stack check, as the first
   // time in function bar when using debug break and no break points will be at
   // the initial stack check.
-  v8::Debug::SetDebugEventListener(DebugEventBreakDeoptimize);
+  v8::Debug::SetDebugEventListener(env->GetIsolate(),
+                                   DebugEventBreakDeoptimize);
 
   // Compile and run function bar which will optimize it for some flag settings.
-  v8::Script::Compile(v8::String::NewFromUtf8(
-                          env->GetIsolate(), "function bar(){}; bar()"))->Run();
+  v8::Local<v8::Function> f = CompileFunction(&env, "function bar(){}", "bar");
+  f->Call(context, v8::Undefined(env->GetIsolate()), 0, NULL).ToLocalChecked();
 
   // Set debug break and call bar again.
   v8::Debug::DebugBreak(env->GetIsolate());
-  v8::Script::Compile(v8::String::NewFromUtf8(env->GetIsolate(), "bar()"))
-      ->Run();
+  f->Call(context, v8::Undefined(env->GetIsolate()), 0, NULL).ToLocalChecked();
 
   CHECK(debug_event_break_deoptimize_done);
 
-  v8::Debug::SetDebugEventListener(NULL);
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr);
 }
 
 
@@ -7098,46 +7370,58 @@
     const v8::Debug::EventDetails& event_details) {
   v8::Isolate* isolate = event_details.GetEventContext()->GetIsolate();
   v8::DebugEvent event = event_details.GetEvent();
-  v8::Handle<v8::Object> exec_state = event_details.GetExecutionState();
+  v8::Local<v8::Object> exec_state = event_details.GetExecutionState();
+  v8::Local<v8::Context> context = isolate->GetCurrentContext();
   if (event == v8::Break) {
     if (!frame_function_name.IsEmpty()) {
       for (int i = 0; i < 2; i++) {
         const int argc = 2;
-        v8::Handle<v8::Value> argv[argc] = {
-          exec_state, v8::Integer::New(isolate, i)
-        };
+        v8::Local<v8::Value> argv[argc] = {exec_state,
+                                           v8::Integer::New(isolate, i)};
         // Get the name of the function in frame i.
-        v8::Handle<v8::Value> result =
-            frame_function_name->Call(exec_state, argc, argv);
+        v8::Local<v8::Value> result =
+            frame_function_name->Call(context, exec_state, argc, argv)
+                .ToLocalChecked();
         CHECK(result->IsString());
-        v8::Handle<v8::String> function_name(result->ToString(isolate));
-        CHECK(function_name->Equals(v8::String::NewFromUtf8(isolate, "loop")));
+        v8::Local<v8::String> function_name(
+            result->ToString(context).ToLocalChecked());
+        CHECK(
+            function_name->Equals(context, v8_str(isolate, "loop")).FromJust());
         // Get the name of the first argument in frame i.
-        result = frame_argument_name->Call(exec_state, argc, argv);
+        result = frame_argument_name->Call(context, exec_state, argc, argv)
+                     .ToLocalChecked();
         CHECK(result->IsString());
-        v8::Handle<v8::String> argument_name(result->ToString(isolate));
-        CHECK(argument_name->Equals(v8::String::NewFromUtf8(isolate, "count")));
+        v8::Local<v8::String> argument_name(
+            result->ToString(context).ToLocalChecked());
+        CHECK(argument_name->Equals(context, v8_str(isolate, "count"))
+                  .FromJust());
         // Get the value of the first argument in frame i. If the
         // funtion is optimized the value will be undefined, otherwise
         // the value will be '1 - i'.
         //
         // TODO(3141533): We should be able to get the real value for
         // optimized frames.
-        result = frame_argument_value->Call(exec_state, argc, argv);
-        CHECK(result->IsUndefined() || (result->Int32Value() == 1 - i));
+        result = frame_argument_value->Call(context, exec_state, argc, argv)
+                     .ToLocalChecked();
+        CHECK(result->IsUndefined() ||
+              (result->Int32Value(context).FromJust() == 1 - i));
         // Get the name of the first local variable.
-        result = frame_local_name->Call(exec_state, argc, argv);
+        result = frame_local_name->Call(context, exec_state, argc, argv)
+                     .ToLocalChecked();
         CHECK(result->IsString());
-        v8::Handle<v8::String> local_name(result->ToString(isolate));
-        CHECK(local_name->Equals(v8::String::NewFromUtf8(isolate, "local")));
+        v8::Local<v8::String> local_name(
+            result->ToString(context).ToLocalChecked());
+        CHECK(local_name->Equals(context, v8_str(isolate, "local")).FromJust());
         // Get the value of the first local variable. If the function
         // is optimized the value will be undefined, otherwise it will
         // be 42.
         //
         // TODO(3141533): We should be able to get the real value for
         // optimized frames.
-        result = frame_local_value->Call(exec_state, argc, argv);
-        CHECK(result->IsUndefined() || (result->Int32Value() == 42));
+        result = frame_local_value->Call(context, exec_state, argc, argv)
+                     .ToLocalChecked();
+        CHECK(result->IsUndefined() ||
+              (result->Int32Value(context).FromJust() == 42));
       }
     }
   }
@@ -7145,7 +7429,8 @@
 
 
 static void ScheduleBreak(const v8::FunctionCallbackInfo<v8::Value>& args) {
-  v8::Debug::SetDebugEventListener(DebugEventBreakWithOptimizedStack);
+  v8::Debug::SetDebugEventListener(args.GetIsolate(),
+                                   DebugEventBreakWithOptimizedStack);
   v8::Debug::DebugBreak(args.GetIsolate());
 }
 
@@ -7153,6 +7438,7 @@
 TEST(DebugBreakStackInspection) {
   DebugLocalContext env;
   v8::HandleScope scope(env->GetIsolate());
+  v8::Local<v8::Context> context = env.context();
 
   frame_function_name =
       CompileFunction(&env, frame_function_name_source, "frame_function_name");
@@ -7166,11 +7452,13 @@
   frame_local_value =
       CompileFunction(&env, frame_local_value_source, "frame_local_value");
 
-  v8::Handle<v8::FunctionTemplate> schedule_break_template =
+  v8::Local<v8::FunctionTemplate> schedule_break_template =
       v8::FunctionTemplate::New(env->GetIsolate(), ScheduleBreak);
-  v8::Handle<v8::Function> schedule_break =
-      schedule_break_template->GetFunction();
-  env->Global()->Set(v8_str("scheduleBreak"), schedule_break);
+  v8::Local<v8::Function> schedule_break =
+      schedule_break_template->GetFunction(context).ToLocalChecked();
+  CHECK(env->Global()
+            ->Set(context, v8_str("scheduleBreak"), schedule_break)
+            .FromJust());
 
   const char* src =
       "function loop(count) {"
@@ -7178,7 +7466,10 @@
       "  if (count < 1) { scheduleBreak(); loop(count + 1); }"
       "}"
       "loop(0);";
-  v8::Script::Compile(v8::String::NewFromUtf8(env->GetIsolate(), src))->Run();
+  v8::Script::Compile(context, v8_str(env->GetIsolate(), src))
+      .ToLocalChecked()
+      ->Run(context)
+      .ToLocalChecked();
 }
 
 
@@ -7186,15 +7477,22 @@
 static void TestDebugBreakInLoop(const char* loop_head,
                                  const char** loop_bodies,
                                  const char* loop_tail) {
-  // Receive 100 breaks for each test and then terminate JavaScript execution.
-  static const int kBreaksPerTest = 100;
+  // Receive 10 breaks for each test and then terminate JavaScript execution.
+  static const int kBreaksPerTest = 10;
 
   for (int i = 0; loop_bodies[i] != NULL; i++) {
     // Perform a lazy deoptimization after various numbers of breaks
     // have been hit.
-    for (int j = 0; j < 7; j++) {
+
+    EmbeddedVector<char, 1024> buffer;
+    SNPrintF(buffer, "function f() {%s%s%s}", loop_head, loop_bodies[i],
+             loop_tail);
+
+    i::PrintF("%s\n", buffer.start());
+
+    for (int j = 0; j < 3; j++) {
       break_point_hit_count_deoptimize = j;
-      if (j == 6) {
+      if (j == 2) {
         break_point_hit_count_deoptimize = kBreaksPerTest;
       }
 
@@ -7202,11 +7500,6 @@
       max_break_point_hit_count = kBreaksPerTest;
       terminate_after_max_break_point_hit = true;
 
-      EmbeddedVector<char, 1024> buffer;
-      SNPrintF(buffer,
-               "function f() {%s%s%s}",
-               loop_head, loop_bodies[i], loop_tail);
-
       // Function with infinite loop.
       CompileRun(buffer.start());
 
@@ -7217,53 +7510,104 @@
       CompileRun("f();");
       CHECK_EQ(kBreaksPerTest, break_point_hit_count);
 
-      CHECK(!v8::V8::IsExecutionTerminating());
+      CHECK(!CcTest::isolate()->IsExecutionTerminating());
     }
   }
 }
 
 
-TEST(DebugBreakLoop) {
+static const char* loop_bodies_1[] = {"",
+                                      "g()",
+                                      "if (a == 0) { g() }",
+                                      "if (a == 1) { g() }",
+                                      "if (a == 0) { g() } else { h() }",
+                                      "if (a == 0) { continue }",
+                                      NULL};
+
+
+static const char* loop_bodies_2[] = {
+    "if (a == 1) { continue }",
+    "switch (a) { case 1: g(); }",
+    "switch (a) { case 1: continue; }",
+    "switch (a) { case 1: g(); break; default: h() }",
+    "switch (a) { case 1: continue; break; default: h() }",
+    NULL};
+
+
+void DebugBreakLoop(const char* loop_header, const char** loop_bodies,
+                    const char* loop_footer) {
   DebugLocalContext env;
   v8::HandleScope scope(env->GetIsolate());
 
   // Register a debug event listener which sets the break flag and counts.
-  v8::Debug::SetDebugEventListener(DebugEventBreakMax);
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventBreakMax);
 
-  // Create a function for getting the frame count when hitting the break.
-  frame_count = CompileFunction(&env, frame_count_source, "frame_count");
+  CompileRun(
+      "var a = 1;\n"
+      "function g() { }\n"
+      "function h() { }");
 
-  CompileRun("var a = 1;");
-  CompileRun("function g() { }");
-  CompileRun("function h() { }");
-
-  const char* loop_bodies[] = {
-      "",
-      "g()",
-      "if (a == 0) { g() }",
-      "if (a == 1) { g() }",
-      "if (a == 0) { g() } else { h() }",
-      "if (a == 0) { continue }",
-      "if (a == 1) { continue }",
-      "switch (a) { case 1: g(); }",
-      "switch (a) { case 1: continue; }",
-      "switch (a) { case 1: g(); break; default: h() }",
-      "switch (a) { case 1: continue; break; default: h() }",
-      NULL
-  };
-
-  TestDebugBreakInLoop("while (true) {", loop_bodies, "}");
-  TestDebugBreakInLoop("while (a == 1) {", loop_bodies, "}");
-
-  TestDebugBreakInLoop("do {", loop_bodies, "} while (true)");
-  TestDebugBreakInLoop("do {", loop_bodies, "} while (a == 1)");
-
-  TestDebugBreakInLoop("for (;;) {", loop_bodies, "}");
-  TestDebugBreakInLoop("for (;a == 1;) {", loop_bodies, "}");
+  TestDebugBreakInLoop(loop_header, loop_bodies, loop_footer);
 
   // Get rid of the debug event listener.
-  v8::Debug::SetDebugEventListener(NULL);
-  CheckDebuggerUnloaded();
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr);
+  CheckDebuggerUnloaded(env->GetIsolate());
+}
+
+
+TEST(DebugBreakInWhileTrue1) {
+  DebugBreakLoop("while (true) {", loop_bodies_1, "}");
+}
+
+
+TEST(DebugBreakInWhileTrue2) {
+  DebugBreakLoop("while (true) {", loop_bodies_2, "}");
+}
+
+
+TEST(DebugBreakInWhileCondition1) {
+  DebugBreakLoop("while (a == 1) {", loop_bodies_1, "}");
+}
+
+
+TEST(DebugBreakInWhileCondition2) {
+  DebugBreakLoop("while (a == 1) {", loop_bodies_2, "}");
+}
+
+
+TEST(DebugBreakInDoWhileTrue1) {
+  DebugBreakLoop("do {", loop_bodies_1, "} while (true)");
+}
+
+
+TEST(DebugBreakInDoWhileTrue2) {
+  DebugBreakLoop("do {", loop_bodies_2, "} while (true)");
+}
+
+
+TEST(DebugBreakInDoWhileCondition1) {
+  DebugBreakLoop("do {", loop_bodies_1, "} while (a == 1)");
+}
+
+
+TEST(DebugBreakInDoWhileCondition2) {
+  DebugBreakLoop("do {", loop_bodies_2, "} while (a == 1)");
+}
+
+
+TEST(DebugBreakInFor1) { DebugBreakLoop("for (;;) {", loop_bodies_1, "}"); }
+
+
+TEST(DebugBreakInFor2) { DebugBreakLoop("for (;;) {", loop_bodies_2, "}"); }
+
+
+TEST(DebugBreakInForCondition1) {
+  DebugBreakLoop("for (;a == 1;) {", loop_bodies_1, "}");
+}
+
+
+TEST(DebugBreakInForCondition2) {
+  DebugBreakLoop("for (;a == 1;) {", loop_bodies_2, "}");
 }
 
 
@@ -7272,6 +7616,7 @@
 static void DebugBreakInlineListener(
     const v8::Debug::EventDetails& event_details) {
   v8::DebugEvent event = event_details.GetEvent();
+  v8::Local<v8::Context> context = CcTest::isolate()->GetCurrentContext();
   if (event != v8::Break) return;
 
   int expected_frame_count = 4;
@@ -7287,7 +7632,7 @@
   SNPrintF(script_vector, "%%GetFrameCount(%d)", break_id);
   v8::Local<v8::Value> result = CompileRun(script);
 
-  int frame_count = result->Int32Value();
+  int frame_count = result->Int32Value(context).FromJust();
   CHECK_EQ(expected_frame_count, frame_count);
 
   for (int i = 0; i < frame_count; i++) {
@@ -7296,10 +7641,11 @@
     SNPrintF(script_vector, "%%GetFrameDetails(%d, %d)[5]", break_id, i);
     v8::Local<v8::Value> result = CompileRun(script);
     CHECK_EQ(expected_line_number[i],
-             i::Script::GetLineNumber(source_script, result->Int32Value()));
+             i::Script::GetLineNumber(source_script,
+                                      result->Int32Value(context).FromJust()));
   }
-  v8::Debug::SetDebugEventListener(NULL);
-  v8::V8::TerminateExecution(CcTest::isolate());
+  v8::Debug::SetDebugEventListener(CcTest::isolate(), nullptr);
+  CcTest::isolate()->TerminateExecution();
 }
 
 
@@ -7307,6 +7653,7 @@
   i::FLAG_allow_natives_syntax = true;
   DebugLocalContext env;
   v8::HandleScope scope(env->GetIsolate());
+  v8::Local<v8::Context> context = env.context();
   const char* source =
       "function debug(b) {             \n"
       "  if (b) debugger;              \n"
@@ -7321,10 +7668,11 @@
       "g(false);                       \n"
       "%OptimizeFunctionOnNextCall(g); \n"
       "g(true);";
-  v8::Debug::SetDebugEventListener(DebugBreakInlineListener);
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugBreakInlineListener);
   inline_script =
-      v8::Script::Compile(v8::String::NewFromUtf8(env->GetIsolate(), source));
-  inline_script->Run();
+      v8::Script::Compile(context, v8_str(env->GetIsolate(), source))
+          .ToLocalChecked();
+  inline_script->Run(context).ToLocalChecked();
 }
 
 
@@ -7338,7 +7686,7 @@
 
 
 static void RunScriptInANewCFrame(const char* source) {
-  v8::TryCatch try_catch;
+  v8::TryCatch try_catch(CcTest::isolate());
   CompileRun(source);
   CHECK(try_catch.HasCaught());
 }
@@ -7355,7 +7703,7 @@
   // on the stack.
   DebugLocalContext env;
   v8::HandleScope scope(env->GetIsolate());
-  v8::Debug::SetDebugEventListener(DebugEventStepNext);
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugEventStepNext);
 
   // We step through the first script.  It exits through an exception.  We run
   // this inside a new frame to record a different FP than the second script
@@ -7367,12 +7715,17 @@
   const char* script_2 = "[0].forEach(function() { });";
   CompileRun(script_2);
 
-  v8::Debug::SetDebugEventListener(NULL);
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr);
 }
 
 
 // Import from test-heap.cc
+namespace v8 {
+namespace internal {
+
 int CountNativeContexts();
+}
+}
 
 
 static void NopListener(const v8::Debug::EventDetails& event_details) {
@@ -7382,17 +7735,17 @@
 TEST(DebuggerCreatesContextIffActive) {
   DebugLocalContext env;
   v8::HandleScope scope(env->GetIsolate());
-  CHECK_EQ(1, CountNativeContexts());
+  CHECK_EQ(1, v8::internal::CountNativeContexts());
 
-  v8::Debug::SetDebugEventListener(NULL);
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr);
   CompileRun("debugger;");
-  CHECK_EQ(1, CountNativeContexts());
+  CHECK_EQ(1, v8::internal::CountNativeContexts());
 
-  v8::Debug::SetDebugEventListener(NopListener);
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), NopListener);
   CompileRun("debugger;");
-  CHECK_EQ(2, CountNativeContexts());
+  CHECK_EQ(2, v8::internal::CountNativeContexts());
 
-  v8::Debug::SetDebugEventListener(NULL);
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr);
 }
 
 
@@ -7422,7 +7775,7 @@
   DebugLocalContext env;
   v8::HandleScope scope(env->GetIsolate());
   env.ExposeDebug();
-  v8::Debug::SetDebugEventListener(DebugBreakInlineListener);
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), DebugBreakInlineListener);
 
   v8::Local<v8::Function> break_here =
       CompileFunction(&env, "function break_here(){}", "break_here");
@@ -7442,10 +7795,10 @@
   v8::Local<v8::Value> result = ParserCacheCompileRun(source);
   CHECK(result->IsString());
   v8::String::Utf8Value utf8(result);
-  CHECK_EQ("bar", *utf8);
+  CHECK_EQ(0, strcmp("bar", *utf8));
 
-  v8::Debug::SetDebugEventListener(NULL);
-  CheckDebuggerUnloaded();
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr);
+  CheckDebuggerUnloaded(env->GetIsolate());
 }
 
 
@@ -7463,12 +7816,16 @@
 TEST(DebugBreakStackTrace) {
   DebugLocalContext env;
   v8::HandleScope scope(env->GetIsolate());
-  v8::Debug::SetDebugEventListener(DebugBreakStackTraceListener);
-  v8::Handle<v8::FunctionTemplate> add_debug_break_template =
+  v8::Debug::SetDebugEventListener(env->GetIsolate(),
+                                   DebugBreakStackTraceListener);
+  v8::Local<v8::Context> context = env.context();
+  v8::Local<v8::FunctionTemplate> add_debug_break_template =
       v8::FunctionTemplate::New(env->GetIsolate(), AddDebugBreak);
-  v8::Handle<v8::Function> add_debug_break =
-      add_debug_break_template->GetFunction();
-  env->Global()->Set(v8_str("add_debug_break"), add_debug_break);
+  v8::Local<v8::Function> add_debug_break =
+      add_debug_break_template->GetFunction(context).ToLocalChecked();
+  CHECK(env->Global()
+            ->Set(context, v8_str("add_debug_break"), add_debug_break)
+            .FromJust());
 
   CompileRun("(function loop() {"
              "  for (var j = 0; j < 1000; j++) {"
@@ -7502,7 +7859,7 @@
 
   virtual void Run() {
     terminate_requested_semaphore.Wait();
-    v8::V8::TerminateExecution(isolate_);
+    isolate_->TerminateExecution();
     terminate_fired_semaphore.Signal();
   }
 
@@ -7515,10 +7872,10 @@
   DebugLocalContext env;
   v8::Isolate* isolate = env->GetIsolate();
   v8::HandleScope scope(isolate);
-  v8::Debug::SetDebugEventListener(DebugBreakTriggerTerminate);
+  v8::Debug::SetDebugEventListener(isolate, DebugBreakTriggerTerminate);
   TerminationThread terminator(isolate);
   terminator.Start();
-  v8::TryCatch try_catch;
+  v8::TryCatch try_catch(env->GetIsolate());
   v8::Debug::DebugBreak(isolate);
   CompileRun("while (true);");
   CHECK(try_catch.HasTerminated());
@@ -7534,7 +7891,7 @@
 
 static void TryCatchWrappedThrowCallback(
     const v8::FunctionCallbackInfo<v8::Value>& args) {
-  v8::TryCatch try_catch;
+  v8::TryCatch try_catch(args.GetIsolate());
   CompileRun("throw 'rejection';");
   CHECK(try_catch.HasCaught());
 }
@@ -7544,19 +7901,23 @@
   DebugLocalContext env;
   v8::Isolate* isolate = env->GetIsolate();
   v8::HandleScope scope(isolate);
-  v8::Debug::SetDebugEventListener(&DebugEventExpectNoException);
+  v8::Debug::SetDebugEventListener(isolate, &DebugEventExpectNoException);
+  v8::Local<v8::Context> context = env.context();
   ChangeBreakOnException(false, true);
 
-  v8::Handle<v8::FunctionTemplate> fun =
+  v8::Local<v8::FunctionTemplate> fun =
       v8::FunctionTemplate::New(isolate, TryCatchWrappedThrowCallback);
-  env->Global()->Set(v8_str("fun"), fun->GetFunction());
+  CHECK(env->Global()
+            ->Set(context, v8_str("fun"),
+                  fun->GetFunction(context).ToLocalChecked())
+            .FromJust());
 
   CompileRun("var p = new Promise(function(res, rej) { fun(); res(); });");
   CompileRun(
       "var r;"
       "p.chain(function() { r = 'resolved'; },"
       "        function() { r = 'rejected'; });");
-  CHECK(CompileRun("r")->Equals(v8_str("resolved")));
+  CHECK(CompileRun("r")->Equals(context, v8_str("resolved")).FromJust());
 }
 
 
@@ -7579,36 +7940,46 @@
   DebugLocalContext env;
   v8::Isolate* isolate = env->GetIsolate();
   v8::HandleScope scope(isolate);
-  v8::Debug::SetDebugEventListener(&DebugEventCountException);
+  v8::Debug::SetDebugEventListener(isolate, &DebugEventCountException);
+  v8::Local<v8::Context> context = env.context();
   ChangeBreakOnException(false, true);
   exception_event_counter = 0;
 
-  v8::Handle<v8::FunctionTemplate> fun =
+  v8::Local<v8::FunctionTemplate> fun =
       v8::FunctionTemplate::New(isolate, ThrowCallback);
-  env->Global()->Set(v8_str("fun"), fun->GetFunction());
+  CHECK(env->Global()
+            ->Set(context, v8_str("fun"),
+                  fun->GetFunction(context).ToLocalChecked())
+            .FromJust());
 
   CompileRun("var p = new Promise(function(res, rej) { fun(); res(); });");
   CompileRun(
       "var r;"
       "p.chain(function() { r = 'resolved'; },"
       "        function(e) { r = 'rejected' + e; });");
-  CHECK(CompileRun("r")->Equals(v8_str("rejectedrejection")));
+  CHECK(
+      CompileRun("r")->Equals(context, v8_str("rejectedrejection")).FromJust());
   CHECK_EQ(1, exception_event_counter);
 }
 
 
 TEST(DebugBreakOnExceptionInObserveCallback) {
+  i::FLAG_harmony_object_observe = true;
   DebugLocalContext env;
   v8::Isolate* isolate = env->GetIsolate();
   v8::HandleScope scope(isolate);
-  v8::Debug::SetDebugEventListener(&DebugEventCountException);
+  v8::Debug::SetDebugEventListener(isolate, &DebugEventCountException);
+  v8::Local<v8::Context> context = env.context();
   // Break on uncaught exception
   ChangeBreakOnException(false, true);
   exception_event_counter = 0;
 
-  v8::Handle<v8::FunctionTemplate> fun =
+  v8::Local<v8::FunctionTemplate> fun =
       v8::FunctionTemplate::New(isolate, ThrowCallback);
-  env->Global()->Set(v8_str("fun"), fun->GetFunction());
+  CHECK(env->Global()
+            ->Set(context, v8_str("fun"),
+                  fun->GetFunction(context).ToLocalChecked())
+            .FromJust());
 
   CompileRun(
       "var obj = {};"
@@ -7618,7 +7989,7 @@
       "   throw Error('foo');"
       "});"
       "obj.prop = 1");
-  CHECK(CompileRun("callbackRan")->BooleanValue());
+  CHECK(CompileRun("callbackRan")->BooleanValue(context).FromJust());
   CHECK_EQ(1, exception_event_counter);
 }
 
@@ -7656,13 +8027,12 @@
 
 
 TEST(DebugBreakInLexicalScopes) {
-  i::FLAG_harmony_scoping = true;
   i::FLAG_allow_natives_syntax = true;
 
   DebugLocalContext env;
   v8::Isolate* isolate = env->GetIsolate();
   v8::HandleScope scope(isolate);
-  v8::Debug::SetDebugEventListener(DebugHarmonyScopingListener);
+  v8::Debug::SetDebugEventListener(isolate, DebugHarmonyScopingListener);
 
   CompileRun(
       "'use strict';            \n"
@@ -7679,3 +8049,27 @@
       "x * y",
       30);
 }
+
+static int after_compile_handler_depth = 0;
+static void HandleInterrupt(v8::Isolate* isolate, void* data) {
+  CHECK_EQ(0, after_compile_handler_depth);
+}
+
+static void NoInterruptsOnDebugEvent(
+    const v8::Debug::EventDetails& event_details) {
+  if (event_details.GetEvent() != v8::AfterCompile) return;
+  ++after_compile_handler_depth;
+  // Do not allow nested AfterCompile events.
+  CHECK(after_compile_handler_depth <= 1);
+  v8::Isolate* isolate = event_details.GetEventContext()->GetIsolate();
+  isolate->RequestInterrupt(&HandleInterrupt, nullptr);
+  CompileRun("function foo() {}; foo();");
+  --after_compile_handler_depth;
+}
+
+
+TEST(NoInterruptsInDebugListener) {
+  DebugLocalContext env;
+  v8::Debug::SetDebugEventListener(env->GetIsolate(), NoInterruptsOnDebugEvent);
+  CompileRun("void(0);");
+}
