diff --git a/AI/SVM/Base.hs b/AI/SVM/Base.hs
--- a/AI/SVM/Base.hs
+++ b/AI/SVM/Base.hs
@@ -23,12 +23,12 @@
                   -- * Types
                    SVM
                  , SVMType(..), Kernel(..)
-		 , SVMVector(..)
+		         , SVMVector(..)
                  ,getNRClasses
                   -- * File operations
                  ,loadSVM, saveSVM
                   -- * Training
-                 ,trainSVM --, crossvalidate
+                 ,trainSVM, crossvalidate
                   -- * Prediction
                  ,predict
                  )  where
@@ -331,7 +331,6 @@
 
 -- |Cross validate SVM. This is faster than training and predicting for each fold
 --  separately, since there are no extra conversions done between libsvm and haskell.
---  Currently broken.
 crossvalidate
   :: (SVMVector b) => SVMType -> Kernel -> Int -> [(Double, b)] -> IO (String, [Double])
 crossvalidate svm kernel folds (map (second convert) -> dataSet) = do
diff --git a/AI/SVM/Simple.hs b/AI/SVM/Simple.hs
--- a/AI/SVM/Simple.hs
+++ b/AI/SVM/Simple.hs
@@ -39,11 +39,11 @@
                  ,Kernel(..)
                  ,SVMOneClass(), SVMClassifier(), SVMRegressor()
 		 -- * Classifier machines
-                 ,trainClassifier, classify   
+                 ,trainClassifier, crossvalidateClassifier, classify   
 		 -- * One class machines
                  ,trainOneClass, inSet, OneClassResult(..)
 		 -- * Regression machines
-                 ,trainRegressor, predictRegression
+                 ,trainRegressor, crossvalidateRegressor, predictRegression
          -- * Unfortunate utilities
                  ,Persisting(..)
                  )  where
@@ -127,15 +127,25 @@
      -> Kernel
      -> [(a, b)]
      -> (String, SVMClassifier a)
-
 trainClassifier ctype kernel dataset = unsafePerformIO $ do
-    let l = zip (nub . labels $ dataset) [1..]
+    let (to,from, doubleDataSet) = convertToDouble dataset 
+    (m,svm) <- trainSVM (generalizeClassifier ctype) kernel doubleDataSet
+    return . (m,) $ SVMClassifier svm to from
+
+convertToDouble dataset = let 
+        l = zip (nub . map fst $ dataset) [1..]
         to   = Map.fromList l
         from = Map.fromList $ map swap l
-        doubleDataSet =  map ((\x -> to Map.! x) *** convert) dataset    
+        in  (to,from, map ((to Map.!) *** convert) dataset)    
 
-    (m,svm) <- trainSVM (generalizeClassifier ctype) kernel doubleDataSet
-    return . (m,) $ SVMClassifier svm to from
+-- | Perform n-foldl cross validation for given set of SVM parameters
+crossvalidateClassifier :: (SVMVector b, Ord a) =>
+     ClassifierType -> Kernel -> Int -> [(a, b)] 
+     -> (String, [a])
+crossvalidateClassifier ctype kernel folds dataset = unsafePerformIO $ do
+    let (to,from, doubleDataSet) = convertToDouble dataset 
+    (m,res :: [Double]) <- crossvalidate (generalizeClassifier ctype) kernel folds doubleDataSet
+    return . (m,) $ map (from Map.!) res
    where 
     labels = map fst
 
@@ -148,7 +158,6 @@
 trainOneClass :: SVMVector a => Double -> Kernel -> [a] -> (String, SVMOneClass)
 trainOneClass nu kernel dataset = unsafePerformIO $ do
     let  doubleDataSet =  map (const 1 &&& convert) dataset    
-
     (m,svm) <- trainSVM (ONE_CLASS nu) kernel doubleDataSet
     return . (m,) $ SVMOneClass svm
 
@@ -171,6 +180,11 @@
     let  doubleDataSet =  map (second convert) dataset    
     (m,svm) <- trainSVM (generalizeRegressor rtype) kernel doubleDataSet
     return . (m,) $ SVMRegressor svm
+
+crossvalidateRegressor rtype kernel folds dataset = unsafePerformIO $ do
+    let  doubleDataSet =  map (second convert) dataset    
+    (m,res) <- crossvalidate (generalizeRegressor rtype) kernel folds doubleDataSet
+    return (m,res)
 
 -- | Predict value for given vector via regression
 predictRegression :: SVMVector a => SVMRegressor -> a -> Double
diff --git a/svm-simple.cabal b/svm-simple.cabal
--- a/svm-simple.cabal
+++ b/svm-simple.cabal
@@ -1,11 +1,15 @@
 name:                svm-simple
-version:             0.2.2
+version:             0.2.5
 synopsis:            Medium level, simplified, bindings to libsvm
 description:
   This is a set of simplified bindings to libsvm <http://www.csie.ntu.edu.tw/~cjlin/libsvm/> suite
   of support vector machines. This package provides tools for classification, one-class classification
   and support vector regression. 
   .
+  .
+  Changes in version 0.2.5
+  .
+  * Crossvalidation for the high level interface 
   .
   Changes in version 0.2.2
   .
