diff --git a/bob/learn/misc/cpp/JFAMachine.cpp b/bob/learn/misc/cpp/JFAMachine.cpp
index bccbc49550542e12a22eeaf792fc3761636f6b07..fb521bfe5b915f7ebb587ba0798bcc281c1f1fcf 100644
--- a/bob/learn/misc/cpp/JFAMachine.cpp
+++ b/bob/learn/misc/cpp/JFAMachine.cpp
@@ -1,6 +1,7 @@
 /**
- * @date Sat Jul 23 21:41:15 2011 +0200
+ * @date Tue Jan 27 16:47:00 2015 +0200
  * @author Laurent El Shafey <Laurent.El-Shafey@idiap.ch>
+ * @author Tiago de Freitas Pereira <tiago.pereira@idiap.ch>
  *
  * Copyright (C) Idiap Research Institute, Martigny, Switzerland
  */
@@ -14,421 +15,6 @@
 #include <limits>
 
 
-//////////////////// FABase ////////////////////
-bob::learn::misc::FABase::FABase():
-  m_ubm(boost::shared_ptr<bob::learn::misc::GMMMachine>()), m_ru(1), m_rv(1),
-  m_U(0,1), m_V(0,1), m_d(0)
-{
-}
-
-bob::learn::misc::FABase::FABase(const boost::shared_ptr<bob::learn::misc::GMMMachine> ubm,
-    const size_t ru, const size_t rv):
-  m_ubm(ubm), m_ru(ru), m_rv(rv),
-  m_U(getDimCD(),ru), m_V(getDimCD(),rv), m_d(getDimCD())
-{
-  if (ru < 1) {
-    boost::format m("value for parameter `ru' (%lu) cannot be smaller than 1");
-    m % ru;
-    throw std::runtime_error(m.str());
-  }
-  if (rv < 1) {
-    boost::format m("value for parameter `rv' (%lu) cannot be smaller than 1");
-    m % ru;
-    throw std::runtime_error(m.str());
-  }
-  updateCache();
-}
-
-bob::learn::misc::FABase::FABase(const bob::learn::misc::FABase& other):
-  m_ubm(other.m_ubm), m_ru(other.m_ru), m_rv(other.m_rv),
-  m_U(bob::core::array::ccopy(other.m_U)),
-  m_V(bob::core::array::ccopy(other.m_V)),
-  m_d(bob::core::array::ccopy(other.m_d))
-{
-  updateCache();
-}
-
-bob::learn::misc::FABase::~FABase() {
-}
-
-bob::learn::misc::FABase& bob::learn::misc::FABase::operator=
-(const bob::learn::misc::FABase& other)
-{
-  if (this != &other)
-  {
-    m_ubm = other.m_ubm;
-    m_ru = other.m_ru;
-    m_rv = other.m_rv;
-    m_U.reference(bob::core::array::ccopy(other.m_U));
-    m_V.reference(bob::core::array::ccopy(other.m_V));
-    m_d.reference(bob::core::array::ccopy(other.m_d));
-
-    updateCache();
-  }
-  return *this;
-}
-
-bool bob::learn::misc::FABase::operator==(const bob::learn::misc::FABase& b) const
-{
-  return ( (((m_ubm && b.m_ubm) && *m_ubm == *(b.m_ubm)) || (!m_ubm && !b.m_ubm)) &&
-          m_ru == b.m_ru && m_rv == b.m_rv &&
-          bob::core::array::isEqual(m_U, b.m_U) &&
-          bob::core::array::isEqual(m_V, b.m_V) &&
-          bob::core::array::isEqual(m_d, b.m_d));
-}
-
-bool bob::learn::misc::FABase::operator!=(const bob::learn::misc::FABase& b) const
-{
-  return !(this->operator==(b));
-}
-
-bool bob::learn::misc::FABase::is_similar_to(const bob::learn::misc::FABase& b,
-    const double r_epsilon, const double a_epsilon) const
-{
-  // TODO: update is_similar_to of the GMMMachine with the 2 epsilon's
-  return (( ((m_ubm && b.m_ubm) && m_ubm->is_similar_to(*(b.m_ubm), a_epsilon)) ||
-            (!m_ubm && !b.m_ubm) ) &&
-          m_ru == b.m_ru && m_rv == b.m_rv &&
-          bob::core::array::isClose(m_U, b.m_U, r_epsilon, a_epsilon) &&
-          bob::core::array::isClose(m_V, b.m_V, r_epsilon, a_epsilon) &&
-          bob::core::array::isClose(m_d, b.m_d, r_epsilon, a_epsilon));
-}
-
-void bob::learn::misc::FABase::resize(const size_t ru, const size_t rv)
-{
-  if (ru < 1) {
-    boost::format m("value for parameter `ru' (%lu) cannot be smaller than 1");
-    m % ru;
-    throw std::runtime_error(m.str());
-  }
-  if (rv < 1) {
-    boost::format m("value for parameter `rv' (%lu) cannot be smaller than 1");
-    m % ru;
-    throw std::runtime_error(m.str());
-  }
-
-  m_ru = ru;
-  m_rv = rv;
-  m_U.resizeAndPreserve(m_U.extent(0), ru);
-  m_V.resizeAndPreserve(m_V.extent(0), rv);
-
-  updateCacheUbmUVD();
-}
-
-void bob::learn::misc::FABase::resize(const size_t ru, const size_t rv, const size_t cd)
-{
-  if (ru < 1) {
-    boost::format m("value for parameter `ru' (%lu) cannot be smaller than 1");
-    m % ru;
-    throw std::runtime_error(m.str());
-  }
-  if (rv < 1) {
-    boost::format m("value for parameter `rv' (%lu) cannot be smaller than 1");
-    m % ru;
-    throw std::runtime_error(m.str());
-  }
-
-  if (!m_ubm || (m_ubm && getDimCD() == cd))
-  {
-    m_ru = ru;
-    m_rv = rv;
-    m_U.resizeAndPreserve(cd, ru);
-    m_V.resizeAndPreserve(cd, rv);
-    m_d.resizeAndPreserve(cd);
-
-    updateCacheUbmUVD();
-  }
-  else {
-    boost::format m("value for parameter `cd' (%lu) is not set to %lu");
-    m % cd % getDimCD();
-    throw std::runtime_error(m.str());
-  }
-}
-
-void bob::learn::misc::FABase::setUbm(const boost::shared_ptr<bob::learn::misc::GMMMachine> ubm)
-{
-  m_ubm = ubm;
-  m_U.resizeAndPreserve(getDimCD(), m_ru);
-  m_V.resizeAndPreserve(getDimCD(), m_rv);
-  m_d.resizeAndPreserve(getDimCD());
-
-  updateCache();
-}
-
-void bob::learn::misc::FABase::setU(const blitz::Array<double,2>& U)
-{
-  if(U.extent(0) != m_U.extent(0)) { //checks dimension
-    boost::format m("number of rows in parameter `U' (%d) does not match the expected size (%d)");
-    m % U.extent(0) % m_U.extent(0);
-    throw std::runtime_error(m.str());
-  }
-  if(U.extent(1) != m_U.extent(1)) { //checks dimension
-    boost::format m("number of columns in parameter `U' (%d) does not match the expected size (%d)");
-    m % U.extent(1) % m_U.extent(1);
-    throw std::runtime_error(m.str());
-  }
-  m_U.reference(bob::core::array::ccopy(U));
-
-  // update cache
-  updateCacheUbmUVD();
-}
-
-void bob::learn::misc::FABase::setV(const blitz::Array<double,2>& V)
-{
-  if(V.extent(0) != m_V.extent(0)) { //checks dimension
-    boost::format m("number of rows in parameter `V' (%d) does not match the expected size (%d)");
-    m % V.extent(0) % m_V.extent(0);
-    throw std::runtime_error(m.str());
-  }
-  if(V.extent(1) != m_V.extent(1)) { //checks dimension
-    boost::format m("number of columns in parameter `V' (%d) does not match the expected size (%d)");
-    m % V.extent(1) % m_V.extent(1);
-    throw std::runtime_error(m.str());
-  }
-  m_V.reference(bob::core::array::ccopy(V));
-}
-
-void bob::learn::misc::FABase::setD(const blitz::Array<double,1>& d)
-{
-  if(d.extent(0) != m_d.extent(0)) { //checks dimension
-    boost::format m("size of input vector `d' (%d) does not match the expected size (%d)");
-    m % d.extent(0) % m_d.extent(0);
-    throw std::runtime_error(m.str());
-  }
-  m_d.reference(bob::core::array::ccopy(d));
-}
-
-
-void bob::learn::misc::FABase::updateCache()
-{
-  updateCacheUbm();
-  updateCacheUbmUVD();
-  resizeTmp();
-}
-
-void bob::learn::misc::FABase::resizeTmp()
-{
-  m_tmp_IdPlusUSProdInv.resize(getDimRu(),getDimRu());
-  m_tmp_Fn_x.resize(getDimCD());
-  m_tmp_ru.resize(getDimRu());
-  m_tmp_ruD.resize(getDimRu(), getDimD());
-  m_tmp_ruru.resize(getDimRu(), getDimRu());
-}
-
-void bob::learn::misc::FABase::updateCacheUbm()
-{
-  // Put supervectors in cache
-  if (m_ubm)
-  {
-    m_cache_mean.resize(getDimCD());
-    m_cache_sigma.resize(getDimCD());
-    m_ubm->getMeanSupervector(m_cache_mean);
-    m_ubm->getVarianceSupervector(m_cache_sigma);
-  }
-}
-
-void bob::learn::misc::FABase::updateCacheUbmUVD()
-{
-  // Compute and put  U^{T}.diag(sigma)^{-1} in cache
-  if (m_ubm)
-  {
-    blitz::firstIndex i;
-    blitz::secondIndex j;
-    m_cache_UtSigmaInv.resize(getDimRu(), getDimCD());
-    m_cache_UtSigmaInv = m_U(j,i) / m_cache_sigma(j); // Ut * diag(sigma)^-1
-  }
-}
-
-void bob::learn::misc::FABase::computeIdPlusUSProdInv(const bob::learn::misc::GMMStats& gmm_stats,
-  blitz::Array<double,2>& output) const
-{
-  // Computes (Id + U^T.Sigma^-1.U.N_{i,h}.U)^-1 =
-  // (Id + sum_{c=1..C} N_{i,h}.U_{c}^T.Sigma_{c}^-1.U_{c})^-1
-
-  // Blitz compatibility: ugly fix (const_cast, as old blitz version does not
-  // provide a non-const version of transpose())
-  blitz::Array<double,2> Ut = const_cast<blitz::Array<double,2>&>(m_U).transpose(1,0);
-
-  blitz::firstIndex i;
-  blitz::secondIndex j;
-  blitz::Range rall = blitz::Range::all();
-
-  bob::math::eye(m_tmp_ruru); // m_tmp_ruru = Id
-  // Loop and add N_{i,h}.U_{c}^T.Sigma_{c}^-1.U_{c} to m_tmp_ruru at each iteration
-  const size_t dim_c = getDimC();
-  const size_t dim_d = getDimD();
-  for(size_t c=0; c<dim_c; ++c) {
-    blitz::Range rc(c*dim_d,(c+1)*dim_d-1);
-    blitz::Array<double,2> Ut_c = Ut(rall,rc);
-    blitz::Array<double,1> sigma_c = m_cache_sigma(rc);
-    m_tmp_ruD = Ut_c(i,j) / sigma_c(j); // U_{c}^T.Sigma_{c}^-1
-    blitz::Array<double,2> U_c = m_U(rc,rall);
-    // Use m_cache_IdPlusUSProdInv as an intermediate array
-    bob::math::prod(m_tmp_ruD, U_c, output); // U_{c}^T.Sigma_{c}^-1.U_{c}
-    // Finally, add N_{i,h}.U_{c}^T.Sigma_{c}^-1.U_{c} to m_tmp_ruru
-    m_tmp_ruru += output * gmm_stats.n(c);
-  }
-  // Computes the inverse
-  bob::math::inv(m_tmp_ruru, output);
-}
-
-
-void bob::learn::misc::FABase::computeFn_x(const bob::learn::misc::GMMStats& gmm_stats,
-  blitz::Array<double,1>& output) const
-{
-  // Compute Fn_x = sum_{sessions h}(N*(o - m) (Normalised first order statistics)
-  blitz::Range rall = blitz::Range::all();
-  const size_t dim_c = getDimC();
-  const size_t dim_d = getDimD();
-  for(size_t c=0; c<dim_c; ++c) {
-    blitz::Range rc(c*dim_d,(c+1)*dim_d-1);
-    blitz::Array<double,1> Fn_x_c = output(rc);
-    blitz::Array<double,1> mean_c = m_cache_mean(rc);
-    Fn_x_c = gmm_stats.sumPx(c,rall) - mean_c*gmm_stats.n(c);
-  }
-}
-
-void bob::learn::misc::FABase::estimateX(const blitz::Array<double,2>& IdPlusUSProdInv,
-  const blitz::Array<double,1>& Fn_x, blitz::Array<double,1>& x) const
-{
-  // m_tmp_ru = UtSigmaInv * Fn_x = Ut*diag(sigma)^-1 * N*(o - m)
-  bob::math::prod(m_cache_UtSigmaInv, Fn_x, m_tmp_ru);
-  // x = IdPlusUSProdInv * m_cache_UtSigmaInv * Fn_x
-  bob::math::prod(IdPlusUSProdInv, m_tmp_ru, x);
-}
-
-
-void bob::learn::misc::FABase::estimateX(const bob::learn::misc::GMMStats& gmm_stats, blitz::Array<double,1>& x) const
-{
-  if (!m_ubm) throw std::runtime_error("No UBM was set in the JFA machine.");
-  computeIdPlusUSProdInv(gmm_stats, m_tmp_IdPlusUSProdInv); // Computes first term
-  computeFn_x(gmm_stats, m_tmp_Fn_x); // Computes last term
-  estimateX(m_tmp_IdPlusUSProdInv, m_tmp_Fn_x, x); // Estimates the value of x
-}
-
-
-
-//////////////////// JFABase ////////////////////
-bob::learn::misc::JFABase::JFABase()
-{
-}
-
-bob::learn::misc::JFABase::JFABase(const boost::shared_ptr<bob::learn::misc::GMMMachine> ubm,
-    const size_t ru, const size_t rv):
-  m_base(ubm, ru, rv)
-{
-}
-
-bob::learn::misc::JFABase::JFABase(const bob::learn::misc::JFABase& other):
-  m_base(other.m_base)
-{
-}
-
-
-bob::learn::misc::JFABase::JFABase(bob::io::base::HDF5File& config)
-{
-  load(config);
-}
-
-bob::learn::misc::JFABase::~JFABase() {
-}
-
-void bob::learn::misc::JFABase::save(bob::io::base::HDF5File& config) const
-{
-  config.setArray("U", m_base.getU());
-  config.setArray("V", m_base.getV());
-  config.setArray("d", m_base.getD());
-}
-
-void bob::learn::misc::JFABase::load(bob::io::base::HDF5File& config)
-{
-  //reads all data directly into the member variables
-  blitz::Array<double,2> U = config.readArray<double,2>("U");
-  blitz::Array<double,2> V = config.readArray<double,2>("V");
-  blitz::Array<double,1> d = config.readArray<double,1>("d");
-  const int ru = U.extent(1);
-  const int rv = V.extent(1);
-  if (!m_base.getUbm())
-    m_base.resize(ru, rv, U.extent(0));
-  else
-    m_base.resize(ru, rv);
-  m_base.setU(U);
-  m_base.setV(V);
-  m_base.setD(d);
-}
-
-bob::learn::misc::JFABase&
-bob::learn::misc::JFABase::operator=(const bob::learn::misc::JFABase& other)
-{
-  if (this != &other)
-  {
-    m_base = other.m_base;
-  }
-  return *this;
-}
-
-
-//////////////////// ISVBase ////////////////////
-bob::learn::misc::ISVBase::ISVBase()
-{
-}
-
-bob::learn::misc::ISVBase::ISVBase(const boost::shared_ptr<bob::learn::misc::GMMMachine> ubm,
-    const size_t ru):
-  m_base(ubm, ru, 1)
-{
-  blitz::Array<double,2>& V = m_base.updateV();
-  V = 0;
-}
-
-bob::learn::misc::ISVBase::ISVBase(const bob::learn::misc::ISVBase& other):
-  m_base(other.m_base)
-{
-}
-
-
-bob::learn::misc::ISVBase::ISVBase(bob::io::base::HDF5File& config)
-{
-  load(config);
-}
-
-bob::learn::misc::ISVBase::~ISVBase() {
-}
-
-void bob::learn::misc::ISVBase::save(bob::io::base::HDF5File& config) const
-{
-  config.setArray("U", m_base.getU());
-  config.setArray("d", m_base.getD());
-}
-
-void bob::learn::misc::ISVBase::load(bob::io::base::HDF5File& config)
-{
-  //reads all data directly into the member variables
-  blitz::Array<double,2> U = config.readArray<double,2>("U");
-  blitz::Array<double,1> d = config.readArray<double,1>("d");
-  const int ru = U.extent(1);
-  if (!m_base.getUbm())
-    m_base.resize(ru, 1, U.extent(0));
-  else
-    m_base.resize(ru, 1);
-  m_base.setU(U);
-  m_base.setD(d);
-  blitz::Array<double,2>& V = m_base.updateV();
-  V = 0;
-}
-
-bob::learn::misc::ISVBase&
-bob::learn::misc::ISVBase::operator=(const bob::learn::misc::ISVBase& other)
-{
-  if (this != &other)
-  {
-    m_base = other.m_base;
-  }
-  return *this;
-}
-
-
-
 //////////////////// JFAMachine ////////////////////
 bob::learn::misc::JFAMachine::JFAMachine():
   m_y(1), m_z(1)
@@ -438,7 +24,7 @@ bob::learn::misc::JFAMachine::JFAMachine():
 
 bob::learn::misc::JFAMachine::JFAMachine(const boost::shared_ptr<bob::learn::misc::JFABase> jfa_base):
   m_jfa_base(jfa_base),
-  m_y(jfa_base->getDimRv()), m_z(jfa_base->getDimCD())
+  m_y(jfa_base->getDimRv()), m_z(jfa_base->getSupervectorLength())
 {
   if (!m_jfa_base->getUbm()) throw std::runtime_error("No UBM was set in the JFA machine.");
   updateCache();
@@ -556,7 +142,7 @@ void bob::learn::misc::JFAMachine::setJFABase(const boost::shared_ptr<bob::learn
 void bob::learn::misc::JFAMachine::resize()
 {
   m_y.resizeAndPreserve(getDimRv());
-  m_z.resizeAndPreserve(getDimCD());
+  m_z.resizeAndPreserve(getSupervectorLength());
   updateCache();
   resizeTmp();
 }
@@ -565,7 +151,7 @@ void bob::learn::misc::JFAMachine::resizeTmp()
 {
   if (m_jfa_base)
   {
-    m_tmp_Ux.resize(getDimCD());
+    m_tmp_Ux.resize(getSupervectorLength());
   }
 }
 
@@ -574,7 +160,7 @@ void bob::learn::misc::JFAMachine::updateCache()
   if (m_jfa_base)
   {
     // m + Vy + Dz
-    m_cache_mVyDz.resize(getDimCD());
+    m_cache_mVyDz.resize(getSupervectorLength());
     bob::math::prod(m_jfa_base->getV(), m_y, m_cache_mVyDz);
     m_cache_mVyDz += m_jfa_base->getD()*m_z + m_jfa_base->getUbm()->getMeanSupervector();
     m_cache_x.resize(getDimRu());
@@ -620,172 +206,3 @@ void bob::learn::misc::JFAMachine::forward_(const bob::learn::misc::GMMStats& in
             input, m_tmp_Ux, true);
 }
 
-
-
-//////////////////// ISVMachine ////////////////////
-bob::learn::misc::ISVMachine::ISVMachine():
-  m_z(1)
-{
-  resizeTmp();
-}
-
-bob::learn::misc::ISVMachine::ISVMachine(const boost::shared_ptr<bob::learn::misc::ISVBase> isv_base):
-  m_isv_base(isv_base),
-  m_z(isv_base->getDimCD())
-{
-  if (!m_isv_base->getUbm())
-    throw std::runtime_error("No UBM was set in the JFA machine.");
-  updateCache();
-  resizeTmp();
-}
-
-
-bob::learn::misc::ISVMachine::ISVMachine(const bob::learn::misc::ISVMachine& other):
-  m_isv_base(other.m_isv_base),
-  m_z(bob::core::array::ccopy(other.m_z))
-{
-  updateCache();
-  resizeTmp();
-}
-
-bob::learn::misc::ISVMachine::ISVMachine(bob::io::base::HDF5File& config)
-{
-  load(config);
-}
-
-bob::learn::misc::ISVMachine::~ISVMachine() {
-}
-
-bob::learn::misc::ISVMachine&
-bob::learn::misc::ISVMachine::operator=(const bob::learn::misc::ISVMachine& other)
-{
-  if (this != &other)
-  {
-    m_isv_base = other.m_isv_base;
-    m_z.reference(bob::core::array::ccopy(other.m_z));
-  }
-  return *this;
-}
-
-bool bob::learn::misc::ISVMachine::operator==(const bob::learn::misc::ISVMachine& other) const
-{
-  return (*m_isv_base == *(other.m_isv_base) &&
-          bob::core::array::isEqual(m_z, other.m_z));
-}
-
-bool bob::learn::misc::ISVMachine::operator!=(const bob::learn::misc::ISVMachine& b) const
-{
-  return !(this->operator==(b));
-}
-
-
-bool bob::learn::misc::ISVMachine::is_similar_to(const bob::learn::misc::ISVMachine& b,
-    const double r_epsilon, const double a_epsilon) const
-{
-  return (m_isv_base->is_similar_to(*(b.m_isv_base), r_epsilon, a_epsilon) &&
-          bob::core::array::isClose(m_z, b.m_z, r_epsilon, a_epsilon));
-}
-
-void bob::learn::misc::ISVMachine::save(bob::io::base::HDF5File& config) const
-{
-  config.setArray("z", m_z);
-}
-
-void bob::learn::misc::ISVMachine::load(bob::io::base::HDF5File& config)
-{
-  //reads all data directly into the member variables
-  blitz::Array<double,1> z = config.readArray<double,1>("z");
-  if (!m_isv_base)
-    m_z.resize(z.extent(0));
-  setZ(z);
-  // update cache
-  updateCache();
-  resizeTmp();
-}
-
-void bob::learn::misc::ISVMachine::setZ(const blitz::Array<double,1>& z)
-{
-  if(z.extent(0) != m_z.extent(0)) { //checks dimension
-    boost::format m("size of input vector `z' (%d) does not match the expected size (%d)");
-    m % z.extent(0) % m_z.extent(0);
-    throw std::runtime_error(m.str());
-  }
-  m_z.reference(bob::core::array::ccopy(z));
-  // update cache
-  updateCache();
-}
-
-void bob::learn::misc::ISVMachine::setISVBase(const boost::shared_ptr<bob::learn::misc::ISVBase> isv_base)
-{
-  if (!isv_base->getUbm())
-    throw std::runtime_error("No UBM was set in the JFA machine.");
-  m_isv_base = isv_base;
-  // Resize variables
-  resize();
-}
-
-void bob::learn::misc::ISVMachine::resize()
-{
-  m_z.resizeAndPreserve(getDimCD());
-  updateCache();
-  resizeTmp();
-}
-
-void bob::learn::misc::ISVMachine::resizeTmp()
-{
-  if (m_isv_base)
-  {
-    m_tmp_Ux.resize(getDimCD());
-  }
-}
-
-void bob::learn::misc::ISVMachine::updateCache()
-{
-  if (m_isv_base)
-  {
-    // m + Dz
-    m_cache_mDz.resize(getDimCD());
-    m_cache_mDz = m_isv_base->getD()*m_z + m_isv_base->getUbm()->getMeanSupervector();
-    m_cache_x.resize(getDimRu());
-  }
-}
-
-void bob::learn::misc::ISVMachine::estimateUx(const bob::learn::misc::GMMStats& gmm_stats,
-  blitz::Array<double,1>& Ux)
-{
-  estimateX(gmm_stats, m_cache_x);
-  bob::math::prod(m_isv_base->getU(), m_cache_x, Ux);
-}
-
-void bob::learn::misc::ISVMachine::forward(const bob::learn::misc::GMMStats& input,
-  double& score) const
-{
-  forward_(input, score);
-}
-
-void bob::learn::misc::ISVMachine::forward(const bob::learn::misc::GMMStats& gmm_stats,
-  const blitz::Array<double,1>& Ux, double& score) const
-{
-  // Checks that a Base machine has been set
-  if (!m_isv_base) throw std::runtime_error("No UBM was set in the JFA machine.");
-
-  score = bob::learn::misc::linearScoring(m_cache_mDz,
-            m_isv_base->getUbm()->getMeanSupervector(), m_isv_base->getUbm()->getVarianceSupervector(),
-            gmm_stats, Ux, true);
-}
-
-void bob::learn::misc::ISVMachine::forward_(const bob::learn::misc::GMMStats& input,
-  double& score) const
-{
-  // Checks that a Base machine has been set
-  if(!m_isv_base) throw std::runtime_error("No UBM was set in the JFA machine.");
-
-  // Ux and GMMStats
-  estimateX(input, m_cache_x);
-  bob::math::prod(m_isv_base->getU(), m_cache_x, m_tmp_Ux);
-
-  score = bob::learn::misc::linearScoring(m_cache_mDz,
-            m_isv_base->getUbm()->getMeanSupervector(), m_isv_base->getUbm()->getVarianceSupervector(),
-            input, m_tmp_Ux, true);
-}
-
diff --git a/bob/learn/misc/cpp/LinearScoring.cpp b/bob/learn/misc/cpp/LinearScoring.cpp
index e9b2365c8a065de47e8974f31c90d86f3abcdfcc..e504f229ab8baae9e8c0488cb6898457eaa8e31e 100644
--- a/bob/learn/misc/cpp/LinearScoring.cpp
+++ b/bob/learn/misc/cpp/LinearScoring.cpp
@@ -101,7 +101,7 @@ void bob::learn::misc::linearScoring(const std::vector<boost::shared_ptr<const b
   // Allocate and get the mean supervector
   for(size_t i=0; i<models.size(); ++i) {
     blitz::Array<double,1> mod(CD);
-    models[i]->getMeanSupervector(mod);
+    mod = models[i]->getMeanSupervector();
     models_b.push_back(mod);
   }
   const blitz::Array<double,1>& ubm_mean = ubm.getMeanSupervector();
@@ -123,7 +123,7 @@ void bob::learn::misc::linearScoring(const std::vector<boost::shared_ptr<const b
   // Allocate and get the mean supervector
   for(size_t i=0; i<models.size(); ++i) {
     blitz::Array<double,1> mod(CD);
-    models[i]->getMeanSupervector(mod);
+    mod = models[i]->getMeanSupervector();
     models_b.push_back(mod);
   }
   const blitz::Array<double,1>& ubm_mean = ubm.getMeanSupervector();