diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,4 +1,9 @@
 
+Version 5.6
+-----
+
+* Lars Kuhtz added the support of GHC 8.4.
+
 Version 5.5
 -----
 
diff --git a/Simulation/Aivika/Trans/Internal/Event.hs b/Simulation/Aivika/Trans/Internal/Event.hs
--- a/Simulation/Aivika/Trans/Internal/Event.hs
+++ b/Simulation/Aivika/Trans/Internal/Event.hs
@@ -55,7 +55,8 @@
         -- * Debugging
         traceEvent) where
 
-import Data.Monoid
+import Data.Monoid hiding ((<>))
+import Data.Semigroup (Semigroup(..))
 
 import Control.Exception
 import Control.Monad
@@ -316,13 +317,17 @@
                     -- ^ Dispose something within the 'Event' computation.
                   }
 
+instance Monad m => Semigroup (DisposableEvent m) where
+  {-# INLINE (<>) #-}
+  DisposableEvent x <> DisposableEvent y = DisposableEvent $ x >> y
+
 instance Monad m => Monoid (DisposableEvent m) where
 
   {-# INLINE mempty #-}
   mempty = DisposableEvent $ return ()
 
   {-# INLINE mappend #-}
-  mappend (DisposableEvent x) (DisposableEvent y) = DisposableEvent $ x >> y
+  mappend = (<>)
 
 -- | Retry the current computation as possible, using the specified argument
 -- as a 'SimulationRetry' exception message in case of failure. It makes sense
diff --git a/Simulation/Aivika/Trans/Results.hs b/Simulation/Aivika/Trans/Results.hs
--- a/Simulation/Aivika/Trans/Results.hs
+++ b/Simulation/Aivika/Trans/Results.hs
@@ -108,7 +108,8 @@
 
 import Data.Ix
 import Data.Maybe
-import Data.Monoid
+import Data.Monoid hiding ((<>))
+import Data.Semigroup (Semigroup(..))
 
 import Simulation.Aivika.Trans.Parameter
 import Simulation.Aivika.Trans.Simulation
@@ -613,26 +614,30 @@
                     | ResultSignalMix (Signal m ())
                       -- ^ When the specified signal was combined with unknown signal.
 
+instance MonadDES m => Semigroup (ResultSignal m) where
+
+  (<>) EmptyResultSignal z = z
+
+  (<>) UnknownResultSignal EmptyResultSignal = UnknownResultSignal
+  (<>) UnknownResultSignal UnknownResultSignal = UnknownResultSignal
+  (<>) UnknownResultSignal (ResultSignal x) = ResultSignalMix x
+  (<>) UnknownResultSignal z@(ResultSignalMix x) = z
+
+  (<>) z@(ResultSignal x) EmptyResultSignal = z
+  (<>) (ResultSignal x) UnknownResultSignal = ResultSignalMix x
+  (<>) (ResultSignal x) (ResultSignal y) = ResultSignal (x <> y)
+  (<>) (ResultSignal x) (ResultSignalMix y) = ResultSignalMix (x <> y)
+
+  (<>) z@(ResultSignalMix x) EmptyResultSignal = z
+  (<>) z@(ResultSignalMix x) UnknownResultSignal = z
+  (<>) (ResultSignalMix x) (ResultSignal y) = ResultSignalMix (x <> y)
+  (<>) (ResultSignalMix x) (ResultSignalMix y) = ResultSignalMix (x <> y)
+
 instance MonadDES m => Monoid (ResultSignal m) where
 
   mempty = EmptyResultSignal
 
-  mappend EmptyResultSignal z = z
-
-  mappend UnknownResultSignal EmptyResultSignal = UnknownResultSignal
-  mappend UnknownResultSignal UnknownResultSignal = UnknownResultSignal
-  mappend UnknownResultSignal (ResultSignal x) = ResultSignalMix x
-  mappend UnknownResultSignal z@(ResultSignalMix x) = z
-  
-  mappend z@(ResultSignal x) EmptyResultSignal = z
-  mappend (ResultSignal x) UnknownResultSignal = ResultSignalMix x
-  mappend (ResultSignal x) (ResultSignal y) = ResultSignal (x <> y)
-  mappend (ResultSignal x) (ResultSignalMix y) = ResultSignalMix (x <> y)
-  
-  mappend z@(ResultSignalMix x) EmptyResultSignal = z
-  mappend z@(ResultSignalMix x) UnknownResultSignal = z
-  mappend (ResultSignalMix x) (ResultSignal y) = ResultSignalMix (x <> y)
-  mappend (ResultSignalMix x) (ResultSignalMix y) = ResultSignalMix (x <> y)
+  mappend = (<>)
 
 -- | Construct a new result signal by the specified optional pure signal.
 maybeResultSignal :: Maybe (Signal m ()) -> ResultSignal m
@@ -1106,10 +1111,14 @@
                                           resultSignalInStartTime  = signalInStartTime,
                                           resultSignalInStopTime   = signalInStopTime }
 
+instance Semigroup (Results m) where
+
+  x <> y = results $ resultSourceList x <> resultSourceList y
+
 instance Monoid (Results m) where
 
-  mempty      = results mempty
-  mappend x y = results $ resultSourceList x <> resultSourceList y
+  mempty  = results mempty
+  mappend = (<>)
 
 -- | Prepare the simulation results.
 results :: [ResultSource m] -> Results m
diff --git a/Simulation/Aivika/Trans/Signal.hs b/Simulation/Aivika/Trans/Signal.hs
--- a/Simulation/Aivika/Trans/Signal.hs
+++ b/Simulation/Aivika/Trans/Signal.hs
@@ -61,7 +61,9 @@
         -- * Debugging
         traceSignal) where
 
-import Data.Monoid
+import Data.Monoid hiding ((<>))
+import Data.Semigroup (Semigroup(..))
+import Data.List.NonEmpty (NonEmpty((:|)))
 import Data.List
 import Data.Array
 
@@ -195,23 +197,31 @@
   {-# INLINE fmap #-}
   fmap = mapSignal
   
+instance MonadDES m => Semigroup (Signal m a) where
+
+  {-# INLINE (<>) #-}
+  (<>) = merge2Signals
+
+  {-# INLINABLE sconcat #-}
+  sconcat (x1 :| []) = x1
+  sconcat (x1 :| [x2]) = merge2Signals x1 x2
+  sconcat (x1 :| [x2, x3]) = merge3Signals x1 x2 x3
+  sconcat (x1 :| [x2, x3, x4]) = merge4Signals x1 x2 x3 x4
+  sconcat (x1 :| [x2, x3, x4, x5]) = merge5Signals x1 x2 x3 x4 x5
+  sconcat (x1 :| (x2 : x3 : x4 : x5 : xs)) = 
+    sconcat $ merge5Signals x1 x2 x3 x4 x5 :| xs
+
 instance MonadDES m => Monoid (Signal m a) where 
 
   {-# INLINE mempty #-}
   mempty = emptySignal
 
   {-# INLINE mappend #-}
-  mappend = merge2Signals
+  mappend = (<>)
 
   {-# INLINABLE mconcat #-}
-  mconcat [] = emptySignal
-  mconcat [x1] = x1
-  mconcat [x1, x2] = merge2Signals x1 x2
-  mconcat [x1, x2, x3] = merge3Signals x1 x2 x3
-  mconcat [x1, x2, x3, x4] = merge4Signals x1 x2 x3 x4
-  mconcat [x1, x2, x3, x4, x5] = merge5Signals x1 x2 x3 x4 x5
-  mconcat (x1 : x2 : x3 : x4 : x5 : xs) = 
-    mconcat $ merge5Signals x1 x2 x3 x4 x5 : xs
+  mconcat [] = mempty
+  mconcat (h:t) = sconcat (h :| t)
   
 -- | Map the signal according the specified function.
 mapSignal :: MonadDES m => (a -> b) -> Signal m a -> Signal m b
@@ -445,13 +455,18 @@
   {-# INLINE fmap #-}
   fmap f x = x { readSignalable = fmap f (readSignalable x) }
 
-instance (MonadDES m, Monoid a) => Monoid (Signalable m a) where
+instance (MonadDES m, Semigroup a) => Semigroup (Signalable m a) where
 
+  {-# INLINE (<>) #-}
+  (<>) = appendSignalable
+
+instance (MonadDES m, Monoid a, Semigroup a) => Monoid (Signalable m a) where
+
   {-# INLINE mempty #-}
   mempty = emptySignalable
 
   {-# INLINE mappend #-}
-  mappend = appendSignalable
+  mappend = (<>)
 
 -- | Return an identity.
 emptySignalable :: (MonadDES m, Monoid a) => Signalable m a
@@ -461,7 +476,7 @@
                signalableChanged_ = mempty }
 
 -- | An associative operation.
-appendSignalable :: (MonadDES m, Monoid a) => Signalable m a -> Signalable m a -> Signalable m a
+appendSignalable :: (MonadDES m, Semigroup a) => Signalable m a -> Signalable m a -> Signalable m a
 {-# INLINABLE appendSignalable #-}
 appendSignalable m1 m2 =
   Signalable { readSignalable = liftM2 (<>) (readSignalable m1) (readSignalable m2),
diff --git a/Simulation/Aivika/Trans/Stream.hs b/Simulation/Aivika/Trans/Stream.hs
--- a/Simulation/Aivika/Trans/Stream.hs
+++ b/Simulation/Aivika/Trans/Stream.hs
@@ -84,7 +84,9 @@
         traceStream) where
 
 import Data.Maybe
-import Data.Monoid
+import Data.Monoid hiding ((<>))
+import Data.Semigroup (Semigroup(..))
+import Data.List.NonEmpty (NonEmpty((:|)))
 
 import Control.Applicative
 import Control.Monad
@@ -132,13 +134,21 @@
   {-# INLINE (<|>) #-}
   (<|>) = mergeStreams
 
+instance MonadDES m => Semigroup (Stream m a) where
+
+  {-# INLINE (<>) #-}
+  (<>) = mergeStreams
+
+  {-# INLINE sconcat #-}
+  sconcat (h :| t) = concatStreams (h : t)
+
 instance MonadDES m => Monoid (Stream m a) where
 
   {-# INLINE mempty #-}
   mempty  = emptyStream
 
   {-# INLINE mappend #-}
-  mappend = mergeStreams
+  mappend = (<>)
 
   {-# INLINE mconcat #-}
   mconcat = concatStreams
diff --git a/Simulation/Aivika/Trans/SystemDynamics.hs b/Simulation/Aivika/Trans/SystemDynamics.hs
--- a/Simulation/Aivika/Trans/SystemDynamics.hs
+++ b/Simulation/Aivika/Trans/SystemDynamics.hs
@@ -721,6 +721,7 @@
 --
 
 -- | Return the delayed value using the specified lag time.
+-- This function is less accurate than 'delayByDT'.
 delay :: Monad m
          => Dynamics m a          -- ^ the value to delay
          -> Dynamics m Double     -- ^ the lag time
@@ -751,6 +752,7 @@
 
 -- | Return the delayed value using the specified lag time and initial value.
 -- Because of the latter, it allows creating a loop back.
+-- This function is less accurate than 'delayIByDT'.
 delayI :: MonadSD m
           => Dynamics m a                    -- ^ the value to delay
           -> Dynamics m Double               -- ^ the lag time
diff --git a/aivika-transformers.cabal b/aivika-transformers.cabal
--- a/aivika-transformers.cabal
+++ b/aivika-transformers.cabal
@@ -1,5 +1,5 @@
 name:            aivika-transformers
-version:         5.5
+version:         5.6
 synopsis:        Transformers for the Aivika simulation library
 description:
     This package is a generalization of the aivika [1] simulation library
@@ -175,7 +175,8 @@
                      random >= 1.0.0.3,
                      mwc-random >= 0.13.0.0,
                      vector >= 0.10.0.1,
-                     aivika >= 5.5
+                     semigroups >= 0.10,
+                     aivika >= 5.6
 
     other-extensions:   FlexibleContexts,
                         FlexibleInstances,
diff --git a/examples/InspectionAdjustmentStations.hs b/examples/InspectionAdjustmentStations.hs
--- a/examples/InspectionAdjustmentStations.hs
+++ b/examples/InspectionAdjustmentStations.hs
@@ -19,9 +19,10 @@
 -- The time between arrivals of television sets to the final inspection station is uniformly 
 -- distributed between 3.5 and 7.5 minutes. Two inspectors work side-by-side at the final 
 -- inspection station. The time required to inspect a set is uniformly distributed between 
--- 6 and 12 minutes. On the average, 85 percent of the sets are routed to the adjustment 
--- station which is manned by a single worker. Adjustment of the vertical control setting 
--- requires between 20 and 40 minutes, uniformly distributed.
+-- 6 and 12 minutes. On the average, 85 percent of the sets pass inspection and continue on
+-- the packing department. The other 15 percent are routed to the adjustment station which is
+-- manned by a single worker. Adjustment of the vertical control setting requires between 20
+-- and 40 minutes, uniformly distributed.
 -- 
 -- The inspection station and adjustor are to be simulated for 480 minutes to estimate 
 -- the time to process television sets through the final production stage and to determine 
