diff --git a/bob/learn/em/MAP_gmm_trainer.cpp b/bob/learn/em/MAP_gmm_trainer.cpp
index 570ed8dd7d57a52c250f7187a09b99ec2469241e..2cac1daac76149755d7089cdbeb2da2a5f831335 100644
--- a/bob/learn/em/MAP_gmm_trainer.cpp
+++ b/bob/learn/em/MAP_gmm_trainer.cpp
@@ -263,7 +263,7 @@ static PyObject* PyBobLearnEMMAPGMMTrainer_initialize(PyBobLearnEMMAPGMMTrainerO
 
   if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!", kwlist, &PyBobLearnEMGMMMachine_Type, &gmm_machine)){
     PyErr_Format(PyExc_RuntimeError, "%s.%s. Was not possible to read :py:class:`bob.learn.em.GMMMachine`", Py_TYPE(self)->tp_name, initialize.name());
-    Py_RETURN_NONE;
+    return 0;
   }
   self->cxx->initialize(*gmm_machine->cxx);
   BOB_CATCH_MEMBER("cannot perform the initialize method", 0)
@@ -296,7 +296,7 @@ static PyObject* PyBobLearnEMMAPGMMTrainer_eStep(PyBobLearnEMMAPGMMTrainerObject
   PyBobLearnEMGMMMachineObject* gmm_machine;
   PyBlitzArrayObject* data = 0;
   if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!O&", kwlist, &PyBobLearnEMGMMMachine_Type, &gmm_machine,
-                                                                 &PyBlitzArray_Converter, &data)) Py_RETURN_NONE;
+                                                                 &PyBlitzArray_Converter, &data)) return 0;
   auto data_ = make_safe(data);
 
   self->cxx->eStep(*gmm_machine->cxx, *PyBlitzArrayCxx_AsBlitz<double,2>(data));
@@ -327,7 +327,7 @@ static PyObject* PyBobLearnEMMAPGMMTrainer_mStep(PyBobLearnEMMAPGMMTrainerObject
 
   PyBobLearnEMGMMMachineObject* gmm_machine;
   
-  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!", kwlist, &PyBobLearnEMGMMMachine_Type, &gmm_machine)) Py_RETURN_NONE;
+  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!", kwlist, &PyBobLearnEMGMMMachine_Type, &gmm_machine)) return 0;
 
   self->cxx->mStep(*gmm_machine->cxx);
 
@@ -353,7 +353,7 @@ static PyObject* PyBobLearnEMMAPGMMTrainer_compute_likelihood(PyBobLearnEMMAPGMM
   char** kwlist = compute_likelihood.kwlist(0);
 
   PyBobLearnEMGMMMachineObject* gmm_machine;
-  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!", kwlist, &PyBobLearnEMGMMMachine_Type, &gmm_machine)) Py_RETURN_NONE;
+  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!", kwlist, &PyBobLearnEMGMMMachine_Type, &gmm_machine)) return 0;
 
   double value = self->cxx->computeLikelihood(*gmm_machine->cxx);
   return Py_BuildValue("d", value);
diff --git a/bob/learn/em/ML_gmm_trainer.cpp b/bob/learn/em/ML_gmm_trainer.cpp
index 51d6ce315462fef115b8568051326ef420f953cd..e9d99550c936613971b8a3f5ab754207acb4ef34 100644
--- a/bob/learn/em/ML_gmm_trainer.cpp
+++ b/bob/learn/em/ML_gmm_trainer.cpp
@@ -168,7 +168,7 @@ static PyObject* PyBobLearnEMMLGMMTrainer_initialize(PyBobLearnEMMLGMMTrainerObj
 
   if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!", kwlist, &PyBobLearnEMGMMMachine_Type, &gmm_machine)){
     PyErr_Format(PyExc_RuntimeError, "%s.%s. Was not possible to read :py:class:`bob.learn.em.GMMMachine`", Py_TYPE(self)->tp_name, initialize.name());
-    Py_RETURN_NONE;
+    return 0;
   }
   self->cxx->initialize(*gmm_machine->cxx);
   BOB_CATCH_MEMBER("cannot perform the initialize method", 0)
@@ -201,7 +201,7 @@ static PyObject* PyBobLearnEMMLGMMTrainer_eStep(PyBobLearnEMMLGMMTrainerObject*
   PyBobLearnEMGMMMachineObject* gmm_machine;
   PyBlitzArrayObject* data = 0;
   if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!O&", kwlist, &PyBobLearnEMGMMMachine_Type, &gmm_machine,
-                                                                 &PyBlitzArray_Converter, &data)) Py_RETURN_NONE;
+                                                                 &PyBlitzArray_Converter, &data)) return 0;
   auto data_ = make_safe(data);
 
   self->cxx->eStep(*gmm_machine->cxx, *PyBlitzArrayCxx_AsBlitz<double,2>(data));
@@ -232,7 +232,7 @@ static PyObject* PyBobLearnEMMLGMMTrainer_mStep(PyBobLearnEMMLGMMTrainerObject*
 
   PyBobLearnEMGMMMachineObject* gmm_machine;
   
-  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!", kwlist, &PyBobLearnEMGMMMachine_Type, &gmm_machine)) Py_RETURN_NONE;
+  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!", kwlist, &PyBobLearnEMGMMMachine_Type, &gmm_machine)) return 0;
 
   self->cxx->mStep(*gmm_machine->cxx);
 
@@ -258,7 +258,7 @@ static PyObject* PyBobLearnEMMLGMMTrainer_compute_likelihood(PyBobLearnEMMLGMMTr
   char** kwlist = compute_likelihood.kwlist(0);
 
   PyBobLearnEMGMMMachineObject* gmm_machine;
-  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!", kwlist, &PyBobLearnEMGMMMachine_Type, &gmm_machine)) Py_RETURN_NONE;
+  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!", kwlist, &PyBobLearnEMGMMMachine_Type, &gmm_machine)) return 0;
 
   double value = self->cxx->computeLikelihood(*gmm_machine->cxx);
   return Py_BuildValue("d", value);
diff --git a/bob/learn/em/__ivector_trainer__.py b/bob/learn/em/__ivector_trainer__.py
index b31e0ed8c431deccdd8610faaf45cd5252786766..579a1d8b1c282765d0e8f4531440f3af06763983 100644
--- a/bob/learn/em/__ivector_trainer__.py
+++ b/bob/learn/em/__ivector_trainer__.py
@@ -37,7 +37,7 @@ class IVectorTrainer (_IVectorTrainer):
     """
 
     #Initialization
-    self.initialize(ivector_machine, data);
+    self.initialize(ivector_machine);
       
     for i in range(self._max_iterations):
       #eStep
diff --git a/bob/learn/em/empca_trainer.cpp b/bob/learn/em/empca_trainer.cpp
index 127a1d78add2e4214b68c0b8e02ae3794863c83c..0a2653b8c622297c444ad01e12a80f84bfd25074 100644
--- a/bob/learn/em/empca_trainer.cpp
+++ b/bob/learn/em/empca_trainer.cpp
@@ -212,7 +212,7 @@ static PyObject* PyBobLearnEMEMPCATrainer_initialize(PyBobLearnEMEMPCATrainerObj
   PyBlitzArrayObject* data                          = 0;
 
   if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!O&", kwlist, &PyBobLearnLinearMachine_Type, &linear_machine,
-                                                                 &PyBlitzArray_Converter, &data)) Py_RETURN_NONE;
+                                                                 &PyBlitzArray_Converter, &data)) return 0;
   auto data_ = make_safe(data);
 
   self->cxx->initialize(*linear_machine->cxx, *PyBlitzArrayCxx_AsBlitz<double,2>(data));
@@ -242,7 +242,7 @@ static PyObject* PyBobLearnEMEMPCATrainer_eStep(PyBobLearnEMEMPCATrainerObject*
   PyBobLearnLinearMachineObject* linear_machine;
   PyBlitzArrayObject* data = 0;
   if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!O&", kwlist, &PyBobLearnLinearMachine_Type, &linear_machine,
-                                                                 &PyBlitzArray_Converter, &data)) Py_RETURN_NONE;
+                                                                 &PyBlitzArray_Converter, &data)) return 0;
   auto data_ = make_safe(data);
 
   self->cxx->eStep(*linear_machine->cxx, *PyBlitzArrayCxx_AsBlitz<double,2>(data));
@@ -273,7 +273,7 @@ static PyObject* PyBobLearnEMEMPCATrainer_mStep(PyBobLearnEMEMPCATrainerObject*
   PyBobLearnLinearMachineObject* linear_machine;
   PyBlitzArrayObject* data = 0;
   if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!O&", kwlist, &PyBobLearnLinearMachine_Type, &linear_machine,
-                                                                 &PyBlitzArray_Converter, &data)) Py_RETURN_NONE;
+                                                                 &PyBlitzArray_Converter, &data)) return 0;
   auto data_ = make_safe(data);
 
   self->cxx->mStep(*linear_machine->cxx, *PyBlitzArrayCxx_AsBlitz<double,2>(data));
@@ -301,7 +301,7 @@ static PyObject* PyBobLearnEMEMPCATrainer_compute_likelihood(PyBobLearnEMEMPCATr
   char** kwlist = compute_likelihood.kwlist(0);
 
   PyBobLearnLinearMachineObject* linear_machine;
-  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!", kwlist, &PyBobLearnLinearMachine_Type, &linear_machine)) Py_RETURN_NONE;
+  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!", kwlist, &PyBobLearnLinearMachine_Type, &linear_machine)) return 0;
 
   double value = self->cxx->computeLikelihood(*linear_machine->cxx);
   return Py_BuildValue("d", value);
diff --git a/bob/learn/em/gaussian.cpp b/bob/learn/em/gaussian.cpp
index 86f49301c1121e8afcba2983028897924b676a2e..267c656f00334cc88178be173da4d080a35cc787 100644
--- a/bob/learn/em/gaussian.cpp
+++ b/bob/learn/em/gaussian.cpp
@@ -315,11 +315,11 @@ static PyObject* PyBobLearnEMGaussian_resize(PyBobLearnEMGaussianObject* self, P
   char** kwlist = resize.kwlist(0);
 
   int input = 0;
-  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i", kwlist, &input)) Py_RETURN_NONE;
+  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i", kwlist, &input)) return 0;
   if (input <= 0){
     PyErr_Format(PyExc_TypeError, "input must be greater than zero");
     resize.print_usage();
-    Py_RETURN_NONE;
+    return 0;
   }
   self->cxx->setNInputs(input);
 
@@ -345,7 +345,7 @@ static PyObject* PyBobLearnEMGaussian_loglikelihood(PyBobLearnEMGaussianObject*
 
   PyBlitzArrayObject* input = 0;
 
-  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&", kwlist, &PyBlitzArray_Converter, &input)) Py_RETURN_NONE;
+  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&", kwlist, &PyBlitzArray_Converter, &input)) return 0;
   //protects acquired resources through this scope
   auto input_ = make_safe(input);
 
@@ -369,7 +369,7 @@ static PyObject* PyBobLearnEMGaussian_loglikelihood_(PyBobLearnEMGaussianObject*
   char** kwlist = log_likelihood_.kwlist(0);
 
   PyBlitzArrayObject* input = 0;
-  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&", kwlist, &PyBlitzArray_Converter, &input)) Py_RETURN_NONE;
+  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&", kwlist, &PyBlitzArray_Converter, &input)) return 0;
   //protects acquired resources through this scope
   auto input_ = make_safe(input);
 
diff --git a/bob/learn/em/gmm_machine.cpp b/bob/learn/em/gmm_machine.cpp
index 8e17e1ea2990ddf98c1746197ceec4a6b92cfa4b..fc27dec08edc6bab49dfaa134864cc3ae9551ad8 100644
--- a/bob/learn/em/gmm_machine.cpp
+++ b/bob/learn/em/gmm_machine.cpp
@@ -553,7 +553,7 @@ static PyObject* PyBobLearnEMGMMMachine_loglikelihood(PyBobLearnEMGMMMachineObje
 
   PyBlitzArrayObject* input = 0;
 
-  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&", kwlist, &PyBlitzArray_Converter, &input)) Py_RETURN_NONE;
+  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&", kwlist, &PyBlitzArray_Converter, &input)) return 0;
   //protects acquired resources through this scope
   auto input_ = make_safe(input);
 
@@ -581,7 +581,7 @@ static PyObject* PyBobLearnEMGMMMachine_loglikelihood_(PyBobLearnEMGMMMachineObj
 
   PyBlitzArrayObject* input = 0;
 
-  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&", kwlist, &PyBlitzArray_Converter, &input)) Py_RETURN_NONE;
+  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&", kwlist, &PyBlitzArray_Converter, &input)) return 0;
   //protects acquired resources through this scope
   auto input_ = make_safe(input);
 
@@ -612,11 +612,17 @@ static PyObject* PyBobLearnEMGMMMachine_accStatistics(PyBobLearnEMGMMMachineObje
 
   if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&O!", kwlist, &PyBlitzArray_Converter,&input, 
                                                                  &PyBobLearnEMGMMStats_Type, &stats))
-    Py_RETURN_NONE;
+    return 0;
 
   //protects acquired resources through this scope
   auto input_ = make_safe(input);
-  self->cxx->accStatistics(*PyBlitzArrayCxx_AsBlitz<double,2>(input), *stats->cxx);
+  
+  blitz::Array<double,2>  blitz_test  = *PyBlitzArrayCxx_AsBlitz<double,2>(input);
+  if (blitz_test.extent(1)==0)
+    self->cxx->accStatistics(*PyBlitzArrayCxx_AsBlitz<double,1>(input), *stats->cxx);
+  else
+    self->cxx->accStatistics(blitz_test, *stats->cxx);  
+
 
   BOB_CATCH_MEMBER("cannot accumulate the statistics", 0)
   Py_RETURN_NONE;
@@ -641,15 +647,18 @@ static PyObject* PyBobLearnEMGMMMachine_accStatistics_(PyBobLearnEMGMMMachineObj
   PyBlitzArrayObject* input = 0;
   PyBobLearnEMGMMStatsObject* stats = 0;
 
-
-
  if(!PyArg_ParseTupleAndKeywords(args, kwargs, "O&O!", kwlist, &PyBlitzArray_Converter,&input, 
                                                                  &PyBobLearnEMGMMStats_Type, &stats))
-    Py_RETURN_NONE;
+    return 0;
 
   //protects acquired resources through this scope
   auto input_ = make_safe(input);
-  self->cxx->accStatistics_(*PyBlitzArrayCxx_AsBlitz<double,2>(input), *stats->cxx);
+  
+  blitz::Array<double,2>  blitz_test  = *PyBlitzArrayCxx_AsBlitz<double,2>(input);
+  if (blitz_test.extent(1)==0)
+    self->cxx->accStatistics_(*PyBlitzArrayCxx_AsBlitz<double,1>(input), *stats->cxx);
+  else
+    self->cxx->accStatistics_(blitz_test, *stats->cxx);  
 
   BOB_CATCH_MEMBER("cannot accumulate the statistics", 0)
   Py_RETURN_NONE;
@@ -685,7 +694,6 @@ static PyObject* PyBobLearnEMGMMMachine_setVarianceThresholds_method(PyBobLearnE
     return 0;
 
 
-
   BOB_CATCH_MEMBER("cannot accumulate set the variance threshold", 0)
   Py_RETURN_NONE;
 }
@@ -710,7 +718,7 @@ static PyObject* PyBobLearnEMGMMMachine_get_gaussian(PyBobLearnEMGMMMachineObjec
 
   int i = 0;
 
-  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i", kwlist, &i)) Py_RETURN_NONE;
+  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i", kwlist, &i)) return 0;
  
   boost::shared_ptr<bob::learn::em::Gaussian> gaussian = self->cxx->getGaussian(i);
 
diff --git a/bob/learn/em/gmm_stats.cpp b/bob/learn/em/gmm_stats.cpp
index a02a3876de987af09d3891e9a4df284bbc2efb33..b6afe2d5a0f7538a75c46e7d6262654e60abab92 100644
--- a/bob/learn/em/gmm_stats.cpp
+++ b/bob/learn/em/gmm_stats.cpp
@@ -482,7 +482,7 @@ static PyObject* PyBobLearnEMGMMStats_resize(PyBobLearnEMGMMStatsObject* self, P
   int n_gaussians = 0;
   int n_inputs = 0;
 
-  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "ii", kwlist, &n_gaussians, &n_inputs)) Py_RETURN_NONE;
+  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "ii", kwlist, &n_gaussians, &n_inputs)) return 0;
 
   if (n_gaussians <= 0){
     PyErr_Format(PyExc_TypeError, "n_gaussians must be greater than zero");
diff --git a/bob/learn/em/isv_base.cpp b/bob/learn/em/isv_base.cpp
index 6ff95102ad3db925e34709aeec6ba830db45c8ca..185463bede107b53ba368372b84dce8df00fe3eb 100644
--- a/bob/learn/em/isv_base.cpp
+++ b/bob/learn/em/isv_base.cpp
@@ -442,7 +442,7 @@ static PyObject* PyBobLearnEMISVBase_resize(PyBobLearnEMISVBaseObject* self, PyO
 
   int rU = 0;
 
-  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i", kwlist, &rU)) Py_RETURN_NONE;
+  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i", kwlist, &rU)) return 0;
 
   if (rU <= 0){
     PyErr_Format(PyExc_TypeError, "rU must be greater than zero");
diff --git a/bob/learn/em/isv_machine.cpp b/bob/learn/em/isv_machine.cpp
index a7772c30818ed79a258ed41d1f483294e7b285c8..bd74344d6fd25b227939edf864e8fbd30d783f6f 100644
--- a/bob/learn/em/isv_machine.cpp
+++ b/bob/learn/em/isv_machine.cpp
@@ -420,7 +420,7 @@ static PyObject* PyBobLearnEMISVMachine_estimateX(PyBobLearnEMISVMachineObject*
 
   if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!O&", kwlist, &PyBobLearnEMGMMStats_Type, &stats, 
                                                                  &PyBlitzArray_Converter,&input))
-    Py_RETURN_NONE;
+    return 0;
 
   //protects acquired resources through this scope
   auto input_ = make_safe(input);
@@ -451,7 +451,7 @@ static PyObject* PyBobLearnEMISVMachine_estimateUx(PyBobLearnEMISVMachineObject*
 
   if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!O&", kwlist, &PyBobLearnEMGMMStats_Type, &stats, 
                                                                  &PyBlitzArray_Converter,&input))
-    Py_RETURN_NONE;
+    return 0;
 
   //protects acquired resources through this scope
   auto input_ = make_safe(input);
@@ -482,7 +482,7 @@ static PyObject* PyBobLearnEMISVMachine_ForwardUx(PyBobLearnEMISVMachineObject*
 
   if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!O&", kwlist, &PyBobLearnEMGMMStats_Type, &stats, 
                                                                  &PyBlitzArray_Converter,&ux_input))
-    Py_RETURN_NONE;
+    return 0;
 
   //protects acquired resources through this scope
   auto ux_input_ = make_safe(ux_input);
@@ -510,7 +510,7 @@ static PyObject* PyBobLearnEMISVMachine_Forward(PyBobLearnEMISVMachineObject* se
   PyBobLearnEMGMMStatsObject* stats = 0;
   
   if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!", kwlist, &PyBobLearnEMGMMStats_Type, &stats))
-    Py_RETURN_NONE;
+    return 0;
 
   //protects acquired resources through this scope
   double score = self->cxx->forward(*stats->cxx);
diff --git a/bob/learn/em/isv_trainer.cpp b/bob/learn/em/isv_trainer.cpp
index fd4d201db7e438f62e2d82388627aebd10d71492..44f294b65b7bce799fcb885af231efe79fc97049 100644
--- a/bob/learn/em/isv_trainer.cpp
+++ b/bob/learn/em/isv_trainer.cpp
@@ -391,7 +391,7 @@ static PyObject* PyBobLearnEMISVTrainer_initialize(PyBobLearnEMISVTrainerObject*
   PyObject* stats = 0;
 
   if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!O!", kwlist, &PyBobLearnEMISVBase_Type, &isv_base,
-                                                                 &PyList_Type, &stats)) Py_RETURN_NONE;
+                                                                 &PyList_Type, &stats)) return 0;
 
   std::vector<std::vector<boost::shared_ptr<bob::learn::em::GMMStats> > > training_data;
   if(extract_GMMStats_2d(stats ,training_data)==0)
@@ -405,7 +405,7 @@ static PyObject* PyBobLearnEMISVTrainer_initialize(PyBobLearnEMISVTrainerObject*
 
 /*** e_step ***/
 static auto e_step = bob::extension::FunctionDoc(
-  "e_step",
+  "eStep",
   "Call the e-step procedure (for the U subspace).",
   "",
   true
@@ -423,7 +423,7 @@ static PyObject* PyBobLearnEMISVTrainer_e_step(PyBobLearnEMISVTrainerObject* sel
   PyObject* stats = 0;
 
   if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!O!", kwlist, &PyBobLearnEMISVBase_Type, &isv_base,
-                                                                 &PyList_Type, &stats)) Py_RETURN_NONE;
+                                                                 &PyList_Type, &stats)) return 0;
 
   std::vector<std::vector<boost::shared_ptr<bob::learn::em::GMMStats> > > training_data;
   if(extract_GMMStats_2d(stats ,training_data)==0)
@@ -437,7 +437,7 @@ static PyObject* PyBobLearnEMISVTrainer_e_step(PyBobLearnEMISVTrainerObject* sel
 
 /*** m_step ***/
 static auto m_step = bob::extension::FunctionDoc(
-  "m_step",
+  "mStep",
   "Call the m-step procedure (for the U subspace).",
   "",
   true
@@ -486,7 +486,7 @@ static PyObject* PyBobLearnEMISVTrainer_enrol(PyBobLearnEMISVTrainerObject* self
 
 
   if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!O!i", kwlist, &PyBobLearnEMISVMachine_Type, &isv_machine,
-                                                                  &PyList_Type, &stats, &n_iter)) Py_RETURN_NONE;
+                                                                  &PyList_Type, &stats, &n_iter)) return 0;
 
   std::vector<boost::shared_ptr<bob::learn::em::GMMStats> > training_data;
   if(extract_GMMStats_1d(stats ,training_data)==0)
diff --git a/bob/learn/em/ivector_machine.cpp b/bob/learn/em/ivector_machine.cpp
index 504ab1510ca23db398937eb80ad935f95726f4c2..607a449dc4fd613b01e0d8497d7f7651a0a1807e 100644
--- a/bob/learn/em/ivector_machine.cpp
+++ b/bob/learn/em/ivector_machine.cpp
@@ -484,7 +484,7 @@ static PyObject* PyBobLearnEMIVectorMachine_Forward(PyBobLearnEMIVectorMachineOb
   PyBobLearnEMGMMStatsObject* stats = 0;
   
   if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!", kwlist, &PyBobLearnEMGMMStats_Type, &stats))
-    Py_RETURN_NONE;
+    return 0;
 
    blitz::Array<double,1> ivector(self->cxx->getDimRt());
    self->cxx->forward(*stats->cxx, ivector);
@@ -512,7 +512,7 @@ static PyObject* PyBobLearnEMIVectorMachine_resize(PyBobLearnEMIVectorMachineObj
 
   int rT = 0;
 
-  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i", kwlist, &rT)) Py_RETURN_NONE;
+  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i", kwlist, &rT)) return 0;
 
   if (rT < 1){
     PyErr_Format(PyExc_TypeError, "rU must be greater than one");
@@ -545,7 +545,7 @@ static PyObject* PyBobLearnEMIVectorMachine_compute_Id_TtSigmaInvT__(PyBobLearnE
   PyBobLearnEMGMMStatsObject* stats = 0;
   
   if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!", kwlist, &PyBobLearnEMGMMStats_Type, &stats))
-    Py_RETURN_NONE;
+    return 0;
 
 
   blitz::Array<double,2> output(self->cxx->getDimRt(), self->cxx->getDimRt());
@@ -574,7 +574,7 @@ static PyObject* PyBobLearnEMIVectorMachine_compute_TtSigmaInvFnorm__(PyBobLearn
   PyBobLearnEMGMMStatsObject* stats = 0;
   
   if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!", kwlist, &PyBobLearnEMGMMStats_Type, &stats))
-    Py_RETURN_NONE;
+    return 0;
 
 
   blitz::Array<double,1> output(self->cxx->getDimRt());
diff --git a/bob/learn/em/ivector_trainer.cpp b/bob/learn/em/ivector_trainer.cpp
index da2773eefc8e33abba6392c2c7a888da8f9fa773..72bced8c369da9ed83678c799f973baa3496d8ed 100644
--- a/bob/learn/em/ivector_trainer.cpp
+++ b/bob/learn/em/ivector_trainer.cpp
@@ -323,7 +323,7 @@ static PyObject* PyBobLearnEMIVectorTrainer_initialize(PyBobLearnEMIVectorTraine
 
   PyBobLearnEMIVectorMachineObject* ivector_machine = 0;
 
-  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!", kwlist, &PyBobLearnEMIVectorMachine_Type, &ivector_machine)) Py_RETURN_NONE;
+  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!", kwlist, &PyBobLearnEMIVectorMachine_Type, &ivector_machine)) return 0;
 
   self->cxx->initialize(*ivector_machine->cxx);
 
@@ -335,7 +335,7 @@ static PyObject* PyBobLearnEMIVectorTrainer_initialize(PyBobLearnEMIVectorTraine
 
 /*** e_step ***/
 static auto e_step = bob::extension::FunctionDoc(
-  "e_step",
+  "eStep",
   "Call the e-step procedure (for the U subspace).",
   "",
   true
@@ -353,7 +353,7 @@ static PyObject* PyBobLearnEMIVectorTrainer_e_step(PyBobLearnEMIVectorTrainerObj
   PyObject* stats = 0;
 
   if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!O!", kwlist, &PyBobLearnEMIVectorMachine_Type, &ivector_machine,
-                                                                 &PyList_Type, &stats)) Py_RETURN_NONE;
+                                                                 &PyList_Type, &stats)) return 0;
 
   std::vector<bob::learn::em::GMMStats> training_data;
   if(extract_GMMStats_1d(stats ,training_data)==0)
@@ -366,7 +366,7 @@ static PyObject* PyBobLearnEMIVectorTrainer_e_step(PyBobLearnEMIVectorTrainerObj
 
 /*** m_step ***/
 static auto m_step = bob::extension::FunctionDoc(
-  "m_step",
+  "mStep",
   "Call the m-step procedure (for the U subspace).",
   "",
   true
@@ -381,7 +381,7 @@ static PyObject* PyBobLearnEMIVectorTrainer_m_step(PyBobLearnEMIVectorTrainerObj
 
   PyBobLearnEMIVectorMachineObject* ivector_machine = 0;
 
-  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!", kwlist, &PyBobLearnEMIVectorMachine_Type, &ivector_machine)) Py_RETURN_NONE;
+  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!", kwlist, &PyBobLearnEMIVectorMachine_Type, &ivector_machine)) return 0;
 
   self->cxx->mStep(*ivector_machine->cxx);
 
diff --git a/bob/learn/em/jfa_base.cpp b/bob/learn/em/jfa_base.cpp
index 54eaa78230e5420dc9e253edfc19d12b7deb95c0..d4fd23b3141ff05b8f846110c1cf87f442da8a91 100644
--- a/bob/learn/em/jfa_base.cpp
+++ b/bob/learn/em/jfa_base.cpp
@@ -488,7 +488,7 @@ static PyObject* PyBobLearnEMJFABase_resize(PyBobLearnEMJFABaseObject* self, PyO
   int rU = 0;
   int rV = 0;
 
-  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "ii", kwlist, &rU, &rV)) Py_RETURN_NONE;
+  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "ii", kwlist, &rU, &rV)) return 0;
 
   if (rU <= 0){
     PyErr_Format(PyExc_TypeError, "rU must be greater than zero");
diff --git a/bob/learn/em/jfa_machine.cpp b/bob/learn/em/jfa_machine.cpp
index 48ffe3a9a44e58e73db6c95d635cb0caade0cafc..2567a956beed58b1699ad6215cec92444d93343f 100644
--- a/bob/learn/em/jfa_machine.cpp
+++ b/bob/learn/em/jfa_machine.cpp
@@ -457,7 +457,7 @@ static PyObject* PyBobLearnEMJFAMachine_estimateX(PyBobLearnEMJFAMachineObject*
 
   if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!O&", kwlist, &PyBobLearnEMGMMStats_Type, &stats, 
                                                                  &PyBlitzArray_Converter,&input))
-    Py_RETURN_NONE;
+    return 0;
 
   //protects acquired resources through this scope
   auto input_ = make_safe(input);
@@ -488,7 +488,7 @@ static PyObject* PyBobLearnEMJFAMachine_estimateUx(PyBobLearnEMJFAMachineObject*
 
   if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!O&", kwlist, &PyBobLearnEMGMMStats_Type, &stats, 
                                                                  &PyBlitzArray_Converter,&input))
-    Py_RETURN_NONE;
+    return 0;
 
   //protects acquired resources through this scope
   auto input_ = make_safe(input);
@@ -519,7 +519,7 @@ static PyObject* PyBobLearnEMJFAMachine_ForwardUx(PyBobLearnEMJFAMachineObject*
 
   if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!O&", kwlist, &PyBobLearnEMGMMStats_Type, &stats, 
                                                                  &PyBlitzArray_Converter,&ux_input))
-    Py_RETURN_NONE;
+    return 0;
 
   //protects acquired resources through this scope
   auto ux_input_ = make_safe(ux_input);
@@ -548,7 +548,7 @@ static PyObject* PyBobLearnEMJFAMachine_Forward(PyBobLearnEMJFAMachineObject* se
   PyBobLearnEMGMMStatsObject* stats = 0;
   
   if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!", kwlist, &PyBobLearnEMGMMStats_Type, &stats))
-    Py_RETURN_NONE;
+    return 0;
 
   //protects acquired resources through this scope
   double score = self->cxx->forward(*stats->cxx);
diff --git a/bob/learn/em/jfa_trainer.cpp b/bob/learn/em/jfa_trainer.cpp
index ffe4147908341613d1ff52bb19de64233e96fdd7..edcc8ecfe58dcfa934d1b8078c94969fef5a8a78 100644
--- a/bob/learn/em/jfa_trainer.cpp
+++ b/bob/learn/em/jfa_trainer.cpp
@@ -567,7 +567,7 @@ static PyObject* PyBobLearnEMJFATrainer_initialize(PyBobLearnEMJFATrainerObject*
   PyObject* stats = 0;
 
   if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!O!", kwlist, &PyBobLearnEMJFABase_Type, &jfa_base,
-                                                                 &PyList_Type, &stats)) Py_RETURN_NONE;
+                                                                 &PyList_Type, &stats)) return 0;
 
   std::vector<std::vector<boost::shared_ptr<bob::learn::em::GMMStats> > > training_data;
   if(extract_GMMStats_2d(stats ,training_data)==0)
@@ -599,7 +599,7 @@ static PyObject* PyBobLearnEMJFATrainer_e_step1(PyBobLearnEMJFATrainerObject* se
   PyObject* stats = 0;
 
   if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!O!", kwlist, &PyBobLearnEMJFABase_Type, &jfa_base,
-                                                                 &PyList_Type, &stats)) Py_RETURN_NONE;
+                                                                 &PyList_Type, &stats)) return 0;
 
   std::vector<std::vector<boost::shared_ptr<bob::learn::em::GMMStats> > > training_data;
   if(extract_GMMStats_2d(stats ,training_data)==0)
@@ -632,7 +632,7 @@ static PyObject* PyBobLearnEMJFATrainer_m_step1(PyBobLearnEMJFATrainerObject* se
   PyObject* stats = 0;
 
   if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!O!", kwlist, &PyBobLearnEMJFABase_Type, &jfa_base,
-                                                                 &PyList_Type, &stats)) Py_RETURN_NONE;
+                                                                 &PyList_Type, &stats)) return 0;
 
   std::vector<std::vector<boost::shared_ptr<bob::learn::em::GMMStats> > > training_data;
   if(extract_GMMStats_2d(stats ,training_data)==0)
@@ -664,7 +664,7 @@ static PyObject* PyBobLearnEMJFATrainer_finalize1(PyBobLearnEMJFATrainerObject*
   PyObject* stats = 0;
 
   if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!O!", kwlist, &PyBobLearnEMJFABase_Type, &jfa_base,
-                                                                 &PyList_Type, &stats)) Py_RETURN_NONE;
+                                                                 &PyList_Type, &stats)) return 0;
 
   std::vector<std::vector<boost::shared_ptr<bob::learn::em::GMMStats> > > training_data;
   if(extract_GMMStats_2d(stats ,training_data)==0)
@@ -696,7 +696,7 @@ static PyObject* PyBobLearnEMJFATrainer_e_step2(PyBobLearnEMJFATrainerObject* se
   PyObject* stats = 0;
 
   if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!O!", kwlist, &PyBobLearnEMJFABase_Type, &jfa_base,
-                                                                 &PyList_Type, &stats)) Py_RETURN_NONE;
+                                                                 &PyList_Type, &stats)) return 0;
 
   std::vector<std::vector<boost::shared_ptr<bob::learn::em::GMMStats> > > training_data;
   if(extract_GMMStats_2d(stats ,training_data)==0)
@@ -728,7 +728,7 @@ static PyObject* PyBobLearnEMJFATrainer_m_step2(PyBobLearnEMJFATrainerObject* se
   PyObject* stats = 0;
 
   if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!O!", kwlist, &PyBobLearnEMJFABase_Type, &jfa_base,
-                                                                 &PyList_Type, &stats)) Py_RETURN_NONE;
+                                                                 &PyList_Type, &stats)) return 0;
 
   std::vector<std::vector<boost::shared_ptr<bob::learn::em::GMMStats> > > training_data;
   if(extract_GMMStats_2d(stats ,training_data)==0)
@@ -760,7 +760,7 @@ static PyObject* PyBobLearnEMJFATrainer_finalize2(PyBobLearnEMJFATrainerObject*
   PyObject* stats = 0;
 
   if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!O!", kwlist, &PyBobLearnEMJFABase_Type, &jfa_base,
-                                                                 &PyList_Type, &stats)) Py_RETURN_NONE;
+                                                                 &PyList_Type, &stats)) return 0;
 
   std::vector<std::vector<boost::shared_ptr<bob::learn::em::GMMStats> > > training_data;
   if(extract_GMMStats_2d(stats ,training_data)==0)
@@ -792,7 +792,7 @@ static PyObject* PyBobLearnEMJFATrainer_e_step3(PyBobLearnEMJFATrainerObject* se
   PyObject* stats = 0;
 
   if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!O!", kwlist, &PyBobLearnEMJFABase_Type, &jfa_base,
-                                                                 &PyList_Type, &stats)) Py_RETURN_NONE;
+                                                                 &PyList_Type, &stats)) return 0;
 
   std::vector<std::vector<boost::shared_ptr<bob::learn::em::GMMStats> > > training_data;
   if(extract_GMMStats_2d(stats ,training_data)==0)
@@ -824,7 +824,7 @@ static PyObject* PyBobLearnEMJFATrainer_m_step3(PyBobLearnEMJFATrainerObject* se
   PyObject* stats = 0;
 
   if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!O!", kwlist, &PyBobLearnEMJFABase_Type, &jfa_base,
-                                                                 &PyList_Type, &stats)) Py_RETURN_NONE;
+                                                                 &PyList_Type, &stats)) return 0;
 
   std::vector<std::vector<boost::shared_ptr<bob::learn::em::GMMStats> > > training_data;
   if(extract_GMMStats_2d(stats ,training_data)==0)
@@ -856,7 +856,7 @@ static PyObject* PyBobLearnEMJFATrainer_finalize3(PyBobLearnEMJFATrainerObject*
   PyObject* stats = 0;
 
   if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!O!", kwlist, &PyBobLearnEMJFABase_Type, &jfa_base,
-                                                                 &PyList_Type, &stats)) Py_RETURN_NONE;
+                                                                 &PyList_Type, &stats)) return 0;
 
   std::vector<std::vector<boost::shared_ptr<bob::learn::em::GMMStats> > > training_data;
   if(extract_GMMStats_2d(stats ,training_data)==0)
@@ -891,7 +891,7 @@ static PyObject* PyBobLearnEMJFATrainer_enrol(PyBobLearnEMJFATrainerObject* self
 
 
   if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!O!i", kwlist, &PyBobLearnEMJFAMachine_Type, &jfa_machine,
-                                                                  &PyList_Type, &stats, &n_iter)) Py_RETURN_NONE;
+                                                                  &PyList_Type, &stats, &n_iter)) return 0;
 
   std::vector<boost::shared_ptr<bob::learn::em::GMMStats> > training_data;
   if(extract_GMMStats_1d(stats ,training_data)==0)
diff --git a/bob/learn/em/kmeans_machine.cpp b/bob/learn/em/kmeans_machine.cpp
index 0fc4de7cb3ab4e64fd73bbf52d2ffcf9f5bad4b3..8f3f55f5ccc91b2b3840d387af4122808b4a86ad 100644
--- a/bob/learn/em/kmeans_machine.cpp
+++ b/bob/learn/em/kmeans_machine.cpp
@@ -339,7 +339,7 @@ static PyObject* PyBobLearnEMKMeansMachine_resize(PyBobLearnEMKMeansMachineObjec
   int n_means = 0;
   int n_inputs = 0;
 
-  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "ii", kwlist, &n_means, &n_inputs)) Py_RETURN_NONE;
+  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "ii", kwlist, &n_means, &n_inputs)) return 0;
 
   if (n_means <= 0){
     PyErr_Format(PyExc_TypeError, "n_means must be greater than zero");
@@ -375,7 +375,7 @@ static PyObject* PyBobLearnEMKMeansMachine_get_mean(PyBobLearnEMKMeansMachineObj
   char** kwlist = get_mean.kwlist(0);
 
   int i = 0;
-  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i", kwlist, &i)) Py_RETURN_NONE;
+  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i", kwlist, &i)) return 0;
  
   return PyBlitzArrayCxx_AsConstNumpy(self->cxx->getMean(i));
 
@@ -400,7 +400,7 @@ static PyObject* PyBobLearnEMKMeansMachine_set_mean(PyBobLearnEMKMeansMachineObj
 
   int i = 0;
   PyBlitzArrayObject* mean = 0;
-  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "iO&", kwlist, &i, &PyBlitzArray_Converter, &mean)) Py_RETURN_NONE;
+  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "iO&", kwlist, &i, &PyBlitzArray_Converter, &mean)) return 0;
   
   //protects acquired resources through this scope
   auto mean_ = make_safe(mean);
@@ -434,7 +434,7 @@ static PyObject* PyBobLearnEMKMeansMachine_get_distance_from_mean(PyBobLearnEMKM
   PyBlitzArrayObject* input = 0;
   int i = 0;
   if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&i", kwlist, &PyBlitzArray_Converter, &input, &i)){ 
-    Py_RETURN_NONE;
+    return 0;
   }
 
   //protects acquired resources through this scope
@@ -463,7 +463,7 @@ static PyObject* PyBobLearnEMKMeansMachine_get_closest_mean(PyBobLearnEMKMeansMa
   char** kwlist = get_closest_mean.kwlist(0);
 
   PyBlitzArrayObject* input = 0;
-  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&", kwlist, &PyBlitzArray_Converter, &input)) Py_RETURN_NONE;
+  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&", kwlist, &PyBlitzArray_Converter, &input)) return 0;
 
   //protects acquired resources through this scope
   auto input_ = make_safe(input);
@@ -494,7 +494,7 @@ static PyObject* PyBobLearnEMKMeansMachine_get_min_distance(PyBobLearnEMKMeansMa
   char** kwlist = get_min_distance.kwlist(0);
 
   PyBlitzArrayObject* input = 0;
-  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&", kwlist, &PyBlitzArray_Converter, &input)) Py_RETURN_NONE;
+  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&", kwlist, &PyBlitzArray_Converter, &input)) return 0;
 
   //protects acquired resources through this scope
   auto input_ = make_safe(input);
@@ -525,7 +525,7 @@ static PyObject* PyBobLearnEMKMeansMachine_get_variances_and_weights_for_each_cl
   char** kwlist =  get_variances_and_weights_for_each_cluster.kwlist(0);
 
   PyBlitzArrayObject* input = 0;
-  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&", kwlist, &PyBlitzArray_Converter, &input)) Py_RETURN_NONE;
+  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&", kwlist, &PyBlitzArray_Converter, &input)) return 0;
 
   //protects acquired resources through this scope
   auto input_ = make_safe(input);
@@ -562,7 +562,7 @@ static PyObject* PyBobLearnEMKMeansMachine_get_variances_and_weights_for_each_cl
 
   PyBlitzArrayObject* variances = 0;
   PyBlitzArrayObject* weights   = 0;
-  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&O&", kwlist, &PyBlitzArray_Converter, &variances,  &PyBlitzArray_Converter, &weights)) Py_RETURN_NONE;
+  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&O&", kwlist, &PyBlitzArray_Converter, &variances,  &PyBlitzArray_Converter, &weights)) return 0;
 
   //protects acquired resources through this scope
   auto weights_   = make_safe(weights);
@@ -598,7 +598,7 @@ static PyObject* PyBobLearnEMKMeansMachine_get_variances_and_weights_for_each_cl
   PyBlitzArrayObject* data      = 0;
   PyBlitzArrayObject* variances = 0;
   PyBlitzArrayObject* weights   = 0;
-  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&O&O&", kwlist, &PyBlitzArray_Converter, &data, &PyBlitzArray_Converter, &variances, &PyBlitzArray_Converter, &weights)) Py_RETURN_NONE;
+  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&O&O&", kwlist, &PyBlitzArray_Converter, &data, &PyBlitzArray_Converter, &variances, &PyBlitzArray_Converter, &weights)) return 0;
 
   //protects acquired resources through this scope
   auto data_      = make_safe(data);
@@ -633,7 +633,7 @@ static PyObject* PyBobLearnEMKMeansMachine_get_variances_and_weights_for_each_cl
 
   PyBlitzArrayObject* variances = 0;
   PyBlitzArrayObject* weights   = 0;
-  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&O&", kwlist, &PyBlitzArray_Converter, &variances,  &PyBlitzArray_Converter, &weights)) Py_RETURN_NONE;
+  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&O&", kwlist, &PyBlitzArray_Converter, &variances,  &PyBlitzArray_Converter, &weights)) return 0;
 
   //protects acquired resources through this scope
   auto weights_   = make_safe(weights);
diff --git a/bob/learn/em/kmeans_trainer.cpp b/bob/learn/em/kmeans_trainer.cpp
index a65637f59e0d442b79dbcae6d36af2395078b03f..d80339c3d048e56368183e12386a2718d9ae59ba 100644
--- a/bob/learn/em/kmeans_trainer.cpp
+++ b/bob/learn/em/kmeans_trainer.cpp
@@ -360,7 +360,7 @@ static PyObject* PyBobLearnEMKMeansTrainer_initialize(PyBobLearnEMKMeansTrainerO
   PyBlitzArrayObject* data                          = 0;
 
   if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!O&", kwlist, &PyBobLearnEMKMeansMachine_Type, &kmeans_machine,
-                                                                 &PyBlitzArray_Converter, &data)) Py_RETURN_NONE;
+                                                                 &PyBlitzArray_Converter, &data)) return 0;
   auto data_ = make_safe(data);
 
   self->cxx->initialize(*kmeans_machine->cxx, *PyBlitzArrayCxx_AsBlitz<double,2>(data));
@@ -392,7 +392,7 @@ static PyObject* PyBobLearnEMKMeansTrainer_eStep(PyBobLearnEMKMeansTrainerObject
   PyBobLearnEMKMeansMachineObject* kmeans_machine;
   PyBlitzArrayObject* data = 0;
   if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!O&", kwlist, &PyBobLearnEMKMeansMachine_Type, &kmeans_machine,
-                                                                 &PyBlitzArray_Converter, &data)) Py_RETURN_NONE;
+                                                                 &PyBlitzArray_Converter, &data)) return 0;
   auto data_ = make_safe(data);
 
   self->cxx->eStep(*kmeans_machine->cxx, *PyBlitzArrayCxx_AsBlitz<double,2>(data));
@@ -420,7 +420,7 @@ static PyObject* PyBobLearnEMKMeansTrainer_mStep(PyBobLearnEMKMeansTrainerObject
   char** kwlist = mStep.kwlist(0);
 
   PyBobLearnEMKMeansMachineObject* kmeans_machine;
-  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!", kwlist, &PyBobLearnEMKMeansMachine_Type, &kmeans_machine)) Py_RETURN_NONE;
+  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!", kwlist, &PyBobLearnEMKMeansMachine_Type, &kmeans_machine)) return 0;
 
   self->cxx->mStep(*kmeans_machine->cxx);
 
@@ -446,7 +446,7 @@ static PyObject* PyBobLearnEMKMeansTrainer_compute_likelihood(PyBobLearnEMKMeans
   char** kwlist = compute_likelihood.kwlist(0);
 
   PyBobLearnEMKMeansMachineObject* kmeans_machine;
-  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!", kwlist, &PyBobLearnEMKMeansMachine_Type, &kmeans_machine)) Py_RETURN_NONE;
+  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!", kwlist, &PyBobLearnEMKMeansMachine_Type, &kmeans_machine)) return 0;
 
   double value = self->cxx->computeLikelihood(*kmeans_machine->cxx);
   return Py_BuildValue("d", value);
@@ -471,7 +471,7 @@ static PyObject* PyBobLearnEMKMeansTrainer_reset_accumulators(PyBobLearnEMKMeans
   char** kwlist = reset_accumulators.kwlist(0);
 
   PyBobLearnEMKMeansMachineObject* kmeans_machine;
-  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!", kwlist, &PyBobLearnEMKMeansMachine_Type, &kmeans_machine)) Py_RETURN_NONE;
+  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!", kwlist, &PyBobLearnEMKMeansMachine_Type, &kmeans_machine)) return 0;
 
   bool value = self->cxx->resetAccumulators(*kmeans_machine->cxx);
   return Py_BuildValue("b", value);
diff --git a/bob/learn/em/linear_scoring.cpp b/bob/learn/em/linear_scoring.cpp
index ab5edd6252f1470ddfe26cec4e578528ff0748c4..e2cc215e8f97046d032f97204c485e054f15e8a3 100644
--- a/bob/learn/em/linear_scoring.cpp
+++ b/bob/learn/em/linear_scoring.cpp
@@ -148,7 +148,7 @@ static PyObject* PyBobLearnEM_linear_scoring(PyObject*, PyObject* args, PyObject
                                                                        &PyList_Type, &channel_offset_list_o,
                                                                        &PyBool_Type, &frame_length_normalisation)){
       linear_scoring1.print_usage();
-      Py_RETURN_NONE;
+      return 0;
     }
 
     std::vector<boost::shared_ptr<const bob::learn::em::GMMStats> > stats_list;
@@ -191,7 +191,7 @@ static PyObject* PyBobLearnEM_linear_scoring(PyObject*, PyObject* args, PyObject
                                                                        &PyList_Type, &channel_offset_list_o,
                                                                        &PyBool_Type, &frame_length_normalisation)){
       linear_scoring2.print_usage(); 
-      Py_RETURN_NONE;
+      return 0;
     }
     
     //protects acquired resources through this scope
@@ -239,7 +239,7 @@ static PyObject* PyBobLearnEM_linear_scoring(PyObject*, PyObject* args, PyObject
                                                                        &PyBlitzArray_Converter, &channel_offset,
                                                                        &PyBool_Type, &frame_length_normalisation)){
       linear_scoring3.print_usage(); 
-      Py_RETURN_NONE;
+      return 0;
     }
     
     //protects acquired resources through this scope
@@ -259,7 +259,7 @@ static PyObject* PyBobLearnEM_linear_scoring(PyObject*, PyObject* args, PyObject
     linear_scoring1.print_usage();
     linear_scoring2.print_usage();
     linear_scoring3.print_usage();
-    Py_RETURN_NONE;
+    return 0;
   }
 
 }
diff --git a/bob/learn/em/plda_base.cpp b/bob/learn/em/plda_base.cpp
index 2c7bafbb465534d843e897d2d2594e8181940cb5..5d48a169bb18ac4b462d3a625110c4ab8080e5a9 100644
--- a/bob/learn/em/plda_base.cpp
+++ b/bob/learn/em/plda_base.cpp
@@ -642,7 +642,7 @@ static PyObject* PyBobLearnEMPLDABase_resize(PyBobLearnEMPLDABaseObject* self, P
 
   int dim_D, dim_F, dim_G = 0;
 
-  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "iii", kwlist, &dim_D, &dim_F, &dim_G)) Py_RETURN_NONE;
+  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "iii", kwlist, &dim_D, &dim_F, &dim_G)) return 0;
 
   if(dim_D <= 0){
     PyErr_Format(PyExc_TypeError, "dim_d argument must be greater than or equal to one");
@@ -684,7 +684,7 @@ static PyObject* PyBobLearnEMPLDABase_getGamma(PyBobLearnEMPLDABaseObject* self,
   char** kwlist = get_gamma.kwlist(0);
 
   int i = 0;
-  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i", kwlist, &i)) Py_RETURN_NONE;
+  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i", kwlist, &i)) return 0;
 
   return PyBlitzArrayCxx_AsConstNumpy(self->cxx->getGamma(i));
   BOB_CATCH_MEMBER("`get_gamma` could not be read", 0)
@@ -707,7 +707,7 @@ static PyObject* PyBobLearnEMPLDABase_hasGamma(PyBobLearnEMPLDABaseObject* self,
   
   char** kwlist = has_gamma.kwlist(0);
   int i = 0;
-  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i", kwlist, &i)) Py_RETURN_NONE;
+  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i", kwlist, &i)) return 0;
 
   if(self->cxx->hasGamma(i))
     Py_RETURN_TRUE;
@@ -734,7 +734,7 @@ static PyObject* PyBobLearnEMPLDABase_computeGamma(PyBobLearnEMPLDABaseObject* s
   char** kwlist = compute_gamma.kwlist(0);
   int i = 0;
   PyBlitzArrayObject* res = 0;  
-  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "iO&", kwlist, &i, &PyBlitzArray_Converter, &res)) Py_RETURN_NONE;
+  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "iO&", kwlist, &i, &PyBlitzArray_Converter, &res)) return 0;
 
   auto res_ = make_safe(res);  
 
@@ -761,7 +761,7 @@ static PyObject* PyBobLearnEMPLDABase_getAddGamma(PyBobLearnEMPLDABaseObject* se
   char** kwlist = get_add_gamma.kwlist(0);
 
   int i = 0;
-  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i", kwlist, &i)) Py_RETURN_NONE;
+  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i", kwlist, &i)) return 0;
 
   return PyBlitzArrayCxx_AsConstNumpy(self->cxx->getAddGamma(i));
   BOB_CATCH_MEMBER("`get_add_gamma` could not be read", 0)
@@ -784,7 +784,7 @@ static PyObject* PyBobLearnEMPLDABase_hasLogLikeConstTerm(PyBobLearnEMPLDABaseOb
   
   char** kwlist = has_log_like_const_term.kwlist(0);
   int i = 0;
-  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i", kwlist, &i)) Py_RETURN_NONE;
+  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i", kwlist, &i)) return 0;
 
   if(self->cxx->hasLogLikeConstTerm(i))
     Py_RETURN_TRUE;
@@ -812,7 +812,7 @@ static PyObject* PyBobLearnEMPLDABase_computeLogLikeConstTerm(PyBobLearnEMPLDABa
   char** kwlist = compute_log_like_const_term.kwlist(0);
   int i = 0;
   PyBlitzArrayObject* res = 0;  
-  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "iO&", kwlist, &i, &PyBlitzArray_Converter, &res)) Py_RETURN_NONE;
+  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "iO&", kwlist, &i, &PyBlitzArray_Converter, &res)) return 0;
 
   auto res_ = make_safe(res);  
 
@@ -839,7 +839,7 @@ static PyObject* PyBobLearnEMPLDABase_getAddLogLikeConstTerm(PyBobLearnEMPLDABas
   
   char** kwlist = get_add_log_like_const_term.kwlist(0);
   int i = 0;
-  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i", kwlist, &i)) Py_RETURN_NONE;
+  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i", kwlist, &i)) return 0;
 
   return Py_BuildValue("d",self->cxx->getAddLogLikeConstTerm(i));
 
@@ -863,7 +863,7 @@ static PyObject* PyBobLearnEMPLDABase_getLogLikeConstTerm(PyBobLearnEMPLDABaseOb
   
   char** kwlist = get_log_like_const_term.kwlist(0);
   int i = 0;
-  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i", kwlist, &i)) Py_RETURN_NONE;
+  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i", kwlist, &i)) return 0;
 
   return Py_BuildValue("d",self->cxx->getLogLikeConstTerm(i));
 
diff --git a/bob/learn/em/plda_machine.cpp b/bob/learn/em/plda_machine.cpp
index dc14d35d0d22fa8d0cbee4c358536800ee98393f..79859c2a7af9caf45fc1796d4c27450b05304756 100644
--- a/bob/learn/em/plda_machine.cpp
+++ b/bob/learn/em/plda_machine.cpp
@@ -477,7 +477,7 @@ static PyObject* PyBobLearnEMPLDAMachine_getGamma(PyBobLearnEMPLDAMachineObject*
   char** kwlist = get_gamma.kwlist(0);
 
   int i = 0;
-  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i", kwlist, &i)) Py_RETURN_NONE;
+  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i", kwlist, &i)) return 0;
 
   return PyBlitzArrayCxx_AsConstNumpy(self->cxx->getGamma(i));
   BOB_CATCH_MEMBER("`get_gamma` could not be read", 0)
@@ -500,7 +500,7 @@ static PyObject* PyBobLearnEMPLDAMachine_hasGamma(PyBobLearnEMPLDAMachineObject*
   
   char** kwlist = has_gamma.kwlist(0);
   int i = 0;
-  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i", kwlist, &i)) Py_RETURN_NONE;
+  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i", kwlist, &i)) return 0;
 
   if(self->cxx->hasGamma(i))
     Py_RETURN_TRUE;
@@ -528,7 +528,7 @@ static PyObject* PyBobLearnEMPLDAMachine_getAddGamma(PyBobLearnEMPLDAMachineObje
   char** kwlist = get_add_gamma.kwlist(0);
 
   int i = 0;
-  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i", kwlist, &i)) Py_RETURN_NONE;
+  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i", kwlist, &i)) return 0;
 
   return PyBlitzArrayCxx_AsConstNumpy(self->cxx->getAddGamma(i));
   BOB_CATCH_MEMBER("`get_add_gamma` could not be read", 0)
@@ -551,7 +551,7 @@ static PyObject* PyBobLearnEMPLDAMachine_hasLogLikeConstTerm(PyBobLearnEMPLDAMac
   
   char** kwlist = has_log_like_const_term.kwlist(0);
   int i = 0;
-  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i", kwlist, &i)) Py_RETURN_NONE;
+  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i", kwlist, &i)) return 0;
 
   if(self->cxx->hasLogLikeConstTerm(i))
     Py_RETURN_TRUE;
@@ -578,7 +578,7 @@ static PyObject* PyBobLearnEMPLDAMachine_getAddLogLikeConstTerm(PyBobLearnEMPLDA
   
   char** kwlist = get_add_log_like_const_term.kwlist(0);
   int i = 0;
-  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i", kwlist, &i)) Py_RETURN_NONE;
+  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i", kwlist, &i)) return 0;
 
   return Py_BuildValue("d",self->cxx->getAddLogLikeConstTerm(i));
 
@@ -602,7 +602,7 @@ static PyObject* PyBobLearnEMPLDAMachine_getLogLikeConstTerm(PyBobLearnEMPLDAMac
   
   char** kwlist = get_log_like_const_term.kwlist(0);
   int i = 0;
-  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i", kwlist, &i)) Py_RETURN_NONE;
+  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i", kwlist, &i)) return 0;
 
   return Py_BuildValue("d",self->cxx->getLogLikeConstTerm(i));
 
@@ -647,7 +647,7 @@ static PyObject* PyBobLearnEMPLDAMachine_computeLogLikelihood(PyBobLearnEMPLDAMa
   PyObject* with_enrolled_samples = Py_True;
   
   if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&|O!", kwlist, &PyBlitzArray_Converter, &samples,
-                                                                 &PyBool_Type, &with_enrolled_samples)) Py_RETURN_NONE;
+                                                                 &PyBool_Type, &with_enrolled_samples)) return 0;
   auto samples_ = make_safe(samples);
 
   blitz::Array<double,2>  blitz_test = *PyBlitzArrayCxx_AsBlitz<double,2>(samples);
@@ -679,7 +679,7 @@ static PyObject* PyBobLearnEMPLDAMachine_forward(PyBobLearnEMPLDAMachineObject*
 
   PyBlitzArrayObject* samples;
 
-  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&", kwlist, &PyBlitzArray_Converter, &samples)) Py_RETURN_NONE;
+  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&", kwlist, &PyBlitzArray_Converter, &samples)) return 0;
   auto samples_ = make_safe(samples);
   blitz::Array<double,2>  blitz_test = *PyBlitzArrayCxx_AsBlitz<double,2>(samples);
 
diff --git a/bob/learn/em/plda_trainer.cpp b/bob/learn/em/plda_trainer.cpp
index 3144fbccce27f979050e5c3347d0782d9873814a..70e09f3dc91816f30405072374ad421c7b7196ec 100644
--- a/bob/learn/em/plda_trainer.cpp
+++ b/bob/learn/em/plda_trainer.cpp
@@ -445,7 +445,7 @@ static PyObject* PyBobLearnEMPLDATrainer_initialize(PyBobLearnEMPLDATrainerObjec
   PyObject* data = 0;
 
   if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!O!", kwlist, &PyBobLearnEMPLDABase_Type, &plda_base,
-                                                                 &PyList_Type, &data)) Py_RETURN_NONE;
+                                                                 &PyList_Type, &data)) return 0;
 
   std::vector<blitz::Array<double,2> > data_vector;
   if(list_as_vector(data ,data_vector)==0)
@@ -477,7 +477,7 @@ static PyObject* PyBobLearnEMPLDATrainer_e_step(PyBobLearnEMPLDATrainerObject* s
   PyObject* data = 0;
 
   if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!O!", kwlist, &PyBobLearnEMPLDABase_Type, &plda_base,
-                                                                 &PyList_Type, &data)) Py_RETURN_NONE;
+                                                                 &PyList_Type, &data)) return 0;
 
   std::vector<blitz::Array<double,2> > data_vector;
   if(list_as_vector(data ,data_vector)==0)
@@ -509,7 +509,7 @@ static PyObject* PyBobLearnEMPLDATrainer_m_step(PyBobLearnEMPLDATrainerObject* s
   PyObject* data = 0;
 
   if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!O!", kwlist, &PyBobLearnEMPLDABase_Type, &plda_base,
-                                                                 &PyList_Type, &data)) Py_RETURN_NONE;
+                                                                 &PyList_Type, &data)) return 0;
 
   std::vector<blitz::Array<double,2> > data_vector;
   if(list_as_vector(data ,data_vector)==0)
@@ -541,7 +541,7 @@ static PyObject* PyBobLearnEMPLDATrainer_finalize(PyBobLearnEMPLDATrainerObject*
   PyObject* data = 0;
 
   if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!O!", kwlist, &PyBobLearnEMPLDABase_Type, &plda_base,
-                                                                 &PyList_Type, &data)) Py_RETURN_NONE;
+                                                                 &PyList_Type, &data)) return 0;
 
   std::vector<blitz::Array<double,2> > data_vector;
   if(list_as_vector(data ,data_vector)==0)
@@ -574,7 +574,7 @@ static PyObject* PyBobLearnEMPLDATrainer_enrol(PyBobLearnEMPLDATrainerObject* se
   PyBlitzArrayObject* data = 0;
 
   if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!O&", kwlist, &PyBobLearnEMPLDAMachine_Type, &plda_machine,
-                                                                 &PyBlitzArray_Converter, &data)) Py_RETURN_NONE;
+                                                                 &PyBlitzArray_Converter, &data)) return 0;
 
   auto data_ = make_safe(data);
   self->cxx->enrol(*plda_machine->cxx, *PyBlitzArrayCxx_AsBlitz<double,2>(data));
diff --git a/bob/learn/em/test/test_ivector_trainer.py b/bob/learn/em/test/test_ivector_trainer.py
index 9ef48e21ffb21c1227954402d57c69c48c9aae08..34d8cad36500f911987bdf42e218f2e9ccfbf1b3 100644
--- a/bob/learn/em/test/test_ivector_trainer.py
+++ b/bob/learn/em/test/test_ivector_trainer.py
@@ -234,14 +234,14 @@ def test_trainer_nosigma():
   m.sigma = sigma
   for it in range(2):
     # E-Step
-    trainer.e_step(m, data)
+    trainer.eStep(m, data)
     for k in acc_Nij_Sigma_wij2_ref[it]:
       assert numpy.allclose(acc_Nij_Sigma_wij2_ref[it][k], trainer.acc_nij_wij2[k], 1e-5)
     for k in acc_Fnorm_Sigma_wij_ref[it]:
       assert numpy.allclose(acc_Fnorm_Sigma_wij_ref[it][k], trainer.acc_fnormij_wij[k], 1e-5)
 
     # M-Step
-    trainer.m_step(m)
+    trainer.mStep(m)
     assert numpy.allclose(t_ref[it], m.t, 1e-5)
 
 def test_trainer_update_sigma():
@@ -348,7 +348,7 @@ def test_trainer_update_sigma():
   m.sigma = sigma
   for it in range(2):
     # E-Step
-    trainer.e_step(m, data)
+    trainer.eStep(m, data)
     for k in acc_Nij_Sigma_wij2_ref[it]:
       assert numpy.allclose(acc_Nij_Sigma_wij2_ref[it][k], trainer.acc_nij_wij2[k], 1e-5)
     for k in acc_Fnorm_Sigma_wij_ref[it]:
@@ -357,7 +357,7 @@ def test_trainer_update_sigma():
     assert numpy.allclose(N_ref[it], trainer.acc_nij, 1e-5)
 
     # M-Step
-    trainer.m_step(m)
+    trainer.mStep(m)
     assert numpy.allclose(t_ref[it], m.t, 1e-5)
     assert numpy.allclose(sigma_ref[it], m.sigma, 1e-5)
 
diff --git a/bob/learn/em/test/test_jfa_trainer.py b/bob/learn/em/test/test_jfa_trainer.py
index 044bbe5281357805fb42a667c1cfdfc85fcdae89..cc6e05518d51949f4d0a21c24a99939227572c91 100644
--- a/bob/learn/em/test/test_jfa_trainer.py
+++ b/bob/learn/em/test/test_jfa_trainer.py
@@ -230,8 +230,8 @@ def test_ISVTrainAndEnrol():
   t.initialize(mb, TRAINING_STATS)
   mb.u = M_u
   for i in range(10):
-    t.e_step(mb, TRAINING_STATS)
-    t.m_step(mb)
+    t.eStep(mb, TRAINING_STATS)
+    t.mStep(mb)
 
   assert numpy.allclose(mb.d, d_ref, eps)
   assert numpy.allclose(mb.u, u_ref, eps)
diff --git a/bob/learn/em/ztnorm.cpp b/bob/learn/em/ztnorm.cpp
index 2164aed3e63199de8923967ee5fe955942bb2063..b000b5fcb08091bcd9664bce395807625e980ebd 100644
--- a/bob/learn/em/ztnorm.cpp
+++ b/bob/learn/em/ztnorm.cpp
@@ -36,7 +36,7 @@ static PyObject* PyBobLearnEM_ztNorm(PyObject*, PyObject* args, PyObject* kwargs
                                                                        &PyBlitzArray_Converter, &rawscores_zprobes_vs_tmodels_o,
                                                                        &PyBlitzArray_Converter, &mask_zprobes_vs_tmodels_istruetrial_o)){
     zt_norm.print_usage();
-    Py_RETURN_NONE;
+    return 0;
   }
 
   // get the number of command line arguments
@@ -90,7 +90,7 @@ static PyObject* PyBobLearnEM_tNorm(PyObject*, PyObject* args, PyObject* kwargs)
   if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&O&", kwlist, &PyBlitzArray_Converter, &rawscores_probes_vs_models_o,
                                                                        &PyBlitzArray_Converter, &rawscores_probes_vs_tmodels_o)){
     zt_norm.print_usage();
-    Py_RETURN_NONE;
+    return 0;
   }
   
   auto rawscores_probes_vs_models_          = make_safe(rawscores_probes_vs_models_o);
@@ -127,7 +127,7 @@ static PyObject* PyBobLearnEM_zNorm(PyObject*, PyObject* args, PyObject* kwargs)
   if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&O&", kwlist, &PyBlitzArray_Converter, &rawscores_probes_vs_models_o,
                                                                        &PyBlitzArray_Converter, &rawscores_zprobes_vs_models_o)){
     zt_norm.print_usage();
-    Py_RETURN_NONE;
+    return 0;
   }
   
   auto rawscores_probes_vs_models_          = make_safe(rawscores_probes_vs_models_o);
diff --git a/doc/guide.rst b/doc/guide.rst
index b549affb7177b568a890c3fa058cb95aade2e5c6..d7895aa6c42549f8aaaf554b05f7f88f7f485eeb 100644
--- a/doc/guide.rst
+++ b/doc/guide.rst
@@ -219,7 +219,7 @@ statistics of this input sample, and then calling the
 
   >>> gs = bob.learn.em.GMMStats(2,3)
   >>> gmm.acc_statistics(sample, gs)
-  >>> score = m.forward(gs)
+  >>> score = m(gs)
 
 As with other machines you can save and re-load machines of this type using
 :py:meth:`bob.learn.em.JFAMachine.save` and the class constructor
@@ -273,7 +273,7 @@ statistics of this input sample, and then calling the
 
   >>> gs = bob.learn.em.GMMStats(2,3)
   >>> gmm.acc_statistics(sample, gs)
-  >>> score = m.forward(gs)
+  >>> score = m(gs)
 
 As with other machines you can save and re-load machines of this type using
 :py:meth:`bob.learn.em.ISVMachine.save` and the class constructor
@@ -309,7 +309,7 @@ extracting the GMM sufficient statistics, and then estimating the i-vector:
 
   >>> gs = bob.learn.em.GMMStats(2,3)
   >>> gmm.acc_statistics(sample, gs)
-  >>> w_ij = m.forward(gs)
+  >>> w_ij = m(gs)
 
 As with other machines you can save and re-load machines of this type using
 :py:meth:`bob.learn.em.IVectorMachine.save` and the class constructor
@@ -472,11 +472,9 @@ set.
    :options: +NORMALIZE_WHITESPACE
 
    >>> relevance_factor = 4.
-   >>> trainer = bob.learn.em.MAP_GMMTrainer(relevance_factor, True, False, False) # mean adaptation only
+   >>> trainer = bob.learn.em.MAP_GMMTrainer(gmm, relevance_factor=relevance_factor, update_means=True, update_variances=False, update_weights=False) # mean adaptation only
    >>> trainer.convergence_threshold = 1e-5
    >>> trainer.max_iterations = 200
-   >>> trainer.set_prior_gmm(gmm)
-   True
    >>> gmmAdapted = bob.learn.em.GMMMachine(2,3) # Create a new machine for the MAP estimate
    >>> trainer.train(gmmAdapted, dataMAP)
    >>> print(gmmAdapted) # doctest: +SKIP