diff --git a/bob/fusion/base/algorithm/Algorithm.py b/bob/fusion/base/algorithm/Algorithm.py
index 80200e6203ccd5fc7b9d0cc8563a6fc622b538cd..621f4a4ad1899b201e5c9285fce545c4af1188e6 100644
--- a/bob/fusion/base/algorithm/Algorithm.py
+++ b/bob/fusion/base/algorithm/Algorithm.py
@@ -15,9 +15,7 @@ class Algorithm(object):
   """docstring for Algorithm"""
 
   def __init__(self,
-               scores=None,
                performs_training=False,
-               trainer_scores=None,
                has_closed_form_solution=False,
                preprocessors=None,
                *args,
@@ -31,36 +29,35 @@ class Algorithm(object):
 
 """
     super(Algorithm, self).__init__()
-    self.scores = scores
     self.performs_training = performs_training
-    self.trainer_scores = trainer_scores
     self.has_closed_form_solution = has_closed_form_solution
     self.preprocessors = preprocessors
     self._kwargs = kwargs
     self._kwargs['preprocessors'] = preprocessors
 
+  def train_preprocessors(self, X):
+    if self.preprocessors is not None:
+      for preprocessor in self.preprocessors:
+        X = preprocessor.fit_transform(X)
+
   def preprocess(self, scores):
     if self.preprocessors is not None:
-      for i, (preprocessor, trained) in enumerate(self.preprocessors):
-        if not trained:
-          train_scores = np.vstack(self.trainer_scores)
-          preprocessor.fit(train_scores)
-          self.preprocessors[i] = (preprocessor, True)
-        scores = self.preprocessor.transform(scores)
+      for preprocessor in self.preprocessors:
+        scores = preprocessor.transform(scores)
     return scores
 
-  def train(self):
-    negatives, positives = self.trainer_scores
-    train_scores = np.vstack(self.trainer_scores)
-    train_scores = self.preprocess(train_scores)
+  def train(self, train, devel=None):
+    if devel is None:
+      devel = train
+    (negatives, positives) = train
+    train_scores = np.vstack((negatives, positives))
     neg_len = negatives.shape[0]
     y = np.zeros((train_scores.shape[0],), dtype='bool')
     y[neg_len:] = True
     self.fit(train_scores, y)
 
-  def __call__(self):
-    self.scores = self.preprocess(self.scores)
-    return self.decision_function(self.scores)
+  def fuse(self, scores):
+    return self.decision_function(scores)
 
   def plot_boundary_decision(self, score_labels, threshold,
                              label_system1='',
diff --git a/bob/fusion/base/algorithm/MLP.py b/bob/fusion/base/algorithm/MLP.py
index 4dac5742de84080274ad41951d1c2b9b079e806b..9af9abd279653d3fbf5fd6d5d2e16140a68e74c1 100644
--- a/bob/fusion/base/algorithm/MLP.py
+++ b/bob/fusion/base/algorithm/MLP.py
@@ -5,7 +5,7 @@ from __future__ import absolute_import
 
 import bob.learn.mlp
 import bob.core.random
-
+import bob.io.base
 import numpy
 
 from .Algorithm import Algorithm
@@ -25,6 +25,8 @@ class MLP(Algorithm):
                hidden_layers=None,
                trainer_devel=None,
                seed=None,
+               machine=None,
+               trainer=None,
                *args, **kwargs):
     # chicken and egg :D call __init__ twice.
     super(MLP, self).__init__(performs_training=True, *args, **kwargs)
@@ -35,8 +37,11 @@ class MLP(Algorithm):
     self.mlp_shape = [n_systems] + hidden_layers + [1]
     super(MLP, self).__init__(
         performs_training=True, mlp_shape=self.mlp_shape, seed=seed,
+        machine=str(machine), trainer=str(trainer),
         *args, **kwargs)
     self.seed = seed
+    self.machine = machine
+    self.trainer = trainer
     self.trainer_devel = trainer_devel if trainer_devel else \
         self.trainer_scores
     self._my_kwargs = kwargs
@@ -85,3 +90,17 @@ class MLP(Algorithm):
     if scores.ndim == 2 and scores.shape[1] == 1:
       scores = scores.ravel()
     return scores
+
+  def save(self, model_file):
+    d5 = bob.io.base.HDF5File(model_file, "w")
+    try:
+      self.machine.save(d5)
+    finally:
+      d5.close()
+
+  def load(self, model_file):
+    d5 = bob.io.base.HDF5File(model_file)
+    try:
+      self.machine.load(d5)
+    finally:
+      d5.close()
diff --git a/bob/fusion/base/algorithm/Weighted_Sum.py b/bob/fusion/base/algorithm/Weighted_Sum.py
index 540fcc6b9e712e7c10203c78295846b353a36af0..3f1c9ae229f2c685078085de6809dfd024e85fcc 100644
--- a/bob/fusion/base/algorithm/Weighted_Sum.py
+++ b/bob/fusion/base/algorithm/Weighted_Sum.py
@@ -20,6 +20,9 @@ class Weighted_Sum(Algorithm):
       has_closed_form_solution=True, *args, **kwargs)
     self.weights = weights
 
+  def fit(self, X, y):
+    pass
+
   def decision_function(self, scores):
     if self.weights is None:
       return numpy.mean(scores, axis=1)
diff --git a/bob/fusion/base/algorithm/__init__.py b/bob/fusion/base/algorithm/__init__.py
index b119df913d31c817a07e39956bb3a8d9ff884601..3823cff5480839e9887344c5120688f52c64c575 100644
--- a/bob/fusion/base/algorithm/__init__.py
+++ b/bob/fusion/base/algorithm/__init__.py
@@ -2,7 +2,6 @@ from .Algorithm import Algorithm
 from .Weighted_Sum import Weighted_Sum
 from .LogisticRegression import LogisticRegression
 from .MLP import MLP
-from .MLPClassifier import MLPClassifier
 
 # gets sphinx autodoc done right - don't remove it
 __all__ = [_ for _ in dir() if not _.startswith('_')]
diff --git a/run.sh b/run.sh
index 94c50fec6da45a7ace66e632f6395a18751f0ec0..c1cbf2135eb2efefb8b619a6a2d2a4aebdab2ef1 100755
--- a/run.sh
+++ b/run.sh
@@ -5,5 +5,5 @@ INPUT1="-i  /home/amir/idiap/remote/user/mobio-male/baselines/gmm/male/ztnorm/sc
 INPUT2="-I  /home/amir/idiap/remote/user/mobio-male/baselines/gmm/male/ztnorm/scores-eval /home/amir/idiap/remote/user/mobio-male/baselines/gabor-graph/male/ztnorm/scores-eval  /home/amir/idiap/remote/user/mobio-male/voice/gmm/male/ztnorm/scores-eval  /home/amir/idiap/remote/user/mobio-male/voice/isv/male/ztnorm/scores-eval"
 
 for HIDDEN_NODES in 5 10 25 50 100 200; do
-	./bin/fuse.py -vvv $INPUT1 $INPUT2 -o "/home/amir/idiap/remote/user/mobio-male/face-voice/F-gmm-gabor-graph-S-gmm-isv_MLP_${HIDDEN_NODES}/male/ztnorm/scores-dev" -O "/home/amir/idiap/remote/user/mobio-male/face-voice/F-gmm-gabor-graph-S-gmm-isv_MLP_${HIDDEN_NODES}/male/ztnorm/scores-eval" -a "bob.fusion.base.algorithm.MLP(preprocessors=[(sklearn.preprocessing.RobustScaler(), False)], n_systems=4, hidden_layers=[${HIDDEN_NODES}], seed=0)" --force --imports='sklearn.preprocessing' 'bob.fusion.base'
+	./bin/fuse.py -vvv $INPUT1 $INPUT2 -o "/home/amir/idiap/remote/user/mobio-male/face-voice/F-gmm-gabor-graph-S-gmm-isv_MLP_${HIDDEN_NODES}/male/ztnorm/scores-dev" -O "/home/amir/idiap/remote/user/mobio-male/face-voice/F-gmm-gabor-graph-S-gmm-isv_MLP_${HIDDEN_NODES}/male/ztnorm/scores-eval" -a "bob.fusion.base.algorithm.MLP(preprocessors=[(sklearn.preprocessing.RobustScaler(), False)], n_systems=4, hidden_layers=[${HIDDEN_NODES}], seed=0)" --force --imports='sklearn.preprocessing','bob.fusion.base'
 done