diff --git a/bob/pad/face/algorithm/VideoCascadeSvmPadAlgorithm.py b/bob/pad/face/algorithm/VideoCascadeSvmPadAlgorithm.py
index 2f04d931bdf935016dce6da21d9781f3c9d49d33..c5690a61a2488918f2c806fd4a746f0de6dd6f0a 100644
--- a/bob/pad/face/algorithm/VideoCascadeSvmPadAlgorithm.py
+++ b/bob/pad/face/algorithm/VideoCascadeSvmPadAlgorithm.py
@@ -994,7 +994,16 @@ class VideoCascadeSvmPadAlgorithm(Algorithm):
         all_scores_array   = np.stack(all_scores, axis = 1).astype(np.float)
 
         # 4. Combine the scores:
-        scores =self.combine_scores_of_svm_cascade(all_scores_array, self.pos_scores_slope)
+
+        one_class_flag = (svm_machine.machine_type == 'ONE_CLASS') # True if one-class SVM is used
+
+        if not(one_class_flag):
+
+            scores = np.mean(all_scores_array, axis = 1) # compute mean for two-class SVM
+
+        else: # one class SVM case
+
+            scores = self.combine_scores_of_svm_cascade(all_scores_array, self.pos_scores_slope)
 
         return scores
 
diff --git a/bob/pad/face/algorithm/VideoGmmPadAlgorithm.py b/bob/pad/face/algorithm/VideoGmmPadAlgorithm.py
new file mode 100644
index 0000000000000000000000000000000000000000..366e3fd01882c859247d16c23b9989538155dd74
--- /dev/null
+++ b/bob/pad/face/algorithm/VideoGmmPadAlgorithm.py
@@ -0,0 +1,476 @@
+#!/usr/bin/env python2
+# -*- coding: utf-8 -*-
+"""
+Created on Mon Aug 28 16:47:47 2017
+
+@author: Olegs Nikisins
+"""
+
+#==============================================================================
+# Import what is needed here:
+
+from bob.pad.base.algorithm import Algorithm
+
+from bob.bio.video.utils import FrameContainer
+
+import numpy as np
+
+import bob.io.base
+
+from sklearn import mixture
+
+
+#==============================================================================
+# Main body :
+
+class VideoGmmPadAlgorithm(Algorithm):
+    """
+    This class is designed to train a GMM based PAD system. The GMM is trained
+    using data of one class (real class) only. The procedure is the following:
+
+    1. First, the training data is mean-std normalized using mean and std of the
+       real class only.
+
+    2. Second, the GMM with ``n_components`` Gaussians is trained using samples
+       of the real class.
+
+    3. The input features are next classified using pre-trained GMM machine.
+
+    **Parameters:**
+
+    ``n_components`` : :py:class:`int`
+        Number of Gaussians in the GMM. Default: 1 .
+
+    ``random_state`` : :py:class:`int`
+        A seed for the random number generator used in the initialization of
+        the GMM. Default: 7 .
+
+    ``frame_level_scores_flag`` : :py:class:`bool`
+        Return scores for each frame individually if True. Otherwise, return a
+        single score per video. Default: False.
+    """
+
+    def __init__(self,
+                 n_components = 1,
+                 random_state = 7,
+                 frame_level_scores_flag = False):
+
+
+        Algorithm.__init__(self,
+                           n_components = n_components,
+                           random_state = random_state,
+                           frame_level_scores_flag = frame_level_scores_flag,
+                           performs_projection=True,
+                           requires_projector_training=True)
+
+        self.n_components = n_components
+
+        self.random_state = random_state
+
+        self.frame_level_scores_flag = frame_level_scores_flag
+
+        self.machine = None # this argument will be updated with pretrained GMM machine
+
+        self.features_mean = None # this argument will be updated with features mean
+
+        self.features_std = None # this argument will be updated with features std
+
+        # names of the arguments of the pretrained GMM machine to be saved/loaded to/from HDF5 file:
+        self.gmm_param_keys = ["covariance_type", "covariances_", "lower_bound_", "means_", "n_components", "weights_", "converged_", "precisions_", "precisions_cholesky_" ]
+
+
+    #==========================================================================
+    def convert_frame_cont_to_array(self, frame_container):
+        """
+        This function converts a single Frame Container into an array of features.
+        The rows are samples, the columns are features.
+
+        **Parameters:**
+
+        ``frame_container`` : object
+            A Frame Container conteining the features of an individual,
+            see ``bob.bio.video.utils.FrameContainer``.
+
+        **Returns:**
+
+        ``features_array`` : 2D :py:class:`numpy.ndarray`
+            An array containing features for all frames.
+            The rows are samples, the columns are features.
+        """
+
+        feature_vectors = []
+
+        frame_dictionary = {}
+
+        for frame in frame_container:
+
+            frame_dictionary[frame[0]] = frame[1]
+
+        for idx, _ in enumerate(frame_container):
+
+            # Frames are stored in a mixed order, therefore we get them using incrementing frame index:
+            feature_vectors.append(frame_dictionary[str(idx)])
+
+        features_array = np.vstack(feature_vectors)
+
+        return features_array
+
+
+    #==========================================================================
+    def convert_list_of_frame_cont_to_array(self, frame_containers):
+        """
+        This function converts a list of Frame containers into an array of features.
+        Features from different frame containers (individuals) are concatenated into the
+        same list. This list is then converted to an array. The rows are samples,
+        the columns are features.
+
+        **Parameters:**
+
+        ``frame_containers`` : [FrameContainer]
+            A list of Frame Containers, , see ``bob.bio.video.utils.FrameContainer``.
+            Each frame Container contains feature vectors for the particular individual/person.
+
+        **Returns:**
+
+        ``features_array`` : 2D :py:class:`numpy.ndarray`
+            An array containing features for all frames of all individuals.
+        """
+
+        feature_vectors = []
+
+        for frame_container in frame_containers:
+
+            video_features_array = self.convert_frame_cont_to_array(frame_container)
+
+            feature_vectors.append( video_features_array )
+
+        features_array = np.vstack(feature_vectors)
+
+        return features_array
+
+
+    #==========================================================================
+    def mean_std_normalize(self, features, features_mean= None, features_std = None):
+        """
+        The features in the input 2D array are mean-std normalized.
+        The rows are samples, the columns are features. If ``features_mean``
+        and ``features_std`` are provided, then these vectors will be used for
+        normalization. Otherwise, the mean and std of the features is
+        computed on the fly.
+
+        **Parameters:**
+
+        ``features`` : 2D :py:class:`numpy.ndarray`
+            Array of features to be normalized.
+
+        ``features_mean`` : 1D :py:class:`numpy.ndarray`
+            Mean of the features. Default: None.
+
+        ``features_std`` : 2D :py:class:`numpy.ndarray`
+            Standart deviation of the features. Default: None.
+
+        **Returns:**
+
+        ``features_norm`` : 2D :py:class:`numpy.ndarray`
+            Normalized array of features.
+
+        ``features_mean`` : 1D :py:class:`numpy.ndarray`
+            Mean of the features.
+
+        ``features_std`` : 1D :py:class:`numpy.ndarray`
+            Standart deviation of the features.
+        """
+
+        features = np.copy(features)
+
+        # Compute mean and std if not given:
+        if features_mean is None:
+
+            features_mean = np.mean(features, axis=0)
+
+            features_std = np.std(features, axis=0)
+
+        row_norm_list = []
+
+        for row in features: # row is a sample
+
+            row_norm = (row - features_mean) / features_std
+
+            row_norm_list.append(row_norm)
+
+        features_norm = np.vstack(row_norm_list)
+
+        return features_norm, features_mean, features_std
+
+
+    #==========================================================================
+    def train_gmm(self, real, n_components, random_state):
+        """
+        Train GMM classifier given real class. Prior to the training the data is
+        mean-std normalized.
+
+        **Parameters:**
+
+        ``real`` : 2D :py:class:`numpy.ndarray`
+            Training features for the real class.
+
+        ``n_components`` : :py:class:`int`
+            Number of Gaussians in the GMM. Default: 1 .
+
+        ``random_state`` : :py:class:`int`
+            A seed for the random number generator used in the initialization of
+            the GMM. Default: 7 .
+
+        **Returns:**
+
+        ``machine`` : object
+            A trained GMM machine.
+
+        ``features_mean`` : 1D :py:class:`numpy.ndarray`
+            Mean of the features.
+
+        ``features_std`` : 1D :py:class:`numpy.ndarray`
+            Standart deviation of the features.
+        """
+
+        features_norm, features_mean, features_std = self.mean_std_normalize(real)
+        # real is now mean-std normalized
+
+        machine = mixture.GaussianMixture(n_components = n_components,
+                                          random_state = random_state,
+                                          covariance_type = 'full')
+
+        machine.fit( features_norm )
+
+        return machine, features_mean, features_std
+
+
+    #==========================================================================
+    def save_gmm_machine_and_mean_std(self, projector_file, machine, features_mean, features_std):
+        """
+        Saves the GMM machine, features mean and std to the hdf5 file.
+        The absolute name of the file is specified in ``projector_file`` string.
+
+        **Parameters:**
+
+        ``projector_file`` : :py:class:`str`
+            Absolute name of the file to save the data to, as returned by
+            ``bob.pad.base`` framework.
+
+        ``machine`` : object
+            The GMM machine to be saved. As returned by sklearn.linear_model
+            module.
+
+        ``features_mean`` : 1D :py:class:`numpy.ndarray`
+            Mean of the features.
+
+        ``features_std`` : 1D :py:class:`numpy.ndarray`
+            Standart deviation of the features.
+        """
+
+        f = bob.io.base.HDF5File(projector_file, 'w') # open hdf5 file to save to
+
+        for key in self.gmm_param_keys:
+
+            data = getattr( machine, key )
+
+            f.set( key, data )
+
+        f.set( "features_mean", features_mean )
+
+        f.set( "features_std", features_std )
+
+        del f
+
+
+    #==========================================================================
+    def train_projector(self, training_features, projector_file):
+        """
+        Train GMM for feature projection and save it to file.
+        The ``requires_projector_training = True`` flag must be set to True
+        to enable this function.
+
+        **Parameters:**
+
+        ``training_features`` : [[FrameContainer], [FrameContainer]]
+            A list containing two elements: [0] - a list of Frame Containers with
+            feature vectors for the real class; [1] - a list of Frame Containers with
+            feature vectors for the attack class.
+
+        ``projector_file`` : :py:class:`str`
+            The file to save the trained projector to, as returned by the
+            ``bob.pad.base`` framework.
+        """
+
+        # training_features[0] - training features for the REAL class.
+        real = self.convert_list_of_frame_cont_to_array(training_features[0]) # output is array
+
+        # training_features[1] - training features for the ATTACK class.
+#        attack = self.convert_list_of_frame_cont_to_array(training_features[1]) # output is array
+
+        # Train the GMM machine and get normalizers:
+        machine, features_mean, features_std = self.train_gmm(real = real,
+                                                              n_components = self.n_components,
+                                                              random_state = self.random_state)
+
+        # Save the GNN machine and normalizers:
+        self.save_gmm_machine_and_mean_std(projector_file, machine, features_mean, features_std)
+
+
+    #==========================================================================
+    def load_gmm_machine_and_mean_std(self, projector_file):
+        """
+        Loads the machine, features mean and std from the hdf5 file.
+        The absolute name of the file is specified in ``projector_file`` string.
+
+        **Parameters:**
+
+        ``projector_file`` : :py:class:`str`
+            Absolute name of the file to load the trained projector from, as
+            returned by ``bob.pad.base`` framework.
+
+        **Returns:**
+
+        ``machine`` : object
+            The loaded GMM machine. As returned by sklearn.mixture module.
+
+        ``features_mean`` : 1D :py:class:`numpy.ndarray`
+            Mean of the features.
+
+        ``features_std`` : 1D :py:class:`numpy.ndarray`
+            Standart deviation of the features.
+        """
+
+        f = bob.io.base.HDF5File(projector_file, 'r') # file to read the machine from
+
+        # initialize the machine:
+        machine = mixture.GaussianMixture()
+
+        # set the params of the machine:
+        for key in self.gmm_param_keys:
+
+            data = f.read(key)
+
+            setattr(machine, key, data)
+
+        features_mean = f.read("features_mean")
+
+        features_std = f.read("features_std")
+
+        del f
+
+        return machine, features_mean, features_std
+
+
+    #==========================================================================
+    def load_projector(self, projector_file):
+        """
+        Loads the machine, features mean and std from the hdf5 file.
+        The absolute name of the file is specified in ``projector_file`` string.
+
+        This function sets the arguments ``self.machine``, ``self.features_mean``
+        and ``self.features_std`` of this class with loaded machines.
+
+        The function must be capable of reading the data saved with the
+        :py:meth:`train_projector` method of this class.
+
+        Please register `performs_projection = True` in the constructor to
+        enable this function.
+
+        **Parameters:**
+
+        ``projector_file`` : :py:class:`str`
+            The file to read the projector from, as returned by the
+            ``bob.pad.base`` framework. In this class the names of the files to
+            read the projectors from are modified, see ``load_machine`` and
+            ``load_cascade_of_machines`` methods of this class for more details.
+        """
+
+        machine, features_mean, features_std = self.load_gmm_machine_and_mean_std(projector_file)
+
+        self.machine = machine
+
+        self.features_mean = features_mean
+
+        self.features_std = features_std
+
+
+    #==========================================================================
+    def project(self, feature):
+        """
+        This function computes a vector of scores for each sample in the input
+        array of features. The following steps are applied:
+
+        1. First, the input data is mean-std normalized using mean and std of the
+           real class only.
+
+        2. The input features are next classified using pre-trained GMM machine.
+
+        Set ``performs_projection = True`` in the constructor to enable this function.
+        It is assured that the :py:meth:`load_projector` was **called before** the
+        ``project`` function is executed.
+
+        **Parameters:**
+
+        ``feature`` : FrameContainer or 2D :py:class:`numpy.ndarray`
+            Two types of inputs are accepted.
+            A Frame Container conteining the features of an individual,
+            see ``bob.bio.video.utils.FrameContainer``.
+            Or a 2D feature array of the size (N_samples x N_features).
+
+        **Returns:**
+
+        ``scores`` : 1D :py:class:`numpy.ndarray`
+            Vector of scores. Scores for the real class are expected to be
+            higher, than the scores of the negative / attack class.
+            In this case scores are the weighted log probabilities.
+        """
+
+        # 1. Convert input array to numpy array if necessary.
+        if isinstance(feature, FrameContainer): # if FrameContainer convert to 2D numpy array
+
+            features_array = self.convert_frame_cont_to_array(feature)
+
+        else:
+
+            features_array = feature
+
+        features_array_norm, _, _ = self.mean_std_normalize(features_array, self.features_mean, self.features_std)
+
+        scores = self.machine.score_samples( features_array_norm )
+
+        return scores
+
+
+    #==========================================================================
+    def score(self, toscore):
+        """
+        Returns a probability of a sample being a real class.
+
+        **Parameters:**
+
+        ``toscore`` : 1D :py:class:`numpy.ndarray`
+            Vector with scores for each frame/sample defining the probability
+            of the frame being a sample of the real class.
+
+        **Returns:**
+
+        ``score`` : [:py:class:`float`]
+            If ``frame_level_scores_flag = False`` a single score is returned.
+            One score per video. This score is placed into a list, because
+            the ``score`` must be an iterable.
+            Score is a probability of a sample being a real class.
+            If ``frame_level_scores_flag = True`` a list of scores is returned.
+            One score per frame/sample.
+        """
+
+        if self.frame_level_scores_flag:
+
+            score = list(toscore)
+
+        else:
+
+            score = [np.mean( toscore )] # compute a single score per video
+
+        return score
+
diff --git a/bob/pad/face/algorithm/VideoLRPadAlgorithm.py b/bob/pad/face/algorithm/VideoLRPadAlgorithm.py
index a078fb6b9ad3cd0bac4445a293e59da3abcba276..833bd858923eea2051cf0b938dce35348683728b 100644
--- a/bob/pad/face/algorithm/VideoLRPadAlgorithm.py
+++ b/bob/pad/face/algorithm/VideoLRPadAlgorithm.py
@@ -25,7 +25,7 @@ import bob.io.base
 
 class VideoLRPadAlgorithm(Algorithm):
     """
-    This class is designed to Logistic Regression classifier given Frame Containers
+    This class is designed to train Logistic Regression classifier given Frame Containers
     with features of real and attack classes. The procedure is the following:
 
     1. First, the input data is mean-std normalized using mean and std of the
@@ -255,8 +255,7 @@ class VideoLRPadAlgorithm(Algorithm):
         **Returns:**
 
         ``machine`` : object
-            A trained LR machine. The mean-std normalizers are also set in the
-            machine.
+            A trained LR machine.
 
         ``features_mean`` : 1D :py:class:`numpy.ndarray`
             Mean of the features.
diff --git a/bob/pad/face/algorithm/__init__.py b/bob/pad/face/algorithm/__init__.py
index 3ef1ea1c5da23998f47a172c21121658933c4e3e..eeb27d59b563e895d3bd2f975fc87cb24060a228 100644
--- a/bob/pad/face/algorithm/__init__.py
+++ b/bob/pad/face/algorithm/__init__.py
@@ -1,6 +1,7 @@
 from .VideoSvmPadAlgorithm import VideoSvmPadAlgorithm
 from .VideoCascadeSvmPadAlgorithm import VideoCascadeSvmPadAlgorithm
 from .VideoLRPadAlgorithm import VideoLRPadAlgorithm
+from .VideoGmmPadAlgorithm import VideoGmmPadAlgorithm
 
 def __appropriate__(*args):
     """Says object was actually declared here, and not in the import module.
@@ -24,5 +25,6 @@ __appropriate__(
     VideoSvmPadAlgorithm,
     VideoCascadeSvmPadAlgorithm,
     VideoLRPadAlgorithm,
+    VideoGmmPadAlgorithm,
 )
 __all__ = [_ for _ in dir() if not _.startswith('_')]
diff --git a/bob/pad/face/config/algorithm/video_cascade_svm_pad_algorithm.py b/bob/pad/face/config/algorithm/video_cascade_svm_pad_algorithm.py
index edd34b0123b256c720ba66d6fcd3ebc208f56c7d..f0ee742ea33ee5226ca752f5caabadb0d4569ed4 100644
--- a/bob/pad/face/config/algorithm/video_cascade_svm_pad_algorithm.py
+++ b/bob/pad/face/config/algorithm/video_cascade_svm_pad_algorithm.py
@@ -241,3 +241,26 @@ algorithm_n2_gamma_01_video_level = VideoCascadeSvmPadAlgorithm(machine_type = M
                                         frame_level_scores_flag = FRAME_LEVEL_SCORES_FLAG)
 
 
+#=======================================================================================
+
+# Test the cascade of two-class SVMs.
+
+MACHINE_TYPE = 'C_SVC'
+KERNEL_TYPE = 'RBF'
+TRAINER_GRID_SEARCH_PARAMS = {'cost': 1, 'gamma': 0.01}
+N = 2
+POS_SCORES_SLOPE = 0.01
+FRAME_LEVEL_SCORES_FLAG = True
+
+algorithm_n2_two_class_svm_c1_gamma_001 = VideoCascadeSvmPadAlgorithm(machine_type = MACHINE_TYPE,
+                                                                      kernel_type = KERNEL_TYPE,
+                                                                      svm_kwargs = TRAINER_GRID_SEARCH_PARAMS,
+                                                                      N = N,
+                                                                      pos_scores_slope = POS_SCORES_SLOPE,
+                                                                      frame_level_scores_flag = FRAME_LEVEL_SCORES_FLAG)
+
+
+
+
+
+
diff --git a/bob/pad/face/config/algorithm/video_gmm_pad_algorithm.py b/bob/pad/face/config/algorithm/video_gmm_pad_algorithm.py
new file mode 100644
index 0000000000000000000000000000000000000000..e46e285d97a7fbbf9561b62a488d90bd4d5eac15
--- /dev/null
+++ b/bob/pad/face/config/algorithm/video_gmm_pad_algorithm.py
@@ -0,0 +1,257 @@
+#!/usr/bin/env python
+
+from bob.pad.face.algorithm import VideoGmmPadAlgorithm
+
+
+#=======================================================================================
+# Define instances here:
+
+N_COMPONENTS = 2
+FRAME_LEVEL_SCORES_FLAG = True
+
+algorithm_gmm_2 = VideoGmmPadAlgorithm(n_components = N_COMPONENTS,
+                                        frame_level_scores_flag = FRAME_LEVEL_SCORES_FLAG)
+
+N_COMPONENTS = 3
+FRAME_LEVEL_SCORES_FLAG = True
+
+algorithm_gmm_3 = VideoGmmPadAlgorithm(n_components = N_COMPONENTS,
+                                        frame_level_scores_flag = FRAME_LEVEL_SCORES_FLAG)
+
+N_COMPONENTS = 4
+FRAME_LEVEL_SCORES_FLAG = True
+
+algorithm_gmm_4 = VideoGmmPadAlgorithm(n_components = N_COMPONENTS,
+                                        frame_level_scores_flag = FRAME_LEVEL_SCORES_FLAG)
+
+N_COMPONENTS = 5
+FRAME_LEVEL_SCORES_FLAG = True
+
+algorithm_gmm_5 = VideoGmmPadAlgorithm(n_components = N_COMPONENTS,
+                                        frame_level_scores_flag = FRAME_LEVEL_SCORES_FLAG)
+
+N_COMPONENTS = 6
+FRAME_LEVEL_SCORES_FLAG = True
+
+algorithm_gmm_6 = VideoGmmPadAlgorithm(n_components = N_COMPONENTS,
+                                        frame_level_scores_flag = FRAME_LEVEL_SCORES_FLAG)
+
+N_COMPONENTS = 7
+FRAME_LEVEL_SCORES_FLAG = True
+
+algorithm_gmm_7 = VideoGmmPadAlgorithm(n_components = N_COMPONENTS,
+                                        frame_level_scores_flag = FRAME_LEVEL_SCORES_FLAG)
+
+N_COMPONENTS = 8
+FRAME_LEVEL_SCORES_FLAG = True
+
+algorithm_gmm_8 = VideoGmmPadAlgorithm(n_components = N_COMPONENTS,
+                                        frame_level_scores_flag = FRAME_LEVEL_SCORES_FLAG)
+
+N_COMPONENTS = 9
+FRAME_LEVEL_SCORES_FLAG = True
+
+algorithm_gmm_9 = VideoGmmPadAlgorithm(n_components = N_COMPONENTS,
+                                        frame_level_scores_flag = FRAME_LEVEL_SCORES_FLAG)
+
+N_COMPONENTS = 10
+FRAME_LEVEL_SCORES_FLAG = True
+
+algorithm_gmm_10 = VideoGmmPadAlgorithm(n_components = N_COMPONENTS,
+                                        frame_level_scores_flag = FRAME_LEVEL_SCORES_FLAG)
+
+
+#=======================================================================================
+# above 10 Gaussians:
+
+N_COMPONENTS = 12
+FRAME_LEVEL_SCORES_FLAG = True
+
+algorithm_gmm_12 = VideoGmmPadAlgorithm(n_components = N_COMPONENTS,
+                                        frame_level_scores_flag = FRAME_LEVEL_SCORES_FLAG)
+
+N_COMPONENTS = 14
+FRAME_LEVEL_SCORES_FLAG = True
+
+algorithm_gmm_14 = VideoGmmPadAlgorithm(n_components = N_COMPONENTS,
+                                        frame_level_scores_flag = FRAME_LEVEL_SCORES_FLAG)
+
+N_COMPONENTS = 16
+FRAME_LEVEL_SCORES_FLAG = True
+
+algorithm_gmm_16 = VideoGmmPadAlgorithm(n_components = N_COMPONENTS,
+                                        frame_level_scores_flag = FRAME_LEVEL_SCORES_FLAG)
+
+N_COMPONENTS = 18
+FRAME_LEVEL_SCORES_FLAG = True
+
+algorithm_gmm_18 = VideoGmmPadAlgorithm(n_components = N_COMPONENTS,
+                                        frame_level_scores_flag = FRAME_LEVEL_SCORES_FLAG)
+
+N_COMPONENTS = 20
+FRAME_LEVEL_SCORES_FLAG = True
+
+algorithm_gmm_20 = VideoGmmPadAlgorithm(n_components = N_COMPONENTS,
+                                        frame_level_scores_flag = FRAME_LEVEL_SCORES_FLAG)
+
+
+#=======================================================================================
+# above 20 Gaussians:
+
+N_COMPONENTS = 25
+FRAME_LEVEL_SCORES_FLAG = True
+
+algorithm_gmm_25 = VideoGmmPadAlgorithm(n_components = N_COMPONENTS,
+                                        frame_level_scores_flag = FRAME_LEVEL_SCORES_FLAG)
+
+N_COMPONENTS = 30
+FRAME_LEVEL_SCORES_FLAG = True
+
+algorithm_gmm_30 = VideoGmmPadAlgorithm(n_components = N_COMPONENTS,
+                                        frame_level_scores_flag = FRAME_LEVEL_SCORES_FLAG)
+
+N_COMPONENTS = 35
+FRAME_LEVEL_SCORES_FLAG = True
+
+algorithm_gmm_35 = VideoGmmPadAlgorithm(n_components = N_COMPONENTS,
+                                        frame_level_scores_flag = FRAME_LEVEL_SCORES_FLAG)
+
+N_COMPONENTS = 40
+FRAME_LEVEL_SCORES_FLAG = True
+
+algorithm_gmm_40 = VideoGmmPadAlgorithm(n_components = N_COMPONENTS,
+                                        frame_level_scores_flag = FRAME_LEVEL_SCORES_FLAG)
+
+N_COMPONENTS = 45
+FRAME_LEVEL_SCORES_FLAG = True
+
+algorithm_gmm_45 = VideoGmmPadAlgorithm(n_components = N_COMPONENTS,
+                                        frame_level_scores_flag = FRAME_LEVEL_SCORES_FLAG)
+
+N_COMPONENTS = 50
+FRAME_LEVEL_SCORES_FLAG = True
+
+algorithm_gmm_50 = VideoGmmPadAlgorithm(n_components = N_COMPONENTS,
+                                        frame_level_scores_flag = FRAME_LEVEL_SCORES_FLAG)
+
+
+#=======================================================================================
+# above 50 Gaussians:
+
+N_COMPONENTS = 60
+FRAME_LEVEL_SCORES_FLAG = True
+
+algorithm_gmm_60 = VideoGmmPadAlgorithm(n_components = N_COMPONENTS,
+                                        frame_level_scores_flag = FRAME_LEVEL_SCORES_FLAG)
+
+N_COMPONENTS = 70
+FRAME_LEVEL_SCORES_FLAG = True
+
+algorithm_gmm_70 = VideoGmmPadAlgorithm(n_components = N_COMPONENTS,
+                                        frame_level_scores_flag = FRAME_LEVEL_SCORES_FLAG)
+
+N_COMPONENTS = 80
+FRAME_LEVEL_SCORES_FLAG = True
+
+algorithm_gmm_80 = VideoGmmPadAlgorithm(n_components = N_COMPONENTS,
+                                        frame_level_scores_flag = FRAME_LEVEL_SCORES_FLAG)
+
+N_COMPONENTS = 90
+FRAME_LEVEL_SCORES_FLAG = True
+
+algorithm_gmm_90 = VideoGmmPadAlgorithm(n_components = N_COMPONENTS,
+                                        frame_level_scores_flag = FRAME_LEVEL_SCORES_FLAG)
+
+N_COMPONENTS = 100
+FRAME_LEVEL_SCORES_FLAG = True
+
+algorithm_gmm_100 = VideoGmmPadAlgorithm(n_components = N_COMPONENTS,
+                                        frame_level_scores_flag = FRAME_LEVEL_SCORES_FLAG)
+
+
+
+#=======================================================================================
+# 50 Gaussians, different random seeds:
+
+N_COMPONENTS = 50
+RANDOM_STATE = 0
+FRAME_LEVEL_SCORES_FLAG = True
+
+algorithm_gmm_50_0 = VideoGmmPadAlgorithm(n_components = N_COMPONENTS,
+                                        random_state = RANDOM_STATE,
+                                        frame_level_scores_flag = FRAME_LEVEL_SCORES_FLAG)
+
+N_COMPONENTS = 50
+RANDOM_STATE = 1
+FRAME_LEVEL_SCORES_FLAG = True
+
+algorithm_gmm_50_1 = VideoGmmPadAlgorithm(n_components = N_COMPONENTS,
+                                        random_state = RANDOM_STATE,
+                                        frame_level_scores_flag = FRAME_LEVEL_SCORES_FLAG)
+
+N_COMPONENTS = 50
+RANDOM_STATE = 2
+FRAME_LEVEL_SCORES_FLAG = True
+
+algorithm_gmm_50_2 = VideoGmmPadAlgorithm(n_components = N_COMPONENTS,
+                                        random_state = RANDOM_STATE,
+                                        frame_level_scores_flag = FRAME_LEVEL_SCORES_FLAG)
+
+N_COMPONENTS = 50
+RANDOM_STATE = 3
+FRAME_LEVEL_SCORES_FLAG = True
+
+algorithm_gmm_50_3 = VideoGmmPadAlgorithm(n_components = N_COMPONENTS,
+                                        random_state = RANDOM_STATE,
+                                        frame_level_scores_flag = FRAME_LEVEL_SCORES_FLAG)
+
+N_COMPONENTS = 50
+RANDOM_STATE = 4
+FRAME_LEVEL_SCORES_FLAG = True
+
+algorithm_gmm_50_4 = VideoGmmPadAlgorithm(n_components = N_COMPONENTS,
+                                        random_state = RANDOM_STATE,
+                                        frame_level_scores_flag = FRAME_LEVEL_SCORES_FLAG)
+
+N_COMPONENTS = 50
+RANDOM_STATE = 5
+FRAME_LEVEL_SCORES_FLAG = True
+
+algorithm_gmm_50_5 = VideoGmmPadAlgorithm(n_components = N_COMPONENTS,
+                                        random_state = RANDOM_STATE,
+                                        frame_level_scores_flag = FRAME_LEVEL_SCORES_FLAG)
+
+N_COMPONENTS = 50
+RANDOM_STATE = 6
+FRAME_LEVEL_SCORES_FLAG = True
+
+algorithm_gmm_50_6 = VideoGmmPadAlgorithm(n_components = N_COMPONENTS,
+                                        random_state = RANDOM_STATE,
+                                        frame_level_scores_flag = FRAME_LEVEL_SCORES_FLAG)
+
+N_COMPONENTS = 50
+RANDOM_STATE = 7
+FRAME_LEVEL_SCORES_FLAG = True
+
+algorithm_gmm_50_7 = VideoGmmPadAlgorithm(n_components = N_COMPONENTS,
+                                        random_state = RANDOM_STATE,
+                                        frame_level_scores_flag = FRAME_LEVEL_SCORES_FLAG)
+
+N_COMPONENTS = 50
+RANDOM_STATE = 8
+FRAME_LEVEL_SCORES_FLAG = True
+
+algorithm_gmm_50_8 = VideoGmmPadAlgorithm(n_components = N_COMPONENTS,
+                                        random_state = RANDOM_STATE,
+                                        frame_level_scores_flag = FRAME_LEVEL_SCORES_FLAG)
+
+N_COMPONENTS = 50
+RANDOM_STATE = 9
+FRAME_LEVEL_SCORES_FLAG = True
+
+algorithm_gmm_50_9 = VideoGmmPadAlgorithm(n_components = N_COMPONENTS,
+                                        random_state = RANDOM_STATE,
+                                        frame_level_scores_flag = FRAME_LEVEL_SCORES_FLAG)
+
+
+
diff --git a/setup.py b/setup.py
index 9d1c453f075068e2173678eaad4dc717eca4273f..f92af0e183a59e2247598341c5a0dd89416c8dcb 100644
--- a/setup.py
+++ b/setup.py
@@ -120,6 +120,7 @@ setup(
             'algorithm-n2-gamma-005 = bob.pad.face.config.algorithm.video_cascade_svm_pad_algorithm:algorithm_n2_gamma_005',
             'algorithm-n2-gamma-001 = bob.pad.face.config.algorithm.video_cascade_svm_pad_algorithm:algorithm_n2_gamma_001',
             'algorithm-n2-gamma-01-video-level = bob.pad.face.config.algorithm.video_cascade_svm_pad_algorithm:algorithm_n2_gamma_01_video_level',
+            'algorithm-n2-two-class-svm-c1-gamma-001 = bob.pad.face.config.algorithm.video_cascade_svm_pad_algorithm:algorithm_n2_two_class_svm_c1_gamma_001',
 
             # for grid search experiments with cascade of SVMs N = 10
             'algorithm-n10-gamma-01 = bob.pad.face.config.algorithm.video_cascade_svm_pad_algorithm:algorithm_n10_gamma_01',
@@ -135,6 +136,43 @@ setup(
             'algorithm-n20-gamma-001 = bob.pad.face.config.algorithm.video_cascade_svm_pad_algorithm:algorithm_n20_gamma_001',
             'algorithm-n20-gamma-0005 = bob.pad.face.config.algorithm.video_cascade_svm_pad_algorithm:algorithm_n20_gamma_0005',
             'algorithm-n20-gamma-0001 = bob.pad.face.config.algorithm.video_cascade_svm_pad_algorithm:algorithm_n20_gamma_0001',
+
+            # for grid search experiments using GMM
+            'algorithm-gmm-2 = bob.pad.face.config.algorithm.video_gmm_pad_algorithm:algorithm_gmm_2',
+            'algorithm-gmm-3 = bob.pad.face.config.algorithm.video_gmm_pad_algorithm:algorithm_gmm_3',
+            'algorithm-gmm-4 = bob.pad.face.config.algorithm.video_gmm_pad_algorithm:algorithm_gmm_4',
+            'algorithm-gmm-5 = bob.pad.face.config.algorithm.video_gmm_pad_algorithm:algorithm_gmm_5',
+            'algorithm-gmm-6 = bob.pad.face.config.algorithm.video_gmm_pad_algorithm:algorithm_gmm_6',
+            'algorithm-gmm-7 = bob.pad.face.config.algorithm.video_gmm_pad_algorithm:algorithm_gmm_7',
+            'algorithm-gmm-8 = bob.pad.face.config.algorithm.video_gmm_pad_algorithm:algorithm_gmm_8',
+            'algorithm-gmm-9 = bob.pad.face.config.algorithm.video_gmm_pad_algorithm:algorithm_gmm_9',
+            'algorithm-gmm-10 = bob.pad.face.config.algorithm.video_gmm_pad_algorithm:algorithm_gmm_10',
+            'algorithm-gmm-12 = bob.pad.face.config.algorithm.video_gmm_pad_algorithm:algorithm_gmm_12',
+            'algorithm-gmm-14 = bob.pad.face.config.algorithm.video_gmm_pad_algorithm:algorithm_gmm_14',
+            'algorithm-gmm-16 = bob.pad.face.config.algorithm.video_gmm_pad_algorithm:algorithm_gmm_16',
+            'algorithm-gmm-18 = bob.pad.face.config.algorithm.video_gmm_pad_algorithm:algorithm_gmm_18',
+            'algorithm-gmm-20 = bob.pad.face.config.algorithm.video_gmm_pad_algorithm:algorithm_gmm_20',
+            'algorithm-gmm-25 = bob.pad.face.config.algorithm.video_gmm_pad_algorithm:algorithm_gmm_25',
+            'algorithm-gmm-30 = bob.pad.face.config.algorithm.video_gmm_pad_algorithm:algorithm_gmm_30',
+            'algorithm-gmm-35 = bob.pad.face.config.algorithm.video_gmm_pad_algorithm:algorithm_gmm_35',
+            'algorithm-gmm-40 = bob.pad.face.config.algorithm.video_gmm_pad_algorithm:algorithm_gmm_40',
+            'algorithm-gmm-45 = bob.pad.face.config.algorithm.video_gmm_pad_algorithm:algorithm_gmm_45',
+            'algorithm-gmm-50 = bob.pad.face.config.algorithm.video_gmm_pad_algorithm:algorithm_gmm_50',
+            'algorithm-gmm-60 = bob.pad.face.config.algorithm.video_gmm_pad_algorithm:algorithm_gmm_60',
+            'algorithm-gmm-70 = bob.pad.face.config.algorithm.video_gmm_pad_algorithm:algorithm_gmm_70',
+            'algorithm-gmm-80 = bob.pad.face.config.algorithm.video_gmm_pad_algorithm:algorithm_gmm_80',
+            'algorithm-gmm-90 = bob.pad.face.config.algorithm.video_gmm_pad_algorithm:algorithm_gmm_90',
+            'algorithm-gmm-100 = bob.pad.face.config.algorithm.video_gmm_pad_algorithm:algorithm_gmm_100',
+            'algorithm-gmm-50-0 = bob.pad.face.config.algorithm.video_gmm_pad_algorithm:algorithm_gmm_50_0',
+            'algorithm-gmm-50-1 = bob.pad.face.config.algorithm.video_gmm_pad_algorithm:algorithm_gmm_50_1',
+            'algorithm-gmm-50-2 = bob.pad.face.config.algorithm.video_gmm_pad_algorithm:algorithm_gmm_50_2',
+            'algorithm-gmm-50-3 = bob.pad.face.config.algorithm.video_gmm_pad_algorithm:algorithm_gmm_50_3',
+            'algorithm-gmm-50-4 = bob.pad.face.config.algorithm.video_gmm_pad_algorithm:algorithm_gmm_50_4',
+            'algorithm-gmm-50-5 = bob.pad.face.config.algorithm.video_gmm_pad_algorithm:algorithm_gmm_50_5',
+            'algorithm-gmm-50-6 = bob.pad.face.config.algorithm.video_gmm_pad_algorithm:algorithm_gmm_50_6',
+            'algorithm-gmm-50-7 = bob.pad.face.config.algorithm.video_gmm_pad_algorithm:algorithm_gmm_50_7',
+            'algorithm-gmm-50-8 = bob.pad.face.config.algorithm.video_gmm_pad_algorithm:algorithm_gmm_50_8',
+            'algorithm-gmm-50-9 = bob.pad.face.config.algorithm.video_gmm_pad_algorithm:algorithm_gmm_50_9',
             ],
 
         # registered grid configurations: