diff --git a/ash/shelf/shelf_view_unittest.cc b/ash/shelf/shelf_view_unittest.cc
index 45c6a5cc51357..ba3874cd940a9 100644
--- a/ash/shelf/shelf_view_unittest.cc
+++ b/ash/shelf/shelf_view_unittest.cc
@@ -2624,12 +2624,12 @@ class ScopedMockTaskRunnerWrapper {
  public:
   ScopedMockTaskRunnerWrapper() {
     mock_task_runner_ = new base::TestMockTimeTaskRunner;
-    previous_task_runner_ = base::MessageLoop::current()->task_runner();
+    previous_task_runner_ = base::ThreadTaskRunnerHandle::Get();
     base::MessageLoop::current()->SetTaskRunner(mock_task_runner_);
   }
 
   ~ScopedMockTaskRunnerWrapper() {
-    DCHECK_EQ(mock_task_runner_, base::MessageLoop::current()->task_runner());
+    DCHECK_EQ(mock_task_runner_, base::ThreadTaskRunnerHandle::Get());
     mock_task_runner_->ClearPendingTasks();
     base::MessageLoop::current()->SetTaskRunner(previous_task_runner_);
   }
diff --git a/base/memory/ref_counted_delete_on_message_loop.h b/base/memory/ref_counted_delete_on_message_loop.h
index de194e8479185..eac1add50fe55 100644
--- a/base/memory/ref_counted_delete_on_message_loop.h
+++ b/base/memory/ref_counted_delete_on_message_loop.h
@@ -33,10 +33,8 @@ namespace base {
 template <class T>
 class RefCountedDeleteOnMessageLoop : public subtle::RefCountedThreadSafeBase {
  public:
-  // This constructor will accept a MessageL00pProxy object, but new code should
-  // prefer a SingleThreadTaskRunner. A SingleThreadTaskRunner for the
-  // MessageLoop on the current thread can be acquired by calling
-  // MessageLoop::current()->task_runner().
+  // A SingleThreadTaskRunner for the current thread can be acquired by calling
+  // ThreadTaskRunnerHandle::Get().
   RefCountedDeleteOnMessageLoop(
       scoped_refptr<SingleThreadTaskRunner> task_runner)
       : task_runner_(std::move(task_runner)) {
diff --git a/base/message_loop/message_loop_test.cc b/base/message_loop/message_loop_test.cc
index 4a690c0e66324..6ffb16d05aedf 100644
--- a/base/message_loop/message_loop_test.cc
+++ b/base/message_loop/message_loop_test.cc
@@ -15,6 +15,7 @@
 #include "base/single_thread_task_runner.h"
 #include "base/synchronization/waitable_event.h"
 #include "base/threading/thread.h"
+#include "base/threading/thread_task_runner_handle.h"
 
 namespace base {
 namespace test {
@@ -97,20 +98,19 @@ void RunTest_PostTask(MessagePumpFactory factory) {
   // Add tests to message loop
   scoped_refptr<Foo> foo(new Foo());
   std::string a("a"), b("b"), c("c"), d("d");
-  MessageLoop::current()->task_runner()->PostTask(FROM_HERE,
-                                                  Bind(&Foo::Test0, foo));
-  MessageLoop::current()->task_runner()->PostTask(
-      FROM_HERE, Bind(&Foo::Test1ConstRef, foo, a));
-  MessageLoop::current()->task_runner()->PostTask(
-      FROM_HERE, Bind(&Foo::Test1Ptr, foo, &b));
-  MessageLoop::current()->task_runner()->PostTask(
-      FROM_HERE, Bind(&Foo::Test1Int, foo, 100));
-  MessageLoop::current()->task_runner()->PostTask(
-      FROM_HERE, Bind(&Foo::Test2Ptr, foo, &a, &c));
-  MessageLoop::current()->task_runner()->PostTask(
-      FROM_HERE, Bind(&Foo::Test2Mixed, foo, a, &d));
+  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, Bind(&Foo::Test0, foo));
+  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
+                                          Bind(&Foo::Test1ConstRef, foo, a));
+  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
+                                          Bind(&Foo::Test1Ptr, foo, &b));
+  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
+                                          Bind(&Foo::Test1Int, foo, 100));
+  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
+                                          Bind(&Foo::Test2Ptr, foo, &a, &c));
+  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
+                                          Bind(&Foo::Test2Mixed, foo, a, &d));
   // After all tests, post a message that will shut down the message loop
-  MessageLoop::current()->task_runner()->PostTask(
+  ThreadTaskRunnerHandle::Get()->PostTask(
       FROM_HERE,
       Bind(&MessageLoop::QuitWhenIdle, Unretained(MessageLoop::current())));
 
@@ -302,7 +302,7 @@ class RecordDeletionProbe : public RefCounted<RecordDeletionProbe> {
   ~RecordDeletionProbe() {
     *was_deleted_ = true;
     if (post_on_delete_.get())
-      MessageLoop::current()->task_runner()->PostTask(
+      ThreadTaskRunnerHandle::Get()->PostTask(
           FROM_HERE, Bind(&RecordDeletionProbe::Run, post_on_delete_));
   }
 
@@ -351,8 +351,8 @@ void RunTest_EnsureDeletion_Chain(MessagePumpFactory factory) {
 void NestingFunc(int* depth) {
   if (*depth > 0) {
     *depth -= 1;
-    MessageLoop::current()->task_runner()->PostTask(FROM_HERE,
-                                                    Bind(&NestingFunc, depth));
+    ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
+                                            Bind(&NestingFunc, depth));
 
     MessageLoop::current()->SetNestableTasksAllowed(true);
     RunLoop().Run();
@@ -365,8 +365,8 @@ void RunTest_Nesting(MessagePumpFactory factory) {
   MessageLoop loop(std::move(pump));
 
   int depth = 100;
-  MessageLoop::current()->task_runner()->PostTask(FROM_HERE,
-                                                  Bind(&NestingFunc, &depth));
+  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
+                                          Bind(&NestingFunc, &depth));
   RunLoop().Run();
   EXPECT_EQ(depth, 0);
 }
@@ -403,10 +403,9 @@ void RunNestedLoop(TestNestingObserver* observer,
   RunLoop nested_loop;
   // Verify that by the time the first task is run the observer has seen the
   // message loop begin.
-  MessageLoop::current()->task_runner()->PostTask(
+  ThreadTaskRunnerHandle::Get()->PostTask(
       FROM_HERE, Bind(&ExpectOneBeginNestedLoop, observer));
-  MessageLoop::current()->task_runner()->PostTask(FROM_HERE,
-                                                  nested_loop.QuitClosure());
+  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, nested_loop.QuitClosure());
   nested_loop.Run();
 
   // Quitting message loops doesn't change the begin count.
@@ -518,7 +517,7 @@ void RecursiveFunc(TaskList* order, int cookie, int depth,
   if (depth > 0) {
     if (is_reentrant)
       MessageLoop::current()->SetNestableTasksAllowed(true);
-    MessageLoop::current()->task_runner()->PostTask(
+    ThreadTaskRunnerHandle::Get()->PostTask(
         FROM_HERE,
         Bind(&RecursiveFunc, order, cookie, depth - 1, is_reentrant));
   }
@@ -536,12 +535,12 @@ void RunTest_RecursiveDenial1(MessagePumpFactory factory) {
 
   EXPECT_TRUE(MessageLoop::current()->NestableTasksAllowed());
   TaskList order;
-  MessageLoop::current()->task_runner()->PostTask(
+  ThreadTaskRunnerHandle::Get()->PostTask(
       FROM_HERE, Bind(&RecursiveFunc, &order, 1, 2, false));
-  MessageLoop::current()->task_runner()->PostTask(
+  ThreadTaskRunnerHandle::Get()->PostTask(
       FROM_HERE, Bind(&RecursiveFunc, &order, 2, 2, false));
-  MessageLoop::current()->task_runner()->PostTask(FROM_HERE,
-                                                  Bind(&QuitFunc, &order, 3));
+  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
+                                          Bind(&QuitFunc, &order, 3));
 
   RunLoop().Run();
 
@@ -580,13 +579,13 @@ void RunTest_RecursiveDenial3(MessagePumpFactory factory) {
 
   EXPECT_TRUE(MessageLoop::current()->NestableTasksAllowed());
   TaskList order;
-  MessageLoop::current()->task_runner()->PostTask(
+  ThreadTaskRunnerHandle::Get()->PostTask(
       FROM_HERE, Bind(&RecursiveSlowFunc, &order, 1, 2, false));
-  MessageLoop::current()->task_runner()->PostTask(
+  ThreadTaskRunnerHandle::Get()->PostTask(
       FROM_HERE, Bind(&RecursiveSlowFunc, &order, 2, 2, false));
-  MessageLoop::current()->task_runner()->PostDelayedTask(
+  ThreadTaskRunnerHandle::Get()->PostDelayedTask(
       FROM_HERE, Bind(&OrderedFunc, &order, 3), TimeDelta::FromMilliseconds(5));
-  MessageLoop::current()->task_runner()->PostDelayedTask(
+  ThreadTaskRunnerHandle::Get()->PostDelayedTask(
       FROM_HERE, Bind(&QuitFunc, &order, 4), TimeDelta::FromMilliseconds(5));
 
   RunLoop().Run();
@@ -616,12 +615,12 @@ void RunTest_RecursiveSupport1(MessagePumpFactory factory) {
   MessageLoop loop(std::move(pump));
 
   TaskList order;
-  MessageLoop::current()->task_runner()->PostTask(
+  ThreadTaskRunnerHandle::Get()->PostTask(
       FROM_HERE, Bind(&RecursiveFunc, &order, 1, 2, true));
-  MessageLoop::current()->task_runner()->PostTask(
+  ThreadTaskRunnerHandle::Get()->PostTask(
       FROM_HERE, Bind(&RecursiveFunc, &order, 2, 2, true));
-  MessageLoop::current()->task_runner()->PostTask(FROM_HERE,
-                                                  Bind(&QuitFunc, &order, 3));
+  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
+                                          Bind(&QuitFunc, &order, 3));
 
   RunLoop().Run();
 
@@ -650,14 +649,12 @@ void RunTest_NonNestableWithNoNesting(MessagePumpFactory factory) {
 
   TaskList order;
 
-  MessageLoop::current()->task_runner()->PostNonNestableTask(
-      FROM_HERE,
-      Bind(&OrderedFunc, &order, 1));
-  MessageLoop::current()->task_runner()->PostTask(
-      FROM_HERE,
-      Bind(&OrderedFunc, &order, 2));
-  MessageLoop::current()->task_runner()->PostTask(FROM_HERE,
-                                                  Bind(&QuitFunc, &order, 3));
+  ThreadTaskRunnerHandle::Get()->PostNonNestableTask(
+      FROM_HERE, Bind(&OrderedFunc, &order, 1));
+  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
+                                          Bind(&OrderedFunc, &order, 2));
+  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
+                                          Bind(&QuitFunc, &order, 3));
   RunLoop().Run();
 
   // FIFO order.
@@ -692,24 +689,18 @@ void RunTest_NonNestableInNestedLoop(MessagePumpFactory factory) {
 
   TaskList order;
 
-  MessageLoop::current()->task_runner()->PostTask(
-      FROM_HERE,
-      Bind(&FuncThatPumps, &order, 1));
-  MessageLoop::current()->task_runner()->PostNonNestableTask(
-      FROM_HERE,
-      Bind(&OrderedFunc, &order, 2));
-  MessageLoop::current()->task_runner()->PostTask(
-      FROM_HERE,
-      Bind(&OrderedFunc, &order, 3));
-  MessageLoop::current()->task_runner()->PostTask(
-      FROM_HERE,
-      Bind(&SleepFunc, &order, 4, TimeDelta::FromMilliseconds(50)));
-  MessageLoop::current()->task_runner()->PostTask(
-      FROM_HERE,
-      Bind(&OrderedFunc, &order, 5));
-  MessageLoop::current()->task_runner()->PostNonNestableTask(
-      FROM_HERE,
-      Bind(&QuitFunc, &order, 6));
+  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
+                                          Bind(&FuncThatPumps, &order, 1));
+  ThreadTaskRunnerHandle::Get()->PostNonNestableTask(
+      FROM_HERE, Bind(&OrderedFunc, &order, 2));
+  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
+                                          Bind(&OrderedFunc, &order, 3));
+  ThreadTaskRunnerHandle::Get()->PostTask(
+      FROM_HERE, Bind(&SleepFunc, &order, 4, TimeDelta::FromMilliseconds(50)));
+  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
+                                          Bind(&OrderedFunc, &order, 5));
+  ThreadTaskRunnerHandle::Get()->PostNonNestableTask(
+      FROM_HERE, Bind(&QuitFunc, &order, 6));
 
   RunLoop().Run();
 
@@ -750,17 +741,15 @@ void RunTest_QuitNow(MessagePumpFactory factory) {
 
   RunLoop run_loop;
 
-  MessageLoop::current()->task_runner()->PostTask(
+  ThreadTaskRunnerHandle::Get()->PostTask(
       FROM_HERE, Bind(&FuncThatRuns, &order, 1, Unretained(&run_loop)));
-  MessageLoop::current()->task_runner()->PostTask(
-      FROM_HERE, Bind(&OrderedFunc, &order, 2));
-  MessageLoop::current()->task_runner()->PostTask(FROM_HERE,
-                                                  Bind(&FuncThatQuitsNow));
-  MessageLoop::current()->task_runner()->PostTask(
-      FROM_HERE, Bind(&OrderedFunc, &order, 3));
-  MessageLoop::current()->task_runner()->PostTask(FROM_HERE,
-                                                  Bind(&FuncThatQuitsNow));
-  MessageLoop::current()->task_runner()->PostTask(
+  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
+                                          Bind(&OrderedFunc, &order, 2));
+  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, Bind(&FuncThatQuitsNow));
+  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
+                                          Bind(&OrderedFunc, &order, 3));
+  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, Bind(&FuncThatQuitsNow));
+  ThreadTaskRunnerHandle::Get()->PostTask(
       FROM_HERE, Bind(&OrderedFunc, &order, 4));  // never runs
 
   RunLoop().Run();
@@ -786,14 +775,14 @@ void RunTest_RunLoopQuitTop(MessagePumpFactory factory) {
   RunLoop outer_run_loop;
   RunLoop nested_run_loop;
 
-  MessageLoop::current()->task_runner()->PostTask(
+  ThreadTaskRunnerHandle::Get()->PostTask(
       FROM_HERE, Bind(&FuncThatRuns, &order, 1, Unretained(&nested_run_loop)));
-  MessageLoop::current()->task_runner()->PostTask(FROM_HERE,
-                                                  outer_run_loop.QuitClosure());
-  MessageLoop::current()->task_runner()->PostTask(
-      FROM_HERE, Bind(&OrderedFunc, &order, 2));
-  MessageLoop::current()->task_runner()->PostTask(
-      FROM_HERE, nested_run_loop.QuitClosure());
+  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
+                                          outer_run_loop.QuitClosure());
+  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
+                                          Bind(&OrderedFunc, &order, 2));
+  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
+                                          nested_run_loop.QuitClosure());
 
   outer_run_loop.Run();
 
@@ -816,14 +805,14 @@ void RunTest_RunLoopQuitNested(MessagePumpFactory factory) {
   RunLoop outer_run_loop;
   RunLoop nested_run_loop;
 
-  MessageLoop::current()->task_runner()->PostTask(
+  ThreadTaskRunnerHandle::Get()->PostTask(
       FROM_HERE, Bind(&FuncThatRuns, &order, 1, Unretained(&nested_run_loop)));
-  MessageLoop::current()->task_runner()->PostTask(
-      FROM_HERE, nested_run_loop.QuitClosure());
-  MessageLoop::current()->task_runner()->PostTask(
-      FROM_HERE, Bind(&OrderedFunc, &order, 2));
-  MessageLoop::current()->task_runner()->PostTask(FROM_HERE,
-                                                  outer_run_loop.QuitClosure());
+  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
+                                          nested_run_loop.QuitClosure());
+  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
+                                          Bind(&OrderedFunc, &order, 2));
+  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
+                                          outer_run_loop.QuitClosure());
 
   outer_run_loop.Run();
 
@@ -847,16 +836,16 @@ void RunTest_RunLoopQuitBogus(MessagePumpFactory factory) {
   RunLoop nested_run_loop;
   RunLoop bogus_run_loop;
 
-  MessageLoop::current()->task_runner()->PostTask(
+  ThreadTaskRunnerHandle::Get()->PostTask(
       FROM_HERE, Bind(&FuncThatRuns, &order, 1, Unretained(&nested_run_loop)));
-  MessageLoop::current()->task_runner()->PostTask(FROM_HERE,
-                                                  bogus_run_loop.QuitClosure());
-  MessageLoop::current()->task_runner()->PostTask(
-      FROM_HERE, Bind(&OrderedFunc, &order, 2));
-  MessageLoop::current()->task_runner()->PostTask(FROM_HERE,
-                                                  outer_run_loop.QuitClosure());
-  MessageLoop::current()->task_runner()->PostTask(
-      FROM_HERE, nested_run_loop.QuitClosure());
+  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
+                                          bogus_run_loop.QuitClosure());
+  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
+                                          Bind(&OrderedFunc, &order, 2));
+  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
+                                          outer_run_loop.QuitClosure());
+  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
+                                          nested_run_loop.QuitClosure());
 
   outer_run_loop.Run();
 
@@ -882,36 +871,36 @@ void RunTest_RunLoopQuitDeep(MessagePumpFactory factory) {
   RunLoop nested_loop3;
   RunLoop nested_loop4;
 
-  MessageLoop::current()->task_runner()->PostTask(
+  ThreadTaskRunnerHandle::Get()->PostTask(
       FROM_HERE, Bind(&FuncThatRuns, &order, 1, Unretained(&nested_loop1)));
-  MessageLoop::current()->task_runner()->PostTask(
+  ThreadTaskRunnerHandle::Get()->PostTask(
       FROM_HERE, Bind(&FuncThatRuns, &order, 2, Unretained(&nested_loop2)));
-  MessageLoop::current()->task_runner()->PostTask(
+  ThreadTaskRunnerHandle::Get()->PostTask(
       FROM_HERE, Bind(&FuncThatRuns, &order, 3, Unretained(&nested_loop3)));
-  MessageLoop::current()->task_runner()->PostTask(
+  ThreadTaskRunnerHandle::Get()->PostTask(
       FROM_HERE, Bind(&FuncThatRuns, &order, 4, Unretained(&nested_loop4)));
-  MessageLoop::current()->task_runner()->PostTask(
-      FROM_HERE, Bind(&OrderedFunc, &order, 5));
-  MessageLoop::current()->task_runner()->PostTask(FROM_HERE,
-                                                  outer_run_loop.QuitClosure());
-  MessageLoop::current()->task_runner()->PostTask(
-      FROM_HERE, Bind(&OrderedFunc, &order, 6));
-  MessageLoop::current()->task_runner()->PostTask(FROM_HERE,
-                                                  nested_loop1.QuitClosure());
-  MessageLoop::current()->task_runner()->PostTask(
-      FROM_HERE, Bind(&OrderedFunc, &order, 7));
-  MessageLoop::current()->task_runner()->PostTask(FROM_HERE,
-                                                  nested_loop2.QuitClosure());
-  MessageLoop::current()->task_runner()->PostTask(
-      FROM_HERE, Bind(&OrderedFunc, &order, 8));
-  MessageLoop::current()->task_runner()->PostTask(FROM_HERE,
-                                                  nested_loop3.QuitClosure());
-  MessageLoop::current()->task_runner()->PostTask(
-      FROM_HERE, Bind(&OrderedFunc, &order, 9));
-  MessageLoop::current()->task_runner()->PostTask(FROM_HERE,
-                                                  nested_loop4.QuitClosure());
-  MessageLoop::current()->task_runner()->PostTask(
-      FROM_HERE, Bind(&OrderedFunc, &order, 10));
+  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
+                                          Bind(&OrderedFunc, &order, 5));
+  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
+                                          outer_run_loop.QuitClosure());
+  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
+                                          Bind(&OrderedFunc, &order, 6));
+  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
+                                          nested_loop1.QuitClosure());
+  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
+                                          Bind(&OrderedFunc, &order, 7));
+  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
+                                          nested_loop2.QuitClosure());
+  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
+                                          Bind(&OrderedFunc, &order, 8));
+  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
+                                          nested_loop3.QuitClosure());
+  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
+                                          Bind(&OrderedFunc, &order, 9));
+  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
+                                          nested_loop4.QuitClosure());
+  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
+                                          Bind(&OrderedFunc, &order, 10));
 
   outer_run_loop.Run();
 
@@ -949,9 +938,9 @@ void RunTest_RunLoopQuitOrderBefore(MessagePumpFactory factory) {
 
   run_loop.Quit();
 
-  MessageLoop::current()->task_runner()->PostTask(
+  ThreadTaskRunnerHandle::Get()->PostTask(
       FROM_HERE, Bind(&OrderedFunc, &order, 1));  // never runs
-  MessageLoop::current()->task_runner()->PostTask(
+  ThreadTaskRunnerHandle::Get()->PostTask(
       FROM_HERE, Bind(&FuncThatQuitsNow));  // never runs
 
   run_loop.Run();
@@ -968,13 +957,12 @@ void RunTest_RunLoopQuitOrderDuring(MessagePumpFactory factory) {
 
   RunLoop run_loop;
 
-  MessageLoop::current()->task_runner()->PostTask(
-      FROM_HERE, Bind(&OrderedFunc, &order, 1));
-  MessageLoop::current()->task_runner()->PostTask(FROM_HERE,
-                                                  run_loop.QuitClosure());
-  MessageLoop::current()->task_runner()->PostTask(
+  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
+                                          Bind(&OrderedFunc, &order, 1));
+  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, run_loop.QuitClosure());
+  ThreadTaskRunnerHandle::Get()->PostTask(
       FROM_HERE, Bind(&OrderedFunc, &order, 2));  // never runs
-  MessageLoop::current()->task_runner()->PostTask(
+  ThreadTaskRunnerHandle::Get()->PostTask(
       FROM_HERE, Bind(&FuncThatQuitsNow));  // never runs
 
   run_loop.Run();
@@ -995,20 +983,18 @@ void RunTest_RunLoopQuitOrderAfter(MessagePumpFactory factory) {
 
   RunLoop run_loop;
 
-  MessageLoop::current()->task_runner()->PostTask(
+  ThreadTaskRunnerHandle::Get()->PostTask(
       FROM_HERE, Bind(&FuncThatRuns, &order, 1, Unretained(&run_loop)));
-  MessageLoop::current()->task_runner()->PostTask(
-      FROM_HERE, Bind(&OrderedFunc, &order, 2));
-  MessageLoop::current()->task_runner()->PostTask(FROM_HERE,
-                                                  Bind(&FuncThatQuitsNow));
-  MessageLoop::current()->task_runner()->PostTask(
-      FROM_HERE, Bind(&OrderedFunc, &order, 3));
-  MessageLoop::current()->task_runner()->PostTask(
+  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
+                                          Bind(&OrderedFunc, &order, 2));
+  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, Bind(&FuncThatQuitsNow));
+  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
+                                          Bind(&OrderedFunc, &order, 3));
+  ThreadTaskRunnerHandle::Get()->PostTask(
       FROM_HERE, run_loop.QuitClosure());  // has no affect
-  MessageLoop::current()->task_runner()->PostTask(
-      FROM_HERE, Bind(&OrderedFunc, &order, 4));
-  MessageLoop::current()->task_runner()->PostTask(FROM_HERE,
-                                                  Bind(&FuncThatQuitsNow));
+  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
+                                          Bind(&OrderedFunc, &order, 4));
+  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, Bind(&FuncThatQuitsNow));
 
   RunLoop outer_run_loop;
   outer_run_loop.Run();
@@ -1028,7 +1014,7 @@ void RunTest_RunLoopQuitOrderAfter(MessagePumpFactory factory) {
 
 void PostNTasksThenQuit(int posts_remaining) {
   if (posts_remaining > 1) {
-    MessageLoop::current()->task_runner()->PostTask(
+    ThreadTaskRunnerHandle::Get()->PostTask(
         FROM_HERE, Bind(&PostNTasksThenQuit, posts_remaining - 1));
   } else {
     MessageLoop::current()->QuitWhenIdle();
diff --git a/base/message_loop/message_loop_unittest.cc b/base/message_loop/message_loop_unittest.cc
index f7b583061bb14..97b7da7764093 100644
--- a/base/message_loop/message_loop_unittest.cc
+++ b/base/message_loop/message_loop_unittest.cc
@@ -456,7 +456,7 @@ void RunTest_RecursiveSupport2(MessageLoop::Type message_loop_type) {
 
 void PostNTasksThenQuit(int posts_remaining) {
   if (posts_remaining > 1) {
-    MessageLoop::current()->task_runner()->PostTask(
+    ThreadTaskRunnerHandle::Get()->PostTask(
         FROM_HERE, Bind(&PostNTasksThenQuit, posts_remaining - 1));
   } else {
     MessageLoop::current()->QuitWhenIdle();
@@ -872,7 +872,7 @@ TEST(MessageLoopTest, ThreadMainTaskRunner) {
       &Foo::Test1ConstRef, foo, a));
 
   // Post quit task;
-  MessageLoop::current()->task_runner()->PostTask(
+  ThreadTaskRunnerHandle::Get()->PostTask(
       FROM_HERE,
       Bind(&MessageLoop::QuitWhenIdle, Unretained(MessageLoop::current())));
 
diff --git a/base/message_loop/message_pump_libevent_unittest.cc b/base/message_loop/message_pump_libevent_unittest.cc
index 4164b3a7e49ff..a23b3543f3d25 100644
--- a/base/message_loop/message_pump_libevent_unittest.cc
+++ b/base/message_loop/message_pump_libevent_unittest.cc
@@ -21,6 +21,7 @@
 #include "base/test/gtest_util.h"
 #include "base/third_party/libevent/event.h"
 #include "base/threading/thread.h"
+#include "base/threading/thread_task_runner_handle.h"
 #include "build/build_config.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -174,8 +175,7 @@ void QuitMessageLoopAndStart(const Closure& quit_closure) {
 
   MessageLoop::ScopedNestableTaskAllower allow(MessageLoop::current());
   RunLoop runloop;
-  MessageLoop::current()->task_runner()->PostTask(FROM_HERE,
-                                                  runloop.QuitClosure());
+  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, runloop.QuitClosure());
   runloop.Run();
 }
 
@@ -186,7 +186,7 @@ class NestedPumpWatcher : public MessagePumpLibevent::Watcher {
 
   void OnFileCanReadWithoutBlocking(int /* fd */) override {
     RunLoop runloop;
-    MessageLoop::current()->task_runner()->PostTask(
+    ThreadTaskRunnerHandle::Get()->PostTask(
         FROM_HERE, Bind(&QuitMessageLoopAndStart, runloop.QuitClosure()));
     runloop.Run();
   }
@@ -218,8 +218,7 @@ class QuitWatcher : public BaseWatcher {
 
   void OnFileCanReadWithoutBlocking(int /* fd */) override {
     // Post a fatal closure to the MessageLoop before we quit it.
-    MessageLoop::current()->task_runner()->PostTask(FROM_HERE,
-                                                    Bind(&FatalClosure));
+    ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, Bind(&FatalClosure));
 
     // Now quit the MessageLoop.
     run_loop_->Quit();
diff --git a/chrome/browser/chromeos/login/easy_unlock/easy_unlock_reauth.cc b/chrome/browser/chromeos/login/easy_unlock/easy_unlock_reauth.cc
index f04370b3a6799..0de29c0241392 100644
--- a/chrome/browser/chromeos/login/easy_unlock/easy_unlock_reauth.cc
+++ b/chrome/browser/chromeos/login/easy_unlock/easy_unlock_reauth.cc
@@ -4,9 +4,11 @@
 
 #include "base/bind.h"
 #include "base/location.h"
+#include "base/logging.h"
 #include "base/macros.h"
 #include "base/message_loop/message_loop.h"
 #include "base/single_thread_task_runner.h"
+#include "base/threading/thread_task_runner_handle.h"
 #include "chrome/browser/chrome_notification_types.h"
 #include "chrome/browser/chromeos/login/easy_unlock/easy_unlock_reauth.h"
 #include "chrome/browser/chromeos/login/lock/screen_locker.h"
@@ -94,9 +96,10 @@ class ReauthHandler : public content::NotificationObserver,
 
   // chromeos::AuthStatusConsumer:
   void OnAuthSuccess(const chromeos::UserContext& user_context) override {
+    DCHECK(base::MessageLoopForUI::IsCurrent());
     callback_.Run(user_context);
     // Schedule deletion.
-    base::MessageLoopForUI::current()->task_runner()->PostTask(
+    base::ThreadTaskRunnerHandle::Get()->PostTask(
         FROM_HERE, base::Bind(&EndReauthAttempt));
   }
 
diff --git a/chrome/browser/chromeos/login/login_ui_keyboard_browsertest.cc b/chrome/browser/chromeos/login/login_ui_keyboard_browsertest.cc
index 8d1e3529f05f0..472d8debcc465 100644
--- a/chrome/browser/chromeos/login/login_ui_keyboard_browsertest.cc
+++ b/chrome/browser/chromeos/login/login_ui_keyboard_browsertest.cc
@@ -6,6 +6,7 @@
 #include "base/location.h"
 #include "base/message_loop/message_loop.h"
 #include "base/single_thread_task_runner.h"
+#include "base/threading/thread_task_runner_handle.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/chromeos/input_method/input_method_persistence.h"
 #include "chrome/browser/chromeos/language_preferences.h"
@@ -54,11 +55,13 @@ class FocusPODWaiter {
   }
 
   void OnFocusPOD() {
+    ASSERT_TRUE(base::MessageLoopForUI::IsCurrent());
     focused_ = true;
-    if (runner_.get())
-      base::MessageLoopForUI::current()->task_runner()->PostTask(
+    if (runner_.get()) {
+      base::ThreadTaskRunnerHandle::Get()->PostTask(
           FROM_HERE,
           base::Bind(&FocusPODWaiter::ExitMessageLoop, base::Unretained(this)));
+    }
   }
 
   void ExitMessageLoop() { runner_->Quit(); }
diff --git a/chrome/browser/ui/ash/media_delegate_chromeos.cc b/chrome/browser/ui/ash/media_delegate_chromeos.cc
index 1c37e97029152..eb98064c73376 100644
--- a/chrome/browser/ui/ash/media_delegate_chromeos.cc
+++ b/chrome/browser/ui/ash/media_delegate_chromeos.cc
@@ -8,8 +8,10 @@
 #include "ash/common/wm_shell.h"
 #include "ash/content/shell_content_state.h"
 #include "base/location.h"
+#include "base/logging.h"
 #include "base/message_loop/message_loop.h"
 #include "base/single_thread_task_runner.h"
+#include "base/threading/thread_task_runner_handle.h"
 #include "chrome/browser/chromeos/extensions/media_player_api.h"
 #include "chrome/browser/chromeos/extensions/media_player_event_router.h"
 #include "chrome/browser/media/webrtc/media_stream_capture_indicator.h"
@@ -156,7 +158,8 @@ void MediaDelegateChromeOS::OnRequestUpdate(
     int render_frame_id,
     content::MediaStreamType stream_type,
     const content::MediaRequestState state) {
-  base::MessageLoopForUI::current()->task_runner()->PostTask(
+  DCHECK(base::MessageLoopForUI::IsCurrent());
+  base::ThreadTaskRunnerHandle::Get()->PostTask(
       FROM_HERE, base::Bind(&MediaDelegateChromeOS::NotifyMediaCaptureChange,
                             weak_ptr_factory_.GetWeakPtr()));
 }
diff --git a/chrome/browser/ui/views/chrome_views_delegate.cc b/chrome/browser/ui/views/chrome_views_delegate.cc
index 7e14f716b79fa..470b548cbae0b 100644
--- a/chrome/browser/ui/views/chrome_views_delegate.cc
+++ b/chrome/browser/ui/views/chrome_views_delegate.cc
@@ -7,10 +7,12 @@
 #include <memory>
 
 #include "base/location.h"
+#include "base/logging.h"
 #include "base/message_loop/message_loop.h"
 #include "base/single_thread_task_runner.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
+#include "base/threading/thread_task_runner_handle.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
 #include "chrome/browser/browser_process.h"
@@ -272,6 +274,8 @@ views::ViewsDelegate::ProcessMenuAcceleratorResult
 ChromeViewsDelegate::ProcessAcceleratorWhileMenuShowing(
     const ui::Accelerator& accelerator) {
 #if defined(USE_ASH)
+  DCHECK(base::MessageLoopForUI::IsCurrent());
+
   // Early return because mash chrome does not have access to ash::Shell
   if (chrome::IsRunningInMash())
     return views::ViewsDelegate::ProcessMenuAcceleratorResult::LEAVE_MENU_OPEN;
@@ -283,7 +287,7 @@ ChromeViewsDelegate::ProcessAcceleratorWhileMenuShowing(
       accelerator);
   if (accelerator_controller->ShouldCloseMenuAndRepostAccelerator(
           accelerator)) {
-    base::MessageLoopForUI::current()->task_runner()->PostTask(
+    base::ThreadTaskRunnerHandle::Get()->PostTask(
         FROM_HERE, base::Bind(ProcessAcceleratorNow, accelerator));
     return views::ViewsDelegate::ProcessMenuAcceleratorResult::CLOSE_MENU;
   }
diff --git a/chrome/browser/ui/views/menu_model_adapter_test.cc b/chrome/browser/ui/views/menu_model_adapter_test.cc
index b7b16a689546c..080f62d131acd 100644
--- a/chrome/browser/ui/views/menu_model_adapter_test.cc
+++ b/chrome/browser/ui/views/menu_model_adapter_test.cc
@@ -233,7 +233,8 @@ class MenuModelAdapterTest : public ViewEventTestBase,
 
     menu_model_adapter_.BuildMenu(menu_);
 
-    base::MessageLoopForUI::current()->task_runner()->PostTask(
+    ASSERT_TRUE(base::MessageLoopForUI::IsCurrent());
+    base::ThreadTaskRunnerHandle::Get()->PostTask(
         FROM_HERE, CreateEventTask(this, &MenuModelAdapterTest::Step3));
   }
 
diff --git a/components/arc/arc_bridge_service_impl.cc b/components/arc/arc_bridge_service_impl.cc
index 93f42b183013e..4cf543f912ee1 100644
--- a/components/arc/arc_bridge_service_impl.cc
+++ b/components/arc/arc_bridge_service_impl.cc
@@ -9,7 +9,6 @@
 
 #include "base/command_line.h"
 #include "base/json/json_writer.h"
-#include "base/message_loop/message_loop.h"
 #include "base/sequenced_task_runner.h"
 #include "base/sys_info.h"
 #include "base/task_runner_util.h"
@@ -148,7 +147,7 @@ void ArcBridgeServiceImpl::OnStopped(StopReason stop_reason) {
       // Instead of immediately trying to restart the container, give it some
       // time to finish tearing down in case it is still in the process of
       // stopping.
-      base::MessageLoop::current()->task_runner()->PostDelayedTask(
+      base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
           FROM_HERE, base::Bind(&ArcBridgeServiceImpl::PrerequisitesChanged,
                                 weak_factory_.GetWeakPtr()),
           base::TimeDelta::FromSeconds(kReconnectDelayInSeconds));
diff --git a/components/browser_watcher/window_hang_monitor_win.cc b/components/browser_watcher/window_hang_monitor_win.cc
index e3966f8c50003..96cadb62ca3bb 100644
--- a/components/browser_watcher/window_hang_monitor_win.cc
+++ b/components/browser_watcher/window_hang_monitor_win.cc
@@ -9,9 +9,9 @@
 #include "base/files/file_util.h"
 #include "base/location.h"
 #include "base/logging.h"
-#include "base/message_loop/message_loop.h"
 #include "base/strings/string_piece.h"
 #include "base/strings/string_util.h"
+#include "base/threading/thread_task_runner_handle.h"
 #include "base/win/message_window.h"
 
 namespace browser_watcher {
@@ -75,7 +75,7 @@ WindowHangMonitor::~WindowHangMonitor() {
 
 void WindowHangMonitor::Initialize(base::Process process) {
   window_process_ = std::move(process);
-  timer_.SetTaskRunner(base::MessageLoop::current()->task_runner());
+  timer_.SetTaskRunner(base::ThreadTaskRunnerHandle::Get());
 
   ScheduleFindWindow();
 }
diff --git a/components/browsing_data/content/conditional_cache_deletion_helper.cc b/components/browsing_data/content/conditional_cache_deletion_helper.cc
index 4f4a4743597e8..416ad0ce8e71b 100644
--- a/components/browsing_data/content/conditional_cache_deletion_helper.cc
+++ b/components/browsing_data/content/conditional_cache_deletion_helper.cc
@@ -79,7 +79,7 @@ void ConditionalCacheDeletionHelper::IterateOverEntries(int error) {
       // The iteration finished successfuly or we can no longer iterate
       // (e.g. the cache was destroyed). We cannot distinguish between the two,
       // but we know that there is nothing more that we can do, so we return OK.
-      base::MessageLoop::current()->task_runner()->PostTask(
+      base::ThreadTaskRunnerHandle::Get()->PostTask(
           FROM_HERE, base::Bind(completion_callback_, net::OK));
       base::ThreadTaskRunnerHandle::Get()->DeleteSoon(FROM_HERE, this);
       return;
diff --git a/components/favicon/core/large_icon_service_unittest.cc b/components/favicon/core/large_icon_service_unittest.cc
index 4775eaff067f7..3618fd5dbe008 100644
--- a/components/favicon/core/large_icon_service_unittest.cc
+++ b/components/favicon/core/large_icon_service_unittest.cc
@@ -13,6 +13,7 @@
 #include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
 #include "base/task/cancelable_task_tracker.h"
+#include "base/threading/thread_task_runner_handle.h"
 #include "components/favicon/core/favicon_client.h"
 #include "components/favicon/core/favicon_service.h"
 #include "components/favicon_base/fallback_icon_style.h"
@@ -71,9 +72,8 @@ class MockFaviconService : public FaviconService {
     favicon_base::FaviconRawBitmapResult mock_result =
         mock_result_queue_.front();
     mock_result_queue_.pop_front();
-    return tracker->PostTask(
-        base::MessageLoop::current()->task_runner().get(), FROM_HERE,
-        base::Bind(callback, mock_result));
+    return tracker->PostTask(base::ThreadTaskRunnerHandle::Get().get(),
+                             FROM_HERE, base::Bind(callback, mock_result));
   }
 
   void InjectResult(const favicon_base::FaviconRawBitmapResult& mock_result) {
@@ -96,7 +96,7 @@ class TestLargeIconService : public LargeIconService {
  public:
   explicit TestLargeIconService(MockFaviconService* mock_favicon_service)
       : LargeIconService(mock_favicon_service,
-                         base::MessageLoop::current()->task_runner()) {}
+                         base::ThreadTaskRunnerHandle::Get()) {}
   ~TestLargeIconService() override {
   }
 
diff --git a/components/leveldb/leveldb_app.cc b/components/leveldb/leveldb_app.cc
index b6e2aba543dd6..55eb5908b4c2c 100644
--- a/components/leveldb/leveldb_app.cc
+++ b/components/leveldb/leveldb_app.cc
@@ -4,7 +4,7 @@
 
 #include "components/leveldb/leveldb_app.h"
 
-#include "base/message_loop/message_loop.h"
+#include "base/threading/thread_task_runner_handle.h"
 #include "components/leveldb/leveldb_service_impl.h"
 #include "services/shell/public/cpp/interface_registry.h"
 
@@ -27,8 +27,7 @@ bool LevelDBApp::OnConnect(const shell::Identity& remote_identity,
 void LevelDBApp::Create(const shell::Identity& remote_identity,
                         leveldb::mojom::LevelDBServiceRequest request) {
   if (!service_)
-    service_.reset(
-        new LevelDBServiceImpl(base::MessageLoop::current()->task_runner()));
+    service_.reset(new LevelDBServiceImpl(base::ThreadTaskRunnerHandle::Get()));
   bindings_.AddBinding(service_.get(), std::move(request));
 }
 
diff --git a/components/previews/core/previews_black_list_unittest.cc b/components/previews/core/previews_black_list_unittest.cc
index d9fd376183c26..53916ad709d96 100644
--- a/components/previews/core/previews_black_list_unittest.cc
+++ b/components/previews/core/previews_black_list_unittest.cc
@@ -15,6 +15,7 @@
 #include "base/run_loop.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/test/simple_test_clock.h"
+#include "base/threading/thread_task_runner_handle.h"
 #include "base/time/time.h"
 #include "components/previews/core/previews_black_list_item.h"
 #include "components/previews/core/previews_experiments.h"
@@ -53,7 +54,7 @@ class TestPreviewsOptOutStore : public PreviewsOptOutStore {
   void LoadBlackList(LoadBlackListCallback callback) override {
     std::unique_ptr<BlackListItemMap> black_list_item_map(
         new BlackListItemMap());
-    base::MessageLoop::current()->task_runner()->PostTask(
+    base::ThreadTaskRunnerHandle::Get()->PostTask(
         FROM_HERE, base::Bind(&RunLoadCallback, callback,
                               base::Passed(&black_list_item_map)));
   }
diff --git a/components/safe_browsing_db/v4_database.cc b/components/safe_browsing_db/v4_database.cc
index efcbe7b1aaa5e..6e14e5f099dfe 100644
--- a/components/safe_browsing_db/v4_database.cc
+++ b/components/safe_browsing_db/v4_database.cc
@@ -8,7 +8,7 @@
 #include "base/debug/leak_annotations.h"
 #include "base/files/file_util.h"
 #include "base/memory/ptr_util.h"
-#include "base/message_loop/message_loop.h"
+#include "base/threading/thread_task_runner_handle.h"
 #include "components/safe_browsing_db/v4_database.h"
 #include "content/public/browser/browser_thread.h"
 
@@ -28,8 +28,8 @@ void V4Database::Create(
   DCHECK(base_path.IsAbsolute());
   DCHECK(!list_infos.empty());
 
-  const scoped_refptr<base::SingleThreadTaskRunner>& callback_task_runner =
-      base::MessageLoop::current()->task_runner();
+  const scoped_refptr<base::SingleThreadTaskRunner> callback_task_runner =
+      base::ThreadTaskRunnerHandle::Get();
   db_task_runner->PostTask(
       FROM_HERE,
       base::Bind(&V4Database::CreateOnTaskRunner, db_task_runner, base_path,
@@ -107,8 +107,8 @@ void V4Database::ApplyUpdate(
 
   // Post the V4Store update task on the task runner but get the callback on the
   // current thread.
-  const scoped_refptr<base::SingleThreadTaskRunner>& current_task_runner =
-      base::MessageLoop::current()->task_runner();
+  const scoped_refptr<base::SingleThreadTaskRunner> current_task_runner =
+      base::ThreadTaskRunnerHandle::Get();
   for (std::unique_ptr<ListUpdateResponse>& response :
        *parsed_server_response) {
     ListIdentifier identifier(*response);
diff --git a/components/test_runner/mock_screen_orientation_client.cc b/components/test_runner/mock_screen_orientation_client.cc
index dd432329282d3..e734897194187 100644
--- a/components/test_runner/mock_screen_orientation_client.cc
+++ b/components/test_runner/mock_screen_orientation_client.cc
@@ -6,8 +6,8 @@
 
 #include "base/bind.h"
 #include "base/logging.h"
-#include "base/message_loop/message_loop.h"
 #include "base/single_thread_task_runner.h"
+#include "base/threading/thread_task_runner_handle.h"
 #include "third_party/WebKit/public/web/WebLocalFrame.h"
 
 namespace test_runner {
@@ -116,13 +116,13 @@ bool MockScreenOrientationClient::IsOrientationAllowedByCurrentLock(
 void MockScreenOrientationClient::lockOrientation(
     blink::WebScreenOrientationLockType orientation,
     blink::WebLockOrientationCallback* callback) {
-  base::MessageLoop::current()->task_runner()->PostTask(
+  base::ThreadTaskRunnerHandle::Get()->PostTask(
       FROM_HERE, base::Bind(&MockScreenOrientationClient::UpdateLockSync,
                             base::Unretained(this), orientation, callback));
 }
 
 void MockScreenOrientationClient::unlockOrientation() {
-  base::MessageLoop::current()->task_runner()->PostTask(
+  base::ThreadTaskRunnerHandle::Get()->PostTask(
       FROM_HERE, base::Bind(&MockScreenOrientationClient::ResetLockSync,
                             base::Unretained(this)));
 }
diff --git a/components/update_client/component_patcher_unittest.cc b/components/update_client/component_patcher_unittest.cc
index 2079d630e7976..a684e12bf46dd 100644
--- a/components/update_client/component_patcher_unittest.cc
+++ b/components/update_client/component_patcher_unittest.cc
@@ -11,6 +11,7 @@
 #include "base/macros.h"
 #include "base/path_service.h"
 #include "base/run_loop.h"
+#include "base/threading/thread_task_runner_handle.h"
 #include "base/values.h"
 #include "components/update_client/component_patcher.h"
 #include "components/update_client/component_patcher_operation.h"
@@ -69,7 +70,7 @@ ComponentPatcherOperationTest::ComponentPatcherOperationTest() {
   EXPECT_TRUE(input_dir_.CreateUniqueTempDir());
   EXPECT_TRUE(installed_dir_.CreateUniqueTempDir());
   installer_ = new ReadOnlyTestInstaller(installed_dir_.GetPath());
-  task_runner_ = base::MessageLoop::current()->task_runner();
+  task_runner_ = base::ThreadTaskRunnerHandle::Get();
 }
 
 ComponentPatcherOperationTest::~ComponentPatcherOperationTest() {
diff --git a/content/browser/renderer_host/render_widget_host_view_mac_editcommand_helper_unittest.mm b/content/browser/renderer_host/render_widget_host_view_mac_editcommand_helper_unittest.mm
index 42275cb527b81..7c95711be0acb 100644
--- a/content/browser/renderer_host/render_widget_host_view_mac_editcommand_helper_unittest.mm
+++ b/content/browser/renderer_host/render_widget_host_view_mac_editcommand_helper_unittest.mm
@@ -10,6 +10,7 @@
 
 #include "base/mac/scoped_nsautorelease_pool.h"
 #include "base/message_loop/message_loop.h"
+#include "base/threading/thread_task_runner_handle.h"
 #include "content/browser/compositor/test/no_transport_image_transport_factory.h"
 #include "content/browser/gpu/compositor_util.h"
 #include "content/browser/renderer_host/render_widget_host_delegate.h"
@@ -135,8 +136,7 @@ TEST_F(RenderWidgetHostViewMacEditCommandHelperTest,
   base::mac::ScopedNSAutoreleasePool pool;
 
   base::MessageLoop message_loop;
-  ui::WindowResizeHelperMac::Get()->Init(
-    base::MessageLoop::current()->task_runner());
+  ui::WindowResizeHelperMac::Get()->Init(base::ThreadTaskRunnerHandle::Get());
 
   // Owned by its |cocoa_view()|, i.e. |rwhv_cocoa|.
   RenderWidgetHostViewMac* rwhv_mac = new RenderWidgetHostViewMac(
diff --git a/content/browser/service_worker/service_worker_url_request_job_unittest.cc b/content/browser/service_worker/service_worker_url_request_job_unittest.cc
index 690154c23ea88..a364b8ab9e022 100644
--- a/content/browser/service_worker/service_worker_url_request_job_unittest.cc
+++ b/content/browser/service_worker/service_worker_url_request_job_unittest.cc
@@ -13,7 +13,6 @@
 #include "base/callback.h"
 #include "base/macros.h"
 #include "base/memory/ptr_util.h"
-#include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
 #include "base/single_thread_task_runner.h"
 #include "base/threading/thread_task_runner_handle.h"
@@ -308,7 +307,7 @@ class ServiceWorkerURLRequestJobTest
     // Simulate another worker kicking out the incumbent worker.  PostTask since
     // it might respond synchronously, and the MockURLRequestDelegate would
     // complain that the message loop isn't being run.
-    base::MessageLoop::current()->task_runner()->PostTask(
+    base::ThreadTaskRunnerHandle::Get()->PostTask(
         FROM_HERE, base::Bind(&ServiceWorkerVersion::SetStatus, version_,
                               ServiceWorkerVersion::REDUNDANT));
     base::RunLoop().RunUntilIdle();
diff --git a/content/browser/webui/url_data_manager_backend.cc b/content/browser/webui/url_data_manager_backend.cc
index 34dceffe7a245..0eca815e05aa5 100644
--- a/content/browser/webui/url_data_manager_backend.cc
+++ b/content/browser/webui/url_data_manager_backend.cc
@@ -23,6 +23,7 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
+#include "base/threading/thread_task_runner_handle.h"
 #include "base/threading/worker_pool.h"
 #include "base/trace_event/trace_event.h"
 #include "content/browser/blob_storage/chrome_blob_storage_context.h"
@@ -326,7 +327,7 @@ void URLRequestChromeJob::Start() {
 
   // Start reading asynchronously so that all error reporting and data
   // callbacks happen as they would for network requests.
-  base::MessageLoop::current()->task_runner()->PostTask(
+  base::ThreadTaskRunnerHandle::Get()->PostTask(
       FROM_HERE,
       base::Bind(&URLRequestChromeJob::StartAsync, weak_factory_.GetWeakPtr()));
 
diff --git a/content/common/child_process_host_impl.cc b/content/common/child_process_host_impl.cc
index b62ec77e1cb85..f03402823bdf1 100644
--- a/content/common/child_process_host_impl.cc
+++ b/content/common/child_process_host_impl.cc
@@ -20,6 +20,7 @@
 #include "base/strings/stringprintf.h"
 #include "base/synchronization/lock.h"
 #include "base/third_party/dynamic_annotations/dynamic_annotations.h"
+#include "base/threading/thread_task_runner_handle.h"
 #include "build/build_config.h"
 #include "content/common/child_process_messages.h"
 #include "content/public/common/child_process_host_delegate.h"
@@ -184,8 +185,9 @@ std::string ChildProcessHostImpl::CreateChannel() {
 
 bool ChildProcessHostImpl::InitChannel() {
 #if USE_ATTACHMENT_BROKER
+  DCHECK(base::MessageLoopForIO::IsCurrent());
   IPC::AttachmentBroker::GetGlobal()->RegisterCommunicationChannel(
-      channel_.get(), base::MessageLoopForIO::current()->task_runner());
+      channel_.get(), base::ThreadTaskRunnerHandle::Get());
 #endif
   if (!channel_->Connect()) {
 #if USE_ATTACHMENT_BROKER
diff --git a/content/public/test/test_renderer_host.cc b/content/public/test/test_renderer_host.cc
index a53eee5d742b7..00490a1834995 100644
--- a/content/public/test/test_renderer_host.cc
+++ b/content/public/test/test_renderer_host.cc
@@ -7,6 +7,7 @@
 #include <utility>
 
 #include "base/run_loop.h"
+#include "base/threading/thread_task_runner_handle.h"
 #include "build/build_config.h"
 #include "content/browser/compositor/test/no_transport_image_transport_factory.h"
 #include "content/browser/frame_host/navigation_entry_impl.h"
@@ -272,8 +273,7 @@ void RenderViewHostTestHarness::SetUp() {
     BrowserSideNavigationSetUp();
 
 #if defined(OS_MACOSX)
-  ui::WindowResizeHelperMac::Get()->Init(
-    base::MessageLoop::current()->task_runner());
+  ui::WindowResizeHelperMac::Get()->Init(base::ThreadTaskRunnerHandle::Get());
 #endif  // OS_MACOSX
 }
 
diff --git a/device/generic_sensor/platform_sensor_android.cc b/device/generic_sensor/platform_sensor_android.cc
index 0296c51f4b9f3..e02cde8493604 100644
--- a/device/generic_sensor/platform_sensor_android.cc
+++ b/device/generic_sensor/platform_sensor_android.cc
@@ -6,7 +6,7 @@
 
 #include "base/android/context_utils.h"
 #include "base/bind.h"
-#include "base/message_loop/message_loop.h"
+#include "base/threading/thread_task_runner_handle.h"
 #include "jni/PlatformSensor_jni.h"
 
 using base::android::AttachCurrentThread;
@@ -26,7 +26,7 @@ PlatformSensorAndroid::PlatformSensorAndroid(
     PlatformSensorProvider* provider,
     const JavaRef<jobject>& java_sensor)
     : PlatformSensor(type, std::move(mapping), provider),
-      task_runner_(base::MessageLoop::current()->task_runner()) {
+      task_runner_(base::ThreadTaskRunnerHandle::Get()) {
   JNIEnv* env = AttachCurrentThread();
   j_object_.Reset(java_sensor);
 
diff --git a/ipc/ipc_channel_reader.cc b/ipc/ipc_channel_reader.cc
index 9af3696ef6130..e5edb9c147d53 100644
--- a/ipc/ipc_channel_reader.cc
+++ b/ipc/ipc_channel_reader.cc
@@ -8,7 +8,9 @@
 
 #include <algorithm>
 
+#include "base/logging.h"
 #include "base/message_loop/message_loop.h"
+#include "base/threading/thread_task_runner_handle.h"
 #include "ipc/ipc_listener.h"
 #include "ipc/ipc_logging.h"
 #include "ipc/ipc_message.h"
@@ -322,8 +324,8 @@ void ChannelReader::ReceivedBrokerableAttachmentWithId(
 
 void ChannelReader::StartObservingAttachmentBroker() {
 #if USE_ATTACHMENT_BROKER
-  GetAttachmentBroker()->AddObserver(
-      this, base::MessageLoopForIO::current()->task_runner());
+  DCHECK(base::MessageLoopForIO::IsCurrent());
+  GetAttachmentBroker()->AddObserver(this, base::ThreadTaskRunnerHandle::Get());
 #endif  // USE_ATTACHMENT_BROKER
 }
 
diff --git a/ipc/ipc_channel_win.cc b/ipc/ipc_channel_win.cc
index 66c14c84eef49..f59b22ae4b8c8 100644
--- a/ipc/ipc_channel_win.cc
+++ b/ipc/ipc_channel_win.cc
@@ -20,6 +20,7 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/threading/thread_checker.h"
+#include "base/threading/thread_task_runner_handle.h"
 #include "base/win/scoped_handle.h"
 #include "ipc/attachment_broker.h"
 #include "ipc/ipc_listener.h"
@@ -393,6 +394,8 @@ bool ChannelWin::CreatePipe(const IPC::ChannelHandle &channel_handle,
 }
 
 bool ChannelWin::Connect() {
+  DCHECK(base::MessageLoopForIO::IsCurrent());
+
   WillConnect();
 
   DLOG_IF(WARNING, thread_check_.get()) << "Connect called more than once";
@@ -413,7 +416,7 @@ bool ChannelWin::Connect() {
     // Complete setup asynchronously. By not setting input_state_.is_pending
     // to true, we indicate to OnIOCompleted that this is the special
     // initialization signal.
-    base::MessageLoopForIO::current()->task_runner()->PostTask(
+    base::ThreadTaskRunnerHandle::Get()->PostTask(
         FROM_HERE,
         base::Bind(&ChannelWin::OnIOCompleted, weak_factory_.GetWeakPtr(),
                    &input_state_.context, 0, 0));
diff --git a/services/shell/standalone/context.cc b/services/shell/standalone/context.cc
index 03c4062ce85c0..7a15ce714dd66 100644
--- a/services/shell/standalone/context.cc
+++ b/services/shell/standalone/context.cc
@@ -219,7 +219,7 @@ void Context::Shutdown() {
 
   TRACE_EVENT0("mojo_shell", "Context::Shutdown");
   // Post a task in case OnShutdownComplete is called synchronously.
-  base::MessageLoop::current()->task_runner()->PostTask(
+  base::ThreadTaskRunnerHandle::Get()->PostTask(
       FROM_HERE, base::Bind(mojo::edk::ShutdownIPCSupport));
   // We'll quit when we get OnShutdownComplete().
   base::RunLoop().Run();
diff --git a/services/shell/standalone/tracer.cc b/services/shell/standalone/tracer.cc
index 84408fc638c48..84564b4049c17 100644
--- a/services/shell/standalone/tracer.cc
+++ b/services/shell/standalone/tracer.cc
@@ -14,6 +14,7 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/synchronization/waitable_event.h"
 #include "base/threading/thread.h"
+#include "base/threading/thread_task_runner_handle.h"
 #include "base/trace_event/trace_config.h"
 #include "base/trace_event/trace_event.h"
 
@@ -43,7 +44,7 @@ void Tracer::Start(const std::string& categories,
         << "Could not parse --trace-startup-duration value "
         << duration_seconds_str;
   }
-  base::MessageLoop::current()->task_runner()->PostDelayedTask(
+  base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
       FROM_HERE,
       base::Bind(&Tracer::StopAndFlushToFile, base::Unretained(this)),
       base::TimeDelta::FromSeconds(trace_duration_secs));
diff --git a/services/tracing/public/cpp/provider.cc b/services/tracing/public/cpp/provider.cc
index 10f326e2e0bf0..e2a0a2f904f90 100644
--- a/services/tracing/public/cpp/provider.cc
+++ b/services/tracing/public/cpp/provider.cc
@@ -13,6 +13,7 @@
 #include "base/single_thread_task_runner.h"
 #include "base/synchronization/lock.h"
 #include "base/threading/platform_thread.h"
+#include "base/threading/thread_task_runner_handle.h"
 #include "base/time/time.h"
 #include "base/trace_event/trace_config.h"
 #include "base/trace_event/trace_event.h"
@@ -107,7 +108,7 @@ void Provider::ForceEnableTracing() {
       base::trace_event::TraceConfig("*", base::trace_event::RECORD_UNTIL_FULL),
       base::trace_event::TraceLog::RECORDING_MODE);
   tracing_forced_ = true;
-  base::MessageLoop::current()->task_runner()->PostTask(
+  base::ThreadTaskRunnerHandle::Get()->PostTask(
       FROM_HERE,
       base::Bind(&Provider::DelayedStop, weak_factory_.GetWeakPtr()));
 }
@@ -116,7 +117,7 @@ void Provider::DelayedStop() {
   // We use this indirection to account for cases where the Initialize method
   // takes more than one second to finish; thus we start the countdown only when
   // the current thread is unblocked.
-  base::MessageLoop::current()->task_runner()->PostDelayedTask(
+  base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
       FROM_HERE,
       base::Bind(&Provider::StopIfForced, weak_factory_.GetWeakPtr()),
       base::TimeDelta::FromSeconds(1));
diff --git a/third_party/WebKit/Source/platform/scheduler/base/task_queue_manager_perftest.cc b/third_party/WebKit/Source/platform/scheduler/base/task_queue_manager_perftest.cc
index b059acc0d8fd4..939b1d13c79b9 100644
--- a/third_party/WebKit/Source/platform/scheduler/base/task_queue_manager_perftest.cc
+++ b/third_party/WebKit/Source/platform/scheduler/base/task_queue_manager_perftest.cc
@@ -10,6 +10,7 @@
 #include "base/memory/ptr_util.h"
 #include "base/run_loop.h"
 #include "base/threading/thread.h"
+#include "base/threading/thread_task_runner_handle.h"
 #include "base/time/default_tick_clock.h"
 #include "platform/scheduler/base/task_queue_impl.h"
 #include "platform/scheduler/base/task_queue_manager_delegate_for_test.h"
@@ -40,7 +41,7 @@ class TaskQueueManagerPerfTest : public testing::Test {
     num_queues_ = num_queues;
     manager_ = base::MakeUnique<TaskQueueManager>(
         TaskQueueManagerDelegateForTest::Create(
-            base::MessageLoop::current()->task_runner(),
+            base::ThreadTaskRunnerHandle::Get(),
             base::WrapUnique(new base::DefaultTickClock())),
         "fake.category", "fake.category", "fake.category.debug");
     manager_->AddTaskTimeObserver(&test_task_time_observer_);
diff --git a/third_party/WebKit/Source/platform/scheduler/base/task_queue_manager_unittest.cc b/third_party/WebKit/Source/platform/scheduler/base/task_queue_manager_unittest.cc
index 364bdeff630b4..94335c6814041 100644
--- a/third_party/WebKit/Source/platform/scheduler/base/task_queue_manager_unittest.cc
+++ b/third_party/WebKit/Source/platform/scheduler/base/task_queue_manager_unittest.cc
@@ -16,6 +16,7 @@
 #include "base/test/simple_test_tick_clock.h"
 #include "base/test/trace_event_analyzer.h"
 #include "base/threading/thread.h"
+#include "base/threading/thread_task_runner_handle.h"
 #include "base/trace_event/blame_context.h"
 #include "base/trace_event/trace_buffer.h"
 #include "cc/test/ordered_simple_task_runner.h"
@@ -65,9 +66,8 @@ class MessageLoopTaskRunner : public TaskQueueManagerDelegateForTest {
 
  private:
   explicit MessageLoopTaskRunner(std::unique_ptr<base::TickClock> tick_clock)
-      : TaskQueueManagerDelegateForTest(
-            base::MessageLoop::current()->task_runner(),
-            std::move(tick_clock)) {}
+      : TaskQueueManagerDelegateForTest(base::ThreadTaskRunnerHandle::Get(),
+                                        std::move(tick_clock)) {}
   ~MessageLoopTaskRunner() override {}
 };
 
diff --git a/third_party/libaddressinput/chromium/chrome_address_validator.cc b/third_party/libaddressinput/chromium/chrome_address_validator.cc
index ef11a62fb1c81..f1f9f0eeb9af5 100644
--- a/third_party/libaddressinput/chromium/chrome_address_validator.cc
+++ b/third_party/libaddressinput/chromium/chrome_address_validator.cc
@@ -9,8 +9,8 @@
 #include "base/bind.h"
 #include "base/location.h"
 #include "base/logging.h"
-#include "base/message_loop/message_loop.h"
 #include "base/single_thread_task_runner.h"
+#include "base/threading/thread_task_runner_handle.h"
 #include "third_party/libaddressinput/chromium/addressinput_util.h"
 #include "third_party/libaddressinput/chromium/input_suggester.h"
 #include "third_party/libaddressinput/src/cpp/include/libaddressinput/address_data.h"
@@ -148,7 +148,7 @@ void AddressValidator::RulesLoaded(bool success,
   if (success || attempts_number_[region_code] + 1 >= kMaxAttemptsNumber)
     return;
 
-  base::MessageLoop::current()->task_runner()->PostDelayedTask(
+  base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
       FROM_HERE, base::Bind(&AddressValidator::RetryLoadRules,
                             weak_factory_.GetWeakPtr(), region_code),
       GetBaseRetryPeriod() * pow(2, attempts_number_[region_code]++));
diff --git a/third_party/zlib/google/zip_reader.cc b/third_party/zlib/google/zip_reader.cc
index 1bdf81c7b34e3..fdeb1259b3a0f 100644
--- a/third_party/zlib/google/zip_reader.cc
+++ b/third_party/zlib/google/zip_reader.cc
@@ -10,7 +10,6 @@
 #include "base/files/file.h"
 #include "base/logging.h"
 #include "base/macros.h"
-#include "base/message_loop/message_loop.h"
 #include "base/single_thread_task_runner.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
@@ -392,7 +391,7 @@ void ZipReader::ExtractCurrentEntryToFilePathAsync(
     return;
   }
 
-  base::MessageLoop::current()->task_runner()->PostTask(
+  base::ThreadTaskRunnerHandle::Get()->PostTask(
       FROM_HERE,
       base::Bind(&ZipReader::ExtractChunk, weak_ptr_factory_.GetWeakPtr(),
                  Passed(std::move(output_file)), success_callback,
@@ -499,7 +498,7 @@ void ZipReader::ExtractChunk(base::File output_file,
 
     progress_callback.Run(current_progress);
 
-    base::MessageLoop::current()->task_runner()->PostTask(
+    base::ThreadTaskRunnerHandle::Get()->PostTask(
         FROM_HERE,
         base::Bind(&ZipReader::ExtractChunk, weak_ptr_factory_.GetWeakPtr(),
                    Passed(std::move(output_file)), success_callback,
diff --git a/ui/aura/test/ui_controls_factory_aurawin.cc b/ui/aura/test/ui_controls_factory_aurawin.cc
index ae8d41543c99e..7d1d2bbe4ef07 100644
--- a/ui/aura/test/ui_controls_factory_aurawin.cc
+++ b/ui/aura/test/ui_controls_factory_aurawin.cc
@@ -6,6 +6,7 @@
 #include "base/macros.h"
 #include "base/message_loop/message_loop.h"
 #include "base/single_thread_task_runner.h"
+#include "base/threading/thread_task_runner_handle.h"
 #include "ui/aura/test/ui_controls_factory_aura.h"
 #include "ui/aura/window.h"
 #include "ui/aura/window_tree_host.h"
@@ -77,8 +78,8 @@ class UIControlsWin : public UIControlsAura {
   void RunClosureAfterAllPendingUIEvents(
       const base::Closure& closure) override {
     // On windows, posting UI events is synchronous so just post the closure.
-    base::MessageLoopForUI::current()->task_runner()->PostTask(FROM_HERE,
-                                                               closure);
+    DCHECK(base::MessageLoopForUI::IsCurrent());
+    base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, closure);
   }
 
  private:
diff --git a/ui/ozone/platform/wayland/wayland_connection.cc b/ui/ozone/platform/wayland/wayland_connection.cc
index b2fb1084f94ac..520b21f9f08a6 100644
--- a/ui/ozone/platform/wayland/wayland_connection.cc
+++ b/ui/ozone/platform/wayland/wayland_connection.cc
@@ -11,6 +11,7 @@
 #include "base/memory/ptr_util.h"
 #include "base/message_loop/message_loop.h"
 #include "base/strings/string_util.h"
+#include "base/threading/thread_task_runner_handle.h"
 #include "ui/ozone/platform/wayland/wayland_object.h"
 #include "ui/ozone/platform/wayland/wayland_window.h"
 
@@ -88,7 +89,8 @@ bool WaylandConnection::StartProcessingEvents() {
 void WaylandConnection::ScheduleFlush() {
   if (scheduled_flush_ || !watching_)
     return;
-  base::MessageLoopForUI::current()->task_runner()->PostTask(
+  DCHECK(base::MessageLoopForUI::IsCurrent());
+  base::ThreadTaskRunnerHandle::Get()->PostTask(
       FROM_HERE, base::Bind(&WaylandConnection::Flush, base::Unretained(this)));
   scheduled_flush_ = true;
 }
diff --git a/ui/shell_dialogs/select_file_dialog_win.cc b/ui/shell_dialogs/select_file_dialog_win.cc
index 1574f88d341da..46804d2ac696b 100644
--- a/ui/shell_dialogs/select_file_dialog_win.cc
+++ b/ui/shell_dialogs/select_file_dialog_win.cc
@@ -15,10 +15,12 @@
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
 #include "base/i18n/case_conversion.h"
+#include "base/logging.h"
 #include "base/macros.h"
 #include "base/message_loop/message_loop.h"
 #include "base/single_thread_task_runner.h"
 #include "base/threading/thread.h"
+#include "base/threading/thread_task_runner_handle.h"
 #include "base/win/registry.h"
 #include "base/win/scoped_comptr.h"
 #include "base/win/shortcut.h"
@@ -201,9 +203,10 @@ class SelectFileDialogImpl : public ui::SelectFileDialog,
           file_type_index(file_type_index),
           default_extension(default_extension),
           run_state(run_state),
-          ui_task_runner(base::MessageLoopForUI::current()->task_runner()),
+          ui_task_runner(base::ThreadTaskRunnerHandle::Get()),
           owner(owner),
           params(params) {
+      DCHECK(base::MessageLoopForUI::IsCurrent());
       if (file_types)
         this->file_types = *file_types;
     }
diff --git a/ui/views/controls/menu/menu_controller_unittest.cc b/ui/views/controls/menu/menu_controller_unittest.cc
index 2db6591a9ce6b..486e9273df85f 100644
--- a/ui/views/controls/menu/menu_controller_unittest.cc
+++ b/ui/views/controls/menu/menu_controller_unittest.cc
@@ -5,9 +5,11 @@
 #include "ui/views/controls/menu/menu_controller.h"
 
 #include "base/callback.h"
+#include "base/logging.h"
 #include "base/macros.h"
 #include "base/single_thread_task_runner.h"
 #include "base/strings/utf_string_conversions.h"
+#include "base/threading/thread_task_runner_handle.h"
 #include "build/build_config.h"
 #include "ui/aura/scoped_window_targeter.h"
 #include "ui/aura/window.h"
@@ -271,6 +273,7 @@ class MenuControllerTest : public ViewsTestBase {
   void SetUp() override {
     ViewsTestBase::SetUp();
     Init();
+    ASSERT_TRUE(base::MessageLoopForUI::IsCurrent());
   }
 
   void TearDown() override {
@@ -612,7 +615,7 @@ class MenuControllerTest : public ViewsTestBase {
 // Tests that an event targeter which blocks events will be honored by the menu
 // event dispatcher.
 TEST_F(MenuControllerTest, EventTargeter) {
-  base::MessageLoopForUI::current()->task_runner()->PostTask(
+  base::ThreadTaskRunnerHandle::Get()->PostTask(
       FROM_HERE, base::Bind(&MenuControllerTest::TestEventTargeter,
                             base::Unretained(this)));
   RunMenu();
@@ -635,11 +638,11 @@ TEST_F(MenuControllerTest, TouchIdsReleasedCorrectly) {
   event_generator()->PressTouchId(1);
   event_generator()->ReleaseTouchId(0);
 
-  base::MessageLoopForUI::current()->task_runner()->PostTask(
+  base::ThreadTaskRunnerHandle::Get()->PostTask(
       FROM_HERE, base::Bind(&MenuControllerTest::ReleaseTouchId,
                             base::Unretained(this), 1));
 
-  base::MessageLoopForUI::current()->task_runner()->PostTask(
+  base::ThreadTaskRunnerHandle::Get()->PostTask(
       FROM_HERE, base::Bind(&MenuControllerTest::PressKey,
                             base::Unretained(this), ui::VKEY_ESCAPE));
 
@@ -1221,7 +1224,7 @@ TEST_F(MenuControllerTest, AsynchronousTouchEventRepostEvent) {
 TEST_F(MenuControllerTest, AsynchronousNestedExitAll) {
   InstallTestMenuMessageLoop();
 
-  base::MessageLoopForUI::current()->task_runner()->PostTask(
+  base::ThreadTaskRunnerHandle::Get()->PostTask(
       FROM_HERE, base::Bind(&MenuControllerTest::TestAsynchronousNestedExitAll,
                             base::Unretained(this)));
 
@@ -1234,7 +1237,7 @@ TEST_F(MenuControllerTest, AsynchronousNestedExitAll) {
 TEST_F(MenuControllerTest, AsynchronousNestedExitOutermost) {
   InstallTestMenuMessageLoop();
 
-  base::MessageLoopForUI::current()->task_runner()->PostTask(
+  base::ThreadTaskRunnerHandle::Get()->PostTask(
       FROM_HERE,
       base::Bind(&MenuControllerTest::TestAsynchronousNestedExitOutermost,
                  base::Unretained(this)));
@@ -1333,7 +1336,7 @@ TEST_F(MenuControllerTest, NestedMessageLoopDiesWithNestedMenu) {
   std::unique_ptr<TestMenuControllerDelegate> nested_delegate(
       new TestMenuControllerDelegate());
   // This will nest an asynchronous menu, and then kill the nested message loop.
-  base::MessageLoopForUI::current()->task_runner()->PostTask(
+  base::ThreadTaskRunnerHandle::Get()->PostTask(
       FROM_HERE,
       base::Bind(&MenuControllerTest::TestNestedMessageLoopKillsItself,
                  base::Unretained(this), nested_delegate.get()));
@@ -1352,7 +1355,7 @@ TEST_F(MenuControllerTest, NestedMessageLoopDiesWithNestedMenu) {
 TEST_F(MenuControllerTest, SynchronousCancelEvent) {
   ExitMenuRun();
   // Post actual test to run once the menu has created a nested message loop.
-  base::MessageLoopForUI::current()->task_runner()->PostTask(
+  base::ThreadTaskRunnerHandle::Get()->PostTask(
       FROM_HERE,
       base::Bind(&MenuControllerTest::TestCancelEvent, base::Unretained(this)));
   int mouse_event_flags = 0;
diff --git a/ui/views/widget/desktop_aura/x11_whole_screen_move_loop.cc b/ui/views/widget/desktop_aura/x11_whole_screen_move_loop.cc
index 251dad6259235..1258c61c9cd0a 100644
--- a/ui/views/widget/desktop_aura/x11_whole_screen_move_loop.cc
+++ b/ui/views/widget/desktop_aura/x11_whole_screen_move_loop.cc
@@ -10,10 +10,12 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/logging.h"
 #include "base/macros.h"
 #include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
 #include "base/single_thread_task_runner.h"
+#include "base/threading/thread_task_runner_handle.h"
 #include "ui/aura/client/capture_client.h"
 #include "ui/aura/env.h"
 #include "ui/aura/window.h"
@@ -73,6 +75,8 @@ bool X11WholeScreenMoveLoop::CanDispatchEvent(const ui::PlatformEvent& event) {
 }
 
 uint32_t X11WholeScreenMoveLoop::DispatchEvent(const ui::PlatformEvent& event) {
+  DCHECK(base::MessageLoopForUI::IsCurrent());
+
   // This method processes all events while the move loop is active.
   if (!in_move_loop_)
     return ui::POST_DISPATCH_PERFORM_DEFAULT;
@@ -91,7 +95,7 @@ uint32_t X11WholeScreenMoveLoop::DispatchEvent(const ui::PlatformEvent& event) {
         // Post a task to dispatch mouse movement event when control returns to
         // the message loop. This allows smoother dragging since the events are
         // dispatched without waiting for the drag widget updates.
-        base::MessageLoopForUI::current()->task_runner()->PostTask(
+        base::ThreadTaskRunnerHandle::Get()->PostTask(
             FROM_HERE,
             base::Bind(&X11WholeScreenMoveLoop::DispatchMouseMovement,
                        weak_factory_.GetWeakPtr()));