Index: cpukit/sapi/include/rtems/chain.h
===================================================================
--- cpukit/sapi/include/rtems/chain.h	(revision e6c87f78724743bc74a38678f93ed579ace840f2)
+++ cpukit/sapi/include/rtems/chain.h	(revision ae88aa7927dbbfb7b841dee8133f55c38303b91b)
@@ -6,5 +6,5 @@
 
 /*
- *  Copyright (c) 2010 embedded brains GmbH.
+ *  Copyright (c) 2010-2014 embedded brains GmbH.
  *
  *  COPYRIGHT (c) 1989-2008.
@@ -20,5 +20,4 @@
 
 #include <rtems/score/chainimpl.h>
-#include <rtems/score/isrlock.h>
 #include <rtems/rtems/event.h>
 
@@ -38,8 +37,5 @@
 typedef Chain_Node rtems_chain_node;
 
-typedef struct {
-  Chain_Control Chain;
-  ISR_lock_Control Lock;
-} rtems_chain_control;
+typedef Chain_Control rtems_chain_control;
 
 /**
@@ -47,5 +43,5 @@
  */
 #define RTEMS_CHAIN_INITIALIZER_EMPTY( name ) \
-  { CHAIN_INITIALIZER_EMPTY( name.Chain ), ISR_LOCK_INITIALIZER }
+  CHAIN_INITIALIZER_EMPTY( name )
 
 /**
@@ -55,5 +51,5 @@
  */
 #define RTEMS_CHAIN_INITIALIZER_ONE_NODE( node ) \
-  { CHAIN_INITIALIZER_ONE_NODE( node ), ISR_LOCK_INITIALIZER }
+  CHAIN_INITIALIZER_ONE_NODE( node )
 
 /**
@@ -63,5 +59,5 @@
  */
 #define RTEMS_CHAIN_NODE_INITIALIZER_ONE_NODE_CHAIN( chain ) \
-  CHAIN_NODE_INITIALIZER_ONE_NODE_CHAIN( &( chain )->Chain )
+  CHAIN_NODE_INITIALIZER_ONE_NODE_CHAIN( chain )
 
 /**
@@ -155,7 +151,6 @@
 )
 {
-  _ISR_lock_Initialize( &the_chain->Lock );
   _Chain_Initialize(
-    &the_chain->Chain,
+    the_chain,
     starting_address,
     number_nodes,
@@ -175,6 +170,5 @@
 )
 {
-  _ISR_lock_Initialize( &the_chain->Lock );
-  _Chain_Initialize_empty( &the_chain->Chain );
+  _Chain_Initialize_empty( the_chain );
 }
 
@@ -242,5 +236,5 @@
 )
 {
-  return _Chain_Head( &the_chain->Chain );
+  return _Chain_Head( the_chain );
 }
 
@@ -258,5 +252,5 @@
 )
 {
-  return _Chain_Immutable_head( &the_chain->Chain );
+  return _Chain_Immutable_head( the_chain );
 }
 
@@ -274,5 +268,5 @@
 )
 {
-  return _Chain_Tail( &the_chain->Chain );
+  return _Chain_Tail( the_chain );
 }
 
@@ -290,5 +284,5 @@
 )
 {
-  return _Chain_Immutable_tail( &the_chain->Chain );
+  return _Chain_Immutable_tail( the_chain );
 }
 
@@ -307,5 +301,5 @@
 )
 {
-  return _Chain_First( &the_chain->Chain );
+  return _Chain_First( the_chain );
 }
 
@@ -324,5 +318,5 @@
 )
 {
-  return _Chain_Immutable_first( &the_chain->Chain );
+  return _Chain_Immutable_first( the_chain );
 }
 
@@ -341,5 +335,5 @@
 )
 {
-  return _Chain_Last( &the_chain->Chain );
+  return _Chain_Last( the_chain );
 }
 
@@ -358,5 +352,5 @@
 )
 {
-  return _Chain_Immutable_last( &the_chain->Chain );
+  return _Chain_Immutable_last( the_chain );
 }
 
@@ -460,5 +454,5 @@
 )
 {
-  return _Chain_Is_empty( &the_chain->Chain );
+  return _Chain_Is_empty( the_chain );
 }
 
@@ -515,5 +509,5 @@
 )
 {
-  return _Chain_Has_only_one_node( &the_chain->Chain );
+  return _Chain_Has_only_one_node( the_chain );
 }
 
@@ -535,5 +529,5 @@
 )
 {
-  return _Chain_Is_head( &the_chain->Chain, the_node );
+  return _Chain_Is_head( the_chain, the_node );
 }
 
@@ -555,8 +549,7 @@
 )
 {
-  return _Chain_Is_tail( &the_chain->Chain, the_node );
-}
-
-#if !defined( RTEMS_SMP )
+  return _Chain_Is_tail( the_chain, the_node );
+}
+
 /**
  * @brief Extract the specified node from a chain.
@@ -568,4 +561,9 @@
  * @arg the_node specifies the node to extract
  */
+#if defined( RTEMS_SMP )
+void rtems_chain_extract(
+  rtems_chain_node *the_node
+);
+#else
 RTEMS_INLINE_ROUTINE void rtems_chain_extract(
   rtems_chain_node *the_node
@@ -573,26 +571,4 @@
 {
   _Chain_Extract( the_node );
-}
-#endif
-
-#if defined( RTEMS_SMP )
-/**
- * @brief Extract the specified node from a chain.
- *
- * @param[in,out] chain The chain containing the node.
- * @param[in,out] node The node to extract.
- */
-void rtems_chain_explicit_extract(
-  rtems_chain_control *chain,
-  rtems_chain_node *node
-);
-#else
-RTEMS_INLINE_ROUTINE void rtems_chain_explicit_extract(
-  rtems_chain_control *chain,
-  rtems_chain_node *node
-)
-{
-  ( void ) chain;
-  rtems_chain_extract( node );
 }
 #endif
@@ -634,5 +610,5 @@
 )
 {
-  return _Chain_Get( &the_chain->Chain );
+  return _Chain_Get( the_chain );
 }
 #endif
@@ -645,8 +621,7 @@
 )
 {
-  return _Chain_Get_unprotected( &the_chain->Chain );
-}
-
-#if !defined( RTEMS_SMP )
+  return _Chain_Get_unprotected( the_chain );
+}
+
 /**
  * @brief Insert a node on a chain
@@ -658,4 +633,10 @@
  * of the extract operation.
  */
+#if defined( RTEMS_SMP )
+void rtems_chain_insert(
+  rtems_chain_node *after_node,
+  rtems_chain_node *the_node
+);
+#else
 RTEMS_INLINE_ROUTINE void rtems_chain_insert(
   rtems_chain_node *after_node,
@@ -664,29 +645,4 @@
 {
   _Chain_Insert( after_node, the_node );
-}
-#endif
-
-/**
- * @brief Insert a node on a chain
- *
- * @param[in,out] chain The chain containing the after node.
- * @param[in,out] after_node Insert the node after this node.
- * @param[in,out] node The node to insert.
- */
-#if defined( RTEMS_SMP )
-void rtems_chain_explicit_insert(
-  rtems_chain_control *chain,
-  rtems_chain_node *after_node,
-  rtems_chain_node *node
-);
-#else
-RTEMS_INLINE_ROUTINE void rtems_chain_explicit_insert(
-  rtems_chain_control *chain,
-  rtems_chain_node *after_node,
-  rtems_chain_node *node
-)
-{
-  ( void ) chain;
-  rtems_chain_insert( after_node, node );
 }
 #endif
@@ -722,5 +678,5 @@
 )
 {
-  _Chain_Append( &the_chain->Chain, the_node );
+  _Chain_Append( the_chain, the_node );
 }
 #endif
@@ -739,5 +695,5 @@
 )
 {
-  _Chain_Append_unprotected( &the_chain->Chain, the_node );
+  _Chain_Append_unprotected( the_chain, the_node );
 }
 
@@ -764,5 +720,5 @@
 )
 {
-  _Chain_Prepend( &the_chain->Chain, the_node );
+  _Chain_Prepend( the_chain, the_node );
 }
 #endif
@@ -784,5 +740,5 @@
 )
 {
-  _Chain_Prepend_unprotected( &the_chain->Chain, the_node );
+  _Chain_Prepend_unprotected( the_chain, the_node );
 }
 
@@ -806,5 +762,5 @@
 )
 {
-  return _Chain_Append_with_empty_check( &chain->Chain, node );
+  return _Chain_Append_with_empty_check( chain, node );
 }
 #endif
@@ -829,5 +785,5 @@
 )
 {
-  return _Chain_Prepend_with_empty_check( &chain->Chain, node );
+  return _Chain_Prepend_with_empty_check( chain, node );
 }
 #endif
@@ -856,5 +812,5 @@
 )
 {
-  return _Chain_Get_with_empty_check( &chain->Chain, node );
+  return _Chain_Get_with_empty_check( chain, node );
 }
 #endif
@@ -874,5 +830,5 @@
 )
 {
-  return _Chain_Node_count_unprotected( &chain->Chain );
+  return _Chain_Node_count_unprotected( chain );
 }
 
Index: cpukit/sapi/src/chainsmp.c
===================================================================
--- cpukit/sapi/src/chainsmp.c	(revision e6c87f78724743bc74a38678f93ed579ace840f2)
+++ cpukit/sapi/src/chainsmp.c	(revision ae88aa7927dbbfb7b841dee8133f55c38303b91b)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2013 embedded brains GmbH.  All rights reserved.
+ * Copyright (c) 2013-2014 embedded brains GmbH.  All rights reserved.
  *
  *  embedded brains GmbH
@@ -21,14 +21,25 @@
 #if defined( RTEMS_SMP )
 
-void rtems_chain_explicit_extract(
-  rtems_chain_control *chain,
-  rtems_chain_node *node
-)
+#include <rtems/score/smplock.h>
+
+static SMP_lock_Control chain_lock = SMP_LOCK_INITIALIZER;
+
+static void chain_acquire( ISR_Level *level )
+{
+  _SMP_lock_ISR_disable_and_acquire( &chain_lock, *level );
+}
+
+static void chain_release( ISR_Level *level )
+{
+  _SMP_lock_Release_and_ISR_enable( &chain_lock, *level );
+}
+
+void rtems_chain_extract( rtems_chain_node *node )
 {
   ISR_Level level;
 
-  _ISR_lock_ISR_disable_and_acquire( &chain->Lock, level );
+  chain_acquire( &level );
   _Chain_Extract_unprotected( node );
-  _ISR_lock_Release_and_ISR_enable( &chain->Lock, level );
+  chain_release( &level );
 }
 
@@ -38,22 +49,18 @@
   ISR_Level level;
 
-  _ISR_lock_ISR_disable_and_acquire( &chain->Lock, level );
-  node = _Chain_Get_unprotected( &chain->Chain );
-  _ISR_lock_Release_and_ISR_enable( &chain->Lock, level );
+  chain_acquire( &level );
+  node = _Chain_Get_unprotected( chain );
+  chain_release( &level );
 
   return node;
 }
 
-void rtems_chain_explicit_insert(
-  rtems_chain_control *chain,
-  rtems_chain_node *after_node,
-  rtems_chain_node *node
-)
+void rtems_chain_insert( rtems_chain_node *after_node, rtems_chain_node *node )
 {
   ISR_Level level;
 
-  _ISR_lock_ISR_disable_and_acquire( &chain->Lock, level );
+  chain_acquire( &level );
   _Chain_Insert_unprotected( after_node, node );
-  _ISR_lock_Release_and_ISR_enable( &chain->Lock, level );
+  chain_release( &level );
 }
 
@@ -65,7 +72,7 @@
   ISR_Level level;
 
-  _ISR_lock_ISR_disable_and_acquire( &chain->Lock, level );
-  _Chain_Append_unprotected( &chain->Chain, node );
-  _ISR_lock_Release_and_ISR_enable( &chain->Lock, level );
+  chain_acquire( &level );
+  _Chain_Append_unprotected( chain, node );
+  chain_release( &level );
 }
 
@@ -77,7 +84,7 @@
   ISR_Level level;
 
-  _ISR_lock_ISR_disable_and_acquire( &chain->Lock, level );
-  _Chain_Prepend_unprotected( &chain->Chain, node );
-  _ISR_lock_Release_and_ISR_enable( &chain->Lock, level );
+  chain_acquire( &level );
+  _Chain_Prepend_unprotected( chain, node );
+  chain_release( &level );
 }
 
@@ -90,10 +97,7 @@
   ISR_Level level;
 
-  _ISR_lock_ISR_disable_and_acquire( &chain->Lock, level );
-  was_empty = _Chain_Append_with_empty_check_unprotected(
-    &chain->Chain,
-    node
-  );
-  _ISR_lock_Release_and_ISR_enable( &chain->Lock, level );
+  chain_acquire( &level );
+  was_empty = _Chain_Append_with_empty_check_unprotected( chain, node );
+  chain_release( &level );
 
   return was_empty;
@@ -108,10 +112,7 @@
   ISR_Level level;
 
-  _ISR_lock_ISR_disable_and_acquire( &chain->Lock, level );
-  was_empty = _Chain_Prepend_with_empty_check_unprotected(
-    &chain->Chain,
-    node
-  );
-  _ISR_lock_Release_and_ISR_enable( &chain->Lock, level );
+  chain_acquire( &level );
+  was_empty = _Chain_Prepend_with_empty_check_unprotected( chain, node );
+  chain_release( &level );
 
   return was_empty;
@@ -126,10 +127,7 @@
   ISR_Level level;
 
-  _ISR_lock_ISR_disable_and_acquire( &chain->Lock, level );
-  is_empty_now = _Chain_Get_with_empty_check_unprotected(
-    &chain->Chain,
-    node
-  );
-  _ISR_lock_Release_and_ISR_enable( &chain->Lock, level );
+  chain_acquire( &level );
+  is_empty_now = _Chain_Get_with_empty_check_unprotected( chain, node );
+  chain_release( &level );
 
   return is_empty_now;
