diff --git a/Simulation/Aivika/Experiment/DeviationChartView.hs b/Simulation/Aivika/Experiment/DeviationChartView.hs
--- a/Simulation/Aivika/Experiment/DeviationChartView.hs
+++ b/Simulation/Aivika/Experiment/DeviationChartView.hs
@@ -39,10 +39,11 @@
 import Simulation.Aivika.Experiment.Chart (colourisePlotLines, colourisePlotFillBetween)
 import Simulation.Aivika.Experiment.SamplingStatsSource
 
+import Simulation.Aivika.Specs
+import Simulation.Aivika.Simulation
 import Simulation.Aivika.Dynamics
-import Simulation.Aivika.Dynamics.Simulation
-import Simulation.Aivika.Dynamics.Signal
-import Simulation.Aivika.Dynamics.Base (starttime, integIterationBnds, integTimes, integIteration)
+import Simulation.Aivika.Event
+import Simulation.Aivika.Signal
 import Simulation.Aivika.Statistics
 
 -- | Defines the 'View' that saves the deviation chart
@@ -173,7 +174,7 @@
                                     deviationChartStats = stats }
        
 -- | Simulate the specified series.
-simulateDeviationChart :: DeviationChartViewState -> ExperimentData -> Dynamics (Dynamics ())
+simulateDeviationChart :: DeviationChartViewState -> ExperimentData -> Event (Event ())
 simulateDeviationChart st expdata =
   do let labels = deviationChartSeries $ deviationChartView st
          (leftLabels, rightLabels) = partitionEithers labels 
@@ -213,7 +214,7 @@
          h = experimentSignalInIntegTimes expdata
      handleSignal_ h $ \_ ->
        do xs <- sequence source
-          i  <- integIteration
+          i  <- liftDynamics integIteration
           liftIO $ withMVar lock $ \() ->
             forM_ (zip xs stats) $ \(x, stats) ->
             do y <- readArray stats i
diff --git a/Simulation/Aivika/Experiment/FinalHistogramView.hs b/Simulation/Aivika/Experiment/FinalHistogramView.hs
--- a/Simulation/Aivika/Experiment/FinalHistogramView.hs
+++ b/Simulation/Aivika/Experiment/FinalHistogramView.hs
@@ -41,10 +41,11 @@
 import Simulation.Aivika.Experiment.Histogram
 import Simulation.Aivika.Experiment.ListSource
 
+import Simulation.Aivika.Specs
+import Simulation.Aivika.Simulation
 import Simulation.Aivika.Dynamics
-import Simulation.Aivika.Dynamics.Simulation
-import Simulation.Aivika.Dynamics.Signal
-import Simulation.Aivika.Dynamics.Base (starttime, integIterationBnds, integTimes, integIteration)
+import Simulation.Aivika.Event
+import Simulation.Aivika.Signal
 
 -- | Defines the 'View' that saves the histogram
 -- in the PNG file by the specified series in
@@ -68,7 +69,7 @@
                        -- @
                        --   finalHistogramFileName = UniqueFileName \"$TITLE\" \".png\"
                        -- @
-                       finalHistogramPredicate   :: Dynamics Bool,
+                       finalHistogramPredicate   :: Event Bool,
                        -- ^ It specifies the predicate that defines
                        -- when we count data when plotting the histogram.
                        finalHistogramBuild       :: [[Double]] -> Histogram, 
@@ -161,7 +162,7 @@
                                     finalHistogramValues = values }
        
 -- | Simulation of the specified series.
-simulateFinalHistogram :: FinalHistogramViewState -> ExperimentData -> Dynamics (Dynamics ())
+simulateFinalHistogram :: FinalHistogramViewState -> ExperimentData -> Event (Event ())
 simulateFinalHistogram st expdata =
   do let labels = finalHistogramSeries $ finalHistogramView st
          providers = experimentSeriesProviders expdata labels
diff --git a/Simulation/Aivika/Experiment/FinalXYChartView.hs b/Simulation/Aivika/Experiment/FinalXYChartView.hs
--- a/Simulation/Aivika/Experiment/FinalXYChartView.hs
+++ b/Simulation/Aivika/Experiment/FinalXYChartView.hs
@@ -38,10 +38,11 @@
 import Simulation.Aivika.Experiment.Utils (divideBy, replace)
 import Simulation.Aivika.Experiment.Chart (colourisePlotLines)
 
+import Simulation.Aivika.Specs
+import Simulation.Aivika.Simulation
 import Simulation.Aivika.Dynamics
-import Simulation.Aivika.Dynamics.Simulation
-import Simulation.Aivika.Dynamics.Signal
-import Simulation.Aivika.Dynamics.Base (time)
+import Simulation.Aivika.Event
+import Simulation.Aivika.Signal
 
 -- | Defines the 'View' that saves the XY chart
 -- in the PNG file by final time points for all
@@ -64,7 +65,7 @@
                      -- @
                      --   finalXYChartFileName = UniqueFileName \"$TITLE\" \".png\"
                      -- @
-                     finalXYChartPredicate   :: Dynamics Bool,
+                     finalXYChartPredicate   :: Event Bool,
                      -- ^ It specifies the predicate that defines
                      -- when we count data when plotting the chart.
                      finalXYChartXSeries     :: Maybe String,
@@ -172,7 +173,7 @@
                                   finalXYChartXY     = xy }
        
 -- | Simulation.
-simulateFinalXYChart :: FinalXYChartViewState -> ExperimentData -> Dynamics (Dynamics ())
+simulateFinalXYChart :: FinalXYChartViewState -> ExperimentData -> Event (Event ())
 simulateFinalXYChart st expdata =
   do let ylabels = finalXYChartYSeries $ finalXYChartView st
          xlabels = finalXYChartXSeries $ finalXYChartView st
diff --git a/Simulation/Aivika/Experiment/HistogramView.hs b/Simulation/Aivika/Experiment/HistogramView.hs
--- a/Simulation/Aivika/Experiment/HistogramView.hs
+++ b/Simulation/Aivika/Experiment/HistogramView.hs
@@ -39,9 +39,10 @@
 import Simulation.Aivika.Experiment.Histogram
 import Simulation.Aivika.Experiment.ListSource
 
-import Simulation.Aivika.Dynamics
-import Simulation.Aivika.Dynamics.Simulation
-import Simulation.Aivika.Dynamics.Signal
+import Simulation.Aivika.Specs
+import Simulation.Aivika.Simulation
+import Simulation.Aivika.Event
+import Simulation.Aivika.Signal
 
 -- | Defines the 'View' that saves the histogram in 
 -- the PNG files by all integration time points for 
@@ -65,7 +66,7 @@
                   -- @
                   --   histogramFileName = UniqueFileName \"$TITLE - $RUN_INDEX\" \".png\"
                   -- @
-                  histogramPredicate   :: Dynamics Bool,
+                  histogramPredicate   :: Event Bool,
                   -- ^ It specifies the predicate that defines
                   -- when we count data when plotting the histogram.
                   histogramBuild       :: [[Double]] -> Histogram, 
@@ -160,7 +161,7 @@
                                  histogramMap        = m }
        
 -- | Plot the histogram during the simulation.
-simulateHistogram :: HistogramViewState -> ExperimentData -> Dynamics (Dynamics ())
+simulateHistogram :: HistogramViewState -> ExperimentData -> Event (Event ())
 simulateHistogram st expdata =
   do let labels = histogramSeries $ histogramView st
          providers = experimentSeriesProviders expdata labels
diff --git a/Simulation/Aivika/Experiment/TimeSeriesView.hs b/Simulation/Aivika/Experiment/TimeSeriesView.hs
--- a/Simulation/Aivika/Experiment/TimeSeriesView.hs
+++ b/Simulation/Aivika/Experiment/TimeSeriesView.hs
@@ -37,9 +37,10 @@
 import Simulation.Aivika.Experiment.Utils (divideBy, replace)
 import Simulation.Aivika.Experiment.Chart (colourisePlotLines)
 
-import Simulation.Aivika.Dynamics
-import Simulation.Aivika.Dynamics.Simulation
-import Simulation.Aivika.Dynamics.Signal
+import Simulation.Aivika.Specs
+import Simulation.Aivika.Simulation
+import Simulation.Aivika.Event
+import Simulation.Aivika.Signal
 
 -- | Defines the 'View' that saves the time series charts
 -- in the PNG files.
@@ -62,7 +63,7 @@
                    -- @
                    --   timeSeriesFileName = UniqueFileName \"$TITLE - $RUN_INDEX\" \".png\"
                    -- @
-                   timeSeriesPredicate   :: Dynamics Bool,
+                   timeSeriesPredicate   :: Event Bool,
                    -- ^ It specifies the predicate that defines
                    -- when we plot data in the chart.
                    timeSeries      :: [Either String String],
@@ -162,7 +163,7 @@
                                   timeSeriesMap          = m }
        
 -- | Plot the time series chart during the simulation.
-simulateTimeSeries :: TimeSeriesViewState -> ExperimentData -> Dynamics (Dynamics ())
+simulateTimeSeries :: TimeSeriesViewState -> ExperimentData -> Event (Event ())
 simulateTimeSeries st expdata =
   do let labels = timeSeries $ timeSeriesView st
          (leftLabels, rightLabels) = partitionEithers labels 
diff --git a/Simulation/Aivika/Experiment/XYChartView.hs b/Simulation/Aivika/Experiment/XYChartView.hs
--- a/Simulation/Aivika/Experiment/XYChartView.hs
+++ b/Simulation/Aivika/Experiment/XYChartView.hs
@@ -38,9 +38,10 @@
 import Simulation.Aivika.Experiment.Utils (divideBy, replace)
 import Simulation.Aivika.Experiment.Chart (colourisePlotLines)
 
-import Simulation.Aivika.Dynamics
-import Simulation.Aivika.Dynamics.Simulation
-import Simulation.Aivika.Dynamics.Signal
+import Simulation.Aivika.Specs
+import Simulation.Aivika.Simulation
+import Simulation.Aivika.Event
+import Simulation.Aivika.Signal
 
 -- | Defines the 'View' that saves the XY charts
 -- in the PNG files.
@@ -63,7 +64,7 @@
                 -- @
                 --   xyChartFileName = UniqueFileName \"$TITLE - $RUN_INDEX\" \".png\"
                 -- @
-                xyChartPredicate   :: Dynamics Bool,
+                xyChartPredicate   :: Event Bool,
                 -- ^ It specifies the predicate that defines
                 -- when we plot data in the chart.
                 xyChartXSeries     :: Maybe String,
@@ -169,7 +170,7 @@
                                xyChartMap        = m }
        
 -- | Plot the XY chart during the simulation.
-simulateXYChart :: XYChartViewState -> ExperimentData -> Dynamics (Dynamics ())
+simulateXYChart :: XYChartViewState -> ExperimentData -> Event (Event ())
 simulateXYChart st expdata =
   do let ylabels = xyChartYSeries $ xyChartView st
          xlabels = xyChartXSeries $ xyChartView st
diff --git a/aivika-experiment-chart.cabal b/aivika-experiment-chart.cabal
--- a/aivika-experiment-chart.cabal
+++ b/aivika-experiment-chart.cabal
@@ -1,5 +1,5 @@
 name:            aivika-experiment-chart
-version:         0.3.1
+version:         0.4
 synopsis:        Simulation experiments with charting for the Aivika library
 description:
     This package complements the Aivika and Aivika Experiment packages with
@@ -48,7 +48,7 @@
                      split >= 0.2.2,
                      data-accessor >= 0.2.2.3,
                      colour >= 2.3.3,
-                     aivika >= 0.6.1,
-                     aivika-experiment >= 0.3.1
+                     aivika >= 0.7,
+                     aivika-experiment >= 0.4
 
     ghc-options:     -O2
diff --git a/examples/BassDiffusion.hs b/examples/BassDiffusion.hs
--- a/examples/BassDiffusion.hs
+++ b/examples/BassDiffusion.hs
@@ -4,11 +4,12 @@
 import Control.Monad
 import Control.Monad.Trans
 
+import Simulation.Aivika.Specs
+import Simulation.Aivika.Simulation
+import Simulation.Aivika.Event
 import Simulation.Aivika.Dynamics
-import Simulation.Aivika.Dynamics.Simulation
-import Simulation.Aivika.Dynamics.EventQueue
-import Simulation.Aivika.Dynamics.Agent
-import Simulation.Aivika.Dynamics.Ref
+import Simulation.Aivika.Agent
+import Simulation.Aivika.Ref
 
 import Simulation.Aivika.Experiment
 import Simulation.Aivika.Experiment.DeviationChartView
@@ -55,19 +56,19 @@
                        personPotentialAdopter :: AgentState,
                        personAdopter :: AgentState }
               
-createPerson :: EventQueue -> Simulation Person              
-createPerson q =    
-  do agent <- newAgent q
+createPerson :: Simulation Person              
+createPerson =    
+  do agent <- newAgent
      potentialAdopter <- newState agent
      adopter <- newState agent
      return Person { personAgent = agent,
                      personPotentialAdopter = potentialAdopter,
                      personAdopter = adopter }
        
-createPersons :: EventQueue -> Simulation (Array Int Person)
-createPersons q =
+createPersons :: Simulation (Array Int Person)
+createPersons =
   do list <- forM [1 .. n] $ \i ->
-       do p <- createPerson q
+       do p <- createPerson
           return (i, p)
      return $ array (1, n) list
      
@@ -101,23 +102,22 @@
   forM_ (elems ps) $ \p -> 
   definePerson p ps potentialAdopters adopters
                                
-activatePerson :: Person -> Dynamics ()
+activatePerson :: Person -> Event ()
 activatePerson p = activateState (personPotentialAdopter p)
 
-activatePersons :: Array Int Person -> Dynamics ()
+activatePersons :: Array Int Person -> Event ()
 activatePersons ps =
   forM_ (elems ps) $ \p -> activatePerson p
 
 model :: Simulation ExperimentData
 model =
-  do q <- newQueue
-     potentialAdopters <- newRef q 0
-     adopters <- newRef q 0
-     ps <- createPersons q
+  do potentialAdopters <- newRef 0
+     adopters <- newRef 0
+     ps <- createPersons
      definePersons ps potentialAdopters adopters
-     runDynamicsInStartTime $
+     runEventInStartTime IncludingCurrentEvents $
        activatePersons ps
-     experimentDataInStartTime q
+     experimentDataInStartTime
        [("potentialAdopters",
          seriesEntity "Potential Adopters" 
          potentialAdopters),
diff --git a/examples/ChemicalReaction.hs b/examples/ChemicalReaction.hs
--- a/examples/ChemicalReaction.hs
+++ b/examples/ChemicalReaction.hs
@@ -1,11 +1,10 @@
 
 {-# LANGUAGE RecursiveDo #-}
 
+import Simulation.Aivika.Specs
+import Simulation.Aivika.Simulation
 import Simulation.Aivika.Dynamics
-import Simulation.Aivika.Dynamics.Simulation
-import Simulation.Aivika.Dynamics.SystemDynamics
-import Simulation.Aivika.Dynamics.EventQueue
-import Simulation.Aivika.Dynamics.Base
+import Simulation.Aivika.SystemDynamics
 
 import Simulation.Aivika.Experiment
 import Simulation.Aivika.Experiment.LastValueView
@@ -67,13 +66,12 @@
 
 model :: Simulation ExperimentData
 model =
-  mdo queue <- newQueue
-      a <- integ (- ka * a) 100
+  mdo a <- integ (- ka * a) 100
       b <- integ (ka * a - kb * b) 0
       c <- integ (kb * b) 0
       let ka = 1
           kb = 1
-      experimentDataInStartTime queue
+      experimentDataInStartTime
         [("t", seriesEntity "time" time),
          ("a", seriesEntity "a" a),
          ("b", seriesEntity "b" b),
diff --git a/examples/DifferenceEquations.hs b/examples/DifferenceEquations.hs
--- a/examples/DifferenceEquations.hs
+++ b/examples/DifferenceEquations.hs
@@ -1,12 +1,11 @@
 
 {-# LANGUAGE RecursiveDo #-}
 
+import Simulation.Aivika.Specs
+import Simulation.Aivika.Simulation
 import Simulation.Aivika.Dynamics
-import Simulation.Aivika.Dynamics.Simulation
-import Simulation.Aivika.Dynamics.SystemDynamics
-import Simulation.Aivika.Dynamics.EventQueue
-import Simulation.Aivika.Dynamics.Base
 import Simulation.Aivika.Dynamics.Random
+import Simulation.Aivika.SystemDynamics
 
 import Simulation.Aivika.Experiment
 import Simulation.Aivika.Experiment.TableView
@@ -46,9 +45,7 @@
 
 model :: Simulation ExperimentData
 model =
-  mdo queue <- newQueue
-      
-      x <- newNormal 3 0.8
+  mdo x <- newNormalDynamics 3 0.8
       sumX <- sumDynamics x 0
       sumX2 <- sumDynamics (x * x) 0
       
@@ -59,7 +56,7 @@
       let avg = ifDynamics (n .>. 0) (sumX / n) 0
       let std = ifDynamics (n .>. 1) (sqrt ((sumX2 - sumX * avg) / (n - 1))) 0
       
-      experimentDataInStartTime queue
+      experimentDataInStartTime
         [("t", seriesEntity "time" time),
          ("n", seriesEntity "n" n),
          ("x", seriesEntity "x" x),
diff --git a/examples/Financial.hs b/examples/Financial.hs
--- a/examples/Financial.hs
+++ b/examples/Financial.hs
@@ -20,12 +20,11 @@
 import Control.Monad
 
 -- from package aivika
+import Simulation.Aivika.Specs
+import Simulation.Aivika.Simulation
 import Simulation.Aivika.Dynamics
-import Simulation.Aivika.Dynamics.Simulation
-import Simulation.Aivika.Dynamics.Base
-import Simulation.Aivika.Dynamics.SystemDynamics
-import Simulation.Aivika.Dynamics.Parameter
-import Simulation.Aivika.Dynamics.EventQueue
+import Simulation.Aivika.SystemDynamics
+import Simulation.Aivika.Parameter.Random
 
 -- from package aivika-experiment
 import Simulation.Aivika.Experiment
@@ -150,12 +149,7 @@
           taxes = taxableIncome * taxRate
           variableProductionCost = liftParam paramsVariableProductionCost
 
-      -- we have to create an event queue to return the experimental data,
-      -- although it was not used in the model itself 
-
-      queue <- newQueue
-      
-      experimentDataInStartTime queue
+      experimentDataInStartTime
         [(netIncomeName, seriesEntity "Net income" netIncome),
          (netCashFlowName, seriesEntity "Net cash flow" netCashFlow),
          (npvIncomeName, seriesEntity "NPV income" npvIncome),
diff --git a/examples/Furnace.hs b/examples/Furnace.hs
--- a/examples/Furnace.hs
+++ b/examples/Furnace.hs
@@ -37,28 +37,26 @@
 import Control.Monad
 import Control.Monad.Trans
 
+import Simulation.Aivika.Specs
+import Simulation.Aivika.Simulation
 import Simulation.Aivika.Dynamics
-import Simulation.Aivika.Dynamics.Simulation
-import Simulation.Aivika.Dynamics.Base
-import Simulation.Aivika.Dynamics.EventQueue
-import Simulation.Aivika.Dynamics.Ref
-import Simulation.Aivika.Dynamics.UVar
-import Simulation.Aivika.Dynamics.Process
-import Simulation.Aivika.Dynamics.Random
-import Simulation.Aivika.Statistics
+import Simulation.Aivika.Event
+import Simulation.Aivika.Ref
+import Simulation.Aivika.Process
+import Simulation.Aivika.Random
 
+import qualified Simulation.Aivika.DoubleLinkedList as DLL
+
 import Simulation.Aivika.Experiment
 import Simulation.Aivika.Experiment.ExperimentSpecsView
 import Simulation.Aivika.Experiment.FinalStatsView
 import Simulation.Aivika.Experiment.DeviationChartView
 import Simulation.Aivika.Experiment.FinalHistogramView
 
-import qualified Simulation.Aivika.Queue as Q
-
 -- | The simulation specs.
 specs = Specs { spcStartTime = 0.0,
-                -- spcStopTime = 1000.0,
-                spcStopTime = 300.0,
+                spcStopTime = 1000.0,
+                -- spcStopTime = 300.0,
                 spcDT = 0.1,
                 spcMethod = RungeKutta4 }
         
@@ -77,22 +75,16 @@
 
 -- | Represents the furnace.
 data Furnace = 
-  Furnace { furnaceQueue :: EventQueue,
-            -- ^ The event queue.
-            furnaceNormalGen :: IO Double,
+  Furnace { furnaceNormalGen :: IO Double,
             -- ^ The normal random number generator.
             furnacePits :: [Pit],
             -- ^ The pits for ingots.
-            furnacePitCount :: UVar Int,
+            furnacePitCount :: Ref Int,
             -- ^ The count of active pits with ingots.
-            furnacePitCountStats :: Ref (SamplingStats Int),
-            -- ^ The statistics about the active pits.
-            furnaceAwaitingIngots :: Q.Queue Ingot,
+            furnaceAwaitingIngots :: DLL.DoubleLinkedList Ingot,
             -- ^ The awaiting ingots in the queue.
-            furnaceQueueCount :: UVar Int,
+            furnaceQueueCount :: Ref Int,
             -- ^ The queue count.
-            furnaceQueueCountStats :: Ref (SamplingStats Int),
-            -- ^ The statistics about the queue count.
             furnaceWaitCount :: Ref Int,
             -- ^ The count of awaiting ingots.
             furnaceWaitTime :: Ref Double,
@@ -113,9 +105,7 @@
 
 -- | A pit in the furnace to place the ingots.
 data Pit = 
-  Pit { pitQueue :: EventQueue,
-        -- ^ The bound dynamics queue.
-        pitIngot :: Ref (Maybe Ingot),
+  Pit { pitIngot :: Ref (Maybe Ingot),
         -- ^ The ingot in the pit.
         pitTemp :: Ref Double
         -- ^ The ingot temperature in the pit.
@@ -123,7 +113,7 @@
 
 data Ingot = 
   Ingot { ingotFurnace :: Furnace,
-          -- ^ Return the furnace.
+          -- ^ The furnace.
           ingotReceiveTime :: Double,
           -- ^ The time at which the ingot was received.
           ingotReceiveTemp :: Double,
@@ -137,31 +127,26 @@
           }
 
 -- | Create a furnace.
-newFurnace :: EventQueue -> Simulation Furnace
-newFurnace queue =
-  do normalGen <- liftIO normalGen
-     pits <- sequence [newPit queue | i <- [1..10]]
-     pitCount <- newUVar queue 0
-     pitCountStats <- newRef queue emptySamplingStats
-     awaitingIngots <- liftIO Q.newQueue
-     queueCount <- newUVar queue 0
-     queueCountStats <- newRef queue emptySamplingStats
-     waitCount <- newRef queue 0
-     waitTime <- newRef queue 0.0
-     heatingTime <- newRef queue 0.0
-     h <- newRef queue 1650.0
-     totalCount <- newRef queue 0
-     loadCount <- newRef queue 0
-     unloadCount <- newRef queue 0
-     unloadTemps <- newRef queue []
-     return Furnace { furnaceQueue = queue,
-                      furnaceNormalGen = normalGen,
+newFurnace :: Simulation Furnace
+newFurnace =
+  do normalGen <- liftIO newNormalGen
+     pits <- sequence [newPit | i <- [1..10]]
+     pitCount <- newRef 0
+     awaitingIngots <- liftIO DLL.newList
+     queueCount <- newRef 0
+     waitCount <- newRef 0
+     waitTime <- newRef 0.0
+     heatingTime <- newRef 0.0
+     h <- newRef 1650.0
+     totalCount <- newRef 0
+     loadCount <- newRef 0
+     unloadCount <- newRef 0
+     unloadTemps <- newRef []
+     return Furnace { furnaceNormalGen = normalGen,
                       furnacePits = pits,
                       furnacePitCount = pitCount,
-                      furnacePitCountStats = pitCountStats,
                       furnaceAwaitingIngots = awaitingIngots,
                       furnaceQueueCount = queueCount,
-                      furnaceQueueCountStats = queueCountStats,
                       furnaceWaitCount = waitCount,
                       furnaceWaitTime = waitTime,
                       furnaceHeatingTime = heatingTime,
@@ -172,18 +157,17 @@
                       furnaceUnloadTemps = unloadTemps }
 
 -- | Create a new pit.
-newPit :: EventQueue -> Simulation Pit
-newPit queue =
-  do ingot <- newRef queue Nothing
-     h' <- newRef queue 0.0
-     return Pit { pitQueue = queue,
-                  pitIngot = ingot,
+newPit :: Simulation Pit
+newPit =
+  do ingot <- newRef Nothing
+     h' <- newRef 0.0
+     return Pit { pitIngot = ingot,
                   pitTemp  = h' }
 
 -- | Create a new ingot.
-newIngot :: Furnace -> Dynamics Ingot
+newIngot :: Furnace -> Event Ingot
 newIngot furnace =
-  do t  <- time
+  do t  <- liftDynamics time
      xi <- liftIO $ furnaceNormalGen furnace
      h' <- liftIO temprnd
      let c = 0.1 + (0.05 + xi * 0.01)
@@ -195,7 +179,7 @@
                     ingotCoeff = c }
 
 -- | Heat the ingot up in the pit if there is such an ingot.
-heatPitUp :: Pit -> Dynamics ()
+heatPitUp :: Pit -> Event ()
 heatPitUp pit =
   do ingot <- readRef (pitIngot pit)
      case ingot of
@@ -205,21 +189,21 @@
          
          -- update the temperature of the ingot.
          let furnace = ingotFurnace ingot
-         dt' <- dt
+         dt' <- liftDynamics dt
          h'  <- readRef (pitTemp pit)
          h   <- readRef (furnaceTemp furnace)
          writeRef (pitTemp pit) $ 
            h' + dt' * (h - h') * ingotCoeff ingot
 
 -- | Check whether there are ready ingots in the pits.
-ingotsReady :: Furnace -> Dynamics Bool
+ingotsReady :: Furnace -> Event Bool
 ingotsReady furnace =
   fmap (not . null) $ 
   filterM (fmap (>= 2200.0) . readRef . pitTemp) $ 
   furnacePits furnace
 
 -- | Try to unload the ready ingot from the specified pit.
-tryUnloadPit :: Furnace -> Pit -> Dynamics ()
+tryUnloadPit :: Furnace -> Pit -> Event ()
 tryUnloadPit furnace pit =
   do h' <- readRef (pitTemp pit)
      when (h' >= 2000.0) $
@@ -227,23 +211,20 @@
           unloadIngot ingot pit
 
 -- | Try to load an awaiting ingot in the specified empty pit.
-tryLoadPit :: Furnace -> Pit -> Dynamics ()       
+tryLoadPit :: Furnace -> Pit -> Event ()       
 tryLoadPit furnace pit =
   do let ingots = furnaceAwaitingIngots furnace
-     flag <- liftIO $ Q.queueNull ingots
+     flag <- liftIO $ DLL.listNull ingots
      unless flag $
-       do ingot <- liftIO $ Q.queueFront ingots
-          liftIO $ Q.dequeue ingots
-          t' <- time
-          modifyUVar (furnaceQueueCount furnace) (+ (-1))
-          c <- readUVar (furnaceQueueCount furnace)
-          modifyRef (furnaceQueueCountStats furnace) $
-            addSamplingStats c
+       do ingot <- liftIO $ DLL.listFirst ingots
+          liftIO $ DLL.listRemoveFirst ingots
+          t' <- liftDynamics time
+          modifyRef (furnaceQueueCount furnace) (+ (-1))
           loadIngot (ingot { ingotLoadTime = t',
                              ingotLoadTemp = 400.0 }) pit
               
 -- | Unload the ingot from the specified pit.       
-unloadIngot :: Ingot -> Pit -> Dynamics ()
+unloadIngot :: Ingot -> Pit -> Event ()
 unloadIngot ingot pit = 
   do h' <- readRef (pitTemp pit)
      writeRef (pitIngot pit) Nothing
@@ -251,13 +232,11 @@
      
      -- count the active pits
      let furnace = ingotFurnace ingot
-     count <- readUVar (furnacePitCount furnace)
-     writeUVar (furnacePitCount furnace) (count - 1)
-     modifyRef (furnacePitCountStats furnace) $
-       addSamplingStats (count - 1)
+     count <- readRef (furnacePitCount furnace)
+     writeRef (furnacePitCount furnace) (count - 1)
      
      -- how long did we heat the ingot up?
-     t' <- time
+     t' <- liftDynamics time
      modifyRef (furnaceHeatingTime furnace)
        (+ (t' - ingotLoadTime ingot))
      
@@ -268,17 +247,15 @@
      modifyRef (furnaceUnloadCount furnace) (+ 1)
      
 -- | Load the ingot in the specified pit
-loadIngot :: Ingot -> Pit -> Dynamics ()
+loadIngot :: Ingot -> Pit -> Event ()
 loadIngot ingot pit =
   do writeRef (pitIngot pit) $ Just ingot
      writeRef (pitTemp pit) $ ingotLoadTemp ingot
      
      -- count the active pits
      let furnace = ingotFurnace ingot
-     count <- readUVar (furnacePitCount furnace)
-     writeUVar (furnacePitCount furnace) (count + 1)
-     modifyRef (furnacePitCountStats furnace) $
-       addSamplingStats (count + 1)
+     count <- readRef (furnacePitCount furnace)
+     writeRef (furnacePitCount furnace) (count + 1)
      
      -- decrease the furnace temperature
      h <- readRef (furnaceTemp furnace)
@@ -287,21 +264,19 @@
      writeRef (furnaceTemp furnace) $ h + dh
 
      -- how long did we keep the ingot in the queue?
-     t' <- time
-     when (ingotReceiveTime ingot < t') $
-       do modifyRef (furnaceWaitCount furnace) (+ 1) 
-          modifyRef (furnaceWaitTime furnace)
-            (+ (t' - ingotReceiveTime ingot))
+     t' <- liftDynamics time
+     modifyRef (furnaceWaitCount furnace) (+ 1) 
+     modifyRef (furnaceWaitTime furnace)
+       (+ (t' - ingotReceiveTime ingot))
 
      -- count the loaded ingots
      modifyRef (furnaceLoadCount furnace) (+ 1)
   
 -- | Start iterating the furnace processing through the event queue.
-startIteratingFurnace :: Furnace -> Dynamics ()
+startIteratingFurnace :: Furnace -> Event ()
 startIteratingFurnace furnace = 
-  let queue = furnaceQueue furnace
-      pits = furnacePits furnace
-  in enqueueWithIntegTimes queue $
+  let pits = furnacePits furnace
+  in enqueueEventWithIntegTimes $
      do ready <- ingotsReady furnace
         when ready $ 
           do mapM_ (tryUnloadPit furnace) pits
@@ -310,19 +285,19 @@
         mapM_ heatPitUp pits
         
         -- update the temperature of the furnace
-        dt' <- dt
+        dt' <- liftDynamics dt
         h   <- readRef (furnaceTemp furnace)
         writeRef (furnaceTemp furnace) $
           h + dt' * (2600.0 - h) * 0.2
 
 -- | Return all empty pits.
-emptyPits :: Furnace -> Dynamics [Pit]
+emptyPits :: Furnace -> Event [Pit]
 emptyPits furnace =
   filterM (fmap isNothing . readRef . pitIngot) $
   furnacePits furnace
 
 -- | Accept a new ingot.
-acceptIngot :: Furnace -> Dynamics ()
+acceptIngot :: Furnace -> Event ()
 acceptIngot furnace =
   do ingot <- newIngot furnace
      
@@ -330,14 +305,11 @@
      modifyRef (furnaceTotalCount furnace) (+ 1)
      
      -- check what to do with the new ingot
-     count <- readUVar (furnacePitCount furnace)
+     count <- readRef (furnacePitCount furnace)
      if count >= 10
        then do let ingots = furnaceAwaitingIngots furnace
-               liftIO $ Q.enqueue ingots ingot
-               modifyUVar (furnaceQueueCount furnace) (+ 1)
-               c <- readUVar (furnaceQueueCount furnace)
-               modifyRef (furnaceQueueCountStats furnace) $
-                 addSamplingStats c
+               liftIO $ DLL.listAddLast ingots ingot
+               modifyRef (furnaceQueueCount furnace) (+ 1)
        else do pit:_ <- emptyPits furnace
                loadIngot ingot pit
        
@@ -347,12 +319,12 @@
   do delay <- liftIO $ exprnd (1.0 / 2.5)
      holdProcess delay
      -- we have got a new ingot
-     liftDynamics $ acceptIngot furnace
+     liftEvent $ acceptIngot furnace
      -- repeat it again
      processFurnace furnace
 
 -- | Initialize the furnace.
-initializeFurnace :: Furnace -> Dynamics ()
+initializeFurnace :: Furnace -> Event ()
 initializeFurnace furnace =
   do x1 <- newIngot furnace
      x2 <- newIngot furnace
@@ -374,21 +346,33 @@
 -- | The simulation model that returns experimental data.
 model :: Simulation ExperimentData
 model =
-  do queue <- newQueue
-     furnace <- newFurnace queue
-     pid <- newProcessID queue
+  do furnace <- newFurnace
+     pid <- newProcessId
 
      -- initialize the furnace and start its iterating in start time
-     runDynamicsInStartTime $
+     runEventInStartTime IncludingCurrentEvents $
        do initializeFurnace furnace
           startIteratingFurnace furnace
      
-     -- start accepting input ingots by launching the process
-     runDynamicsInStartTime $
-       do t0 <- starttime
-          runProcess (processFurnace furnace) pid t0
+     -- accept input ingots
+     runProcessInStartTime IncludingCurrentEvents
+       pid (processFurnace furnace)
+
+     -- the mean wait time in the queue
+     let meanWaitTime :: Event Double
+         meanWaitTime =
+           do waitTime <- readRef (furnaceWaitTime furnace)
+              waitCount <- readRef (furnaceWaitCount furnace)
+              return $ waitTime / fromIntegral waitCount
+         
+     -- the mean heating time
+     let meanHeatingTime :: Event Double
+         meanHeatingTime =
+           do heatingTime <- readRef (furnaceHeatingTime furnace)
+              unloadCount <- readRef (furnaceUnloadCount furnace)
+              return $ heatingTime / fromIntegral unloadCount
      
-     experimentDataInStartTime queue $
+     experimentDataInStartTime
        [(totalIngotCountName,
          seriesEntity "total ingot count" $
          furnaceTotalCount furnace),
@@ -409,31 +393,29 @@
          seriesEntity "the temperature of ready ingot" $
          furnaceUnloadTemps furnace),
                 
-        (pitCountStatsName,
+        (pitCountName,
          seriesEntity "the used pit count" $
-         furnacePitCountStats furnace),
+         furnacePitCount furnace),
               
-        (queueCountStatsName,
+        (queueCountName,
          seriesEntity "the queue size" $
-         furnaceQueueCountStats furnace),
+         furnaceQueueCount furnace),
               
         (meanWaitTimeName,
-         seriesEntity "the mean wait time" $
-         readRef (furnaceWaitTime furnace) /
-         fmap fromIntegral (readRef (furnaceWaitCount furnace))),
+         seriesEntity "the mean wait time"
+         meanWaitTime),
 
         (meanHeatingTimeName,
-         seriesEntity "the mean heating time" $
-         readRef (furnaceHeatingTime furnace) /
-         fmap fromIntegral (readRef (furnaceUnloadCount furnace))) ]
+         seriesEntity "the mean heating time"
+         meanHeatingTime) ]
               
 totalIngotCountName    = "totalIngotCount"
 loadedIngotCountName   = "loadedIngotCount"
 readyIngotCountName    = "readyIngotCount"
 awaitedIngotCountName  = "awaitedIngotCount"
 readyIngotTempsName    = "readyIngotTemps"
-pitCountStatsName      = "pitCountStats"
-queueCountStatsName    = "queueCountStats"
+pitCountName           = "pitCount"
+queueCountName         = "queueCount"
 meanWaitTimeName       = "the mean wait time in the queue"
 meanHeatingTimeName    = "the mean heating time"
 
@@ -486,22 +468,34 @@
        outputView $ defaultDeviationChartView {
          deviationChartTitle = "Deviation Chart - 2",
          deviationChartPlotTitle = "The used pit count",
-         deviationChartSeries = [Right pitCountStatsName] },
+         deviationChartSeries = [Right pitCountName] },
        
+       outputView $ defaultFinalHistogramView {
+         finalHistogramTitle = "Final Histogram - 2",
+         finalHistogramPlotTitle = "The distribution of the used pit count " ++
+                                   "in the final simulation time point.",
+         finalHistogramSeries = [pitCountName] },
+
        outputView $ defaultFinalStatsView {
          finalStatsTitle = "Final Statistics - 2",
          finalStatsDescription = "The summary of the used pit count in the final time point.",
-         finalStatsSeries = [pitCountStatsName] },
+         finalStatsSeries = [pitCountName] },
 
        outputView $ defaultDeviationChartView {
          deviationChartTitle = "Deviation Chart - 3",
          deviationChartPlotTitle = "The queue size",
-         deviationChartSeries = [Right queueCountStatsName] },
+         deviationChartSeries = [Right queueCountName] },
        
+       outputView $ defaultFinalHistogramView {
+         finalHistogramTitle = "Final Histogram - 3",
+         finalHistogramPlotTitle = "The distribution of the queue size " ++
+                                   "in the final simulation time point.",
+         finalHistogramSeries = [queueCountName] },
+
        outputView $ defaultFinalStatsView {
          finalStatsTitle = "Final Statistics - 3",
          finalStatsDescription = "The summary of the queue size in the final time point.",
-         finalStatsSeries = [queueCountStatsName] },
+         finalStatsSeries = [queueCountName] },
 
        outputView $ defaultDeviationChartView {
          deviationChartTitle = "Deviation Chart - 4",
diff --git a/examples/LinearArray.hs b/examples/LinearArray.hs
--- a/examples/LinearArray.hs
+++ b/examples/LinearArray.hs
@@ -14,11 +14,10 @@
 
 import qualified Data.Vector as V
 
+import Simulation.Aivika.Specs
+import Simulation.Aivika.Simulation
 import Simulation.Aivika.Dynamics
-import Simulation.Aivika.Dynamics.Simulation
-import Simulation.Aivika.Dynamics.SystemDynamics
-import Simulation.Aivika.Dynamics.EventQueue
-import Simulation.Aivika.Dynamics.Base
+import Simulation.Aivika.SystemDynamics
 
 import Simulation.Aivika.Experiment
 import Simulation.Aivika.Experiment.TableView
@@ -46,8 +45,7 @@
 
 model :: Int -> Simulation ExperimentData
 model n =
-  mdo queue <- newQueue
-      m <- generateArray (1, n) $ \i ->
+  mdo m <- generateArray (1, n) $ \i ->
         integ (q + k * (c!(i - 1) - c!i) + k * (c!(i + 1) - c!i)) 0
       let c =
             array (0, n + 1) [(i, if (i == 0) || (i == n + 1)
@@ -56,7 +54,7 @@
           q = 1
           k = 2
           v = 0.75
-      experimentDataInStartTime queue
+      experimentDataInStartTime
         [("t", seriesEntity "time" time),
          ("m", seriesEntity "M" m),
          ("c", seriesEntity "C" c)]
diff --git a/examples/MachRep3.hs b/examples/MachRep3.hs
--- a/examples/MachRep3.hs
+++ b/examples/MachRep3.hs
@@ -17,13 +17,14 @@
 import Control.Monad
 import Control.Monad.Trans
 
+import Simulation.Aivika.Specs
+import Simulation.Aivika.Simulation
 import Simulation.Aivika.Dynamics
-import Simulation.Aivika.Dynamics.Simulation
-import Simulation.Aivika.Dynamics.Base
-import Simulation.Aivika.Dynamics.EventQueue
-import Simulation.Aivika.Dynamics.Ref
-import Simulation.Aivika.Dynamics.Resource
-import Simulation.Aivika.Dynamics.Process
+import Simulation.Aivika.Event
+import Simulation.Aivika.Ref
+import Simulation.Aivika.QueueStrategy
+import Simulation.Aivika.Resource
+import Simulation.Aivika.Process
 
 import Simulation.Aivika.Experiment
 import Simulation.Aivika.Experiment.Histogram
@@ -104,56 +105,55 @@
      
 model :: Simulation ExperimentData
 model =
-  do queue <- newQueue
-     
-     -- number of machines currently up
-     nUp <- newRef queue 2
+  do -- number of machines currently up
+     nUp <- newRef 2
      
      -- total up time for all machines
-     totalUpTime <- newRef queue 0.0
+     totalUpTime <- newRef 0.0
      
-     repairPerson <- newResource queue 1
+     repairPerson <- newResource FCFS 1
      
-     pid1 <- newProcessID queue
-     pid2 <- newProcessID queue
+     pid1 <- newProcessId
+     pid2 <- newProcessId
      
-     let machine :: ProcessID -> Process ()
+     let machine :: ProcessId -> Process ()
          machine pid =
            do startUpTime <- liftDynamics time
               upTime <- liftIO $ exprnd upRate
               holdProcess upTime
               finishUpTime <- liftDynamics time
-              liftDynamics $ modifyRef totalUpTime 
+              liftEvent $ modifyRef totalUpTime 
                 (+ (finishUpTime - startUpTime))
                 
-              liftDynamics $ modifyRef nUp $ \a -> a - 1
-              nUp' <- liftDynamics $ readRef nUp
+              liftEvent $ modifyRef nUp $ \a -> a - 1
+              nUp' <- liftEvent $ readRef nUp
               if nUp' == 1
                 then passivateProcess
-                else do n <- liftDynamics $ 
-                             resourceCount repairPerson
+                else liftEvent $
+                     do n <- resourceCount repairPerson
                         when (n == 1) $ 
-                          liftDynamics $ reactivateProcess pid
+                          reactivateProcess pid
               
               requestResource repairPerson
               repairTime <- liftIO $ exprnd repairRate
               holdProcess repairTime
-              liftDynamics $ modifyRef nUp $ \a -> a + 1
+              liftEvent $ modifyRef nUp $ \a -> a + 1
               releaseResource repairPerson
               
               machine pid
 
-     runDynamicsInStartTime $
-       do t0 <- starttime
-          runProcess (machine pid2) pid1 t0
-          runProcess (machine pid1) pid2 t0
+     runProcessInStartTime IncludingCurrentEvents
+       pid1 (machine pid2)
+
+     runProcessInStartTime IncludingCurrentEvents
+       pid2 (machine pid1)
      
      let result = 
            do x <- readRef totalUpTime
-              y <- time
+              y <- liftDynamics time
               return $ x / (2 * y)          
               
-     experimentDataInStartTime queue
+     experimentDataInStartTime
        [("x", seriesEntity "The proportion of up time" result),
         ("t", seriesEntity "Total up time" totalUpTime),
         ("n", seriesEntity "Simulation run" simulationIndex)]
