diff --git a/neet.cabal b/neet.cabal
--- a/neet.cabal
+++ b/neet.cabal
@@ -2,7 +2,7 @@
 -- see http://haskell.org/cabal/users-guide/
 
 name:                neet
-version:             0.3.0.0
+version:             0.3.1.0
 synopsis:            A NEAT library for Haskell
 -- description:         
 homepage:            https://github.com/raymoo/NEET
@@ -23,7 +23,7 @@
 
 library
   exposed-modules:     Neet.Genome, Control.Monad.Fresh.Class, Neet.Parameters, Neet.Network,
-                       Neet.Species, Neet.Population, Neet.Examples.XOR, Neet
+                       Neet.Species, Neet.Population, Neet.Examples.XOR, Neet, Neet.Training
   -- other-modules:       
   other-extensions:    FunctionalDependencies, MultiParamTypeClasses
   build-depends:       base >=4.7 && <4.8, MonadRandom >=0.4 && <0.5,
diff --git a/src/Neet/Population.hs b/src/Neet/Population.hs
--- a/src/Neet/Population.hs
+++ b/src/Neet/Population.hs
@@ -394,7 +394,7 @@
               newParams :: Parameters
               newParams =
                 case specParams params of
-                 Simple _ -> newParams
+                 Simple _ -> params
                  Target dp st@SpeciesTarget{..}
                    | specCount > snd targetCount ->
                        let newDP = dp { delta_t = delta_t dp + adjustAmount }
@@ -421,6 +421,7 @@
                      , popParams = newParams
                      , nextSpec = nextSpec'
                      , popGen = popGen pop + 1
+                     , popPhase = newPhase
                      } 
 
 
diff --git a/src/Neet/Training.hs b/src/Neet/Training.hs
new file mode 100644
--- /dev/null
+++ b/src/Neet/Training.hs
@@ -0,0 +1,76 @@
+{-
+Copyright (C) 2015 Leon Medvinsky
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 3
+of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+-}
+
+{-|
+Module      : Neet.Training
+Description : Generic training abstraction
+Copyright   : (c) Leon Medvinsky, 2015
+
+License     : GPL-3
+Maintainer  : lmedvinsky@hotmail.com
+Stability   : experimental
+Portability : ghc
+-}
+
+module Neet.Training ( Training(..)
+                     , trainSingle
+                     , trainTraversable
+                     ) where
+
+import Control.Applicative
+import qualified Data.Traversable as T
+import Data.Traversable (Traversable)
+
+
+-- | Training structure. The idea is that if it is 'StillTraining', it is
+-- presenting you with something that must have its score evaluated, and
+-- a way to advance the training by providing that score. If it is 'DoneTraining',
+-- everything has been iterated through.
+data Training candidate score result =
+  StillTraining candidate (score -> Training candidate score result)
+  | DoneTraining result
+
+
+instance (Show c, Show r) => Show (Training c s r) where
+  show (DoneTraining res) = "DoneTraining " ++ show res
+  show (StillTraining c _) = "StillTraining " ++ show c ++ " <function>"
+
+
+instance Functor (Training candidate score) where
+  fmap f (DoneTraining res) = DoneTraining (f res)
+  fmap f (StillTraining cand k) = StillTraining cand ((fmap . fmap) f k)
+
+
+instance Applicative (Training candidate score) where
+  pure = DoneTraining
+  (<*>) = apTraining
+
+
+apTraining :: Training c s (r1 -> r2) -> Training c s r1 -> Training c s r2
+apTraining (DoneTraining f) tcsr1 = fmap f tcsr1
+apTraining (StillTraining cand k) tcsr1 = StillTraining cand go
+  where go score = apTraining (k score) tcsr1
+
+
+trainSingle :: a -> Training a b b
+trainSingle a = StillTraining a k
+  where k b = DoneTraining b
+
+
+trainTraversable :: Traversable t => t a -> Training a b (t b)
+trainTraversable = T.traverse trainSingle
