Index: cpukit/posix/src/adjtime.c
===================================================================
--- cpukit/posix/src/adjtime.c	(revision 3888771772a57b4c924e1987e603e7a1b957e07c)
+++ cpukit/posix/src/adjtime.c	(revision 1ef8e4a8e93a848e2a68f37e029039300f1c936b)
@@ -83,5 +83,5 @@
    * Now apply the adjustment
    */
-  _TOD_Adjust( delta_as_timestamp );
+  _TOD_Adjust( &delta_as_timestamp );
 
   return 0;
Index: cpukit/posix/src/clocksettime.c
===================================================================
--- cpukit/posix/src/clocksettime.c	(revision 3888771772a57b4c924e1987e603e7a1b957e07c)
+++ cpukit/posix/src/clocksettime.c	(revision 1ef8e4a8e93a848e2a68f37e029039300f1c936b)
@@ -20,7 +20,5 @@
 
 #include <time.h>
-#include <errno.h>
 
-#include <rtems/score/threaddispatch.h>
 #include <rtems/score/todimpl.h>
 #include <rtems/seterr.h>
@@ -42,7 +40,5 @@
       rtems_set_errno_and_return_minus_one( EINVAL );
 
-    _Thread_Disable_dispatch();
-      _TOD_Set_with_timespec( tp );
-    _Thread_Enable_dispatch();
+    _TOD_Set_with_timespec( tp );
   }
 #ifdef _POSIX_CPUTIME
Index: cpukit/rtems/src/clockset.c
===================================================================
--- cpukit/rtems/src/clockset.c	(revision 3888771772a57b4c924e1987e603e7a1b957e07c)
+++ cpukit/rtems/src/clockset.c	(revision 1ef8e4a8e93a848e2a68f37e029039300f1c936b)
@@ -20,5 +20,4 @@
 
 #include <rtems/rtems/clock.h>
-#include <rtems/score/threaddispatch.h>
 #include <rtems/score/todimpl.h>
 #include <rtems/config.h>
@@ -33,13 +32,17 @@
   if ( _TOD_Validate( tod ) ) {
     Timestamp_Control tod_as_timestamp;
-    uint32_t seconds = _TOD_To_seconds( tod );
-    uint32_t nanoseconds = tod->ticks
+    uint32_t          seconds;
+    uint32_t          nanoseconds;
+    ISR_lock_Context  lock_context;
+
+    seconds = _TOD_To_seconds( tod );
+    nanoseconds = tod->ticks
       * rtems_configuration_get_nanoseconds_per_tick();
-
     _Timestamp_Set( &tod_as_timestamp, seconds, nanoseconds );
 
-    _Thread_Disable_dispatch();
-      _TOD_Set( &tod_as_timestamp );
-    _Thread_Enable_dispatch();
+    _TOD_Lock();
+    _TOD_Acquire( &lock_context );
+    _TOD_Set( &tod_as_timestamp, &lock_context );
+    _TOD_Unlock();
 
     return RTEMS_SUCCESSFUL;
Index: cpukit/score/include/rtems/score/timecounterimpl.h
===================================================================
--- cpukit/score/include/rtems/score/timecounterimpl.h	(revision 3888771772a57b4c924e1987e603e7a1b957e07c)
+++ cpukit/score/include/rtems/score/timecounterimpl.h	(revision 1ef8e4a8e93a848e2a68f37e029039300f1c936b)
@@ -37,5 +37,8 @@
  */
 
-void _Timecounter_Set_clock( const struct timespec *ts );
+void _Timecounter_Set_clock(
+  const struct bintime *bt,
+  ISR_lock_Context     *lock_context
+);
 
 /** @} */
Index: cpukit/score/include/rtems/score/todimpl.h
===================================================================
--- cpukit/score/include/rtems/score/todimpl.h	(revision 3888771772a57b4c924e1987e603e7a1b957e07c)
+++ cpukit/score/include/rtems/score/todimpl.h	(revision 1ef8e4a8e93a848e2a68f37e029039300f1c936b)
@@ -20,4 +20,5 @@
 
 #include <rtems/score/tod.h>
+#include <rtems/score/apimutex.h>
 #include <rtems/score/timestamp.h>
 #include <rtems/score/timecounterimpl.h>
@@ -143,12 +144,34 @@
 extern TOD_Control _TOD;
 
+static inline void _TOD_Lock( void )
+{
+  /* FIXME: https://devel.rtems.org/ticket/2630 */
+  _API_Mutex_Lock( _Once_Mutex );
+}
+
+static inline void _TOD_Unlock( void )
+{
+  _API_Mutex_Unlock( _Once_Mutex );
+}
+
+static inline void _TOD_Acquire( ISR_lock_Context *lock_context )
+{
+  _Timecounter_Acquire( lock_context );
+}
+
 /**
  * @brief Sets the time of day.
+ *
+ * The caller must be the owner of the TOD lock.
  *
  * @param tod_as_timestamp The new time of day in timestamp format representing
  *   the time since UNIX Epoch.
+ * @param lock_context The ISR lock context used for the corresponding
+ *   _TOD_Acquire().  The caller must be the owner of the TOD lock.  This
+ *   function will release the TOD lock.
  */
 void _TOD_Set(
-  const Timestamp_Control *tod_as_timestamp
+  const Timestamp_Control *tod_as_timestamp,
+  ISR_lock_Context        *lock_context
 );
 
@@ -165,4 +188,5 @@
 {
   Timestamp_Control tod_as_timestamp;
+  ISR_lock_Context  lock_context;
 
   _Timestamp_Set(
@@ -171,5 +195,9 @@
     tod_as_timespec->tv_nsec
   );
-  _TOD_Set( &tod_as_timestamp );
+
+  _TOD_Lock();
+  _TOD_Acquire( &lock_context );
+  _TOD_Set( &tod_as_timestamp, &lock_context );
+  _TOD_Unlock();
 }
 
@@ -297,5 +325,5 @@
  */
 void _TOD_Adjust(
-  const Timestamp_Control timestamp
+  const Timestamp_Control *delta
 );
 
Index: cpukit/score/src/coretodadjust.c
===================================================================
--- cpukit/score/src/coretodadjust.c	(revision 3888771772a57b4c924e1987e603e7a1b957e07c)
+++ cpukit/score/src/coretodadjust.c	(revision 1ef8e4a8e93a848e2a68f37e029039300f1c936b)
@@ -19,12 +19,12 @@
 #endif
 
-#include <rtems/score/threaddispatch.h>
 #include <rtems/score/todimpl.h>
 
 void _TOD_Adjust(
-  const Timestamp_Control delta
+  const Timestamp_Control *delta
 )
 {
   Timestamp_Control tod;
+  ISR_lock_Context  lock_context;
 
   /*
@@ -36,15 +36,9 @@
    */
 
-  /*
-   * This prevents context switches while we are adjusting the TOD
-   */
-  _Thread_Disable_dispatch();
-
-    _TOD_Get( &tod );
-
-    _Timestamp_Add_to( &tod, &delta );
-
-    _TOD_Set( &tod );
-
-  _Thread_Enable_dispatch();
+  _TOD_Lock();
+  _TOD_Acquire( &lock_context );
+  _TOD_Get( &tod );
+  _Timestamp_Add_to( &tod, delta );
+  _TOD_Set( &tod, &lock_context );
+  _TOD_Unlock();
 }
Index: cpukit/score/src/coretodset.c
===================================================================
--- cpukit/score/src/coretodset.c	(revision 3888771772a57b4c924e1987e603e7a1b957e07c)
+++ cpukit/score/src/coretodset.c	(revision 1ef8e4a8e93a848e2a68f37e029039300f1c936b)
@@ -20,9 +20,10 @@
 
 #include <rtems/score/todimpl.h>
-#include <rtems/score/threaddispatch.h>
+#include <rtems/score/assert.h>
 #include <rtems/score/watchdogimpl.h>
 
 void _TOD_Set(
-  const Timestamp_Control *tod_as_timestamp
+  const Timestamp_Control *tod_as_timestamp,
+  ISR_lock_Context        *lock_context
 )
 {
@@ -32,10 +33,9 @@
   uint32_t        cpu_index;
 
+  _Assert( _API_Mutex_Is_owner( _Once_Mutex ) );
+
+  _Timecounter_Set_clock( tod_as_timestamp, lock_context );
+
   _Timestamp_To_timespec( tod_as_timestamp, &tod_as_timespec );
-
-  _Thread_Disable_dispatch();
-
-  _Timecounter_Set_clock( &tod_as_timespec );
-
   tod_as_ticks = _Watchdog_Ticks_from_timespec( &tod_as_timespec );
   cpu_count = _SMP_Get_processor_count();
@@ -48,5 +48,3 @@
 
   _TOD.is_set = true;
-
-  _Thread_Enable_dispatch();
 }
Index: cpukit/score/src/kern_tc.c
===================================================================
--- cpukit/score/src/kern_tc.c	(revision 3888771772a57b4c924e1987e603e7a1b957e07c)
+++ cpukit/score/src/kern_tc.c	(revision 1ef8e4a8e93a848e2a68f37e029039300f1c936b)
@@ -34,4 +34,5 @@
 #define	boottimebin _Timecounter_Boottimebin
 #include <rtems/score/timecounterimpl.h>
+#include <rtems/score/smp.h>
 #include <rtems/score/todimpl.h>
 #include <rtems/score/watchdogimpl.h>
@@ -216,4 +217,6 @@
 #ifndef __rtems__
 static void cpu_tick_calibrate(int);
+#else /* __rtems__ */
+static void _Timecounter_Windup(ISR_lock_Context *lock_context);
 #endif /* __rtems__ */
 
@@ -1345,10 +1348,10 @@
  * XXX: not locked.
  */
-#ifndef __rtems__
-void
+void
+#ifndef __rtems__
 tc_setclock(struct timespec *ts)
 #else /* __rtems__ */
-void
-_Timecounter_Set_clock(const struct timespec *ts)
+_Timecounter_Set_clock(const struct bintime *_bt,
+    ISR_lock_Context *lock_context)
 #endif /* __rtems__ */
 {
@@ -1361,6 +1364,8 @@
 	cpu_tick_calibrate(1);
 	nanotime(&tbef);
-#endif /* __rtems__ */
 	timespec2bintime(ts, &bt);
+#else /* __rtems__ */
+	bt = *_bt;
+#endif /* __rtems__ */
 	binuptime(&bt2);
 	bintime_sub(&bt, &bt2);
@@ -1369,9 +1374,7 @@
 #ifndef __rtems__
 	bintime2timeval(&bt, &boottime);
-#endif /* __rtems__ */
 
 	/* XXX fiddle all the little crinkly bits around the fiords... */
 	tc_windup();
-#ifndef __rtems__
 	nanotime(&taft);
 	if (timestepwarnings) {
@@ -1383,4 +1386,6 @@
 	}
 	cpu_tick_calibrate(1);
+#else /* __rtems__ */
+	_Timecounter_Windup(lock_context);
 #endif /* __rtems__ */
 }
@@ -1393,4 +1398,15 @@
 static void
 tc_windup(void)
+#ifdef __rtems__
+{
+        ISR_lock_Context lock_context;
+
+        _Timecounter_Acquire(&lock_context);
+        _Timecounter_Windup(&lock_context);
+}
+
+static void
+_Timecounter_Windup(ISR_lock_Context *lock_context)
+#endif /* __rtems__ */
 {
 	struct bintime bt;
@@ -1400,9 +1416,4 @@
 	int i;
 	time_t t;
-#ifdef __rtems__
-	ISR_lock_Context lock_context;
-
-	_Timecounter_Acquire(&lock_context);
-#endif /* __rtems__ */
 
 	/*
@@ -1566,5 +1577,5 @@
 #endif /* __rtems__ */
 #ifdef __rtems__
-	_Timecounter_Release(&lock_context);
+	_Timecounter_Release(lock_context);
 #endif /* __rtems__ */
 }
@@ -1979,6 +1990,7 @@
 		return;
 	count = 0;
+	tc_windup();
+}
 #else /* __rtems__ */
-#include <rtems/score/smp.h>
 void
 _Timecounter_Tick(void)
@@ -1987,13 +1999,10 @@
 
 	if (_Per_CPU_Is_boot_processor(cpu_self)) {
-#endif /* __rtems__ */
-	tc_windup();
-#ifdef __rtems__
-	};
+                tc_windup();
+	}
 
 	_Watchdog_Tick(cpu_self);
-#endif /* __rtems__ */
-}
-#ifdef __rtems__
+}
+
 void
 _Timecounter_Tick_simple(uint32_t delta, uint32_t offset,
