diff --git a/Simulation/Aivika/Dynamics/Buffer.hs b/Simulation/Aivika/Dynamics/Buffer.hs
--- a/Simulation/Aivika/Dynamics/Buffer.hs
+++ b/Simulation/Aivika/Dynamics/Buffer.hs
@@ -27,8 +27,6 @@
         enqueueBufferOrLost) where
 
 import Data.IORef
-import Data.Array
-import Data.Array.IO
 
 import Control.Monad
 import Control.Monad.Trans
diff --git a/Simulation/Aivika/Dynamics/EventQueue.hs b/Simulation/Aivika/Dynamics/EventQueue.hs
--- a/Simulation/Aivika/Dynamics/EventQueue.hs
+++ b/Simulation/Aivika/Dynamics/EventQueue.hs
@@ -83,7 +83,7 @@
                  let sc  = pointSpecs p
                      t0  = spcStartTime sc
                      dt  = spcDT sc
-                     n2  = fromInteger $ toInteger $ floor ((t2 - t0) / dt)
+                     n2  = fromIntegral $ floor ((t2 - t0) / dt)
                      Dynamics k = c2
                  k $ p { pointTime = t2,
                          pointIteration = n2,
diff --git a/Simulation/Aivika/Dynamics/FIFO.hs b/Simulation/Aivika/Dynamics/FIFO.hs
--- a/Simulation/Aivika/Dynamics/FIFO.hs
+++ b/Simulation/Aivika/Dynamics/FIFO.hs
@@ -26,7 +26,7 @@
 
 import Data.IORef
 import Data.Array
-import Data.Array.IO
+import Data.Array.IO.Safe
 
 import Control.Monad
 import Control.Monad.Trans
diff --git a/Simulation/Aivika/Dynamics/Internal/Dynamics.hs b/Simulation/Aivika/Dynamics/Internal/Dynamics.hs
--- a/Simulation/Aivika/Dynamics/Internal/Dynamics.hs
+++ b/Simulation/Aivika/Dynamics/Internal/Dynamics.hs
@@ -118,7 +118,7 @@
     error "Incorrect phase: basicTime"
   else
     spcStartTime sc + n' * spcDT sc + delta (spcMethod sc) ph 
-      where n' = fromInteger (toInteger n)
+      where n' = fromIntegral n
             delta Euler       0 = 0
             delta RungeKutta2 0 = 0
             delta RungeKutta2 1 = spcDT sc
@@ -187,7 +187,7 @@
   do let sc = runSpecs r
          t0 = spcStartTime sc
          dt = spcDT sc
-         n  = fromInteger $ toInteger $ floor ((t - t0) / dt)
+         n  = fromIntegral $ floor ((t - t0) / dt)
      m Point { pointSpecs = sc,
                pointRun = r,
                pointTime = t,
@@ -202,7 +202,7 @@
          t0 = spcStartTime sc
          dt = spcDT sc
          point t =
-           let n = fromInteger $ toInteger $ floor ((t - t0) / dt)
+           let n = fromIntegral $ floor ((t - t0) / dt)
            in Point { pointSpecs = sc,
                       pointRun = r,
                       pointTime = t,
diff --git a/Simulation/Aivika/Dynamics/Internal/Fold.hs b/Simulation/Aivika/Dynamics/Internal/Fold.hs
--- a/Simulation/Aivika/Dynamics/Internal/Fold.hs
+++ b/Simulation/Aivika/Dynamics/Internal/Fold.hs
@@ -89,4 +89,4 @@
 divideDynamics (Dynamics m) = 
   discrete $ Dynamics $ \p ->
   do a <- m p
-     return $ a / fromInteger (toInteger (pointIteration p + 1))
+     return $ a / fromIntegral (pointIteration p + 1)
diff --git a/Simulation/Aivika/Dynamics/Internal/Memo.hs b/Simulation/Aivika/Dynamics/Internal/Memo.hs
--- a/Simulation/Aivika/Dynamics/Internal/Memo.hs
+++ b/Simulation/Aivika/Dynamics/Internal/Memo.hs
@@ -22,7 +22,7 @@
         iterateDynamics) where
 
 import Data.Array
-import Data.Array.IO
+import Data.Array.IO.Safe
 import Data.IORef
 import Control.Monad
 
diff --git a/Simulation/Aivika/Dynamics/LIFO.hs b/Simulation/Aivika/Dynamics/LIFO.hs
--- a/Simulation/Aivika/Dynamics/LIFO.hs
+++ b/Simulation/Aivika/Dynamics/LIFO.hs
@@ -26,7 +26,7 @@
 
 import Data.IORef
 import Data.Array
-import Data.Array.IO
+import Data.Array.IO.Safe
 
 import Control.Monad
 import Control.Monad.Trans
diff --git a/Simulation/Aivika/Dynamics/SystemDynamics.hs b/Simulation/Aivika/Dynamics/SystemDynamics.hs
--- a/Simulation/Aivika/Dynamics/SystemDynamics.hs
+++ b/Simulation/Aivika/Dynamics/SystemDynamics.hs
@@ -35,7 +35,7 @@
         lookupStepwiseD) where
 
 import Data.Array
-import Data.Array.IO
+import Data.Array.IO.Safe
 import Data.IORef
 import Control.Monad
 import Control.Monad.Trans
@@ -418,7 +418,7 @@
 --           n  = parIteration p
 --       a <- d p
 --       let t' = (t - a) - spcStartTime sc
---           n' = fromInteger $ toInteger $ floor $ t' / spcDT sc
+--           n' = fromIntegral $ floor $ t' / spcDT sc
 --           y | n' < 0    = i $ p { pointTime = spcStartTime sc,
 --                                   pointIteration = 0, 
 --                                   pointPhase = 0 }
diff --git a/Simulation/Aivika/Dynamics/UVar.hs b/Simulation/Aivika/Dynamics/UVar.hs
--- a/Simulation/Aivika/Dynamics/UVar.hs
+++ b/Simulation/Aivika/Dynamics/UVar.hs
@@ -25,7 +25,7 @@
 
 import Control.Monad
 import Data.Array
-import Data.Array.IO
+import Data.Array.IO.Safe
 import Data.IORef
 
 import Simulation.Aivika.Dynamics.Internal.Simulation
diff --git a/Simulation/Aivika/Dynamics/Var.hs b/Simulation/Aivika/Dynamics/Var.hs
--- a/Simulation/Aivika/Dynamics/Var.hs
+++ b/Simulation/Aivika/Dynamics/Var.hs
@@ -22,7 +22,7 @@
         freezeVar) where
 
 import Data.Array
-import Data.Array.IO
+import Data.Array.IO.Safe
 import Data.IORef
 
 import Simulation.Aivika.Dynamics.Internal.Simulation
diff --git a/Simulation/Aivika/PriorityQueue.hs b/Simulation/Aivika/PriorityQueue.hs
--- a/Simulation/Aivika/PriorityQueue.hs
+++ b/Simulation/Aivika/PriorityQueue.hs
@@ -19,8 +19,8 @@
         queueFront) where 
 
 import Data.Array
-import Data.Array.MArray
-import Data.Array.IO
+import Data.Array.MArray.Safe
+import Data.Array.IO.Safe
 import Data.IORef
 import Control.Monad
 
diff --git a/Simulation/Aivika/Statistics.hs b/Simulation/Aivika/Statistics.hs
--- a/Simulation/Aivika/Statistics.hs
+++ b/Simulation/Aivika/Statistics.hs
@@ -31,7 +31,7 @@
   convertToDouble = id
   
 instance ConvertableToDouble Int where
-  convertToDouble = fromInteger . toInteger
+  convertToDouble = fromIntegral
 
 -- | Describes when the statistics consists of only samples 
 -- not bound to the simulation time.
@@ -98,7 +98,7 @@
           maxX   = a `seq` max a (samplingStatsMax stats)
           meanX  = k1 * x + k2 * samplingStatsMean stats
           meanX2 = k1 * x * x + k2 * samplingStatsMean2 stats
-          n      = fromInteger $ toInteger count
+          n      = fromIntegral count
           x      = convertToDouble a
           k1     = 1.0 / n
           k2     = (n - 1.0) / n
@@ -111,7 +111,7 @@
     where count  = samplingStatsCount stats
           meanX  = samplingStatsMean stats
           meanX2 = samplingStatsMean2 stats
-          n      = fromInteger $ toInteger count
+          n      = fromIntegral count
           
 -- | Return the deviation.          
 samplingStatsDeviation :: SamplingStats a -> Double
@@ -209,6 +209,7 @@
 
 addTimingStatsGeneric :: ConvertableToDouble a => Double -> a -> TimingStats a -> TimingStats a
 addTimingStatsGeneric t a stats
+  | t < t'     = error "The current time cannot be less than the previous one: addTimingStats"
   | isNaN x    = stats
   | count == 1 = TimingStats { timingStatsCount     = 1,
                                timingStatsMin       = a,
@@ -219,7 +220,6 @@
                                timingStatsLastTime  = t,
                                timingStatsSum       = 0,
                                timingStatsSum2      = 0 }
-  | t < t'     = error "The current time cannot be less than the previous one: addTimingStats"
   | otherwise  = TimingStats { timingStatsCount     = count,
                                timingStatsMin       = minX,
                                timingStatsMax       = maxX,
diff --git a/Simulation/Aivika/UVector.hs b/Simulation/Aivika/UVector.hs
--- a/Simulation/Aivika/UVector.hs
+++ b/Simulation/Aivika/UVector.hs
@@ -26,8 +26,8 @@
         freezeVector) where 
 
 import Data.Array
-import Data.Array.MArray
-import Data.Array.IO
+import Data.Array.MArray.Safe
+import Data.Array.IO.Safe
 import Data.IORef
 import Control.Monad
 
diff --git a/Simulation/Aivika/Vector.hs b/Simulation/Aivika/Vector.hs
--- a/Simulation/Aivika/Vector.hs
+++ b/Simulation/Aivika/Vector.hs
@@ -24,8 +24,8 @@
         freezeVector) where 
 
 import Data.Array
-import Data.Array.MArray
-import Data.Array.IO
+import Data.Array.MArray.Safe
+import Data.Array.IO.Safe
 import Data.IORef
 import Control.Monad
 
diff --git a/aivika.cabal b/aivika.cabal
--- a/aivika.cabal
+++ b/aivika.cabal
@@ -1,5 +1,5 @@
 name:            aivika
-version:         0.4.3
+version:         0.5
 synopsis:        A multi-paradigm simulation library
 description:
     Aivika is a small simulation library that covers many paradigms. 
@@ -29,6 +29,11 @@
     <https://github.com/dsorokin/aivika/blob/master/doc/aivika.pdf>.
     Please note that the documentation is outdated and it corresponds to 
     version 0.2 but it can still be helpful.
+    .
+    Also please look at other two my packages
+    <http://hackage.haskell.org/package/aivika-experiment> and
+    <http://hackage.haskell.org/package/aivika-experiment-chart>
+    that complement the Aivika library.
     .
 category:        Simulation
 license:         BSD3
