Index: branches/org.gvsig.desktop-2018a/org.gvsig.desktop.library/org.gvsig.raster/org.gvsig.raster.lib/org.gvsig.raster.lib.buffer.spi/src/main/java/org/gvsig/raster/lib/buffer/spi/operations/AbstractOperation.java
===================================================================
--- branches/org.gvsig.desktop-2018a/org.gvsig.desktop.library/org.gvsig.raster/org.gvsig.raster.lib/org.gvsig.raster.lib.buffer.spi/src/main/java/org/gvsig/raster/lib/buffer/spi/operations/AbstractOperation.java	(revision 43864)
+++ branches/org.gvsig.desktop-2018a/org.gvsig.desktop.library/org.gvsig.raster/org.gvsig.raster.lib/org.gvsig.raster.lib.buffer.spi/src/main/java/org/gvsig/raster/lib/buffer/spi/operations/AbstractOperation.java	(revision 43865)
@@ -26,9 +26,10 @@
 import org.gvsig.raster.lib.buffer.api.exceptions.BufferOperationException;
 import org.gvsig.raster.lib.buffer.api.operations.OperationFactory;
 import org.gvsig.raster.lib.buffer.spi.exceptions.ProcessingOperationException;
+import org.gvsig.tools.ToolsLocator;
 import org.gvsig.tools.dynobject.DynObject;
-import org.gvsig.tools.persistence.PersistentState;
-import org.gvsig.tools.persistence.exception.PersistenceException;
+import org.gvsig.tools.task.TaskStatus;
+import org.gvsig.tools.task.TaskStatusManager;
 
 
 /**
@@ -39,20 +40,26 @@
 
     static public String COPY_UNPROCESSED_BANDS_PARAM = "copy_unprocessed_bands";
 
-    protected Buffer buffer;
-    protected DynObject parameters;
-    protected Buffer outputBuffer;
-    protected OperationFactory factory;
-    protected boolean copyUnprocessedBands;
+    private Buffer buffer;
+    private DynObject parameters;
+    private Buffer outputBuffer;
+    private final OperationFactory factory;
+    private TaskStatus taskStatus;
 
+    private boolean copyUnprocessedBands;
 
     /**
      *
+     * @param factory
      */
-    public AbstractOperation() {
-        // Nothing to do
+    protected AbstractOperation(OperationFactory factory) {
+        this.factory = factory;
     }
 
+    protected boolean mustCopyUnprocessedBands() {
+        return copyUnprocessedBands;
+    }
+    
     @Override
     public void preProcess() throws BufferOperationException {
         if (this.parameters.getDynClass().getDynField(COPY_UNPROCESSED_BANDS_PARAM) != null
@@ -64,6 +71,16 @@
     }
 
     @Override
+    public TaskStatus getTaskStatus() {
+        if( this.taskStatus==null ) {
+            TaskStatusManager taskStatusManager = ToolsLocator.getTaskStatusManager();
+            this.taskStatus = taskStatusManager.createDefaultSimpleTaskStatus(
+                this.getFactory().getName());
+        }
+        return this.taskStatus;
+    }
+
+    @Override
     public void process() throws ProcessingOperationException {
         //Nothing to do
     }
@@ -78,9 +95,10 @@
      * @see org.gvsig.raster.lib.buffer.api.Operation#execute(org.gvsig.raster.lib.buffer.api.Buffer, org.gvsig.tools.dynobject.DynObject)
      */
     @Override
-    public Buffer execute(Buffer buffer, DynObject parameters) throws BufferOperationException {
+    public Buffer execute(TaskStatus status, Buffer buffer, DynObject parameters) throws BufferOperationException {
         this.buffer = buffer;
         this.parameters = parameters;
+        this.taskStatus = status;
         this.preProcess();
         this.process();
         this.postProcess();
@@ -103,6 +121,19 @@
         return parameters;
     }
 
+    @Override
+    public Object getParameter(String name, Object defaultValue) {
+        if(this.parameters.getDynClass().getDynField(name)!=null) {
+            return this.getParameters().getDynValue(name);
+        }
+        return defaultValue;
+    }
+    
+    @Override
+    public void setParameter(String name, Object value) {
+            this.getParameters().setDynValue(name, value);
+    }
+    
     /* (non-Javadoc)
      * @see org.gvsig.raster.lib.buffer.spi.OperationServices#getInputBuffer()
      */
@@ -118,4 +149,11 @@
     public Buffer getOutputBuffer() {
         return outputBuffer;
     }
+
+    @Override
+    public void setOutputBuffer(Buffer theOutputBuffer) {
+        this.outputBuffer = theOutputBuffer;
+    }
+
+    
 }
Index: branches/org.gvsig.desktop-2018a/org.gvsig.desktop.library/org.gvsig.raster/org.gvsig.raster.lib/org.gvsig.raster.lib.buffer.spi/src/main/java/org/gvsig/raster/lib/buffer/spi/operations/OperationServices.java
===================================================================
--- branches/org.gvsig.desktop-2018a/org.gvsig.desktop.library/org.gvsig.raster/org.gvsig.raster.lib/org.gvsig.raster.lib.buffer.spi/src/main/java/org/gvsig/raster/lib/buffer/spi/operations/OperationServices.java	(revision 43864)
+++ branches/org.gvsig.desktop-2018a/org.gvsig.desktop.library/org.gvsig.raster/org.gvsig.raster.lib/org.gvsig.raster.lib.buffer.spi/src/main/java/org/gvsig/raster/lib/buffer/spi/operations/OperationServices.java	(revision 43865)
@@ -26,6 +26,7 @@
 import org.gvsig.raster.lib.buffer.api.exceptions.BufferOperationException;
 import org.gvsig.raster.lib.buffer.api.operations.Operation;
 import org.gvsig.tools.dynobject.DynObject;
+import org.gvsig.tools.task.TaskStatus;
 
 
 /**
@@ -39,6 +40,9 @@
      */
     public DynObject getParameters();
 
+    public Object getParameter(String name, Object defaultValue);
+    
+    public void setParameter(String name, Object value);
     /**
      * @return the input buffer
      */
@@ -49,6 +53,8 @@
      */
     public Buffer getOutputBuffer();
 
+    public void setOutputBuffer(Buffer theOutputBuffer);
+    
     /**
      * Prepare the process
      * @throws BufferOperationException
@@ -67,4 +73,5 @@
      */
     void postProcess() throws BufferOperationException;
 
+    TaskStatus getTaskStatus();
 }
Index: branches/org.gvsig.desktop-2018a/org.gvsig.desktop.library/org.gvsig.raster/org.gvsig.raster.lib/org.gvsig.raster.lib.buffer.spi/src/main/java/org/gvsig/raster/lib/buffer/spi/operations/AbstractSpecifiedBandsOperation.java
===================================================================
--- branches/org.gvsig.desktop-2018a/org.gvsig.desktop.library/org.gvsig.raster/org.gvsig.raster.lib/org.gvsig.raster.lib.buffer.spi/src/main/java/org/gvsig/raster/lib/buffer/spi/operations/AbstractSpecifiedBandsOperation.java	(revision 43864)
+++ branches/org.gvsig.desktop-2018a/org.gvsig.desktop.library/org.gvsig.raster/org.gvsig.raster.lib/org.gvsig.raster.lib.buffer.spi/src/main/java/org/gvsig/raster/lib/buffer/spi/operations/AbstractSpecifiedBandsOperation.java	(revision 43865)
@@ -24,9 +24,11 @@
 
 import java.util.ArrayList;
 import java.util.List;
+import org.gvsig.raster.lib.buffer.api.Buffer;
+import org.gvsig.raster.lib.buffer.api.NoData;
 
-import org.gvsig.raster.lib.buffer.api.BandInfo;
 import org.gvsig.raster.lib.buffer.api.exceptions.BufferOperationException;
+import org.gvsig.raster.lib.buffer.api.operations.OperationFactory;
 import org.gvsig.raster.lib.buffer.api.operations.SpecifiedBandsOperation;
 import org.gvsig.raster.lib.buffer.spi.exceptions.ProcessingOperationException;
 
@@ -36,28 +38,33 @@
  */
 public abstract class AbstractSpecifiedBandsOperation extends AbstractOperation implements SpecifiedBandsOperation {
 
-    protected List<Integer> bandsToProcess;
+    private List<Integer> bandsToProcess;
 
     /**
      *
+     * @param factory
      */
-    public AbstractSpecifiedBandsOperation() {
-        // TODO Auto-generated constructor stub
+    public AbstractSpecifiedBandsOperation(OperationFactory factory) {
+        super(factory);
     }
-
+    
+    public List<Integer> getBandsToProcess() {
+        return this.bandsToProcess;
+    }
+    
     @SuppressWarnings("unchecked")
     @Override
     public void preProcess() throws BufferOperationException {
         super.preProcess();
-        if(this.parameters.getDynClass().getDynField(BANDS_TO_PROCESS_PARAM)!=null) {
-            bandsToProcess = (List<Integer>)this.parameters.getDynValue(BANDS_TO_PROCESS_PARAM);
+        if(this.getParameters().getDynClass().getDynField(BANDS_TO_PROCESS_PARAM)!=null) {
+            bandsToProcess = (List<Integer>)this.getParameters().getDynValue(BANDS_TO_PROCESS_PARAM);
         }
 
         if(this.bandsToProcess==null) {
-            bandsToProcess = new ArrayList<Integer>(buffer.getBandCount());
-        };
-        if(this.bandsToProcess.size()==0){
-            for (int i=0; i<buffer.getBandCount(); i++){
+            bandsToProcess = new ArrayList<>(this.getInputBuffer().getBandCount());
+        }
+        if(this.bandsToProcess.isEmpty()){
+            for (int i=0; i<this.getInputBuffer().getBandCount(); i++){
                 bandsToProcess.add(i);
             }
         }
@@ -82,4 +89,72 @@
     public void postProcess() throws BufferOperationException {
         super.postProcess();
     }
+    
+
+    /**
+     * This is a utility method that return a copy of the NoData of 
+     * the processable band of the input buffer.
+     * 
+     * @return List of NoDatas
+     */
+    protected List<NoData> getProcessableBandNoDatas() {
+        int bands = this.getInputBuffer().getBandCount();
+        List<NoData> noDatas = new ArrayList<>();
+        for (int band = 0; band < bands; band++) {
+            if (this.isProcessableBand(band)) {
+                noDatas.add(this.getInputBuffer().getBandNoData()[band]);
+            }
+        }
+        return noDatas;
+    }
+    
+    /**
+     * This is a utility method that return a copy of the NoData of 
+     * the processable band of the input buffer.
+     * 
+     * @return array of NoDatas
+     */
+    protected NoData[] getProcessableBandNoDatasAsArray() {
+        List<NoData> l = this.getProcessableBandNoDatas();
+        NoData[] noDatas = l.toArray(new NoData[l.size()]);
+        return noDatas;
+    }
+    
+    /**
+     * This is a utility method that return a copy of the types of 
+     * the processable band of the input buffer.
+     * 
+     * @return list of types
+     */
+    protected List<Integer> getProcessableBandTypes() {
+        int bands = this.getInputBuffer().getBandCount();
+        List<Integer> types = new ArrayList<>();
+        for (int band = 0; band < bands; band++) {
+            if (this.isProcessableBand(band)) {
+                types.add(this.getInputBuffer().getBandTypes()[band]);
+            }
+        }
+        return types;
+    }
+    
+    /**
+     * This is a utility method that return a copy of the types of 
+     * the processable band of the input buffer.
+     * 
+     * @return Array of types
+     */
+    protected int[] getProcessableBandTypesAsArray() {
+        int[] types = this.getTypesAsArray(this.getProcessableBandTypes());
+        return types;
+    }
+    
+    protected int[] getTypesAsArray(List<Integer> theTypes) {
+        int[] types = new int[theTypes.size()];
+        int n = 0;
+        for (Integer type : theTypes) {
+            types[n++] = type ;
+        }
+        return types;
+    }
+             
 }
