diff --git a/src/main/java/fr/pasteur/ida/zellige/gui/controller/MainController.java b/src/main/java/fr/pasteur/ida/zellige/gui/controller/MainController.java
index 267530c10293dc85544162291ccd146143ac1f85..a9ffc5368d89071f2371dbb4a7c061b844bebeb0 100644
--- a/src/main/java/fr/pasteur/ida/zellige/gui/controller/MainController.java
+++ b/src/main/java/fr/pasteur/ida/zellige/gui/controller/MainController.java
@@ -71,7 +71,7 @@ public class MainController< T extends RealType< T > & NativeType< T > > impleme
 
     private final static Logger LOGGER = LoggerFactory.getLogger( MainController.class );
     private final SimpleObjectProperty< Dataset > currentDataset = new SimpleObjectProperty<>();
-    private final SimpleObjectProperty< ClassifiedImages< FloatType > > images = new SimpleObjectProperty<>();
+    //private final SimpleObjectProperty< ClassifiedImages< FloatType > > images = new SimpleObjectProperty<>();
     private final SimpleObjectProperty< Img< FloatType > > pretreatedImg = new SimpleObjectProperty<>();
     private final SimpleBooleanProperty disableGUI = new SimpleBooleanProperty();
     private final SimpleBooleanProperty changedParameters = new SimpleBooleanProperty();
@@ -83,7 +83,7 @@ public class MainController< T extends RealType< T > & NativeType< T > > impleme
 
 
     @FXML
-    private PreprocessingController< T > preprocessingController;
+    private PreprocessingController preprocessingController;
     @FXML
     private SelectionController< T > selectionController;
     @FXML
@@ -114,7 +114,7 @@ public class MainController< T extends RealType< T > & NativeType< T > > impleme
 
 
         model = new MainModel<>( preprocessingController.getModel(), selectionController.getModel(), constructionController.getConstructionModel(), projectionController.getModel() );
-
+        selectionController.setParent(this);
 
 
 
@@ -140,32 +140,42 @@ public class MainController< T extends RealType< T > & NativeType< T > > impleme
 
         currentDataset.addListener( ( observableValue, dataset, t1 ) ->
         {
-            if ( t1 != null )
-            {
-                selectionController.disableParameters();
-                disableGUI.setValue( true );
-                runPretreatment( currentDataset.getValue() );
-            }
-            else
+            if (t1 == null)
             {
                 pretreatedImg.setValue( null );
                 LOGGER.debug( "PRETREATED_IMAGE is NULL" );
             }
+//            if ( t1 != null )
+//            {
+//                selectionController.disableParameters();
+//                disableGUI.setValue( true );
+//                preprocessingController.runPreprocessing( );
+//            }
+//            else
+//            {
+//                pretreatedImg.setValue( null );
+//                LOGGER.debug( "PRETREATED_IMAGE is NULL" );
+//            }
         } );
 
 
-        pretreatedImg.addListener( ( observable, oldValue, newValue ) ->
-        {
-            if ( newValue != null )
-            {
-                computeClassifiedImages();
-            }
-            else
-            {
-                images.setValue( null );
-                LOGGER.debug( "IMAGES is NULL" );
-            }
-        } );
+//        pretreatedImg.addListener( ( observable, oldValue, newValue ) ->
+//        {
+//            if ( newValue == null )
+//            {
+//                images.setValue( null );
+//                LOGGER.debug( "IMAGES is NULL" );
+//            }
+////            if ( newValue != null )
+////            {
+////                computeClassifiedImages();
+////            }
+////            else
+////            {
+////                images.setValue( null );
+////                LOGGER.debug( "IMAGES is NULL" );
+////            }
+//        } );
 
         disableGUI.addListener( ( observable, oldValue, newValue ) ->
                 runButton.setDisable( newValue ) );
@@ -181,9 +191,9 @@ public class MainController< T extends RealType< T > & NativeType< T > > impleme
 
         /* Binding properties*/
         preprocessingController.getModel().currentDatasetProperty().bind( currentDataset );
-        preprocessingController.getModel().pretreatedImgProperty().bind( pretreatedImg );
+        preprocessingController.getModel().pretreatedImgProperty().bindBidirectional( pretreatedImg );
         selectionController.getModel().pretreatedImgProperty().bind( pretreatedImg );
-        selectionController.getModel().imagesProperty().bind( images );
+        //selectionController.getModel().imagesProperty().bind( images );
         constructionController.getConstructionModel().maximumsProperty().bind( selectionController.getModel().selectedPixelsProperty() );
         projectionController.getModel().referenceSurfacesProperty().bind( constructionController.getConstructionModel().referenceSurfacesProperty() );
         changedParameters.bindBidirectional( selectionController.changedParametersProperty() );
@@ -250,18 +260,13 @@ public class MainController< T extends RealType< T > & NativeType< T > > impleme
         LOGGER.debug( "###########################################---NEW RUN---###########################################" );
     }
 
-    private void runPreprocessing( Dataset dataset )
-    {
-       // AbstractTask< Img<T> > task = new BinningTask<>( pr )
-    }
-
-    private void runPretreatment( Dataset dataset )
-    {
-        AbstractTask< Img< FloatType > > task = new PreprocessingTask<>( dataset, 2, 2 );//TODO default value to change
-        task.setOnSucceeded( workerStateEvent ->
-                pretreatedImg.setValue( task.getValue() ) );
-        task.start();
-    }
+//    private void runPretreatment( Dataset dataset )
+//    {
+//        AbstractTask< Img< FloatType > > task = new PreprocessingTask<>( dataset, 2, 2 ); //TODO default value to change
+//        task.setOnSucceeded( workerStateEvent ->
+//                pretreatedImg.setValue( task.getValue() ) );
+//        task.start();
+//    }
 
     public void setAndDisplayDatasetChoices()
     {
@@ -273,7 +278,7 @@ public class MainController< T extends RealType< T > & NativeType< T > > impleme
             list.add( null );
             activeDatasets.setItems( list );
 
-            LOGGER.debug( "item selected : list size = " + list.size() );
+            LOGGER.debug( "item selected : list size = {}" , list.size() );
             if ( list.isEmpty() )
             {
                 currentDataset.setValue( null );
@@ -294,12 +299,7 @@ public class MainController< T extends RealType< T > & NativeType< T > > impleme
 
     }
 
-    public void computeClassifiedImages()
-    {
-        ComputeClassificationImagesTask classifiedImagesTask = new ComputeClassificationImagesTask( pretreatedImg.getValue() );
-        classifiedImagesTask.setOnSucceeded( workerStateEvent -> images.set( classifiedImagesTask.getValue() ) );
-        classifiedImagesTask.start();
-    }
+
 
     public void setMainApp( MainAppFrame mainAppFrame )
     {
@@ -410,5 +410,34 @@ public class MainController< T extends RealType< T > & NativeType< T > > impleme
         }
         return true;
     }
+
+//    public static void setNextOutputToNull( SimpleObjectProperty<?> property, SimpleObjectProperty<?> nextOutput)
+//    {
+//        property.addListener( ( observable, oldValue, newValue ) ->
+//        {
+//            if (newValue != oldValue && newValue != null)
+//            {
+//                LOGGER.debug( "The output {} is set to null.", nextOutput.getName());
+//               nextOutput.set( null );
+//            }
+//        });
+//    }
+//
+//    public static void resetResultFromParameter( SimpleObjectProperty<?> result, Control parameter)
+//    {
+//        result.addListener( ( observable, oldValue, newValue ) ->
+//        {
+//            if (newValue != oldValue && newValue != null)
+//            {
+//                LOGGER.debug( "The output {} is set to null due to parameter update.", result.getName());
+//                result.set( null );
+//            }
+//        });
+//    }
+
+    public PreprocessingController getPreprocessingController()
+    {
+        return preprocessingController;
+    }
 }
 
diff --git a/src/main/java/fr/pasteur/ida/zellige/gui/controller/PreprocessingController.java b/src/main/java/fr/pasteur/ida/zellige/gui/controller/PreprocessingController.java
index 78f3212bede7ca12b262e889d914ed48ae1d2cc4..442ae78bea75a3697aedadf7bde2168c27e5483d 100644
--- a/src/main/java/fr/pasteur/ida/zellige/gui/controller/PreprocessingController.java
+++ b/src/main/java/fr/pasteur/ida/zellige/gui/controller/PreprocessingController.java
@@ -1,22 +1,16 @@
 package fr.pasteur.ida.zellige.gui.controller;
 
 import fr.pasteur.ida.zellige.gui.PreprocessingPanel;
-import fr.pasteur.ida.zellige.gui.exception.NoA3DStackException;
-import fr.pasteur.ida.zellige.gui.exception.NoInputException;
-import fr.pasteur.ida.zellige.gui.exception.TimeLapseException;
 import fr.pasteur.ida.zellige.gui.model.PreprocessingModel;
-import fr.pasteur.ida.zellige.gui.task.DisplayDatasetChoicesTask;
-import javafx.collections.FXCollections;
-import javafx.collections.ObservableList;
+import fr.pasteur.ida.zellige.gui.task.AbstractTask;
+import fr.pasteur.ida.zellige.gui.task.PreprocessingTask;
 import javafx.fxml.FXML;
 import javafx.fxml.FXMLLoader;
 import javafx.fxml.Initializable;
-import javafx.scene.control.ComboBox;
 import javafx.scene.control.Spinner;
 import javafx.scene.control.SpinnerValueFactory;
-import net.imagej.Dataset;
-import net.imglib2.type.NativeType;
-import net.imglib2.type.numeric.RealType;
+import net.imglib2.img.Img;
+import net.imglib2.type.numeric.real.FloatType;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -25,7 +19,7 @@ import java.util.ResourceBundle;
 
 
 
-public class PreprocessingController < T extends RealType< T > & NativeType< T > > implements Initializable
+public class PreprocessingController implements Initializable
 {
 
     private final static Logger LOGGER = LoggerFactory.getLogger( PreprocessingController.class );
@@ -42,7 +36,6 @@ public class PreprocessingController < T extends RealType< T > & NativeType< T >
                 "fr.pasteur.ida.zellige.gui.view/PreprocessingPanel.fxml" ) );
         fxmlLoader.setRoot( this );
         fxmlLoader.setController( this );
-
     }
 
 
@@ -53,18 +46,29 @@ public class PreprocessingController < T extends RealType< T > & NativeType< T >
         model = new PreprocessingModel();
 
         //link Model with View
-        model.binProperty().bind(bin.valueProperty()); // link between model and controller
+
 
         /* Control of the bin Spinner*/
         SpinnerValueFactory< Integer > valueFactory =
                 new SpinnerValueFactory.IntegerSpinnerValueFactory( 1, 10, 1 );
         bin.setValueFactory( valueFactory );
 
-        bin.valueProperty().addListener( ( observableValue, number, newValue ) ->
-                model.runPreprocessingTask());
+//        bin.valueProperty().addListener( ( observableValue, number, newValue ) ->
+//                runPreprocessing());
+        model.binProperty().bind( bin.getValueFactory().valueProperty()); // link between model and controller
 
     }
 
+    public void runPreprocessing()
+    {
+        AbstractTask< Img< FloatType > > task = new PreprocessingTask<>(model.getCurrentDataset(), 2, model.getBin()  );
+        task.setOnSucceeded( workerStateEvent ->
+                model.pretreatedImgProperty().set( task.getValue()  ));
+
+        task.start();
+    }
+
+
     public PreprocessingModel getModel()
     {
         return model;
diff --git a/src/main/java/fr/pasteur/ida/zellige/gui/controller/SelectionController.java b/src/main/java/fr/pasteur/ida/zellige/gui/controller/SelectionController.java
index a00d308a8a3dc5fedb80a11fc10315d0f959c16f..07e1acc0ea91fb6032391812f66077a5fdbc420b 100644
--- a/src/main/java/fr/pasteur/ida/zellige/gui/controller/SelectionController.java
+++ b/src/main/java/fr/pasteur/ida/zellige/gui/controller/SelectionController.java
@@ -28,16 +28,20 @@
  */
 package fr.pasteur.ida.zellige.gui.controller;
 
+import fr.pasteur.ida.zellige.gui.ParameterSlider;
 import fr.pasteur.ida.zellige.gui.ParameterSliderInteger;
 import fr.pasteur.ida.zellige.gui.ZSlicesSlider;
 import fr.pasteur.ida.zellige.gui.model.SelectionModel;
 import fr.pasteur.ida.zellige.gui.parameter.ZelligeParameters;
 import fr.pasteur.ida.zellige.gui.task.*;
 import javafx.beans.property.SimpleBooleanProperty;
+import javafx.beans.property.SimpleObjectProperty;
 import javafx.beans.value.ChangeListener;
 import javafx.fxml.FXML;
 import javafx.fxml.Initializable;
 import javafx.geometry.Pos;
+import javafx.scene.control.Button;
+import javafx.scene.control.Control;
 import javafx.scene.image.ImageView;
 import javafx.scene.layout.FlowPane;
 import net.imglib2.img.Img;
@@ -50,6 +54,8 @@ import org.slf4j.LoggerFactory;
 import java.net.URL;
 import java.util.ResourceBundle;
 
+
+
 public class SelectionController< T extends RealType< T > & NativeType< T > > implements Initializable
 {
     private final static Logger LOGGER = LoggerFactory.getLogger( SelectionController.class );
@@ -58,6 +64,7 @@ public class SelectionController< T extends RealType< T > & NativeType< T > > im
     private final SimpleBooleanProperty changedParameters = new SimpleBooleanProperty();
     private final SimpleBooleanProperty disableGUI = new SimpleBooleanProperty();
     private SelectionModel model;
+    private MainController<T> parentController;
 
     @FXML
     private ParameterSliderInteger amplitude;
@@ -73,12 +80,16 @@ public class SelectionController< T extends RealType< T > & NativeType< T > > im
     private ParameterSliderInteger zBlur;
     @FXML
     private ZSlicesSlider zSlices;
+    @FXML
+    private Button pixelSelection;
+
 
     @Override
     public void initialize( URL url, ResourceBundle resourceBundle )
     {
+
         // model
-        model = new SelectionModel();
+        model = new SelectionModel( );
 
         //link Model with View
         model.amplitudeProperty().bind( amplitude.sliderProperty() );
@@ -87,66 +98,106 @@ public class SelectionController< T extends RealType< T > & NativeType< T > > im
         model.xyBlurProperty().bind( xyBlur.sliderProperty() );
         model.zBlurProperty().bind( zBlur.sliderProperty() );
         model.disableGUIProperty().bindBidirectional( disableGUI );
+
+
         /* JavaFx Components */
 
         /* Amplitude slider initialization */
+//        amplitude.sliderProperty().addListener( ( observableValue, number, newValue ) ->
+//        {
+//            if ( amplitude.hasChanged( newValue ) && model.selectedAmplitudeProperty().getValue() != null )
+//            {
+//                disableGUI.setValue( true );
+//                runAmplitudeTask();
+//                changedParameters.setValue( true );
+//            }
+//        } );
+        // Set the linked output to null when the related parameter(s) is (are) changed.
+        resetResultFromParameter( model.selectedAmplitudeProperty(), amplitude);
+        resetResultFromParameter( model.selectedOtsuProperty(), otsu );
+        resetResultFromParameter( model.islandSearchImageProperty(), island );
+        resetResultFromParameter( model.selectedPixelsProperty(), zBlur );
+        resetResultFromParameter( model.selectedPixelsProperty(), xyBlur );
 
         amplitude.sliderProperty().addListener( ( observableValue, number, newValue ) ->
         {
-            if ( amplitude.hasChanged( newValue ) && model.selectedAmplitudeProperty().getValue() != null )
-            {
-                disableGUI.setValue( true );
-                runAmplitudeTask();
-                changedParameters.setValue( true );
-            }
-        } );
-
-        /* Otsu slider initialization */
-        otsu.sliderProperty().addListener( ( observableValue, number, newValue ) ->
-        {
-            if ( otsu.hasChanged( newValue ) && model.selectedOtsuProperty().getValue() != null )
+            if ( amplitude.hasChanged( newValue ))
             {
-                disableGUI.setValue( true );
-               runOtsuTask();
-                changedParameters.setValue( true );
+                model.selectedAmplitudeProperty().set( null );
             }
-        } );
+        });
 
-        island.getSlider().valueProperty().addListener( ( observableValue, number, t1 ) ->
-        {
-            if ( island.hasChanged( t1 ) )
-            {
-                model.setIslandSearchImage( null );
-                changedParameters.setValue( true );
-            }
-        } );
 
-        xyBlur.sliderProperty().addListener( ( observable, oldValue, newValue ) ->
-        {
-            if ( xyBlur.hasChanged( newValue ) )
-            {
-                model.setSelectedPixels( null );
-                changedParameters.setValue( true );
-            }
-        } );
-        zBlur.sliderProperty().addListener( ( observable, oldValue, newValue ) ->
-        {
-            if ( zBlur.hasChanged( newValue ) )
-            {
-                model.setSelectedPixels( null );
-                changedParameters.setValue( true );
-            }
-        } );
+        /* Otsu slider initialization */
+//        otsu.sliderProperty().addListener( ( observableValue, number, newValue ) ->
+//        {
+//            if ( otsu.hasChanged( newValue ) && model.selectedOtsuProperty().getValue() != null )
+//            {
+//                disableGUI.setValue( true );
+//               runOtsuTask();
+//                changedParameters.setValue( true );
+//            }
+//        } );
+
+//        otsu.sliderProperty().addListener( ( observableValue, number, newValue ) ->
+//        {
+//            if ( otsu.hasChanged( newValue ))
+//            {
+//                model.selectedOtsuProperty().set( null );
+//            }
+//        });
+
+//        island.getSlider().valueProperty().addListener( ( observableValue, number, t1 ) ->
+//        {
+//            if ( island.hasChanged( t1 ) )
+//            {
+//                model.setIslandSearchImage( null );
+//                changedParameters.setValue( true );
+//            }
+//        } );
+
+//        island.sliderProperty().addListener( ( observableValue, number, newValue ) ->
+//        {
+//            if ( island.hasChanged( newValue ))
+//            {
+//                model.islandSearchImageProperty().set( null );
+//            }
+//        });
+
+//        xyBlur.sliderProperty().addListener( ( observable, oldValue, newValue ) ->
+//        {
+//            if ( xyBlur.hasChanged( newValue ) )
+//            {
+//                model.setSelectedPixels( null );
+//                changedParameters.setValue( true );
+//            }
+//        } );
+//        zBlur.sliderProperty().addListener( ( observable, oldValue, newValue ) ->
+//        {
+//            if ( zBlur.hasChanged( newValue ) )
+//            {
+//                model.setSelectedPixels( null );
+//                changedParameters.setValue( true );
+//            }
+//        } );
         stack.setAlignment( Pos.CENTER );
 
         // section Slider initialization
-        zSlices.getSlider().valueProperty().addListener( ( observableValue, number, newValue ) ->
+//        zSlices.getSlider().valueProperty().addListener( ( observableValue, number, newValue ) ->
+//        {
+//            int newZValue = newValue.intValue();
+//            if ( zSlices.hasChanged( newZValue ) )
+//            {
+//                refreshDisplay( newZValue );
+//            }
+//        } );
+
+        pixelSelection.setOnAction( actionEvent ->
         {
-            int newZValue = newValue.intValue();
-            if ( zSlices.hasChanged( newZValue ) )
-            {
-                refreshDisplay( newZValue );
-            }
+            disableGUI.setValue( true );
+            changedParameters.setValue( false );
+            runPixelSelection();
+            //run2();
         } );
 
         /* Properties */
@@ -162,65 +213,137 @@ public class SelectionController< T extends RealType< T > & NativeType< T > > im
                 enableParameters();
             }
         } );
-        model.imagesProperty().addListener( ( observableValue, classifiedImages, t1 ) ->
+
+        /* Chain reaction : if one parameter value is changed the following outputs are reset. */
+        setNextOutputToNull( model.pretreatedImgProperty(), model.imagesProperty());
+
+        setNextOutputToNull( model.imagesProperty(), model.selectedAmplitudeProperty());
+        setNextOutputToNull( model.imagesProperty(), model.selectedOtsuProperty());
+
+        setNextOutputToNull( model.selectedAmplitudeProperty(), model.interClassifiedImageProperty() );
+        setNextOutputToNull( model.selectedOtsuProperty(), model.interClassifiedImageProperty() );
+
+        setNextOutputToNull( model.interClassifiedImageProperty(), model.islandSearchImageProperty() );
+
+
+        setNextOutputToNull( model.islandSearchImageProperty(), model.selectedPixelsProperty() );
+
+        setNextOutputToNull( model.selectedPixelsProperty(), model.imageViewsProperty()  );
+
+        model.pretreatedImgProperty().addListener( ( observableValue, number, newValue ) ->
         {
-            if ( t1 != null )
+            LOGGER.debug( "Pretreated image value update.");
+            if (newValue != null )
             {
-                runAmplitudeTask();
-                runOtsuTask();
+                LOGGER.debug( " Update value is valid : starting computing classified images" );
+                computeClassifiedImages();
             }
-            else
+            if (model.pretreatedImgProperty().getValue() == null)
             {
-                LOGGER.debug( "IMAGES is NULL" );
-                model.selectedAmplitudeProperty().setValue( null );
-                model.selectedOtsuProperty().setValue( null );
-                model.interClassifiedImageProperty().setValue( null );
+                parentController.getPreprocessingController().runPreprocessing();
             }
-
         } );
-        ChangeListener< Img< BitType > > listener = ( observableValue, bitTypeClassifiedImages, t1 ) ->
+
+        model.imagesProperty().addListener( ( observableValue, number, newValue ) ->
         {
-            if ( model.selectedAmplitudeProperty().getValue() != null && model.selectedOtsuProperty().getValue() != null )
+            if (newValue != null)
             {
-                runInterClassification();
-                LOGGER.debug( "Inter classification" );
+                runAmplitudeTask();
+                runOtsuTask();
             }
-            else
+        });
+
+        model.selectedAmplitudeProperty().addListener( ( observableValue, number, newValue ) ->
+        {
+            if ( newValue != null && model.selectedOtsuProperty().getValue() != null)
             {
-                LOGGER.debug( "SELECTED_AMPLITUDE or SELECTED_OTSU is NULL" );
-                model.interClassifiedImageProperty().setValue( null );
+               runInterClassification();
             }
+        });
 
-        };
-
-        model.selectedAmplitudeProperty().addListener( listener );
-        model.selectedOtsuProperty().addListener( listener );
-
+        model.selectedOtsuProperty().addListener( ( observableValue, number, newValue ) ->
+        {
+            if ( newValue != null && model.selectedAmplitudeProperty().getValue() != null)
+            {
+               runInterClassification();
+            }
+        });
 
-        model.interClassifiedImageProperty().addListener( ( observable, oldValue, newValue ) ->
+        model.interClassifiedImageProperty().addListener( ( observableValue, number, newValue ) ->
         {
-            LOGGER.info( "Computing double classification..." );
             if ( newValue != null )
             {
-                computeImageFXDisplay();
+                runIslandSearch();
             }
-            model.islandSearchImageProperty().setValue( null );
-        } );
+        });
 
-        model.islandSearchImageProperty().addListener( ( observableValue, bitTypes, t1 ) ->
+        model.islandSearchImageProperty().addListener( ( observableValue, number, newValue ) ->
         {
-            if ( t1 == null )
+            if ( newValue != null )
             {
-                LOGGER.debug( "ISLAND_SEARCH is NULL" );
-                model.selectedPixelsProperty().setValue( null );
+                runSmoothing();
             }
-            else
+        });
+
+        model.selectedPixelsProperty().addListener(  ( observableValue, number, newValue ) ->
+        {
+            if ( newValue != null )
             {
-                runSmoothing();
+                computeImageFXDisplay();
             }
-        } );
+        });
+
+//        ChangeListener< Img< BitType > > listener = ( observableValue, bitTypeClassifiedImages, t1 ) ->
+//        {
+//            if ( model.selectedAmplitudeProperty().getValue() != null && model.selectedOtsuProperty().getValue() != null )
+//            {
+//                runInterClassification();
+//                LOGGER.debug( "Inter classification" );
+//            }
+//            else
+//            {
+//                LOGGER.debug( "SELECTED_AMPLITUDE or SELECTED_OTSU is NULL" );
+//                model.interClassifiedImageProperty().setValue( null );
+//            }
+//
+//        };
+
+//        model.selectedAmplitudeProperty().addListener( listener );
+//        model.selectedOtsuProperty().addListener( listener );
+
+
+//        model.interClassifiedImageProperty().addListener( ( observable, oldValue, newValue ) ->
+//        {
+//            LOGGER.info( "Computing double classification..." );
+//            if ( newValue != null )
+//            {
+//                computeImageFXDisplay();
+//            }
+//            model.islandSearchImageProperty().setValue( null );
+//        } );
+//
+//        model.islandSearchImageProperty().addListener( ( observableValue, bitTypes, t1 ) ->
+//        {
+//            if ( t1 == null )
+//            {
+//                LOGGER.debug( "ISLAND_SEARCH is NULL" );
+//                model.selectedPixelsProperty().setValue( null );
+//            }
+//            else
+//            {
+//                runSmoothing();
+//            }
+//        } );
+    }
+    public void computeClassifiedImages()
+    {
+
+        ComputeClassificationImagesTask classifiedImagesTask = new ComputeClassificationImagesTask( model.pretreatedImgProperty().getValue() );
+        classifiedImagesTask.setOnSucceeded( workerStateEvent -> model.imagesProperty().set( classifiedImagesTask.getValue() ) );
+        classifiedImagesTask.start();
     }
 
+
     public void runAmplitudeTask()
     {
         AmplitudeThresholdingTask amplitudeTask = new AmplitudeThresholdingTask( model.imagesProperty().get().getAmplitudeImg(), model.amplitudeProperty().getValue().intValue() );
@@ -275,14 +398,31 @@ public class SelectionController< T extends RealType< T > & NativeType< T > > im
 
     public void runPixelSelection()
     {
-        if ( model.islandSearchImageProperty().getValue() == null )
+        LOGGER.debug("Starting pixel selection.");
+        if ( model.pretreatedImgProperty().getValue() == null)
+        {
+            parentController.getPreprocessingController().runPreprocessing();
+            //computeClassifiedImages();
+        }
+
+        else if ( model.selectedAmplitudeProperty().getValue() == null || model.selectedOtsuProperty().getValue() == null)
+        {
+
+            if ( model.selectedAmplitudeProperty().getValue() == null )
+            {
+                runAmplitudeTask();
+            }
+            if ( model.selectedOtsuProperty().getValue() == null )
+            {
+               runOtsuTask();
+            }
+        }
+        else if( model.islandSearchImageProperty().getValue() == null )
         {
-            LOGGER.debug( "Island search image is NULL" );
             runIslandSearch();
         }
         else if ( model.selectedPixelsProperty().getValue() == null )
         {
-            LOGGER.debug( "Island search image is not NULL" );
             runSmoothing();
         }
     }
@@ -405,4 +545,33 @@ public class SelectionController< T extends RealType< T > & NativeType< T > > im
         xyBlur.setValue( parameters.getXyBlur() );
         zBlur.setValue( parameters.getzBlur() );
     }
+
+    public void setParent( MainController< T > mainController )
+    {
+        parentController = mainController;
+    }
+
+    public static void setNextOutputToNull( SimpleObjectProperty<?> property, SimpleObjectProperty<?> nextOutput)
+    {
+        property.addListener( ( observable, oldValue, newValue ) ->
+        {
+            if (newValue != oldValue && newValue == null)
+            {
+                LOGGER.debug( "Next output set to null...." );
+                nextOutput.set( null );
+            }
+        });
+    }
+
+    public static void resetResultFromParameter( SimpleObjectProperty<?> result, ParameterSlider parameter)
+    {
+        parameter.sliderProperty().addListener( ( observable, oldValue, newValue ) ->
+        {
+            if (parameter.hasChanged( newValue ) && newValue != null )
+            {
+                LOGGER.debug( "The output {} is set to null due to parameter update.", result.getValue().getClass().getName() );
+                result.set( null );
+            }
+        });
+    }
 }
diff --git a/src/main/java/fr/pasteur/ida/zellige/gui/model/PreprocessingModel.java b/src/main/java/fr/pasteur/ida/zellige/gui/model/PreprocessingModel.java
index cd571811dc0058256fa3a0e2b6c4b75381a139c3..4d6f07808a9540529b4620c351ba6d5f879862d5 100644
--- a/src/main/java/fr/pasteur/ida/zellige/gui/model/PreprocessingModel.java
+++ b/src/main/java/fr/pasteur/ida/zellige/gui/model/PreprocessingModel.java
@@ -1,7 +1,5 @@
 package fr.pasteur.ida.zellige.gui.model;
 
-import fr.pasteur.ida.zellige.gui.task.AbstractTask;
-import fr.pasteur.ida.zellige.gui.task.PreprocessingTask;
 import javafx.beans.property.IntegerProperty;
 import javafx.beans.property.SimpleIntegerProperty;
 import javafx.beans.property.SimpleObjectProperty;
@@ -24,18 +22,14 @@ public class PreprocessingModel
         this.bin = new SimpleIntegerProperty();
     }
 
-    public void runBinningTask()
-    {
 
-    }
-
-    public void runPreprocessingTask()
-    {
-        AbstractTask< Img< FloatType > > task = new PreprocessingTask<>(currentDataset.get(), 2, getBin()  );
-        task.setOnSucceeded( workerStateEvent ->
-                pretreatedImg.setValue( task.getValue() ) );
-        task.start();
-    }
+//    public void runPreprocessingTask()
+//    {
+//        AbstractTask< Img< FloatType > > task = new PreprocessingTask<>(currentDataset.get(), 2, getBin()  );
+//        task.setOnSucceeded( workerStateEvent ->
+//                pretreatedImg.setValue( task.getValue() ) );
+//        task.start();
+//    }
 
     public int getBin()
     {
@@ -57,6 +51,8 @@ public class PreprocessingModel
         return pretreatedImg.get();
     }
 
+
+
     public SimpleObjectProperty< Img< FloatType > > pretreatedImgProperty()
     {
         return pretreatedImg;
diff --git a/src/main/java/fr/pasteur/ida/zellige/gui/model/SelectionModel.java b/src/main/java/fr/pasteur/ida/zellige/gui/model/SelectionModel.java
index 7a7b4284c3e28a07095843fa6850fea9c7936e7e..973fd4b2bf7aa48d6e5dd4ff4272f8a4ed09e45e 100644
--- a/src/main/java/fr/pasteur/ida/zellige/gui/model/SelectionModel.java
+++ b/src/main/java/fr/pasteur/ida/zellige/gui/model/SelectionModel.java
@@ -60,6 +60,9 @@ public class SelectionModel
     private final SimpleObjectProperty< Pixels[][] > selectedPixels = new SimpleObjectProperty<>();
     private final SimpleObjectProperty< ImageView[] > imageViews = new SimpleObjectProperty<>();
 
+
+
+
     public SelectionModel()
     {
         amplitude = new SimpleDoubleProperty();
diff --git a/src/main/resources/fr.pasteur.ida.zellige.gui.view/Selection.fxml b/src/main/resources/fr.pasteur.ida.zellige.gui.view/Selection.fxml
index 08e23d88d8158eb75380a12fda16204f4cac4b9b..1de5281a9aaf86f113a54ada084812c8e4103e32 100644
--- a/src/main/resources/fr.pasteur.ida.zellige.gui.view/Selection.fxml
+++ b/src/main/resources/fr.pasteur.ida.zellige.gui.view/Selection.fxml
@@ -1,68 +1,58 @@
 <?xml version="1.0" encoding="UTF-8"?>
 
 <!--suppress JavaFxDefaultTag -->
-<?import fr.pasteur.ida.zellige.gui.*?>
+
+<?import fr.pasteur.ida.zellige.gui.ParameterSliderInteger?>
+<?import fr.pasteur.ida.zellige.gui.StepPanel?>
+<?import fr.pasteur.ida.zellige.gui.ZSlicesSlider?>
 <?import javafx.geometry.Insets?>
+<?import javafx.scene.control.Button?>
 <?import javafx.scene.control.Label?>
-<?import javafx.scene.layout.*?>
-<StepPanel xmlns:fx="http://javafx.com/fxml" maxHeight="-Infinity" maxWidth="-Infinity"
-           minHeight="-Infinity" minWidth="-Infinity" name="Selection" prefHeight="336.0" prefWidth="815.0"
-           spacing="5.0" stylesheets="@theme2.css" xmlns="http://javafx.com/javafx"
-           fx:controller="fr.pasteur.ida.zellige.gui.controller.SelectionController">
+<?import javafx.scene.layout.ColumnConstraints?>
+<?import javafx.scene.layout.FlowPane?>
+<?import javafx.scene.layout.GridPane?>
+<?import javafx.scene.layout.HBox?>
+<?import javafx.scene.layout.RowConstraints?>
+<?import javafx.scene.layout.VBox?>
+
+<StepPanel maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" name="Selection" prefHeight="336.0" prefWidth="815.0" spacing="5.0" stylesheets="@theme2.css" xmlns="http://javafx.com/javafx/23.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="fr.pasteur.ida.zellige.gui.controller.SelectionController">
     <children>
         <HBox alignment="CENTER" minHeight="-Infinity" minWidth="-Infinity" prefHeight="293.0" prefWidth="815.0">
             <children>
-                <GridPane alignment="CENTER" maxHeight="1.7976931348623157E308"
-                          maxWidth="1.7976931348623157E308" minHeight="-Infinity" minWidth="-Infinity"
-                          prefHeight="265.0" prefWidth="414.0" vgap="5.0" HBox.hgrow="ALWAYS">
+                <GridPane alignment="CENTER" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" minHeight="-Infinity" minWidth="-Infinity" prefHeight="265.0" prefWidth="414.0" vgap="5.0" HBox.hgrow="ALWAYS">
                     <columnConstraints>
-                        <ColumnConstraints halignment="CENTER" hgrow="SOMETIMES" maxWidth="130.0" minWidth="10.0"
-                                           percentWidth="5.0" prefWidth="20.0"/>
-                        <ColumnConstraints hgrow="SOMETIMES" maxWidth="235.0" minWidth="10.0" percentWidth="95.0"
-                                           prefWidth="214.0"/>
+                        <ColumnConstraints halignment="CENTER" hgrow="SOMETIMES" maxWidth="130.0" minWidth="10.0" percentWidth="5.0" prefWidth="20.0" />
+                        <ColumnConstraints hgrow="SOMETIMES" maxWidth="235.0" minWidth="10.0" percentWidth="95.0" prefWidth="214.0" />
                     </columnConstraints>
                     <rowConstraints>
-                        <RowConstraints maxHeight="338.0" minHeight="10.0" prefHeight="205.0" vgrow="SOMETIMES"/>
-                        <RowConstraints maxHeight="446.0" minHeight="10.0" prefHeight="121.0" valignment="CENTER"
-                                        vgrow="SOMETIMES"/>
+                        <RowConstraints maxHeight="338.0" minHeight="10.0" prefHeight="205.0" vgrow="SOMETIMES" />
+                        <RowConstraints maxHeight="446.0" minHeight="10.0" prefHeight="121.0" valignment="CENTER" vgrow="SOMETIMES" />
                     </rowConstraints>
 
-                    <Label alignment="CENTER" minHeight="-Infinity" minWidth="-Infinity" prefHeight="16.0"
-                           prefWidth="100.0" rotate="-90.0" text="CLASSIFICATION" GridPane.halignment="CENTER"
-                           GridPane.valignment="CENTER"/>
-                    <Label alignment="CENTER" minHeight="-Infinity" minWidth="-Infinity" prefHeight="16.0"
-                           prefWidth="100.0" rotate="-90.0" text="SMOOTHING" GridPane.halignment="CENTER"
-                           GridPane.rowIndex="1" GridPane.valignment="CENTER"/>
-                    <VBox alignment="CENTER" prefHeight="168.0" prefWidth="400.0" GridPane.columnIndex="1"
-                          GridPane.halignment="CENTER" GridPane.valignment="CENTER">
-                        <ParameterSliderInteger fx:id="amplitude" default="10" increment="1" interval="%INTERVAL1"
-                                                major="10" max="50" min="0" minor="9" name="Amplitude"/>
-                        <ParameterSliderInteger fx:id="otsu" default="10" increment="1" interval="%INTERVAL1" major="10"
-                                                max="50" min="0" minor="9" name="Otsu" GridPane.rowIndex="1"/>
-                        <ParameterSliderInteger fx:id="island" default="5" increment="1" interval="%INTERVAL1"
-                                                major="10" max="50" min="0" minor="9" name="Island Search"
-                                                GridPane.rowIndex="2"/>
+                    <Label alignment="CENTER" minHeight="-Infinity" minWidth="-Infinity" prefHeight="16.0" prefWidth="100.0" rotate="-90.0" text="CLASSIFICATION" GridPane.halignment="CENTER" GridPane.valignment="CENTER" />
+                    <Label alignment="CENTER" minHeight="-Infinity" minWidth="-Infinity" prefHeight="16.0" prefWidth="100.0" rotate="-90.0" text="SMOOTHING" GridPane.halignment="CENTER" GridPane.rowIndex="1" GridPane.valignment="CENTER" />
+                    <VBox alignment="CENTER" prefHeight="168.0" prefWidth="400.0" GridPane.columnIndex="1" GridPane.halignment="CENTER" GridPane.valignment="CENTER">
+                        <ParameterSliderInteger fx:id="amplitude" default="10" increment="1" interval="%INTERVAL1" major="10" max="50" min="0" minor="9" name="Amplitude" />
+                        <ParameterSliderInteger fx:id="otsu" default="10" increment="1" interval="%INTERVAL1" major="10" max="50" min="0" minor="9" name="Otsu" GridPane.rowIndex="1" />
+                        <ParameterSliderInteger fx:id="island" default="5" increment="1" interval="%INTERVAL1" major="10" max="50" min="0" minor="9" name="Island Search" GridPane.rowIndex="2" />
                     </VBox>
-                    <VBox alignment="CENTER" prefHeight="200.0" prefWidth="100.0" GridPane.columnIndex="1"
-                          GridPane.rowIndex="1">
-                        <ParameterSliderInteger default="1" increment="1" interval="%INTERVAL2" major="2" max="10"
-                                                min="0" minor="1" name="XY Blur " GridPane.rowIndex="1" fx:id="xyBlur"/>
-                        <ParameterSliderInteger fx:id="zBlur" default="1" increment="1" interval="%INTERVAL2" major="2"
-                                                max="10" min="0" minor="1" name="Z Blur " GridPane.rowIndex="1"/>
+                    <VBox alignment="CENTER" prefHeight="200.0" prefWidth="100.0" GridPane.columnIndex="1" GridPane.rowIndex="1">
+                        <ParameterSliderInteger default="1" increment="1" interval="%INTERVAL2" major="2" max="10" min="0" minor="1" name="XY Blur " GridPane.rowIndex="1" fx:id="xyBlur" />
+                        <ParameterSliderInteger fx:id="zBlur" default="1" increment="1" interval="%INTERVAL2" major="2" max="10" min="0" minor="1" name="Z Blur " GridPane.rowIndex="1" />
                     </VBox>
 
                     <padding>
-                        <Insets left="5.0" right="5.0" top="5.0"/>
+                        <Insets left="5.0" right="5.0" top="5.0" />
                     </padding>
                 </GridPane>
-                <VBox maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" minHeight="-Infinity"
-                      minWidth="-Infinity" prefHeight="293.0" prefWidth="386.0" HBox.hgrow="ALWAYS">
-                    <FlowPane fx:id="stack" alignment="CENTER" columnHalignment="CENTER" prefHeight="254.0"
-                              prefWidth="401.0" VBox.vgrow="NEVER"/>
-                    <ZSlicesSlider fx:id="zSlices" alignment="CENTER" columnHalignment="CENTER"
-                                   maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308"
-                                   minHeight="-Infinity" minWidth="-Infinity" prefHeight="30.0" prefWidth="401.0"
-                                   VBox.vgrow="ALWAYS"/>
+                <VBox maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" minHeight="-Infinity" minWidth="-Infinity" prefHeight="293.0" prefWidth="386.0" HBox.hgrow="ALWAYS">
+                    <FlowPane fx:id="stack" alignment="CENTER" columnHalignment="CENTER" prefHeight="254.0" prefWidth="401.0" VBox.vgrow="NEVER" />
+               <HBox VBox.vgrow="ALWAYS">
+                  <children>
+                          <ZSlicesSlider fx:id="zSlices" alignment="CENTER" columnHalignment="CENTER" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" minHeight="-Infinity" minWidth="-Infinity" prefHeight="39.0" prefWidth="338.0" prefWrapLength="300.0" />
+                     <Button fx:id="pixelSelection" mnemonicParsing="false" text="Run" />
+                  </children>
+               </HBox>
                 </VBox>
             </children>
         </HBox>