diff --git a/src/main/java/fr/pasteur/ida/zellige/gui/CheckBoxDisplay.java b/src/main/java/fr/pasteur/ida/zellige/gui/CheckBoxDisplay.java
index ecc08c3c0a0a3fc5060e77c56c6a408c75e12441..8c21045e1d5e3a76c6b5aa34ce1b72f03d1a73a7 100644
--- a/src/main/java/fr/pasteur/ida/zellige/gui/CheckBoxDisplay.java
+++ b/src/main/java/fr/pasteur/ida/zellige/gui/CheckBoxDisplay.java
@@ -28,25 +28,33 @@
  */
 package fr.pasteur.ida.zellige.gui;
 
+import javafx.beans.property.SimpleBooleanProperty;
 import javafx.scene.control.CheckBox;
 
 public class CheckBoxDisplay extends CheckBox
 {
 
-    private boolean notDisplayed = true;
+    private SimpleBooleanProperty notDisplayed = new SimpleBooleanProperty( true );
+
+//    private boolean notDisplayed = true;
 
     public boolean isNotDisplayed()
     {
-        return notDisplayed;
+        return notDisplayed.getValue();
     }
 
     public void disable()
     {
-        notDisplayed = false;
+        notDisplayed.setValue( false );
     }
 
     public void enable()
     {
-        notDisplayed = true;
+        notDisplayed.setValue( true );
+    }
+
+    public SimpleBooleanProperty notDisplayedProperty()
+    {
+        return notDisplayed;
     }
 }
diff --git a/src/main/java/fr/pasteur/ida/zellige/gui/MainController.java b/src/main/java/fr/pasteur/ida/zellige/gui/MainController.java
index a68b8150bcbb78a4610bc0bdf6358b150d7ab42b..0e5d11eb1428b29081bbb346bcd244f6d45443e6 100644
--- a/src/main/java/fr/pasteur/ida/zellige/gui/MainController.java
+++ b/src/main/java/fr/pasteur/ida/zellige/gui/MainController.java
@@ -161,7 +161,7 @@ public class MainController< T extends RealType< T > & NativeType< T > > impleme
         selectionController.getSelectionModel().pretreatedImgProperty().bind( pretreatedImg );
         selectionController.getSelectionModel().imagesProperty().bind( images );
         constructionController.getConstructionModel().maximumsProperty().bind( selectionController.getSelectionModel().selectedPixelsProperty() );
-        projectionController.referenceSurfacesProperty().bind( constructionController.getConstructionModel().referenceSurfacesProperty() );
+        projectionController.getModel().referenceSurfacesProperty().bind( constructionController.getConstructionModel().referenceSurfacesProperty() );
         changedParameters.bindBidirectional( selectionController.changedParametersProperty() );
         selectionController.changedParametersProperty().bindBidirectional( constructionController.changedParametersProperty() );
         constructionController.changedParametersProperty().bindBidirectional( projectionController.changedParametersProperty() );
@@ -348,7 +348,7 @@ public class MainController< T extends RealType< T > & NativeType< T > > impleme
         {
             if ( constructionController.getConstructionModel().referenceSurfacesProperty().getValue() != null )
             {
-                projectionController.runProjection();
+                projectionController.getModel().runProjection();
             }
             else
             {
diff --git a/src/main/java/fr/pasteur/ida/zellige/gui/ProjectionController.java b/src/main/java/fr/pasteur/ida/zellige/gui/ProjectionController.java
index 25a3ae2c2a9911c5f86d9e75eee1427106533823..36fffec7f586a6e5fb2973d05a99581f01a04e02 100644
--- a/src/main/java/fr/pasteur/ida/zellige/gui/ProjectionController.java
+++ b/src/main/java/fr/pasteur/ida/zellige/gui/ProjectionController.java
@@ -6,13 +6,13 @@
  * %%
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are met:
- * 
+ *
  * 1. Redistributions of source code must retain the above copyright notice,
  *    this list of conditions and the following disclaimer.
  * 2. Redistributions in binary form must reproduce the above copyright notice,
  *    this list of conditions and the following disclaimer in the documentation
  *    and/or other materials provided with the distribution.
- * 
+ *
  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
@@ -28,11 +28,8 @@
  */
 package fr.pasteur.ida.zellige.gui;
 
-import fr.pasteur.ida.zellige.element.Projection;
-import fr.pasteur.ida.zellige.element.ReferenceSurface;
-import fr.pasteur.ida.zellige.steps.projection.ReferenceSurfaceProjection;
+import javafx.beans.property.BooleanProperty;
 import javafx.beans.property.SimpleBooleanProperty;
-import javafx.beans.property.SimpleObjectProperty;
 import javafx.collections.FXCollections;
 import javafx.collections.ObservableList;
 import javafx.fxml.FXML;
@@ -40,25 +37,18 @@ import javafx.fxml.Initializable;
 import javafx.scene.control.ComboBox;
 import javafx.scene.control.Spinner;
 import javafx.scene.control.SpinnerValueFactory;
-import net.imglib2.img.Img;
-import net.imglib2.img.display.imagej.ImageJFunctions;
 import net.imglib2.type.NativeType;
 import net.imglib2.type.numeric.RealType;
-import net.imglib2.type.numeric.integer.UnsignedShortType;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.net.URL;
-import java.util.ArrayList;
 import java.util.ResourceBundle;
 
 public class ProjectionController< T extends RealType< T > & NativeType< T > > implements Initializable
 {
 
     private final static Logger LOGGER = LoggerFactory.getLogger( ProjectionController.class );
-    SimpleObjectProperty< ArrayList< ReferenceSurface< T > > > referenceSurfaces = new SimpleObjectProperty<>();
-    SimpleBooleanProperty delta1Functions = new SimpleBooleanProperty( false );
-    SimpleBooleanProperty delta2Functions = new SimpleBooleanProperty( false );
     private final SimpleBooleanProperty changedParameters = new SimpleBooleanProperty();
     @FXML
     private Spinner< Integer > delta1;
@@ -79,9 +69,26 @@ public class ProjectionController< T extends RealType< T > & NativeType< T > > i
     @FXML
     private Spinner< Integer > delta2;
 
+    private ProjectionModel< T > model;
+
     @Override
     public void initialize( URL url, ResourceBundle resourceBundle )
     {
+        // Model
+        model = new ProjectionModel<>();
+
+        //link Model with View
+        model.methodProperty().bind( methodComboBox.valueProperty() );
+        model.delta1Property().bind( delta1.valueProperty() );
+        model.delta2Property().bind( delta2.valueProperty() );
+        bindCheckBox( model.rawHMProperty(), model.rawHMDisplayProperty(), rawHeightMap );
+        bindCheckBox( model.projectionProperty(), model.projectionDisplayProperty(), projection );
+        bindCheckBox( model.extractedHMProperty(), model.extractedHMDisplayProperty(), extractedHeightMap );
+        bindCheckBox( model.reduced3DspaceProperty(), model.reduced3DspaceDisplayProperty(), reduced3DSpace );
+        bindCheckBox( model.segmentedSurfaceProperty(), model.segmentedSurfaceDisplayProperty(), segmentedSurface );
+        bindCheckBox( model.segmentedSurfaceMaskProperty(), model.segmentedSurfaceMaskDisplayProperty(), segmentedSurfaceMask );
+
+
         /* Components*/
         SpinnerValueFactory< Integer > valueFactory =
                 new SpinnerValueFactory.IntegerSpinnerValueFactory( 1, 30, 0 );
@@ -95,14 +102,14 @@ public class ProjectionController< T extends RealType< T > & NativeType< T > > i
 
         delta1.valueProperty().addListener( ( observableValue, integer, t1 ) ->
         {
-            delta1Functions.setValue( false );
+            model.delta1FunctionsProperty().setValue( false );
             resetDisplayMode();
             changedParameters.setValue( true );
         } );
 
         delta2.valueProperty().addListener( ( observableValue, integer, t1 ) ->
         {
-            delta2Functions.setValue( false );
+            model.delta2FunctionsProperty().setValue( false );
             segmentedSurfaceMask.enable();
             changedParameters.setValue( true );
         } );
@@ -110,242 +117,100 @@ public class ProjectionController< T extends RealType< T > & NativeType< T > > i
 
         projection.selectedProperty().addListener( ( observableValue, aBoolean, t1 ) ->
         {
-            if ( delta1Functions.getValue() && t1 && projection.isNotDisplayed() )
+            if ( model.delta1FunctionsProperty().getValue() && t1 && projection.isNotDisplayed() )
             {
 
-                showProjections();
+                model.showProjections();
             }
         } );
 
         rawHeightMap.selectedProperty().addListener( ( observableValue, aBoolean, t1 ) ->
         {
-            if ( delta1Functions.getValue() && t1 && rawHeightMap.isNotDisplayed() )
+            if ( model.delta1FunctionsProperty().getValue() && t1 && rawHeightMap.isNotDisplayed() )
             {
-                showRawHeightMap();
+                model.showRawHeightMap();
 
             }
         } );
         extractedHeightMap.selectedProperty().addListener( ( observableValue, aBoolean, t1 ) ->
         {
-            if ( delta1Functions.getValue() && t1 && extractedHeightMap.isNotDisplayed() )
+            if ( model.delta1FunctionsProperty().getValue() && t1 && extractedHeightMap.isNotDisplayed() )
             {
 
-                showExtractedHeightMaps();
+                model.showExtractedHeightMaps();
             }
         } );
         reduced3DSpace.selectedProperty().addListener( ( observableValue, aBoolean, t1 ) ->
         {
-            if ( delta1Functions.getValue() && t1 && reduced3DSpace.isNotDisplayed() )
+            if ( model.delta1FunctionsProperty().getValue() && t1 && reduced3DSpace.isNotDisplayed() )
             {
 
-                showReduced3DSpace();
+                model.showReduced3DSpace();
             }
         } );
         segmentedSurface.selectedProperty().addListener( ( observableValue, aBoolean, t1 ) ->
         {
-            if ( delta1Functions.getValue() && t1 && segmentedSurface.isNotDisplayed() )
+            if ( model.delta1FunctionsProperty().getValue() && t1 && segmentedSurface.isNotDisplayed() )
             {
 
-                showSegmentedSurface();
+                model.showSegmentedSurface();
             }
         } );
         segmentedSurfaceMask.selectedProperty().addListener( ( observableValue, aBoolean, t1 ) ->
         {
-            if ( delta2Functions.getValue() && t1 && segmentedSurfaceMask.isNotDisplayed() )
+            if ( model.delta2FunctionsProperty().getValue() && t1 && segmentedSurfaceMask.isNotDisplayed() )
             {
 
-                showSegmentedSurfaceMask();
+                model.showSegmentedSurfaceMask();
             }
         } );
 
-        /* Properties*/
-        referenceSurfaces.addListener( ( observableValue, referenceSurfaces1, t1 ) ->
+        // Model Properties
+        model.referenceSurfacesProperty().addListener( ( observableValue, referenceSurfaces1, t1 ) ->
         {
             if ( t1 == null )
             {
-                delta1Functions.setValue( false );
+                model.delta1FunctionsProperty().setValue( false );
                 LOGGER.debug( "REFERENCE_SURFACES  is NULL" );
-
-
             }
             else
             {
-                LOGGER.info( "Extraction of {} surfaces", referenceSurfaces.getValue().size() );
+                LOGGER.info( "Extraction of {} surfaces", model.referenceSurfacesProperty().getValue().size() );
                 LOGGER.debug( "Compute output delta1" );
-                setOutputDelta1();
+                model.setOutputDelta1();
                 resetDisplayMode();
             }
         } );
 
-        delta1Functions.addListener( ( observableValue, aBoolean, t1 ) ->
+        model.delta1FunctionsProperty().addListener( ( observableValue, aBoolean, t1 ) ->
         {
             if ( ! t1 )
             {
                 LOGGER.debug( "DELTA1_FUNCTIONS is NULL" );
-                delta2Functions.setValue( false );
+                model.delta2FunctionsProperty().setValue( false );
             }
             else
             {
                 LOGGER.debug( "Compute output delta2" );
-                setOutputDelta2();
+                model.setOutputDelta2();
             }
         } );
 
-        delta2Functions.addListener( ( observable, oldValue, newValue ) ->
+        model.delta2FunctionsProperty().addListener( ( observable, oldValue, newValue ) ->
         {
             if ( newValue )
             {
-                showOutput();
+                model.showOutput();
             }
             else
             {
                 LOGGER.debug( "DELTA2_FUNCTIONS is NULL" );
             }
         } );
-    }
-
-    private void showSegmentedSurfaceMask()
-    {
-        for ( ReferenceSurface< T > referenceSurface : referenceSurfaces.getValue() )
-        {
-            ImageJFunctions.show( referenceSurface.getProjection().getSegmentedSurfaceMask(), "Surface_mask_" + referenceSurface.getIndex() );
-        }
-    }
-
-    private void showSegmentedSurface()
-    {
-
-        for ( ReferenceSurface< T > referenceSurface : referenceSurfaces.getValue() )
-        {
-            ImageJFunctions.show( referenceSurface.getProjection().getSegmentedSurface(), "Segmented_surface_" + referenceSurface.getIndex() );
-        }
-    }
-
-    private void showReduced3DSpace()
-    {
-
-        for ( ReferenceSurface< T > referenceSurface : referenceSurfaces.getValue() )
-        {
-            ImageJFunctions.show( referenceSurface.getProjection().getReduced3DSpace(), "Reduced_3D_space_" + referenceSurface.getIndex() );
-        }
-    }
-
-    private void showExtractedHeightMaps()
-    {
-        for ( ReferenceSurface< T > referenceSurface : referenceSurfaces.getValue() )
-        {
-            ImageJFunctions.show( referenceSurface.getProjection().getExtractedHeightMap(), "Extracted_HM_" + referenceSurface.getIndex() );
-        }
-    }
-
-    private void showRawHeightMap()
-    {
-        for ( ReferenceSurface< T > referenceSurface : referenceSurfaces.getValue() )
-        {
-            ImageJFunctions.show( referenceSurface.getzMap(), "Raw_HM_" + referenceSurface.getIndex() );
-        }
-    }
-
-    private void showProjections()
-    {
-        for ( ReferenceSurface< T > referenceSurface : referenceSurfaces.getValue() )
-        {
-            ImageJFunctions.show( referenceSurface.getProjection().get(), "Projection_" + referenceSurface.getIndex() );
-        }
-    }
-
-    public void runProjection()
-    {
 
-        LOGGER.debug( "Starting projections ! " );
-        if ( ! delta1Functions.getValue() )
-        {
-            LOGGER.debug( "Output with delta1 " );
-            setOutputDelta1();
-        }
-        if ( ! delta2Functions.getValue() )
-        {
-            LOGGER.debug( "Output with delta2 " );
-            setOutputDelta2();
-        }
-        showOutput();
-    }
-
-    private void showOutput()
-    {
-        if ( extractedHeightMap.isSelected() && extractedHeightMap.isNotDisplayed() )
-        {
-            showExtractedHeightMaps();
-            extractedHeightMap.disable();
-        }
-        if ( segmentedSurface.isSelected() && segmentedSurface.isNotDisplayed() )
-        {
-            showSegmentedSurface();
-            segmentedSurface.disable();
-        }
-        if ( projection.isSelected() && projection.isNotDisplayed() )
-        {
-            showProjections();
-            projection.disable();
-        }
-        if ( reduced3DSpace.isSelected() && reduced3DSpace.isNotDisplayed() )
-        {
-            showReduced3DSpace();
-            reduced3DSpace.disable();
-        }
-        if ( segmentedSurfaceMask.isSelected() && segmentedSurfaceMask.isNotDisplayed() )
-        {
-            showSegmentedSurfaceMask();
-            segmentedSurfaceMask.disable();
-        }
-        if ( rawHeightMap.isSelected() && rawHeightMap.isNotDisplayed() )
-        {
-            showRawHeightMap();
-            rawHeightMap.disable();
-        }
-    }
-
-    private void setOutputDelta1()
-    {
-        int delta = delta1.getValue();
-        String method = methodComboBox.getValue();
 
-
-        for ( ReferenceSurface< T > referenceSurface : referenceSurfaces.getValue() )
-        {
-            Projection< T > projection = referenceSurface.getProjection();
-            Img< UnsignedShortType > extractedHeightMap = ReferenceSurfaceProjection.getProjectionHeightMap( referenceSurface, method, delta );
-            projection.setExtractedHeightMap( extractedHeightMap );
-            projection.setProjection( ReferenceSurfaceProjection.projection1( referenceSurface, method ) );
-
-            projection.setSegmentedSurface( ReferenceSurfaceProjection.getSegmentedSurface( extractedHeightMap, referenceSurface.getInput(), referenceSurface.getFactory() ) );
-            projection.setReduced3DSpace( ReferenceSurfaceProjection.getExtractedHeightMapSubStack( referenceSurface, delta ) );
-        }
-        delta1Functions.setValue( true );
     }
 
-    private void setOutputDelta2()
-    {
-
-        for ( ReferenceSurface< T > referenceSurface : referenceSurfaces.getValue() )
-        {
-
-            Projection< T > projection = referenceSurface.getProjection();
-            projection.setSegmentedSurfaceMask( ReferenceSurfaceProjection.getSegmentedSurfaceMask( projection.getSegmentedSurface(), delta2.getValue() ) );
-
-        }
-        delta2Functions.setValue( true );
-    }
-
-    public ArrayList< ReferenceSurface< T > > getReferenceSurfaces()
-    {
-        return referenceSurfaces.get();
-    }
-
-    public SimpleObjectProperty< ArrayList< ReferenceSurface< T > > > referenceSurfacesProperty()
-    {
-        return referenceSurfaces;
-    }
 
     private void resetDisplayMode()
     {
@@ -363,4 +228,16 @@ public class ProjectionController< T extends RealType< T > & NativeType< T > > i
     {
         return changedParameters;
     }
+
+    public ProjectionModel< T > getModel()
+    {
+        return model;
+    }
+
+
+    private void bindCheckBox( BooleanProperty selected, BooleanProperty notDisplayed, CheckBoxDisplay checkBox )
+    {
+        selected.bind( checkBox.selectedProperty() );
+        notDisplayed.bindBidirectional( checkBox.notDisplayedProperty() );
+    }
 }
diff --git a/src/main/java/fr/pasteur/ida/zellige/gui/ProjectionModel.java b/src/main/java/fr/pasteur/ida/zellige/gui/ProjectionModel.java
new file mode 100644
index 0000000000000000000000000000000000000000..f8683bdbd2dd9632a0f05402fdf66f9e1d09d112
--- /dev/null
+++ b/src/main/java/fr/pasteur/ida/zellige/gui/ProjectionModel.java
@@ -0,0 +1,310 @@
+package fr.pasteur.ida.zellige.gui;
+
+import fr.pasteur.ida.zellige.element.Projection;
+import fr.pasteur.ida.zellige.element.ReferenceSurface;
+import fr.pasteur.ida.zellige.steps.projection.ReferenceSurfaceProjection;
+import javafx.beans.property.*;
+import net.imglib2.img.Img;
+import net.imglib2.img.display.imagej.ImageJFunctions;
+import net.imglib2.type.NativeType;
+import net.imglib2.type.numeric.RealType;
+import net.imglib2.type.numeric.integer.UnsignedShortType;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.ArrayList;
+
+public class ProjectionModel< T extends RealType< T > & NativeType< T > >
+{
+    private final static Logger LOGGER = LoggerFactory.getLogger( ProjectionModel.class );
+    private final SimpleObjectProperty< ArrayList< ReferenceSurface< T > > > referenceSurfaces;
+    private final SimpleBooleanProperty delta1Functions;
+    private final SimpleBooleanProperty delta2Functions;
+    private final IntegerProperty delta1;
+    private final IntegerProperty delta2;
+
+    private final StringProperty method;
+
+
+    private final BooleanProperty rawHM;
+    private final BooleanProperty projection;
+    private final BooleanProperty extractedHM;
+    private final BooleanProperty reduced3Dspace;
+    private final BooleanProperty segmentedSurface;
+    private final BooleanProperty segmentedSurfaceMask;
+
+    private final BooleanProperty rawHMDisplay;
+    private final BooleanProperty projectionDisplay;
+    private final BooleanProperty extractedHMDisplay;
+    private final BooleanProperty reduced3DspaceDisplay;
+    private final BooleanProperty segmentedSurfaceDisplay;
+    private final BooleanProperty segmentedSurfaceMaskDisplay;
+
+    public ProjectionModel()
+    {
+        this.referenceSurfaces = new SimpleObjectProperty<>();
+        this.delta1Functions = new SimpleBooleanProperty( false );
+        this.delta2Functions = new SimpleBooleanProperty( false );
+        this.method = new SimpleStringProperty();
+        this.delta1 = new SimpleIntegerProperty();
+        this.delta2 = new SimpleIntegerProperty();
+        this.rawHM = new SimpleBooleanProperty();
+        this.projection = new SimpleBooleanProperty();
+        this.extractedHM = new SimpleBooleanProperty();
+        this.reduced3Dspace = new SimpleBooleanProperty();
+        this.segmentedSurface = new SimpleBooleanProperty();
+        this.segmentedSurfaceMask = new SimpleBooleanProperty();
+        this.rawHMDisplay = new SimpleBooleanProperty( true );
+        this.projectionDisplay = new SimpleBooleanProperty( true );
+        this.extractedHMDisplay = new SimpleBooleanProperty( true );
+        this.reduced3DspaceDisplay = new SimpleBooleanProperty( true );
+        this.segmentedSurfaceDisplay = new SimpleBooleanProperty( true );
+        this.segmentedSurfaceMaskDisplay = new SimpleBooleanProperty( true );
+    }
+
+    public void showSegmentedSurfaceMask()
+    {
+        for ( ReferenceSurface< T > referenceSurface : referenceSurfaces.getValue() )
+        {
+            ImageJFunctions.show( referenceSurface.getProjection().getSegmentedSurfaceMask(), "Surface_mask_" + referenceSurface.getIndex() );
+        }
+    }
+
+    public void showSegmentedSurface()
+    {
+
+        for ( ReferenceSurface< T > referenceSurface : referenceSurfaces.getValue() )
+        {
+            ImageJFunctions.show( referenceSurface.getProjection().getSegmentedSurface(), "Segmented_surface_" + referenceSurface.getIndex() );
+        }
+    }
+
+    public void showReduced3DSpace()
+    {
+
+        for ( ReferenceSurface< T > referenceSurface : referenceSurfaces.getValue() )
+        {
+            ImageJFunctions.show( referenceSurface.getProjection().getReduced3DSpace(), "Reduced_3D_space_" + referenceSurface.getIndex() );
+        }
+    }
+
+    public void showExtractedHeightMaps()
+    {
+        for ( ReferenceSurface< T > referenceSurface : referenceSurfaces.getValue() )
+        {
+            ImageJFunctions.show( referenceSurface.getProjection().getExtractedHeightMap(), "Extracted_HM_" + referenceSurface.getIndex() );
+        }
+    }
+
+    public void showRawHeightMap()
+    {
+        for ( ReferenceSurface< T > referenceSurface : referenceSurfaces.getValue() )
+        {
+            ImageJFunctions.show( referenceSurface.getzMap(), "Raw_HM_" + referenceSurface.getIndex() );
+        }
+    }
+
+    public void showProjections()
+    {
+        for ( ReferenceSurface< T > referenceSurface : referenceSurfaces.getValue() )
+        {
+            ImageJFunctions.show( referenceSurface.getProjection().get(), "Projection_" + referenceSurface.getIndex() );
+        }
+    }
+
+    public void runProjection()
+    {
+
+        LOGGER.debug( "Starting projections ! " );
+        if ( ! delta1Functions.getValue() )
+        {
+            LOGGER.debug( "Output with delta1 " );
+            setOutputDelta1();
+        }
+        if ( ! delta2Functions.getValue() )
+        {
+            LOGGER.debug( "Output with delta2 " );
+            setOutputDelta2();
+        }
+        showOutput();
+    }
+
+    public void showOutput()
+    {
+        if ( rawHM.get() && rawHMDisplay.getValue() )
+        {
+            showRawHeightMap();
+            rawHMDisplay.setValue( false );
+        }
+        if ( projection.get() && projectionDisplay.get() )
+        {
+            showProjections();
+            projectionDisplay.setValue( false );
+        }
+
+        if ( extractedHM.get() && extractedHMDisplay.get() )
+        {
+            showExtractedHeightMaps();
+            extractedHMDisplay.setValue( false );
+        }
+        if ( segmentedSurface.get() && segmentedSurfaceDisplay.get() )
+        {
+            showSegmentedSurface();
+            segmentedSurface.setValue( false );
+        }
+
+        if ( reduced3Dspace.get() && reduced3DspaceDisplay.get() )
+        {
+            showReduced3DSpace();
+            reduced3DspaceDisplay.setValue( false );
+        }
+        if ( segmentedSurfaceMask.get() && segmentedSurfaceMaskDisplay.get() )
+        {
+            showSegmentedSurfaceMask();
+            segmentedSurfaceMask.setValue( false );
+        }
+
+    }
+
+    public void setOutputDelta1()
+    {
+
+        for ( ReferenceSurface< T > referenceSurface : referenceSurfaces.getValue() )
+        {
+            Projection< T > projection = referenceSurface.getProjection();
+            Img< UnsignedShortType > extractedHeightMap = ReferenceSurfaceProjection.getProjectionHeightMap( referenceSurface, method.get(), delta1.intValue() );
+            projection.setExtractedHeightMap( extractedHeightMap );
+            projection.setProjection( ReferenceSurfaceProjection.projection1( referenceSurface, this.method.get() ) );
+
+            projection.setSegmentedSurface( ReferenceSurfaceProjection.getSegmentedSurface( extractedHeightMap, referenceSurface.getInput(), referenceSurface.getFactory() ) );
+            projection.setReduced3DSpace( ReferenceSurfaceProjection.getExtractedHeightMapSubStack( referenceSurface, delta1.intValue() ) );
+        }
+        delta1Functions.setValue( true );
+    }
+
+    public void setOutputDelta2()
+    {
+
+        for ( ReferenceSurface< T > referenceSurface : referenceSurfaces.getValue() )
+        {
+
+            Projection< T > projection = referenceSurface.getProjection();
+            projection.setSegmentedSurfaceMask( ReferenceSurfaceProjection.getSegmentedSurfaceMask( projection.getSegmentedSurface(), delta2.intValue() ) );
+
+        }
+        delta2Functions.setValue( true );
+    }
+
+
+    public ArrayList< ReferenceSurface< T > > getReferenceSurfaces()
+    {
+        return referenceSurfaces.get();
+    }
+
+    public SimpleObjectProperty< ArrayList< ReferenceSurface< T > > > referenceSurfacesProperty()
+    {
+        return referenceSurfaces;
+    }
+
+    public SimpleBooleanProperty delta1FunctionsProperty()
+    {
+        return delta1Functions;
+    }
+
+    public SimpleBooleanProperty delta2FunctionsProperty()
+    {
+        return delta2Functions;
+    }
+
+    public IntegerProperty delta1Property()
+    {
+        return delta1;
+    }
+
+    public IntegerProperty delta2Property()
+    {
+        return delta2;
+    }
+
+    public BooleanProperty rawHMProperty()
+    {
+        return rawHM;
+    }
+
+    public boolean isProjection()
+    {
+        return projection.get();
+    }
+
+    public BooleanProperty projectionProperty()
+    {
+        return projection;
+    }
+
+    public BooleanProperty extractedHMProperty()
+    {
+        return extractedHM;
+    }
+
+    public BooleanProperty reduced3DspaceProperty()
+    {
+        return reduced3Dspace;
+    }
+
+    public BooleanProperty segmentedSurfaceProperty()
+    {
+        return segmentedSurface;
+    }
+
+    public BooleanProperty segmentedSurfaceMaskProperty()
+    {
+        return segmentedSurfaceMask;
+    }
+
+    public String getMethod()
+    {
+        return method.get();
+    }
+
+    public void setMethod( String method )
+    {
+        this.method.set( method );
+    }
+
+    public StringProperty methodProperty()
+    {
+        return method;
+    }
+
+
+    public BooleanProperty rawHMDisplayProperty()
+    {
+        return rawHMDisplay;
+    }
+
+    public BooleanProperty projectionDisplayProperty()
+    {
+        return projectionDisplay;
+    }
+
+    public BooleanProperty extractedHMDisplayProperty()
+    {
+        return extractedHMDisplay;
+    }
+
+
+    public BooleanProperty reduced3DspaceDisplayProperty()
+    {
+        return reduced3DspaceDisplay;
+    }
+
+    public BooleanProperty segmentedSurfaceDisplayProperty()
+    {
+        return segmentedSurfaceDisplay;
+    }
+
+    public BooleanProperty segmentedSurfaceMaskDisplayProperty()
+    {
+        return segmentedSurfaceMaskDisplay;
+    }
+}