diff --git a/src/hotspot/cpu/aarch64/gc/g1/g1BarrierSetAssembler_aarch64.cpp b/src/hotspot/cpu/aarch64/gc/g1/g1BarrierSetAssembler_aarch64.cpp
index 974527f30e9..94c2e2450bb 100644
--- a/src/hotspot/cpu/aarch64/gc/g1/g1BarrierSetAssembler_aarch64.cpp
+++ b/src/hotspot/cpu/aarch64/gc/g1/g1BarrierSetAssembler_aarch64.cpp
@@ -92,7 +92,6 @@ void G1BarrierSetAssembler::gen_write_ref_array_post_barrier(MacroAssembler* mas
                                                              Register count,
                                                              Register scratch,
                                                              RegSet saved_regs) {
-
   Label done;
   Label loop;
   Label next;
@@ -111,7 +110,8 @@ void G1BarrierSetAssembler::gen_write_ref_array_post_barrier(MacroAssembler* mas
   __ sub(count, count, start);                                            // Number of bytes to mark - 1.
 
   // Add card table base offset to start.
-  __ ldr(scratch, Address(rthread, in_bytes(G1ThreadLocalData::card_table_base_offset())));
+  __ mov(scratch, G1BarrierSet::g1_barrier_set()->globa_byte_map_base_addr());
+  __ ldr(scratch, Address(scratch));
   __ add(start, start, scratch);
 
   __ bind(loop);
@@ -254,8 +254,8 @@ static void generate_post_barrier(MacroAssembler* masm,
   // Storing region crossing non-null.
   __ lsr(tmp1, store_addr, CardTable::card_shift());     // tmp1 := card address relative to card table base
 
-  Address card_table_addr(thread, in_bytes(G1ThreadLocalData::card_table_base_offset()));
-  __ ldr(tmp2, card_table_addr);                         // tmp2 := card table base address
+  __ mov(tmp2, G1BarrierSet::g1_barrier_set()->globa_byte_map_base_addr());
+  __ ldr(tmp2, Address(tmp2));                         // tmp2 := card table base address
   if (UseCondCardMark) {
     __ ldrb(rscratch1, Address(tmp1, tmp2));             // rscratch1 := card
     // Instead of loading clean_card_val and comparing, we exploit the fact that
diff --git a/src/hotspot/cpu/x86/gc/g1/g1BarrierSetAssembler_x86.cpp b/src/hotspot/cpu/x86/gc/g1/g1BarrierSetAssembler_x86.cpp
index a846289d91b..3f2b6f92b07 100644
--- a/src/hotspot/cpu/x86/gc/g1/g1BarrierSetAssembler_x86.cpp
+++ b/src/hotspot/cpu/x86/gc/g1/g1BarrierSetAssembler_x86.cpp
@@ -103,7 +103,7 @@ void G1BarrierSetAssembler::gen_write_ref_array_post_barrier(MacroAssembler* mas
 
   Register thread = r15_thread;
 
-  __ movptr(tmp, Address(thread, in_bytes(G1ThreadLocalData::card_table_base_offset())));
+  __ movptr(tmp, ExternalAddress((address)G1BarrierSet::g1_barrier_set()->globa_byte_map_base_addr()));
   __ addptr(addr, tmp);
 
   // Calculate address of card of last word in the array.
@@ -272,6 +272,7 @@ static void generate_post_barrier(MacroAssembler* masm,
                                   const Register store_addr,
                                   const Register new_val,
                                   const Register tmp1,
+                                  const Register tmp2,
                                   Label& done,
                                   bool new_val_may_be_null) {
 
@@ -294,8 +295,8 @@ static void generate_post_barrier(MacroAssembler* masm,
   __ movptr(tmp1, store_addr);                                    // tmp1 := store address
   __ shrptr(tmp1, CardTable::card_shift());                       // tmp1 := card address relative to card table base
 
-  Address card_table_addr(thread, in_bytes(G1ThreadLocalData::card_table_base_offset()));
-  __ addptr(tmp1, card_table_addr);                               // tmp1 := card address
+  __ movptr(tmp2, ExternalAddress((address)G1BarrierSet::g1_barrier_set()->globa_byte_map_base_addr()));
+  __ addptr(tmp1, tmp2);                                          // tmp1 := card address
   if (UseCondCardMark) {
     __ cmpb(Address(tmp1, 0), G1CardTable::clean_card_val());     // *(card address) == clean_card_val?
     __ jcc(Assembler::notEqual, done);
@@ -308,9 +309,10 @@ static void generate_post_barrier(MacroAssembler* masm,
 void G1BarrierSetAssembler::g1_write_barrier_post(MacroAssembler* masm,
                                                   Register store_addr,
                                                   Register new_val,
-                                                  Register tmp) {
+                                                  Register tmp1,
+                                                  Register tmp2) {
   Label done;
-  generate_post_barrier(masm, store_addr, new_val, tmp, done, true /* new_val_may_be_null */);
+  generate_post_barrier(masm, store_addr, new_val, tmp1, tmp2, done, true /* new_val_may_be_null */);
   __ bind(done);
 }
 
@@ -372,10 +374,11 @@ void G1BarrierSetAssembler::generate_c2_pre_barrier_stub(MacroAssembler* masm,
 void G1BarrierSetAssembler::g1_write_barrier_post_c2(MacroAssembler* masm,
                                                      Register store_addr,
                                                      Register new_val,
-                                                     Register tmp,
+                                                     Register tmp1,
+                                                     Register tmp2,
                                                      bool new_val_may_be_null) {
   Label done;
-  generate_post_barrier(masm, store_addr, new_val, tmp, done, new_val_may_be_null);
+  generate_post_barrier(masm, store_addr, new_val, tmp1, tmp2, done, new_val_may_be_null);
   __ bind(done);
 }
 
@@ -423,7 +426,8 @@ void G1BarrierSetAssembler::oop_store_at(MacroAssembler* masm, DecoratorSet deco
       g1_write_barrier_post(masm /*masm*/,
                             tmp1 /* store_adr */,
                             new_val /* new_val */,
-                            tmp3 /* tmp */);
+                            tmp3 /* tmp1 */,
+                            tmp2 /* tmp2 */);
     }
   }
 }
@@ -464,9 +468,9 @@ void G1BarrierSetAssembler::g1_write_barrier_post_c1(MacroAssembler* masm,
                                                      Register new_val,
                                                      Register thread,
                                                      Register tmp1,
-                                                     Register tmp2 /* unused on x86 */) {
+                                                     Register tmp2) {
   Label done;
-  generate_post_barrier(masm, store_addr, new_val, tmp1, done, true /* new_val_may_be_null */);
+  generate_post_barrier(masm, store_addr, new_val, tmp1, tmp2, done, true /* new_val_may_be_null */);
   masm->bind(done);
 }
 
diff --git a/src/hotspot/cpu/x86/gc/g1/g1BarrierSetAssembler_x86.hpp b/src/hotspot/cpu/x86/gc/g1/g1BarrierSetAssembler_x86.hpp
index 4b2de41de69..5df4bb54832 100644
--- a/src/hotspot/cpu/x86/gc/g1/g1BarrierSetAssembler_x86.hpp
+++ b/src/hotspot/cpu/x86/gc/g1/g1BarrierSetAssembler_x86.hpp
@@ -49,7 +49,8 @@ class G1BarrierSetAssembler: public ModRefBarrierSetAssembler {
   void g1_write_barrier_post(MacroAssembler* masm,
                              Register store_addr,
                              Register new_val,
-                             Register tmp);
+                             Register tmp1,
+                             Register tmp2);
 
   virtual void oop_store_at(MacroAssembler* masm, DecoratorSet decorators, BasicType type,
                             Address dst, Register val, Register tmp1, Register tmp2, Register tmp3);
@@ -82,7 +83,8 @@ class G1BarrierSetAssembler: public ModRefBarrierSetAssembler {
   void g1_write_barrier_post_c2(MacroAssembler* masm,
                                 Register store_addr,
                                 Register new_val,
-                                Register tmp,
+                                Register tmp1,
+                                Register tmp2,
                                 bool new_val_may_be_null);
 #endif // COMPILER2
 };
diff --git a/src/hotspot/cpu/x86/gc/g1/g1_x86_64.ad b/src/hotspot/cpu/x86/gc/g1/g1_x86_64.ad
index 94607cd6796..fbeab8bdb0a 100644
--- a/src/hotspot/cpu/x86/gc/g1/g1_x86_64.ad
+++ b/src/hotspot/cpu/x86/gc/g1/g1_x86_64.ad
@@ -59,14 +59,15 @@ static void write_barrier_post(MacroAssembler* masm,
                                const MachNode* node,
                                Register store_addr,
                                Register new_val,
-                               Register tmp1) {
+                               Register tmp1,
+                               Register tmp2) {
   if (!G1BarrierStubC2::needs_post_barrier(node)) {
     return;
   }
   Assembler::InlineSkippedInstructionsCounter skip_counter(masm);
   G1BarrierSetAssembler* g1_asm = static_cast<G1BarrierSetAssembler*>(BarrierSet::barrier_set()->barrier_set_assembler());
   bool new_val_may_be_null = G1BarrierStubC2::post_new_val_may_be_null(node);
-  g1_asm->g1_write_barrier_post_c2(masm, store_addr, new_val, tmp1, new_val_may_be_null);
+  g1_asm->g1_write_barrier_post_c2(masm, store_addr, new_val, tmp1, tmp2, new_val_may_be_null);
 }
 
 %}
@@ -94,7 +95,8 @@ instruct g1StoreP(memory mem, any_RegP src, rRegP tmp1, rRegP tmp2, rRegP tmp3,
     write_barrier_post(masm, this,
                        $tmp1$$Register /* store_addr */,
                        $src$$Register /* new_val */,
-                       $tmp3$$Register /* tmp1 */);
+                       $tmp3$$Register /* tmp1 */,
+                       $tmp2$$Register /* tmp2 */);
   %}
   ins_pipe(ialu_mem_reg);
 %}
@@ -125,7 +127,8 @@ instruct g1StoreN(memory mem, rRegN src, rRegP tmp1, rRegP tmp2, rRegP tmp3, rFl
     write_barrier_post(masm, this,
                        $tmp1$$Register /* store_addr */,
                        $tmp2$$Register /* new_val */,
-                       $tmp3$$Register /* tmp1 */);
+                       $tmp3$$Register /* tmp1 */,
+                       $tmp2$$Register /* tmp2 */);
   %}
   ins_pipe(ialu_mem_reg);
 %}
@@ -155,7 +158,8 @@ instruct g1EncodePAndStoreN(memory mem, any_RegP src, rRegP tmp1, rRegP tmp2, rR
     write_barrier_post(masm, this,
                        $tmp1$$Register /* store_addr */,
                        $src$$Register /* new_val */,
-                       $tmp3$$Register /* tmp1 */);
+                       $tmp3$$Register /* tmp1 */,
+                       $tmp2$$Register /* tmp2 */);
   %}
   ins_pipe(ialu_mem_reg);
 %}
@@ -183,7 +187,8 @@ instruct g1CompareAndExchangeP(indirect mem, rRegP newval, rRegP tmp1, rRegP tmp
     write_barrier_post(masm, this,
                        $mem$$Register /* store_addr */,
                        $tmp1$$Register /* new_val */,
-                       $tmp2$$Register /* tmp1 */);
+                       $tmp2$$Register /* tmp1 */,
+                       $tmp3$$Register /* tmp2 */);
   %}
   ins_pipe(pipe_cmpxchg);
 %}
@@ -209,7 +214,8 @@ instruct g1CompareAndExchangeN(indirect mem, rRegN newval, rRegP tmp1, rRegP tmp
     write_barrier_post(masm, this,
                        $mem$$Register /* store_addr */,
                        $tmp1$$Register /* new_val */,
-                       $tmp2$$Register /* tmp1 */);
+                       $tmp2$$Register /* tmp1 */,
+                       $tmp3$$Register /* tmp2 */);
   %}
   ins_pipe(pipe_cmpxchg);
 %}
@@ -240,7 +246,8 @@ instruct g1CompareAndSwapP(rRegI res, indirect mem, rRegP newval, rRegP tmp1, rR
     write_barrier_post(masm, this,
                        $mem$$Register /* store_addr */,
                        $tmp1$$Register /* new_val */,
-                       $tmp2$$Register /* tmp1 */);
+                       $tmp2$$Register /* tmp1 */,
+                       $tmp3$$Register /* tmp2 */);
   %}
   ins_pipe(pipe_cmpxchg);
 %}
@@ -272,7 +279,8 @@ instruct g1CompareAndSwapN(rRegI res, indirect mem, rRegN newval, rRegP tmp1, rR
     write_barrier_post(masm, this,
                        $mem$$Register /* store_addr */,
                        $tmp1$$Register /* new_val */,
-                       $tmp2$$Register /* tmp1 */);
+                       $tmp2$$Register /* tmp1 */,
+                       $tmp3$$Register /* tmp2 */);
   %}
   ins_pipe(pipe_cmpxchg);
 %}
@@ -295,7 +303,8 @@ instruct g1GetAndSetP(indirect mem, rRegP newval, rRegP tmp1, rRegP tmp2, rRegP
     write_barrier_post(masm, this,
                        $mem$$Register /* store_addr */,
                        $tmp1$$Register /* new_val */,
-                       $tmp2$$Register /* tmp1 */);
+                       $tmp2$$Register /* tmp1 */,
+                       $tmp3$$Register /* tmp2 */);
   %}
   ins_pipe(pipe_cmpxchg);
 %}
@@ -319,7 +328,8 @@ instruct g1GetAndSetN(indirect mem, rRegN newval, rRegP tmp1, rRegP tmp2, rRegP
     write_barrier_post(masm, this,
                        $mem$$Register /* store_addr */,
                        $tmp1$$Register /* new_val */,
-                       $tmp2$$Register /* tmp1 */);
+                       $tmp2$$Register /* tmp1 */,
+                       $tmp3$$Register /* tmp2 */);
   %}
   ins_pipe(pipe_cmpxchg);
 %}
diff --git a/src/hotspot/share/gc/g1/g1BarrierSet.cpp b/src/hotspot/share/gc/g1/g1BarrierSet.cpp
index ab7d6febf4c..4782202a434 100644
--- a/src/hotspot/share/gc/g1/g1BarrierSet.cpp
+++ b/src/hotspot/share/gc/g1/g1BarrierSet.cpp
@@ -60,8 +60,9 @@ G1BarrierSet::G1BarrierSet(G1CardTable* card_table,
                       BarrierSet::FakeRtti(BarrierSet::G1BarrierSet)),
   _satb_mark_queue_buffer_allocator("SATB Buffer Allocator", G1SATBBufferSize),
   _satb_mark_queue_set(&_satb_mark_queue_buffer_allocator),
-  _refinement_table(refinement_table)
-{}
+  _refinement_table(refinement_table) {
+  _global_byte_map_base = _card_table->byte_map_base();
+}
 
 G1BarrierSet::~G1BarrierSet() {
   delete _refinement_table;
@@ -71,16 +72,8 @@ void G1BarrierSet::swap_global_card_table() {
   G1CardTable* temp = static_cast<G1CardTable*>(_card_table);
   _card_table = _refinement_table;
   _refinement_table = temp;
-}
 
-void G1BarrierSet::update_card_table_base(Thread* thread) {
-#ifdef ASSERT
-  {
-    ResourceMark rm;
-    assert(thread->is_Java_thread(), "may only update card table base of JavaThreads, not %s", thread->name());
-  }
-#endif
-  G1ThreadLocalData::set_byte_map_base(thread, _card_table->byte_map_base());
+  _global_byte_map_base = _card_table->byte_map_base();
 }
 
 template <class T> void
@@ -169,11 +162,6 @@ void G1BarrierSet::on_thread_attach(Thread* thread) {
   // set the active field of the SATB queue to true.  That involves
   // copying the global is_active value to this thread's queue.
   satbq.set_active(_satb_mark_queue_set.is_active());
-
-  if (thread->is_Java_thread()) {
-    assert(Threads_lock->is_locked(), "must be, synchronization with refinement.");
-    update_card_table_base(thread);
-  }
 }
 
 void G1BarrierSet::on_thread_detach(Thread* thread) {
diff --git a/src/hotspot/share/gc/g1/g1BarrierSet.hpp b/src/hotspot/share/gc/g1/g1BarrierSet.hpp
index 20642cfc7e6..22037a280ce 100644
--- a/src/hotspot/share/gc/g1/g1BarrierSet.hpp
+++ b/src/hotspot/share/gc/g1/g1BarrierSet.hpp
@@ -68,6 +68,7 @@ class G1BarrierSet: public CardTableBarrierSet {
 
   G1CardTable* _refinement_table;
 
+  CardValue* _global_byte_map_base;
  public:
   G1BarrierSet(G1CardTable* card_table, G1CardTable* refinement_table);
   virtual ~G1BarrierSet();
@@ -81,8 +82,10 @@ class G1BarrierSet: public CardTableBarrierSet {
   // Swap the global card table references, without synchronization.
   void swap_global_card_table();
 
-  // Update the given thread's card table (byte map) base to the current card table's.
-  void update_card_table_base(Thread* thread);
+  // Use by barrier set assembler.
+  intptr_t globa_byte_map_base_addr() const {
+    return (intptr_t)&_global_byte_map_base;
+  }
 
   virtual bool card_mark_must_follow_store() const {
     return true;
diff --git a/src/hotspot/share/gc/g1/g1CollectedHeap.cpp b/src/hotspot/share/gc/g1/g1CollectedHeap.cpp
index 2368b5b4fc4..668c7188f4a 100644
--- a/src/hotspot/share/gc/g1/g1CollectedHeap.cpp
+++ b/src/hotspot/share/gc/g1/g1CollectedHeap.cpp
@@ -832,20 +832,6 @@ void G1CollectedHeap::prepare_for_mutator_after_full_collection(size_t allocatio
 void G1CollectedHeap::abort_refinement() {
   G1ConcurrentRefineSweepState& sweep_state = concurrent_refine()->sweep_state();
   if (sweep_state.is_in_progress()) {
-
-    if (!sweep_state.are_java_threads_synched()) {
-      // Synchronize Java threads with global card table that has already been swapped.
-      class SwapThreadCardTableClosure : public ThreadClosure {
-      public:
-
-        virtual void do_thread(Thread* t) {
-          G1BarrierSet* bs = G1BarrierSet::g1_barrier_set();
-          bs->update_card_table_base(t);
-        }
-      } cl;
-      Threads::java_threads_do(&cl);
-    }
-
     // Record any available refinement statistics.
     policy()->record_refinement_stats(sweep_state.stats());
     sweep_state.complete_work(false /* concurrent */, false /* print_log */);
@@ -1391,10 +1377,6 @@ jint G1CollectedHeap::initialize() {
   G1CardTable* card_table = new G1CardTable(_reserved);
   G1CardTable* refinement_table = new G1CardTable(_reserved);
 
-  G1BarrierSet* bs = new G1BarrierSet(card_table, refinement_table);
-  bs->initialize();
-  assert(bs->is_a(BarrierSet::G1BarrierSet), "sanity");
-
   // Create space mappers.
   size_t page_size = heap_rs.page_size();
   G1RegionToSpaceMapper* heap_storage =
@@ -1441,6 +1423,10 @@ jint G1CollectedHeap::initialize() {
   card_table->initialize(cardtable_storage);
   refinement_table->initialize(refinement_cards_storage);
 
+  G1BarrierSet* bs = new G1BarrierSet(card_table, refinement_table);
+  bs->initialize();
+  assert(bs->is_a(BarrierSet::G1BarrierSet), "sanity");
+
   BarrierSet::set_barrier_set(bs);
 
   {
diff --git a/src/hotspot/share/gc/g1/g1ConcurrentRefine.cpp b/src/hotspot/share/gc/g1/g1ConcurrentRefine.cpp
index ed6a9ad4292..1fd03f021ff 100644
--- a/src/hotspot/share/gc/g1/g1ConcurrentRefine.cpp
+++ b/src/hotspot/share/gc/g1/g1ConcurrentRefine.cpp
@@ -182,20 +182,7 @@ bool G1ConcurrentRefineSweepState::swap_global_card_table() {
   GCTraceTime(Info, gc, refine) tm("Concurrent Refine Global Card Table Swap");
   set_state_start_time();
 
-  {
-    // We can't have any new threads being in the process of created while we
-    // swap the card table because we read the current card table state during
-    // initialization.
-    // A safepoint may occur during that time, so leave the STS temporarily.
-    SuspendibleThreadSetLeaver sts_leave;
-
-    MutexLocker mu(Threads_lock);
-    // A GC that advanced the epoch might have happened, which already switched
-    // The global card table. Do nothing.
-    if (is_in_progress()) {
-      G1BarrierSet::g1_barrier_set()->swap_global_card_table();
-    }
-  }
+  G1BarrierSet::g1_barrier_set()->swap_global_card_table();
 
   return advance_state(State::SwapJavaThreadsCT);
 }
@@ -216,8 +203,7 @@ bool G1ConcurrentRefineSweepState::swap_java_threads_ct() {
       G1SwapThreadCardTableClosure() : HandshakeClosure("G1 Java Thread CT swap") { }
 
       virtual void do_thread(Thread* thread) {
-        G1BarrierSet* bs = G1BarrierSet::g1_barrier_set();
-        bs->update_card_table_base(thread);
+        // Empty
       }
     } cl;
     Handshake::execute(&cl);
diff --git a/src/hotspot/share/gc/g1/g1HeapVerifier.cpp b/src/hotspot/share/gc/g1/g1HeapVerifier.cpp
index 21b3545f7e0..e903df29889 100644
--- a/src/hotspot/share/gc/g1/g1HeapVerifier.cpp
+++ b/src/hotspot/share/gc/g1/g1HeapVerifier.cpp
@@ -529,7 +529,6 @@ void G1HeapVerifier::verify_before_gc() {
 
 void G1HeapVerifier::verify_after_gc() {
   verify(VerifyOption::G1UseConcMarking, "After GC");
-  verify_card_tables_in_sync();
 }
 
 void G1HeapVerifier::verify_bitmap_clear(bool from_tams) {
@@ -636,39 +635,6 @@ void G1HeapVerifier::verify_rt_clean_region(G1HeapRegion* hr) {
 
 #ifndef PRODUCT
 
-void G1HeapVerifier::verify_card_tables_in_sync() {
-
-    // Non-Java thread card tables must be null.
-    class AssertCardTableBaseNull : public ThreadClosure {
-    public:
-
-      void do_thread(Thread* thread) {
-        ResourceMark rm;
-        assert(G1ThreadLocalData::get_byte_map_base(thread) == nullptr, "thread " PTR_FORMAT " (%s) has non-null card table base",
-               p2i(thread), thread->name());
-      }
-    } check_null_cl;
-
-    Threads::non_java_threads_do(&check_null_cl);
-
-    // Java thread card tables must be the same as the global card table.
-    class AssertSameCardTableClosure : public ThreadClosure {
-    public:
-
-      void do_thread(Thread* thread) {
-        G1CardTable::CardValue* global_ct_base = G1CollectedHeap::heap()->card_table_base();
-        G1CardTable::CardValue* cur_ct_base = G1ThreadLocalData::get_byte_map_base(thread);
-
-        ResourceMark rm;
-        assert(cur_ct_base == global_ct_base,
-               "thread " PTR_FORMAT " (%s) has wrong card table base, should be " PTR_FORMAT " is " PTR_FORMAT,
-               p2i(thread), thread->name(), p2i(global_ct_base), p2i(cur_ct_base));
-      }
-    } check_same_cl;
-
-    Threads::java_threads_do(&check_same_cl);
-}
-
 class G1CheckRegionAttrTableClosure : public G1HeapRegionClosure {
 private:
   bool _failures;
diff --git a/src/hotspot/share/gc/g1/g1ThreadLocalData.hpp b/src/hotspot/share/gc/g1/g1ThreadLocalData.hpp
index 07c8c569504..3bd1f9ac6cb 100644
--- a/src/hotspot/share/gc/g1/g1ThreadLocalData.hpp
+++ b/src/hotspot/share/gc/g1/g1ThreadLocalData.hpp
@@ -36,16 +36,6 @@
 class G1ThreadLocalData {
 private:
   SATBMarkQueue _satb_mark_queue;
-  // The current base address of the card table. Accessed by the barrier to do
-  // the card mark. Changed as required by the refinement control thread to
-  // implement card table switching.
-  //
-  // Tests showed that embedding this value in the TLS block is the cheapest
-  // way for fast access to this value in the barrier.
-  // E.g. embedding an address to that value directly into the code stream and
-  // then loading from that was found to be slower on non-x64 architectures.
-  // Additionally it increases code size a lot.
-  G1CardTable::CardValue* _byte_map_base;
 
   // Per-thread cache of pinned object count to reduce atomic operation traffic
   // due to region pinning. Holds the last region where the mutator pinned an
@@ -54,7 +44,6 @@ class G1ThreadLocalData {
 
   G1ThreadLocalData() :
       _satb_mark_queue(&G1BarrierSet::satb_mark_queue_set()),
-      _byte_map_base(nullptr),
       _pin_cache() { }
 
   static G1ThreadLocalData* data(Thread* thread) {
@@ -91,20 +80,6 @@ class G1ThreadLocalData {
     return satb_mark_queue_offset() + SATBMarkQueue::byte_offset_of_buf();
   }
 
-  static ByteSize card_table_base_offset() {
-    return Thread::gc_data_offset() + byte_offset_of(G1ThreadLocalData, _byte_map_base);
-  }
-
-  static void set_byte_map_base(Thread* thread, G1CardTable::CardValue* new_byte_map_base) {
-    data(thread)->_byte_map_base = new_byte_map_base;
-  }
-
-#ifndef PRODUCT
-  static G1CardTable::CardValue* get_byte_map_base(Thread* thread) {
-    return data(thread)->_byte_map_base;
-  }
-#endif
-
   static G1RegionPinCache& pin_count_cache(Thread* thread) {
     return data(thread)->_pin_cache;
   }
diff --git a/src/hotspot/share/gc/g1/g1YoungGCPostEvacuateTasks.cpp b/src/hotspot/share/gc/g1/g1YoungGCPostEvacuateTasks.cpp
index 2737def7e84..17d4fa9a90a 100644
--- a/src/hotspot/share/gc/g1/g1YoungGCPostEvacuateTasks.cpp
+++ b/src/hotspot/share/gc/g1/g1YoungGCPostEvacuateTasks.cpp
@@ -850,8 +850,6 @@ class G1PostEvacuateCollectionSetCleanupTask2::ResizeTLABsAndSwapCardTableTask :
         if (UseTLAB && ResizeTLAB) {
           static_cast<JavaThread*>(thread)->tlab().resize();
         }
-
-        G1BarrierSet::g1_barrier_set()->update_card_table_base(thread);
       }
     } resize_and_swap_cl;
 
diff --git a/src/hotspot/share/jvmci/vmStructs_jvmci.cpp b/src/hotspot/share/jvmci/vmStructs_jvmci.cpp
index b91de1c9b35..8119d85ce5a 100644
--- a/src/hotspot/share/jvmci/vmStructs_jvmci.cpp
+++ b/src/hotspot/share/jvmci/vmStructs_jvmci.cpp
@@ -950,7 +950,6 @@
   declare_constant_with_value("G1ThreadLocalData::satb_mark_queue_active_offset", in_bytes(G1ThreadLocalData::satb_mark_queue_active_offset())) \
   declare_constant_with_value("G1ThreadLocalData::satb_mark_queue_index_offset", in_bytes(G1ThreadLocalData::satb_mark_queue_index_offset())) \
   declare_constant_with_value("G1ThreadLocalData::satb_mark_queue_buffer_offset", in_bytes(G1ThreadLocalData::satb_mark_queue_buffer_offset())) \
-  declare_constant_with_value("G1ThreadLocalData::card_table_base_offset", in_bytes(G1ThreadLocalData::card_table_base_offset())) \
 
 #endif // INCLUDE_G1GC
 
