diff --git a/CHANGES b/CHANGES
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,6 @@
+2.7.0.1 - 120131
+* made externalMulti thread-safe (courtesy of Takano Akio)
+
 2.7.0 - 111223
 * fixed an issue with nested signal creations not updating properly
   (courtesy of Takano Akio)
diff --git a/FRP/Elerea/Clocked.hs b/FRP/Elerea/Clocked.hs
--- a/FRP/Elerea/Clocked.hs
+++ b/FRP/Elerea/Clocked.hs
@@ -530,10 +530,9 @@
 externalMulti = do
     var <- newMVar []
     return (SG $ \gpool _pool -> do
-                 let sig = S $ readMVar var
-                 update <- mkWeak sig (return (),takeMVar var >> putMVar var []) Nothing
-                 modifyIORef gpool (USig update:)
-                 return sig
+                 ref <- newIORef (Ready undefined)
+                 let sample = modifyMVar var $ \list -> memoise ref list >> return ([], list)
+                 addSignal (const sample) (const (() <$ sample)) ref gpool
            ,\val -> do
                  vals <- takeMVar var
                  putMVar var (val:vals)
diff --git a/FRP/Elerea/Param.hs b/FRP/Elerea/Param.hs
--- a/FRP/Elerea/Param.hs
+++ b/FRP/Elerea/Param.hs
@@ -434,10 +434,9 @@
 externalMulti = do
   var <- newMVar []
   return (SG $ \pool _ -> do
-             let sig = S $ readMVar var
-             update <- mkWeak sig (return (),takeMVar var >> putMVar var []) Nothing
-             modifyIORef pool (update:)
-             return sig
+             ref <- newIORef (Ready undefined)
+             let sample = modifyMVar var $ \list -> memoise ref list >> return ([], list)
+             addSignal (const sample) (const (() <$ sample)) ref pool
          ,\val -> do vals <- takeMVar var
                      putMVar var (val:vals)
          )
diff --git a/FRP/Elerea/Simple.hs b/FRP/Elerea/Simple.hs
--- a/FRP/Elerea/Simple.hs
+++ b/FRP/Elerea/Simple.hs
@@ -414,10 +414,9 @@
 externalMulti = do
   var <- newMVar []
   return (SG $ \pool -> do
-             let sig = S $ readMVar var
-             update <- mkWeak sig (return (),takeMVar var >> putMVar var []) Nothing
-             modifyIORef pool (update:)
-             return sig
+             ref <- newIORef (Ready undefined)
+             let sample = modifyMVar var $ \list -> memoise ref list >> return ([], list)
+             addSignal (const sample) (const (() <$ sample)) ref pool
          ,\val -> do vals <- takeMVar var
                      putMVar var (val:vals)
          )
diff --git a/elerea.cabal b/elerea.cabal
--- a/elerea.cabal
+++ b/elerea.cabal
@@ -1,5 +1,5 @@
 Name:                elerea
-Version:             2.7.0
+Version:             2.7.0.1
 Cabal-Version:       >= 1.2
 Synopsis:            A minimalistic FRP library
 Category:            reactivity, FRP
@@ -41,7 +41,7 @@
 
 Author:              Patai Gergely
 Maintainer:          Patai Gergely (patai.gergely@gmail.com)
-Copyright:           (c) 2009-2011, Patai Gergely
+Copyright:           (c) 2009-2012, Patai Gergely
 License:             BSD3
 License-File:        LICENSE
 Stability:           experimental
