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/Internal/Event.hs b/Simulation/Aivika/Internal/Event.hs
--- a/Simulation/Aivika/Internal/Event.hs
+++ b/Simulation/Aivika/Internal/Event.hs
@@ -60,7 +60,8 @@
         traceEvent) where
 
 import Data.IORef
-import Data.Monoid
+import Data.Monoid hiding ((<>))
+import Data.Semigroup (Semigroup(..))
 
 import Control.Exception
 import Control.Monad
@@ -423,10 +424,13 @@
                     -- ^ Dispose something within the 'Event' computation.
                   }
 
+instance Semigroup DisposableEvent where
+  DisposableEvent x <> DisposableEvent y = DisposableEvent $ x >> y
+
 instance Monoid DisposableEvent where
 
   mempty = DisposableEvent $ return ()
-  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.
diff --git a/Simulation/Aivika/Results.hs b/Simulation/Aivika/Results.hs
--- a/Simulation/Aivika/Results.hs
+++ b/Simulation/Aivika/Results.hs
@@ -109,7 +109,8 @@
 
 import Data.Ix
 import Data.Maybe
-import Data.Monoid
+import Data.Monoid hiding ((<>))
+import Data.Semigroup (Semigroup(..))
 
 import Simulation.Aivika.Parameter
 import Simulation.Aivika.Simulation
@@ -607,27 +608,29 @@
                   | ResultSignalMix (Signal ())
                     -- ^ When the specified signal was combined with unknown signal.
 
-instance Monoid ResultSignal where
+instance Semigroup ResultSignal where
+  (<>) EmptyResultSignal z = z
 
-  mempty = EmptyResultSignal
+  (<>) UnknownResultSignal EmptyResultSignal = UnknownResultSignal
+  (<>) UnknownResultSignal UnknownResultSignal = UnknownResultSignal
+  (<>) UnknownResultSignal (ResultSignal x) = ResultSignalMix x
+  (<>) UnknownResultSignal z@(ResultSignalMix x) = z
 
-  mappend EmptyResultSignal z = 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)
 
-  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)
+  (<>) 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 Monoid ResultSignal where
+
+  mempty = EmptyResultSignal
+  mappend = (<>)
+
 -- | Construct a new result signal by the specified optional pure signal.
 maybeResultSignal :: Maybe (Signal ()) -> ResultSignal
 maybeResultSignal (Just x) = ResultSignal x
@@ -1099,11 +1102,13 @@
          return ResultPredefinedSignals { resultSignalInIntegTimes = signalInIntegTimes,
                                           resultSignalInStartTime  = signalInStartTime,
                                           resultSignalInStopTime   = signalInStopTime }
+instance Semigroup Results where
+  x <> y = results $ resultSourceList x <> resultSourceList y
 
 instance Monoid Results where
 
-  mempty      = results mempty
-  mappend x y = results $ resultSourceList x <> resultSourceList y
+  mempty  = results mempty
+  mappend = (<>)
 
 -- | Prepare the simulation results.
 results :: [ResultSource] -> Results
diff --git a/Simulation/Aivika/Signal.hs b/Simulation/Aivika/Signal.hs
--- a/Simulation/Aivika/Signal.hs
+++ b/Simulation/Aivika/Signal.hs
@@ -60,7 +60,9 @@
         traceSignal) where
 
 import Data.IORef
-import Data.Monoid
+import Data.Monoid hiding ((<>))
+import Data.Semigroup (Semigroup(..))
+import Data.List.NonEmpty (NonEmpty((:|)))
 import Data.List
 import Data.Array
 
@@ -167,21 +169,26 @@
 
 instance Functor Signal where
   fmap = mapSignal
-  
+
+instance Semigroup (Signal a) where
+  (<>) = merge2Signals
+
+  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 Monoid (Signal a) where 
   
   mempty = emptySignal
   
-  mappend = merge2Signals
+  mappend = (<>)
   
   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 (h : t) = sconcat (h :| t)
   
 -- | Map the signal according the specified function.
 mapSignal :: (a -> b) -> Signal a -> Signal b
@@ -385,10 +392,13 @@
 instance Functor Signalable where
   fmap f x = x { readSignalable = fmap f (readSignalable x) }
 
-instance Monoid a => Monoid (Signalable a) where
+instance Semigroup a => Semigroup (Signalable a) where
+  (<>) = appendSignalable
 
+instance (Monoid a, Semigroup a) => Monoid (Signalable a) where
+
   mempty = emptySignalable
-  mappend = appendSignalable
+  mappend = (<>)
 
 -- | Return an identity.
 emptySignalable :: Monoid a => Signalable a
@@ -397,7 +407,7 @@
                signalableChanged_ = mempty }
 
 -- | An associative operation.
-appendSignalable :: Monoid a => Signalable a -> Signalable a -> Signalable a
+appendSignalable :: Semigroup a => Signalable a -> Signalable a -> Signalable a
 appendSignalable m1 m2 =
   Signalable { readSignalable = liftM2 (<>) (readSignalable m1) (readSignalable m2),
                signalableChanged_ = (signalableChanged_ m1) <> (signalableChanged_ m2) }
diff --git a/Simulation/Aivika/Statistics.hs b/Simulation/Aivika/Statistics.hs
--- a/Simulation/Aivika/Statistics.hs
+++ b/Simulation/Aivika/Statistics.hs
@@ -50,7 +50,8 @@
 
 import Control.DeepSeq
 
-import Data.Monoid
+import Data.Monoid hiding ((<>))
+import Data.Semigroup (Semigroup(..))
 import Data.Typeable
 import Data.Binary
 
@@ -97,11 +98,14 @@
   -- | Combine two statistics.
   combineSamplingStats :: SamplingStats a -> SamplingStats a -> SamplingStats a
 
+instance SamplingData a => Semigroup (SamplingStats a) where
+  (<>) = combineSamplingStats
+
 instance SamplingData a => Monoid (SamplingStats a) where 
   
   mempty = emptySamplingStats
   
-  mappend = combineSamplingStats
+  mappend = (<>)
 
 instance SamplingData Double where
 
diff --git a/Simulation/Aivika/Stream.hs b/Simulation/Aivika/Stream.hs
--- a/Simulation/Aivika/Stream.hs
+++ b/Simulation/Aivika/Stream.hs
@@ -83,7 +83,9 @@
 
 import Data.IORef
 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
@@ -123,11 +125,17 @@
 
   (<|>) = mergeStreams
 
+instance Semigroup (Stream a) where
+
+  (<>) = mergeStreams
+
+  sconcat (h :| t) = concatStreams (h : t)
+
 instance Monoid (Stream a) where
 
   mempty  = emptyStream
 
-  mappend = mergeStreams
+  mappend = (<>)
 
   mconcat = concatStreams
 
diff --git a/Simulation/Aivika/SystemDynamics.hs b/Simulation/Aivika/SystemDynamics.hs
--- a/Simulation/Aivika/SystemDynamics.hs
+++ b/Simulation/Aivika/SystemDynamics.hs
@@ -660,6 +660,7 @@
 --
 
 -- | Return the delayed value using the specified lag time.
+-- This function is less accurate than 'delayByDT'.
 delay :: Dynamics a          -- ^ the value to delay
          -> Dynamics Double  -- ^ the lag time
          -> Dynamics a       -- ^ the delayed value
@@ -688,6 +689,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 :: Dynamics a          -- ^ the value to delay
           -> Dynamics Double  -- ^ the lag time
           -> Dynamics a       -- ^ the initial value
diff --git a/aivika.cabal b/aivika.cabal
--- a/aivika.cabal
+++ b/aivika.cabal
@@ -1,5 +1,5 @@
 name:            aivika
-version:         5.5
+version:         5.6
 synopsis:        A multi-method simulation library
 description:
     Aivika is a discrete event simulation (DES) framework with support of activity-oriented,
@@ -238,7 +238,8 @@
                      mwc-random >= 0.13.0.0,
                      vector >= 0.10.0.1,
                      deepseq >= 1.1.0.0,
-                     binary >= 0.6.4.0
+                     binary >= 0.6.4.0,
+                     semigroups >= 0.10
 
     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 
