diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,14 @@
+
+Version 4.1.1
+-----
+
+* More counters and statistics for the new resources.
+
+Version 4.1
+-----
+
+* Added new resource types with counters and statistics.
+
 Version 4.0.2
 -----
 
diff --git a/Simulation/Aivika/Resource.hs b/Simulation/Aivika/Resource.hs
--- a/Simulation/Aivika/Resource.hs
+++ b/Simulation/Aivika/Resource.hs
@@ -38,6 +38,10 @@
         resourceCountStats,
         resourceUtilisationCount,
         resourceUtilisationCountStats,
+        resourceQueueCount,
+        resourceQueueCountStats,
+        resourceTotalWaitTime,
+        resourceWaitTime,
         -- * Requesting for and Releasing Resource
         requestResource,
         requestResourceWithPriority,
@@ -54,6 +58,10 @@
         resourceCountChanged_,
         resourceUtilisationCountChanged,
         resourceUtilisationCountChanged_,
+        resourceQueueCountChanged,
+        resourceQueueCountChanged_,
+        resourceWaitTimeChanged,
+        resourceWaitTimeChanged_,
         resourceChanged_) where
 
 import Data.IORef
@@ -101,8 +109,18 @@
              resourceUtilisationCountRef :: IORef Int,
              resourceUtilisationCountStatsRef :: IORef (TimingStats Int),
              resourceUtilisationCountSource :: SignalSource Int,
-             resourceWaitList :: StrategyQueue s (FrozenCont ()) }
+             resourceQueueCountRef :: IORef Int,
+             resourceQueueCountStatsRef :: IORef (TimingStats Int),
+             resourceQueueCountSource :: SignalSource Int,
+             resourceTotalWaitTimeRef :: IORef Double,
+             resourceWaitTimeRef :: IORef (SamplingStats Double),
+             resourceWaitTimeSource :: SignalSource (),
+             resourceWaitList :: StrategyQueue s ResourceItem }
 
+data ResourceItem =
+  ResourceItem { resourceItemTime :: Double,
+                 resourceItemCont :: FrozenCont () }
+
 instance Eq (Resource s) where
   x == y = resourceCountRef x == resourceCountRef y  -- unique references
 
@@ -179,29 +197,7 @@
                -- ^ the initial count (and maximal count too) of the resource
                -> Event (Resource s)
 newResource s count =
-  Event $ \p ->
-  do let r = pointRun p
-         t = pointTime p
-     when (count < 0) $
-       error $
-       "The resource count cannot be negative: " ++
-       "newResource."
-     countRef <- newIORef count
-     countStatsRef <- newIORef $ returnTimingStats t count
-     countSource <- invokeSimulation r newSignalSource 
-     utilCountRef <- newIORef 0
-     utilCountStatsRef <- newIORef $ returnTimingStats t 0
-     utilCountSource <- invokeSimulation r newSignalSource 
-     waitList <- invokeSimulation r $ newStrategyQueue s
-     return Resource { resourceStrategy = s,
-                       resourceMaxCount = Just count,
-                       resourceCountRef = countRef,
-                       resourceCountStatsRef = countStatsRef,
-                       resourceCountSource = countSource,
-                       resourceUtilisationCountRef = utilCountRef,
-                       resourceUtilisationCountStatsRef = utilCountStatsRef,
-                       resourceUtilisationCountSource = utilCountSource,
-                       resourceWaitList = waitList }
+  newResourceWithMaxCount s count (Just count)
 
 -- | Create a new resource with the specified queue strategy, initial and maximum counts,
 -- where 'Nothing' means that the resource has no upper bound.
@@ -234,6 +230,12 @@
      utilCountRef <- newIORef 0
      utilCountStatsRef <- newIORef $ returnTimingStats t 0
      utilCountSource <- invokeSimulation r newSignalSource
+     queueCountRef <- newIORef 0
+     queueCountStatsRef <- newIORef $ returnTimingStats t 0
+     queueCountSource <- invokeSimulation r newSignalSource
+     totalWaitTimeRef <- newIORef 0
+     waitTimeRef <- newIORef emptySamplingStats
+     waitTimeSource <- invokeSimulation r newSignalSource
      waitList <- invokeSimulation r $ newStrategyQueue s
      return Resource { resourceStrategy = s,
                        resourceMaxCount = maxCount,
@@ -243,6 +245,12 @@
                        resourceUtilisationCountRef = utilCountRef,
                        resourceUtilisationCountStatsRef = utilCountStatsRef,
                        resourceUtilisationCountSource = utilCountSource,
+                       resourceQueueCountRef = queueCountRef,
+                       resourceQueueCountStatsRef = queueCountStatsRef,
+                       resourceQueueCountSource = queueCountSource,
+                       resourceTotalWaitTimeRef = totalWaitTimeRef,
+                       resourceWaitTimeRef = waitTimeRef,
+                       resourceWaitTimeSource = waitTimeSource,
                        resourceWaitList = waitList }
 
 -- | Return the current available count of the resource.
@@ -285,6 +293,46 @@
 resourceUtilisationCountChanged_ r =
   mapSignal (const ()) $ resourceUtilisationCountChanged r
 
+-- | Return the current queue length of the resource.
+resourceQueueCount :: Resource s -> Event Int
+resourceQueueCount r =
+  Event $ \p -> readIORef (resourceQueueCountRef r)
+
+-- | Return the statistics for the queue length of the resource.
+resourceQueueCountStats :: Resource s -> Event (TimingStats Int)
+resourceQueueCountStats r =
+  Event $ \p -> readIORef (resourceQueueCountStatsRef r)
+
+-- | Signal triggered when the 'resourceQueueCount' property changes.
+resourceQueueCountChanged :: Resource s -> Signal Int
+resourceQueueCountChanged r =
+  publishSignal $ resourceQueueCountSource r
+
+-- | Signal triggered when the 'resourceQueueCount' property changes.
+resourceQueueCountChanged_ :: Resource s -> Signal ()
+resourceQueueCountChanged_ r =
+  mapSignal (const ()) $ resourceQueueCountChanged r
+
+-- | Return the total wait time of the resource.
+resourceTotalWaitTime :: Resource s -> Event Double
+resourceTotalWaitTime r =
+  Event $ \p -> readIORef (resourceTotalWaitTimeRef r)
+
+-- | Return the statistics for the wait time of the resource.
+resourceWaitTime :: Resource s -> Event (SamplingStats Double)
+resourceWaitTime r =
+  Event $ \p -> readIORef (resourceWaitTimeRef r)
+
+-- | Signal triggered when the 'resourceTotalWaitTime' and 'resourceWaitTime' properties change.
+resourceWaitTimeChanged :: Resource s -> Signal (SamplingStats Double)
+resourceWaitTimeChanged r =
+  mapSignalM (\() -> resourceWaitTime r) $ resourceWaitTimeChanged_ r
+
+-- | Signal triggered when the 'resourceTotalWaitTime' and 'resourceWaitTime' properties change.
+resourceWaitTimeChanged_ :: Resource s -> Signal ()
+resourceWaitTimeChanged_ r =
+  publishSignal $ resourceWaitTimeSource r
+
 -- | Request for the resource decreasing its count in case of success,
 -- otherwise suspending the discontinuous process until some other 
 -- process releases the resource.
@@ -304,8 +352,11 @@
                     invokeProcess pid $
                     requestResource r
                invokeEvent p $
-                 strategyEnqueue (resourceWaitList r) c
-       else do invokeEvent p $ updateResourceCount r (-1)
+                 strategyEnqueue (resourceWaitList r) $
+                 ResourceItem (pointTime p) c
+               invokeEvent p $ updateResourceQueueCount r 1
+       else do invokeEvent p $ updateResourceWaitTime r 0
+               invokeEvent p $ updateResourceCount r (-1)
                invokeEvent p $ updateResourceUtilisationCount r 1
                invokeEvent p $ resumeCont c ()
 
@@ -330,8 +381,11 @@
                     invokeProcess pid $
                     requestResourceWithPriority r priority
                invokeEvent p $
-                 strategyEnqueueWithPriority (resourceWaitList r) priority c
-       else do invokeEvent p $ updateResourceCount r (-1)
+                 strategyEnqueueWithPriority (resourceWaitList r) priority $
+                 ResourceItem (pointTime p) c
+               invokeEvent p $ updateResourceQueueCount r 1
+       else do invokeEvent p $ updateResourceWaitTime r 0
+               invokeEvent p $ updateResourceCount r (-1)
                invokeEvent p $ updateResourceUtilisationCount r 1
                invokeEvent p $ resumeCont c ()
 
@@ -379,14 +433,16 @@
           strategyQueueNull (resourceWaitList r)
      if f 
        then invokeEvent p $ updateResourceCount r 1
-       else do c <- invokeEvent p $
+       else do x <- invokeEvent p $
                     strategyDequeue (resourceWaitList r)
-               c <- invokeEvent p $ unfreezeCont c
+               invokeEvent p $ updateResourceQueueCount r (-1)
+               c <- invokeEvent p $ unfreezeCont (resourceItemCont x)
                case c of
                  Nothing ->
                    invokeEvent p $ releaseResource' r
                  Just c  ->
-                   do invokeEvent p $ updateResourceUtilisationCount r 1
+                   do invokeEvent p $ updateResourceWaitTime r (pointTime p - resourceItemTime x)
+                      invokeEvent p $ updateResourceUtilisationCount r 1
                       invokeEvent p $ enqueueEvent (pointTime p) $ resumeCont c ()
 
 -- | Try to request for the resource decreasing its count in case of success
@@ -399,7 +455,8 @@
   do a <- readIORef (resourceCountRef r)
      if a == 0 
        then return False
-       else do invokeEvent p $ updateResourceCount r (-1)
+       else do invokeEvent p $ updateResourceWaitTime r 0
+               invokeEvent p $ updateResourceCount r (-1)
                invokeEvent p $ updateResourceUtilisationCount r 1
                return True
                
@@ -477,7 +534,8 @@
 resourceChanged_ :: Resource s -> Signal ()
 resourceChanged_ r =
   resourceCountChanged_ r <>
-  resourceUtilisationCountChanged_ r
+  resourceUtilisationCountChanged_ r <>
+  resourceQueueCountChanged_ r
 
 -- | Update the resource count and its statistics.
 updateResourceCount :: Resource s -> Int -> Event ()
@@ -502,3 +560,27 @@
        addTimingStats (pointTime p) a'
      invokeEvent p $
        triggerSignal (resourceUtilisationCountSource r) a'
+
+-- | Update the resource queue length and its statistics.
+updateResourceQueueCount :: Resource s -> Int -> Event ()
+updateResourceQueueCount r delta =
+  Event $ \p ->
+  do a <- readIORef (resourceQueueCountRef r)
+     let a' = a + delta
+     a' `seq` writeIORef (resourceQueueCountRef r) a'
+     modifyIORef' (resourceQueueCountStatsRef r) $
+       addTimingStats (pointTime p) a'
+     invokeEvent p $
+       triggerSignal (resourceQueueCountSource r) a'
+
+-- | Update the resource wait time and its statistics.
+updateResourceWaitTime :: Resource s -> Double -> Event ()
+updateResourceWaitTime r delta =
+  Event $ \p ->
+  do a <- readIORef (resourceTotalWaitTimeRef r)
+     let a' = a + delta
+     a' `seq` writeIORef (resourceTotalWaitTimeRef r) a'
+     modifyIORef' (resourceWaitTimeRef r) $
+       addSamplingStats delta
+     invokeEvent p $
+       triggerSignal (resourceWaitTimeSource r) ()
diff --git a/Simulation/Aivika/Resource/Preemption.hs b/Simulation/Aivika/Resource/Preemption.hs
--- a/Simulation/Aivika/Resource/Preemption.hs
+++ b/Simulation/Aivika/Resource/Preemption.hs
@@ -21,6 +21,10 @@
         resourceCountStats,
         resourceUtilisationCount,
         resourceUtilisationCountStats,
+        resourceQueueCount,
+        resourceQueueCountStats,
+        resourceTotalWaitTime,
+        resourceWaitTime,
         -- * Requesting for and Releasing Resource
         requestResourceWithPriority,
         releaseResource,
@@ -34,6 +38,10 @@
         resourceCountChanged_,
         resourceUtilisationCountChanged,
         resourceUtilisationCountChanged_,
+        resourceQueueCountChanged,
+        resourceQueueCountChanged_,
+        resourceWaitTimeChanged,
+        resourceWaitTimeChanged_,
         resourceChanged_) where
 
 import Data.IORef
@@ -65,6 +73,12 @@
              resourceUtilisationCountRef :: IORef Int,
              resourceUtilisationCountStatsRef :: IORef (TimingStats Int),
              resourceUtilisationCountSource :: SignalSource Int,
+             resourceQueueCountRef :: IORef Int,
+             resourceQueueCountStatsRef :: IORef (TimingStats Int),
+             resourceQueueCountSource :: SignalSource Int,
+             resourceTotalWaitTimeRef :: IORef Double,
+             resourceWaitTimeRef :: IORef (SamplingStats Double),
+             resourceWaitTimeSource :: SignalSource (),
              resourceActingQueue :: PQ.PriorityQueue ResourceActingItem,
              resourceWaitQueue :: PQ.PriorityQueue ResourceAwaitingItem }
 
@@ -79,12 +93,14 @@
 -- | Idenitifies an item that requests for the resource.
 data ResourceRequestingItem =
   ResourceRequestingItem { requestingItemPriority :: Double,
+                           requestingItemTime :: Double,
                            requestingItemId :: ProcessId,
                            requestingItemCont :: FrozenCont () }
 
 -- | Idenitifies an item that was preempted.
 data ResourcePreemptedItem =
   ResourcePreemptedItem { preemptedItemPriority :: Double,
+                          preemptedItemTime :: Double,
                           preemptedItemId :: ProcessId }
 
 instance Eq Resource where
@@ -98,30 +114,7 @@
                -- ^ the initial count (and maximal count too) of the resource
                -> Event Resource
 newResource count =
-  Event $ \p ->
-  do let r = pointRun p
-         t = pointTime p
-     when (count < 0) $
-       error $
-       "The resource count cannot be negative: " ++
-       "newResource."
-     countRef <- newIORef count
-     countStatsRef <- newIORef $ returnTimingStats t count
-     countSource <- invokeSimulation r newSignalSource
-     utilCountRef <- newIORef 0
-     utilCountStatsRef <- newIORef $ returnTimingStats t 0
-     utilCountSource <- invokeSimulation r newSignalSource
-     actingQueue <- PQ.newQueue
-     waitQueue <- PQ.newQueue
-     return Resource { resourceMaxCount = Just count,
-                       resourceCountRef = countRef,
-                       resourceCountStatsRef = countStatsRef,
-                       resourceCountSource = countSource,
-                       resourceUtilisationCountRef = utilCountRef,
-                       resourceUtilisationCountStatsRef = utilCountStatsRef,
-                       resourceUtilisationCountSource = utilCountSource,
-                       resourceActingQueue = actingQueue,
-                       resourceWaitQueue = waitQueue }
+  newResourceWithMaxCount count (Just count)
 
 -- | Create a new resource with the specified initial and maximum counts,
 -- where 'Nothing' means that the resource has no upper bound.
@@ -151,6 +144,12 @@
      utilCountRef <- newIORef 0
      utilCountStatsRef <- newIORef $ returnTimingStats t 0
      utilCountSource <- invokeSimulation r newSignalSource
+     queueCountRef <- newIORef 0
+     queueCountStatsRef <- newIORef $ returnTimingStats t 0
+     queueCountSource <- invokeSimulation r newSignalSource
+     totalWaitTimeRef <- newIORef 0
+     waitTimeRef <- newIORef emptySamplingStats
+     waitTimeSource <- invokeSimulation r newSignalSource
      actingQueue <- PQ.newQueue
      waitQueue <- PQ.newQueue
      return Resource { resourceMaxCount = maxCount,
@@ -160,6 +159,12 @@
                        resourceUtilisationCountRef = utilCountRef,
                        resourceUtilisationCountStatsRef = utilCountStatsRef,
                        resourceUtilisationCountSource = utilCountSource,
+                       resourceQueueCountRef = queueCountRef,
+                       resourceQueueCountStatsRef = queueCountStatsRef,
+                       resourceQueueCountSource = queueCountSource,
+                       resourceTotalWaitTimeRef = totalWaitTimeRef,
+                       resourceWaitTimeRef = waitTimeRef,
+                       resourceWaitTimeSource = waitTimeSource,
                        resourceActingQueue = actingQueue,
                        resourceWaitQueue = waitQueue }
 
@@ -203,6 +208,46 @@
 resourceUtilisationCountChanged_ r =
   mapSignal (const ()) $ resourceUtilisationCountChanged r
 
+-- | Return the current queue length of the resource.
+resourceQueueCount :: Resource -> Event Int
+resourceQueueCount r =
+  Event $ \p -> readIORef (resourceQueueCountRef r)
+
+-- | Return the statistics for the queue length of the resource.
+resourceQueueCountStats :: Resource -> Event (TimingStats Int)
+resourceQueueCountStats r =
+  Event $ \p -> readIORef (resourceQueueCountStatsRef r)
+
+-- | Signal triggered when the 'resourceQueueCount' property changes.
+resourceQueueCountChanged :: Resource -> Signal Int
+resourceQueueCountChanged r =
+  publishSignal $ resourceQueueCountSource r
+
+-- | Signal triggered when the 'resourceQueueCount' property changes.
+resourceQueueCountChanged_ :: Resource -> Signal ()
+resourceQueueCountChanged_ r =
+  mapSignal (const ()) $ resourceQueueCountChanged r
+
+-- | Return the total wait time of the resource.
+resourceTotalWaitTime :: Resource -> Event Double
+resourceTotalWaitTime r =
+  Event $ \p -> readIORef (resourceTotalWaitTimeRef r)
+
+-- | Return the statistics for the wait time of the resource.
+resourceWaitTime :: Resource -> Event (SamplingStats Double)
+resourceWaitTime r =
+  Event $ \p -> readIORef (resourceWaitTimeRef r)
+
+-- | Signal triggered when the 'resourceTotalWaitTime' and 'resourceWaitTime' properties change.
+resourceWaitTimeChanged :: Resource -> Signal (SamplingStats Double)
+resourceWaitTimeChanged r =
+  mapSignalM (\() -> resourceWaitTime r) $ resourceWaitTimeChanged_ r
+
+-- | Signal triggered when the 'resourceTotalWaitTime' and 'resourceWaitTime' properties change.
+resourceWaitTimeChanged_ :: Resource -> Signal ()
+resourceWaitTimeChanged_ r =
+  publishSignal $ resourceWaitTimeSource r
+
 -- | Request with the priority for the resource decreasing its count
 -- in case of success, otherwise suspending the discontinuous process
 -- until some other process releases the resource.
@@ -219,7 +264,8 @@
   Process $ \pid ->
   Cont $ \c ->
   Event $ \p ->
-  do a <- readIORef (resourceCountRef r)
+  do let t = pointTime p
+     a <- readIORef (resourceCountRef r)
      if a == 0
        then do f <- PQ.queueNull (resourceActingQueue r)
                if f
@@ -228,14 +274,16 @@
                               invokeCont c $
                               invokeProcess pid $
                               requestResourceWithPriority r priority
-                         PQ.enqueue (resourceWaitQueue r) priority (Left $ ResourceRequestingItem priority pid c)
+                         PQ.enqueue (resourceWaitQueue r) priority (Left $ ResourceRequestingItem priority t pid c)
+                         invokeEvent p $ updateResourceQueueCount r 1
                  else do (p0', item0) <- PQ.queueFront (resourceActingQueue r)
                          let p0 = - p0'
                              pid0 = actingItemId item0
                          if priority < p0
                            then do PQ.dequeue (resourceActingQueue r)
                                    PQ.enqueue (resourceActingQueue r) (- priority) $ ResourceActingItem priority pid
-                                   PQ.enqueue (resourceWaitQueue r) p0 (Right $ ResourcePreemptedItem p0 pid0)
+                                   PQ.enqueue (resourceWaitQueue r) p0 (Right $ ResourcePreemptedItem p0 t pid0)
+                                   invokeEvent p $ updateResourceQueueCount r 1
                                    invokeEvent p $ processPreemptionBegin pid0
                                    invokeEvent p $ resumeCont c ()
                            else do c <- invokeEvent p $
@@ -243,8 +291,10 @@
                                         invokeCont c $
                                         invokeProcess pid $
                                         requestResourceWithPriority r priority
-                                   PQ.enqueue (resourceWaitQueue r) priority (Left $ ResourceRequestingItem priority pid c)
+                                   PQ.enqueue (resourceWaitQueue r) priority (Left $ ResourceRequestingItem priority t pid c)
+                                   invokeEvent p $ updateResourceQueueCount r 1
        else do PQ.enqueue (resourceActingQueue r) (- priority) $ ResourceActingItem priority pid
+               invokeEvent p $ updateResourceWaitTime r 0
                invokeEvent p $ updateResourceCount r (-1)
                invokeEvent p $ updateResourceUtilisationCount r 1
                invokeEvent p $ resumeCont c ()
@@ -287,23 +337,26 @@
        then invokeEvent p $ updateResourceCount r 1
        else do (priority', item) <- PQ.queueFront (resourceWaitQueue r)
                PQ.dequeue (resourceWaitQueue r)
+               invokeEvent p $ updateResourceQueueCount r (-1)
                case item of
-                 Left (ResourceRequestingItem priority pid c) ->
+                 Left (ResourceRequestingItem priority t pid c) ->
                    do c <- invokeEvent p $ unfreezeCont c
                       case c of
                         Nothing ->
                           invokeEvent p $ releaseResource' r
                         Just c ->
                           do PQ.enqueue (resourceActingQueue r) (- priority) $ ResourceActingItem priority pid
+                             invokeEvent p $ updateResourceWaitTime r (pointTime p - t)
                              invokeEvent p $ updateResourceUtilisationCount r 1
                              invokeEvent p $ enqueueEvent (pointTime p) $ resumeCont c ()
-                 Right (ResourcePreemptedItem priority pid) ->
+                 Right (ResourcePreemptedItem priority t pid) ->
                    do f <- invokeEvent p $ processCancelled pid
                       case f of
                         True ->
                           invokeEvent p $ releaseResource' r
                         False ->
                           do PQ.enqueue (resourceActingQueue r) (- priority) $ ResourceActingItem priority pid
+                             invokeEvent p $ updateResourceWaitTime r (pointTime p - t)
                              invokeEvent p $ updateResourceUtilisationCount r 1
                              invokeEvent p $ processPreemptionEnd pid
                
@@ -328,7 +381,8 @@
 decResourceCount' :: Resource -> Event ()
 decResourceCount' r =
   Event $ \p ->
-  do a <- readIORef (resourceCountRef r)
+  do let t = pointTime p
+     a <- readIORef (resourceCountRef r)
      when (a == 0) $
        error $
        "The resource exceeded and its count is zero: decResourceCount'"
@@ -338,9 +392,10 @@
           let p0 = - p0'
               pid0 = actingItemId item0
           PQ.dequeue (resourceActingQueue r)
-          PQ.enqueue (resourceWaitQueue r) p0 (Right $ ResourcePreemptedItem p0 pid0)
+          PQ.enqueue (resourceWaitQueue r) p0 (Right $ ResourcePreemptedItem p0 t pid0)
           invokeEvent p $ processPreemptionBegin pid0
           invokeEvent p $ updateResourceUtilisationCount r (-1)
+          invokeEvent p $ updateResourceQueueCount r 1
      invokeEvent p $ updateResourceCount r (-1)
 
 -- | Increase the count of available resource by the specified number,
@@ -388,7 +443,8 @@
 resourceChanged_ :: Resource -> Signal ()
 resourceChanged_ r =
   resourceCountChanged_ r <>
-  resourceUtilisationCountChanged_ r
+  resourceUtilisationCountChanged_ r <>
+  resourceQueueCountChanged_ r
 
 -- | Update the resource count and its statistics.
 updateResourceCount :: Resource -> Int -> Event ()
@@ -402,6 +458,18 @@
      invokeEvent p $
        triggerSignal (resourceCountSource r) a'
 
+-- | Update the resource queue length and its statistics.
+updateResourceQueueCount :: Resource -> Int -> Event ()
+updateResourceQueueCount r delta =
+  Event $ \p ->
+  do a <- readIORef (resourceQueueCountRef r)
+     let a' = a + delta
+     a' `seq` writeIORef (resourceQueueCountRef r) a'
+     modifyIORef' (resourceQueueCountStatsRef r) $
+       addTimingStats (pointTime p) a'
+     invokeEvent p $
+       triggerSignal (resourceQueueCountSource r) a'
+
 -- | Update the resource utilisation count and its statistics.
 updateResourceUtilisationCount :: Resource -> Int -> Event ()
 updateResourceUtilisationCount r delta =
@@ -413,3 +481,15 @@
        addTimingStats (pointTime p) a'
      invokeEvent p $
        triggerSignal (resourceUtilisationCountSource r) a'
+
+-- | Update the resource wait time and its statistics.
+updateResourceWaitTime :: Resource -> Double -> Event ()
+updateResourceWaitTime r delta =
+  Event $ \p ->
+  do a <- readIORef (resourceTotalWaitTimeRef r)
+     let a' = a + delta
+     a' `seq` writeIORef (resourceTotalWaitTimeRef r) a'
+     modifyIORef' (resourceWaitTimeRef r) $
+       addSamplingStats delta
+     invokeEvent p $
+       triggerSignal (resourceWaitTimeSource r) ()
diff --git a/Simulation/Aivika/Results.hs b/Simulation/Aivika/Results.hs
--- a/Simulation/Aivika/Results.hs
+++ b/Simulation/Aivika/Results.hs
@@ -1755,6 +1755,10 @@
     resultObjectSignal = resultContainerSignal c,
     resultObjectSummary = resourceResultSummary c,
     resultObjectProperties = [
+      resultContainerProperty c "queueCount" ResourceQueueCountId resourceQueueCount resourceQueueCountChanged_,
+      resultContainerProperty c "queueCountStats" ResourceQueueCountStatsId resourceQueueCountStats resourceQueueCountChanged_,
+      resultContainerProperty c "totalWaitTime" ResourceTotalWaitTimeId resourceTotalWaitTime resourceWaitTimeChanged_,
+      resultContainerProperty c "waitTime" ResourceWaitTimeId resourceWaitTime resourceWaitTimeChanged_,
       resultContainerProperty c "count" ResourceCountId resourceCount resourceCountChanged_,
       resultContainerProperty c "countStats" ResourceCountStatsId resourceCountStats resourceCountChanged_,
       resultContainerProperty c "utilisationCount" ResourceUtilisationCountId resourceUtilisationCount resourceUtilisationCountChanged_,
@@ -1773,6 +1777,8 @@
     resultObjectSignal = resultContainerSignal c,
     resultObjectSummary = resourceResultSummary c,
     resultObjectProperties = [
+      resultContainerProperty c "queueCountStats" ResourceQueueCountStatsId resourceQueueCountStats resourceQueueCountChanged_,
+      resultContainerProperty c "waitTime" ResourceWaitTimeId resourceWaitTime resourceWaitTimeChanged_,
       resultContainerProperty c "countStats" ResourceCountStatsId resourceCountStats resourceCountChanged_,
       resultContainerProperty c "utilisationCountStats" ResourceUtilisationCountStatsId resourceUtilisationCountStats resourceUtilisationCountChanged_ ] }
 
@@ -1789,6 +1795,10 @@
     resultObjectSignal = resultContainerSignal c,
     resultObjectSummary = preemptibleResourceResultSummary c,
     resultObjectProperties = [
+      resultContainerProperty c "queueCount" ResourceQueueCountId PR.resourceQueueCount PR.resourceQueueCountChanged_,
+      resultContainerProperty c "queueCountStats" ResourceQueueCountStatsId PR.resourceQueueCountStats PR.resourceQueueCountChanged_,
+      resultContainerProperty c "totalWaitTime" ResourceTotalWaitTimeId PR.resourceTotalWaitTime PR.resourceWaitTimeChanged_,
+      resultContainerProperty c "waitTime" ResourceWaitTimeId PR.resourceWaitTime PR.resourceWaitTimeChanged_,
       resultContainerProperty c "count" ResourceCountId PR.resourceCount PR.resourceCountChanged_,
       resultContainerProperty c "countStats" ResourceCountStatsId PR.resourceCountStats PR.resourceCountChanged_,
       resultContainerProperty c "utilisationCount" ResourceUtilisationCountId PR.resourceUtilisationCount PR.resourceUtilisationCountChanged_,
@@ -1807,6 +1817,8 @@
     resultObjectSignal = resultContainerSignal c,
     resultObjectSummary = preemptibleResourceResultSummary c,
     resultObjectProperties = [
+      resultContainerProperty c "queueCountStats" ResourceQueueCountStatsId PR.resourceQueueCountStats PR.resourceQueueCountChanged_,
+      resultContainerProperty c "waitTime" ResourceWaitTimeId PR.resourceWaitTime PR.resourceWaitTimeChanged_,
       resultContainerProperty c "countStats" ResourceCountStatsId PR.resourceCountStats PR.resourceCountChanged_,
       resultContainerProperty c "utilisationCountStats" ResourceUtilisationCountStatsId PR.resourceUtilisationCountStats PR.resourceUtilisationCountChanged_ ] }
 
diff --git a/Simulation/Aivika/Results/Locale.hs b/Simulation/Aivika/Results/Locale.hs
--- a/Simulation/Aivika/Results/Locale.hs
+++ b/Simulation/Aivika/Results/Locale.hs
@@ -226,6 +226,14 @@
                 -- ^ Property 'resourceUtilisationCount'.
               | ResourceUtilisationCountStatsId
                 -- ^ Property 'resourceUtilisationCountStats'.
+              | ResourceQueueCountId
+                -- ^ Property 'resourceQueueCount'.
+              | ResourceQueueCountStatsId
+                -- ^ Property 'resourceQueueCountStats'.
+              | ResourceTotalWaitTimeId
+                -- ^ Property 'resourceTotalWaitTime'.
+              | ResourceWaitTimeId
+                -- ^ Property 'resourceWaitTime'.
               | UserDefinedResultId ResultDescription
                 -- ^ An user defined description.
               | LocalisedResultId (M.Map ResultLocale ResultDescription)
@@ -331,6 +339,10 @@
 russianResultLocalisation ResourceCountStatsId = "статистика по доступному количеству ресурса"
 russianResultLocalisation ResourceUtilisationCountId = "текущее используемое количество ресурса"
 russianResultLocalisation ResourceUtilisationCountStatsId = "статистика по используемому количеству ресурса"
+russianResultLocalisation ResourceQueueCountId = "текущая длина очереди к ресурсу"
+russianResultLocalisation ResourceQueueCountStatsId = "статистика длины очереди к ресурсу"
+russianResultLocalisation ResourceTotalWaitTimeId = "общее время ожидания ресурса"
+russianResultLocalisation ResourceWaitTimeId = "время ожидания ресурса"
 russianResultLocalisation (UserDefinedResultId m) = m
 russianResultLocalisation x@(LocalisedResultId m) =
   lookupResultLocalisation russianResultLocale x
@@ -426,6 +438,10 @@
 englishResultLocalisation ResourceCountStatsId = "the available count statistics"
 englishResultLocalisation ResourceUtilisationCountId = "the current utilisation count"
 englishResultLocalisation ResourceUtilisationCountStatsId = "the utilisation count statistics"
+englishResultLocalisation ResourceQueueCountId = "the current queue length"
+englishResultLocalisation ResourceQueueCountStatsId = "the queue length statistics"
+englishResultLocalisation ResourceTotalWaitTimeId = "the total wait time"
+englishResultLocalisation ResourceWaitTimeId = "the wait time"
 englishResultLocalisation (UserDefinedResultId m) = m
 englishResultLocalisation x@(LocalisedResultId m) =
   lookupResultLocalisation englishResultLocale x
diff --git a/aivika.cabal b/aivika.cabal
--- a/aivika.cabal
+++ b/aivika.cabal
@@ -1,5 +1,5 @@
 name:            aivika
-version:         4.1
+version:         4.1.1
 synopsis:        A multi-paradigm simulation library
 description:
     Aivika is a multi-paradigm simulation library with a strong emphasis
