diff --git a/som.cabal b/som.cabal
--- a/som.cabal
+++ b/som.cabal
@@ -1,5 +1,5 @@
 Name:              som
-Version:           8.0.5
+Version:           8.0.6
 Stability:         experimental
 Synopsis:          Self-Organising Maps.
 Description:       A Kohonen Self-organising Map (SOM) maps input patterns 
@@ -33,13 +33,15 @@
 source-repository this
   type:     git
   location: https://github.com/mhwombat/som.git
-  tag:      8.0.5
+  tag:      8.0.6
 
 
 library
   hs-source-dirs:  src
-  build-depends:   base ==4.*,
+  build-depends:   assert ==0.0.*,
+                   base >=4.8 && <5,
                    containers ==0.5.*,
+                   deepseq ==1.4.*,
                    grid ==7.* && >=7.7,
                    MonadRandom ==0.4.*
   ghc-options:     -Wall
@@ -54,7 +56,8 @@
 
 test-suite som-tests
   type:            exitcode-stdio-1.0
-  build-depends:   base ==4.*,
+  build-depends:   assert ==0.0.*,
+                   base >=4.8 && <5,
                    test-framework-quickcheck2 == 0.3.*,
                    QuickCheck ==2.8.*,
                    test-framework ==0.8.*,
diff --git a/src/Data/Datamining/Clustering/DSOMInternal.hs b/src/Data/Datamining/Clustering/DSOMInternal.hs
--- a/src/Data/Datamining/Clustering/DSOMInternal.hs
+++ b/src/Data/Datamining/Clustering/DSOMInternal.hs
@@ -12,13 +12,15 @@
 --
 ------------------------------------------------------------------------
 {-# LANGUAGE TypeFamilies, FlexibleContexts, FlexibleInstances,
-    MultiParamTypeClasses #-}
+    MultiParamTypeClasses, DeriveAnyClass, DeriveGeneric #-}
 
 module Data.Datamining.Clustering.DSOMInternal where
 
+import Control.DeepSeq (NFData)
 import qualified Data.Foldable as F (Foldable, foldr)
 import Data.List (foldl', minimumBy)
 import Data.Ord (comparing)
+import GHC.Generics (Generic)
 import qualified Math.Geometry.Grid as G (Grid(..), FiniteGrid(..))
 import qualified Math.Geometry.GridMap as GM (GridMap(..))
 import Data.Datamining.Clustering.Classifier(Classifier(..))
@@ -59,7 +61,7 @@
     --   If @amount@=1, the result should be identical to the @target@.
     --   If @amount@=0, the result should be the unmodified @pattern@.
     makeSimilar :: p -> x -> p -> p
-  }
+  } deriving (Generic, NFData)
 
 instance (F.Foldable gm) => F.Foldable (DSOM gm x k) where
   foldr f x g = F.foldr f x (gridMap g)
diff --git a/src/Data/Datamining/Clustering/SOMInternal.hs b/src/Data/Datamining/Clustering/SOMInternal.hs
--- a/src/Data/Datamining/Clustering/SOMInternal.hs
+++ b/src/Data/Datamining/Clustering/SOMInternal.hs
@@ -12,10 +12,11 @@
 --
 ------------------------------------------------------------------------
 {-# LANGUAGE TypeFamilies, FlexibleContexts, FlexibleInstances,
-    MultiParamTypeClasses, DeriveGeneric #-}
+    MultiParamTypeClasses, DeriveAnyClass, DeriveGeneric #-}
 
 module Data.Datamining.Clustering.SOMInternal where
 
+import Control.DeepSeq (NFData)
 import qualified Data.Foldable as F (Foldable, foldr)
 import Data.List (foldl', minimumBy)
 import Data.Ord (comparing)
@@ -111,7 +112,7 @@
     --   directly modify it, then the counter will represent the number
     --   of patterns that this SOM has classified.
     counter :: t
-  } deriving (Generic)
+  } deriving (Generic, NFData)
 
 instance (F.Foldable gm) => F.Foldable (SOM t d gm x k) where
   foldr f x g = F.foldr f x (gridMap g)
diff --git a/src/Data/Datamining/Clustering/SSOMInternal.hs b/src/Data/Datamining/Clustering/SSOMInternal.hs
--- a/src/Data/Datamining/Clustering/SSOMInternal.hs
+++ b/src/Data/Datamining/Clustering/SSOMInternal.hs
@@ -12,10 +12,11 @@
 --
 ------------------------------------------------------------------------
 {-# LANGUAGE TypeFamilies, FlexibleContexts, FlexibleInstances,
-    MultiParamTypeClasses, DeriveGeneric #-}
+    MultiParamTypeClasses, DeriveAnyClass, DeriveGeneric #-}
 
 module Data.Datamining.Clustering.SSOMInternal where
 
+import Control.DeepSeq (NFData)
 import Data.List (foldl', minimumBy)
 import Data.Ord (comparing)
 import Data.Datamining.Clustering.Classifier(Classifier(..))
@@ -33,9 +34,6 @@
 --   * 0 < r0 < 1
 --
 --   * 0 < d
---
---   where << means "is much smaller than" (not the Haskell @<<@
---   operator!)
 exponential :: Floating a => a -> a -> a -> a
 exponential r0 d t = r0 * exp (-d*t)
 
@@ -77,7 +75,7 @@
     --   directly modify it, then the counter will represent the number
     --   of patterns that this SSOM has classified.
     counter :: t
-  } deriving (Generic)
+  } deriving (Generic, NFData)
 
 -- | Extracts the current models from the SSOM.
 --   A synonym for @'sMap'@.
diff --git a/test/Data/Datamining/Clustering/SSOMQC.hs b/test/Data/Datamining/Clustering/SSOMQC.hs
--- a/test/Data/Datamining/Clustering/SSOMQC.hs
+++ b/test/Data/Datamining/Clustering/SSOMQC.hs
@@ -23,7 +23,7 @@
   absDifference)
 import Data.Datamining.Clustering.Classifier(classify,
   classifyAndTrain, reportAndTrain, differences, diffAndTrain, models,
-  train, trainBatch)
+  train, trainBatch, numModels)
 import Data.Datamining.Clustering.SSOMInternal
 import qualified Data.Map.Strict as M
 
@@ -138,6 +138,15 @@
           s1 = trainNode s (classify s p) p
           s2 = train s p
 
+prop_train_node_only_modifies_one_model :: Int -> SSOMTestData -> Property
+prop_train_node_only_modifies_one_model n (SSOMTestData s _ ps)
+  = property $ as == as' && bs == bs'
+    where p = head ps
+          k = n `mod` (numModels s)
+          s' = trainNode s k p
+          (as, _:bs) = splitAt k (models s)
+          (as', _:bs') = splitAt k (models s')
+
 -- | The training set consists of the same vectors in the same order,
 --   several times over. So the resulting classifications should consist
 --   of the same integers in the same order, over and over.
@@ -266,6 +275,8 @@
       prop_classifyAndTrainEquiv,
     testProperty "prop_diffAndTrainEquiv" prop_diffAndTrainEquiv,
     testProperty "prop_trainNodeEquiv" prop_trainNodeEquiv,
+    testProperty "prop_train_node_only_modifies_one_model"
+      prop_train_node_only_modifies_one_model,
     testProperty "prop_batch_training_works" prop_batch_training_works,
     testProperty "prop_classification_is_consistent"
       prop_classification_is_consistent,
