diff --git a/samoa-instances/src/main/java/org/apache/samoa/instances/AttributesInformation.java b/samoa-instances/src/main/java/org/apache/samoa/instances/AttributesInformation.java
index 58ece8e..214a716 100644
--- a/samoa-instances/src/main/java/org/apache/samoa/instances/AttributesInformation.java
+++ b/samoa-instances/src/main/java/org/apache/samoa/instances/AttributesInformation.java
@@ -148,5 +148,42 @@
     this.numberAttributes=v.size();	
     this.indexValues=indexValues;
   }
+  
+  public void deleteAttributeAt(Integer position) {
+        if ((position < 0) || (position >= attributes.size())) {
+            throw new IllegalArgumentException("Index out of range");
+        }
+
+        ArrayList<Attribute> newList = new ArrayList<Attribute>(attributes.size() - 1);
+        for (int i = 0 ; i < position; i++) {
+            Attribute att = attributes.get(i);
+            newList.add(att);
+        }
+        for (int i = position + 1; i < attributes.size(); i++) {
+            Attribute newAtt = (Attribute) attributes.get(i);
+            newList.add(newAtt);
+        }
+        attributes = newList;
+    }
+
+    public void insertAttributeAt(Attribute att, int position) {
+
+        if ((position < 0) || (position > attributes.size())) {
+            throw new IllegalArgumentException("Index out of range");
+        }
+
+        ArrayList<Attribute> newList = new ArrayList<Attribute>(attributes.size() + 1);
+        for (int i = 0 ; i < position; i++) {
+            Attribute oldAtt = attributes.get(i);
+            newList.add(oldAtt);
+        }
+        newList.add(att);
+        for (int i = position; i < attributes.size(); i++) {
+            Attribute newAtt = (Attribute) attributes.get(i);
+            newList.add(newAtt);
+        }
+        attributes = newList;
+
+    }
 
 }
diff --git a/samoa-instances/src/main/java/org/apache/samoa/instances/DenseInstanceData.java b/samoa-instances/src/main/java/org/apache/samoa/instances/DenseInstanceData.java
index 6781e91..862001a 100644
--- a/samoa-instances/src/main/java/org/apache/samoa/instances/DenseInstanceData.java
+++ b/samoa-instances/src/main/java/org/apache/samoa/instances/DenseInstanceData.java
@@ -20,12 +20,13 @@
  * #L%
  */
 
-public class DenseInstanceData implements InstanceData{
+public class DenseInstanceData implements InstanceData {
 
   /**
    * Instantiates a new dense instance data.
    *
-   * @param array the array
+   * @param array
+   *          the array
    */
   public DenseInstanceData(double[] array) {
     this.attributeValues = array;
@@ -34,7 +35,8 @@
   /**
    * Instantiates a new dense instance data.
    *
-   * @param length the length
+   * @param length
+   *          the length
    */
   public DenseInstanceData(int length) {
     this.attributeValues = new double[length];
@@ -63,21 +65,23 @@
   /**
    * Value.
    *
-   * @param indexAttribute the index attribute
+   * @param indexAttribute
+   *          the index attribute
    * @return the double
    */
   @Override
   public double value(int indexAttribute) {
-	if (this.attributeValues.length <= indexAttribute)
-      return this.attributeValues[this.attributeValues.length-1];
-    
-	return this.attributeValues[indexAttribute];
+    if (this.attributeValues.length <= indexAttribute)
+      return this.attributeValues[this.attributeValues.length - 1];
+
+    return this.attributeValues[indexAttribute];
   }
 
   /**
    * Checks if is missing.
    *
-   * @param indexAttribute the index attribute
+   * @param indexAttribute
+   *          the index attribute
    * @return true, if is missing
    */
   @Override
@@ -98,7 +102,8 @@
   /**
    * Index.
    *
-   * @param indexAttribute the index attribute
+   * @param indexAttribute
+   *          the index attribute
    * @return the int
    */
   @Override
@@ -109,7 +114,8 @@
   /**
    * Value sparse.
    *
-   * @param indexAttribute the index attribute
+   * @param indexAttribute
+   *          the index attribute
    * @return the double
    */
   @Override
@@ -120,7 +126,8 @@
   /**
    * Checks if is missing sparse.
    *
-   * @param indexAttribute the index attribute
+   * @param indexAttribute
+   *          the index attribute
    * @return true, if is missing sparse
    */
   @Override
@@ -141,8 +148,10 @@
   /**
    * Sets the value.
    *
-   * @param attributeIndex the attribute index
-   * @param d the d
+   * @param attributeIndex
+   *          the attribute index
+   * @param d
+   *          the d
    */
   @Override
   public void setValue(int attributeIndex, double d) {
@@ -163,6 +172,22 @@
   }
 
   @Override
+  public void insertAttributeAt(int index) {
+    if ((index < 0) || (index > numAttributes())) {
+      throw new IllegalArgumentException("Can't insert attribute: index out "
+          + "of range");
+    }
+    double[] newValues = new double[attributeValues.length + 1];
+
+    System.arraycopy(attributeValues, 0, newValues, 0, index);
+    newValues[index] = Double.NaN; //Missing Value
+    System.arraycopy(attributeValues, index, newValues, index + 1,
+        attributeValues.length - index);
+    attributeValues = newValues;
+
+  }
+
+  @Override
   public InstanceData copy() {
     return new DenseInstanceData(this.attributeValues);
   }
diff --git a/samoa-instances/src/main/java/org/apache/samoa/instances/InstanceData.java b/samoa-instances/src/main/java/org/apache/samoa/instances/InstanceData.java
index b735ea5..a5a5658 100644
--- a/samoa-instances/src/main/java/org/apache/samoa/instances/InstanceData.java
+++ b/samoa-instances/src/main/java/org/apache/samoa/instances/InstanceData.java
@@ -34,7 +34,8 @@
   /**
    * Value.
    *
-   * @param instAttIndex the inst att index
+   * @param instAttIndex
+   *          the inst att index
    * @return the double
    */
   public double value(int instAttIndex);
@@ -42,7 +43,8 @@
   /**
    * Checks if is missing.
    *
-   * @param instAttIndex the inst att index
+   * @param instAttIndex
+   *          the inst att index
    * @return true, if is missing
    */
   public boolean isMissing(int instAttIndex);
@@ -57,7 +59,8 @@
   /**
    * Index.
    *
-   * @param i the i
+   * @param i
+   *          the i
    * @return the int
    */
   public int index(int i);
@@ -65,7 +68,8 @@
   /**
    * Value sparse.
    *
-   * @param i the i
+   * @param i
+   *          the i
    * @return the double
    */
   public double valueSparse(int i);
@@ -73,7 +77,8 @@
   /**
    * Checks if is missing sparse.
    *
-   * @param p1 the p1
+   * @param p1
+   *          the p1
    * @return true, if is missing sparse
    */
   public boolean isMissingSparse(int p1);
@@ -88,21 +93,31 @@
   /**
    * Sets the value.
    *
-   * @param m_numAttributes the m_num attributes
-   * @param d the d
+   * @param m_numAttributes
+   *          the m_num attributes
+   * @param d
+   *          the d
    */
   public void setValue(int m_numAttributes, double d);
 
-
   /**
    * Deletes an attribute.
    *
-   * @param index the indes
+   * @param index
+   *          the indes
    */
   public void deleteAttributeAt(int index);
 
   /**
-   * Produces a shallow copy of this instance data. 
+   * Inserts an attribute.
+   *
+   * @param index
+   *          the indes
+   */
+  public void insertAttributeAt(int index);
+
+  /**
+   * Produces a shallow copy of this instance data.
    * 
    * @return the shallow copy
    */
diff --git a/samoa-instances/src/main/java/org/apache/samoa/instances/InstanceImpl.java b/samoa-instances/src/main/java/org/apache/samoa/instances/InstanceImpl.java
index ff77dc2..e81c8a5 100644
--- a/samoa-instances/src/main/java/org/apache/samoa/instances/InstanceImpl.java
+++ b/samoa-instances/src/main/java/org/apache/samoa/instances/InstanceImpl.java
@@ -42,7 +42,8 @@
   /**
    * Instantiates a new instance.
    *
-   * @param inst the inst
+   * @param inst
+   *          the inst
    */
   public InstanceImpl(InstanceImpl inst) {
     this.weight = inst.weight;
@@ -54,8 +55,10 @@
   /**
    * Instantiates a new instance.
    *
-   * @param weight the weight
-   * @param res the res
+   * @param weight
+   *          the weight
+   * @param res
+   *          the res
    */
   public InstanceImpl(double weight, double[] res) {
     this.weight = weight;
@@ -66,10 +69,14 @@
   /**
    * Instantiates a new instance.
    *
-   * @param weight the weight
-   * @param attributeValues the attribute values
-   * @param indexValues the index values
-   * @param numberAttributes the number attributes
+   * @param weight
+   *          the weight
+   * @param attributeValues
+   *          the attribute values
+   * @param indexValues
+   *          the index values
+   * @param numberAttributes
+   *          the number attributes
    */
   public InstanceImpl(double weight, double[] attributeValues, int[] indexValues, int numberAttributes) {
     this.weight = weight;
@@ -79,8 +86,10 @@
   /**
    * Instantiates a new instance.
    *
-   * @param weight the weight
-   * @param instanceData the instance data
+   * @param weight
+   *          the weight
+   * @param instanceData
+   *          the instance data
    */
   public InstanceImpl(double weight, InstanceData instanceData) {
     this.weight = weight;
@@ -90,7 +99,8 @@
   /**
    * Instantiates a new instance.
    *
-   * @param numAttributes the num attributes
+   * @param numAttributes
+   *          the num attributes
    */
   public InstanceImpl(int numAttributes) {
     this.instanceData = new DenseInstanceData(new double[numAttributes]); //JD
@@ -110,7 +120,8 @@
   /**
    * Sets the weight.
    *
-   * @param weight the new weight
+   * @param weight
+   *          the new weight
    */
   @Override
   public void setWeight(double weight) {
@@ -120,7 +131,8 @@
   /**
    * Attribute.
    *
-   * @param instAttIndex the inst att index
+   * @param instAttIndex
+   *          the inst att index
    * @return the attribute
    */
   @Override
@@ -128,14 +140,15 @@
     return this.instanceHeader.attribute(instAttIndex);
   }
 
-  public int indexOfAttribute(Attribute attribute){
+  public int indexOfAttribute(Attribute attribute) {
     return this.instanceHeader.indexOf(attribute);
   }
 
   /**
    * Delete attribute at.
    *
-   * @param i the i
+   * @param i
+   *          the i
    */
   @Override
   public void deleteAttributeAt(int i) {
@@ -145,11 +158,12 @@
   /**
    * Insert attribute at.
    *
-   * @param i the i
+   * @param i
+   *          the i
    */
   @Override
   public void insertAttributeAt(int i) {
-    throw new UnsupportedOperationException("Not yet implemented");
+    this.instanceData.insertAttributeAt(i);
   }
 
   /**
@@ -165,7 +179,8 @@
   /**
    * Value.
    *
-   * @param instAttIndex the inst att index
+   * @param instAttIndex
+   *          the inst att index
    * @return the double
    */
   @Override
@@ -176,7 +191,8 @@
   /**
    * Checks if is missing.
    *
-   * @param instAttIndex the inst att index
+   * @param instAttIndex
+   *          the inst att index
    * @return true, if is missing
    */
   @Override
@@ -197,7 +213,8 @@
   /**
    * Index.
    *
-   * @param i the i
+   * @param i
+   *          the i
    * @return the int
    */
   @Override
@@ -208,7 +225,8 @@
   /**
    * Value sparse.
    *
-   * @param i the i
+   * @param i
+   *          the i
    * @return the double
    */
   @Override
@@ -219,7 +237,8 @@
   /**
    * Checks if is missing sparse.
    *
-   * @param p the p
+   * @param p
+   *          the p
    * @return true, if is missing sparse
    */
   @Override
@@ -230,7 +249,8 @@
   /**
    * String value.
    *
-   * @param i the i
+   * @param i
+   *          the i
    * @return the string
    */
   @Override
@@ -251,8 +271,10 @@
   /**
    * Sets the value.
    *
-   * @param numAttribute the num attribute
-   * @param d the d
+   * @param numAttribute
+   *          the num attribute
+   * @param d
+   *          the d
    */
   @Override
   public void setValue(int numAttribute, double d) {
@@ -279,11 +301,11 @@
     int classIndex = instanceHeader.classIndex();
     //return classIndex != Integer.MAX_VALUE ? classIndex : 0;
     // return  ? classIndex : 0;
-    if(classIndex == Integer.MAX_VALUE)
-      if(this.instanceHeader.instanceInformation.range!=null)
-        classIndex=instanceHeader.instanceInformation.range.getStart();
+    if (classIndex == Integer.MAX_VALUE)
+      if (this.instanceHeader.instanceInformation.range != null)
+        classIndex = instanceHeader.instanceInformation.range.getStart();
       else
-        classIndex=0;
+        classIndex = 0;
     return classIndex;
   }
 
@@ -320,7 +342,8 @@
   /**
    * Sets the class value.
    *
-   * @param d the new class value
+   * @param d
+   *          the new class value
    */
   @Override
   public void setClassValue(double d) {
@@ -351,7 +374,8 @@
   /**
    * Sets the dataset.
    *
-   * @param dataset the new dataset
+   * @param dataset
+   *          the new dataset
    */
   @Override
   public void setDataset(Instances dataset) {
@@ -361,9 +385,12 @@
   /**
    * Adds the sparse values.
    *
-   * @param indexValues the index values
-   * @param attributeValues the attribute values
-   * @param numberAttributes the number attributes
+   * @param indexValues
+   *          the index values
+   * @param attributeValues
+   *          the attribute values
+   * @param numberAttributes
+   *          the number attributes
    */
   @Override
   public void addSparseValues(int[] indexValues, double[] attributeValues, int numberAttributes) {
@@ -454,7 +481,8 @@
   /**
    * Value.
    *
-   * @param attribute the attribute
+   * @param attribute
+   *          the attribute
    * @return the double
    */
   @Override
diff --git a/samoa-instances/src/main/java/org/apache/samoa/instances/InstanceInformation.java b/samoa-instances/src/main/java/org/apache/samoa/instances/InstanceInformation.java
index cfd7f51..9d39791 100644
--- a/samoa-instances/src/main/java/org/apache/samoa/instances/InstanceInformation.java
+++ b/samoa-instances/src/main/java/org/apache/samoa/instances/InstanceInformation.java
@@ -53,7 +53,8 @@
   /**
    * Instantiates a new instance information.
    *
-   * @param chunk the chunk
+   * @param chunk
+   *          the chunk
    */
   public InstanceInformation(InstanceInformation chunk) {
     this.relationName = chunk.relationName;
@@ -64,8 +65,10 @@
   /**
    * Instantiates a new instance information.
    *
-   * @param st the st
-   * @param v the v
+   * @param st
+   *          the st
+   * @param input
+   *          the input
    */
   public InstanceInformation(String st, List<Attribute> input) {
     this.relationName = st;
@@ -141,29 +144,29 @@
    * @see com.yahoo.labs.samoa.instances.InstanceInformationInterface#deleteAttributeAt(java.lang.Integer)
    */
   public void deleteAttributeAt(Integer integer) {
-    throw new UnsupportedOperationException("Not yet implemented");
+    this.attributesInformation.deleteAttributeAt(integer);
   }
 
   /* (non-Javadoc)
    * @see com.yahoo.labs.samoa.instances.InstanceInformationInterface#insertAttributeAt(com.yahoo.labs.samoa.instances.Attribute, int)
    */
   public void insertAttributeAt(Attribute attribute, int i) {
-    throw new UnsupportedOperationException("Not yet implemented");
+    this.attributesInformation.insertAttributeAt(attribute, i);
   }
 
   public void setAttributes(List<Attribute> v) {
-    if(this.attributesInformation==null)
-      this.attributesInformation= new AttributesInformation();
+    if (this.attributesInformation == null)
+      this.attributesInformation = new AttributesInformation();
     this.attributesInformation.setAttributes(v);
   }
 
   public int inputAttributeIndex(int index) {
     int ret = 0;
     if (classIndex == Integer.MAX_VALUE) {//Multi Label
-      if(index<range.getStart())//JD
-        ret= index;
-      else 
-        ret= index+range.getSelectionLength();
+      if (index < range.getStart())//JD
+        ret = index;
+      else
+        ret = index + range.getSelectionLength();
 
     } else { //Single Label
       ret = classIndex() > index ? index : index + 1;
@@ -174,7 +177,7 @@
   public int outputAttributeIndex(int attributeIndex) {
     int ret = 0;
     if (classIndex == Integer.MAX_VALUE) {//Multi Label
-      ret=attributeIndex+range.getStart(); //JD - Range should be a "block"
+      ret = attributeIndex + range.getStart(); //JD - Range should be a "block"
     } else { //Single Label
       ret = classIndex;
     }
@@ -184,7 +187,7 @@
   public int numInputAttributes() {
     int ret = 0;
     if (classIndex == Integer.MAX_VALUE) {//Multi Label
-      ret=this.numAttributes()-range.getSelectionLength(); //JD
+      ret = this.numAttributes() - range.getSelectionLength(); //JD
     } else { //Single Label
       ret = this.numAttributes() - 1;
     }
@@ -194,7 +197,7 @@
   public int numOutputAttributes() {
     int ret = 0;
     if (classIndex == Integer.MAX_VALUE) {//Multi Label
-      ret=range.getSelectionLength(); //JD
+      ret = range.getSelectionLength(); //JD
     } else { //Single Label
       ret = 1;
     }
@@ -207,9 +210,9 @@
   }
 
   public void setAttributes(List<Attribute> v, List<Integer> indexValues) {
-    if(this.attributesInformation==null)
-      this.attributesInformation= new AttributesInformation();
-    this.attributesInformation.setAttributes(v,indexValues);
+    if (this.attributesInformation == null)
+      this.attributesInformation = new AttributesInformation();
+    this.attributesInformation.setAttributes(v, indexValues);
 
   }
 
diff --git a/samoa-instances/src/main/java/org/apache/samoa/instances/SparseInstanceData.java b/samoa-instances/src/main/java/org/apache/samoa/instances/SparseInstanceData.java
index 77b634b..940271a 100644
--- a/samoa-instances/src/main/java/org/apache/samoa/instances/SparseInstanceData.java
+++ b/samoa-instances/src/main/java/org/apache/samoa/instances/SparseInstanceData.java
@@ -25,9 +25,12 @@
   /**
    * Instantiates a new sparse instance data.
    *
-   * @param attributeValues the attribute values
-   * @param indexValues the index values
-   * @param numberAttributes the number attributes
+   * @param attributeValues
+   *          the attribute values
+   * @param indexValues
+   *          the index values
+   * @param numberAttributes
+   *          the number attributes
    */
   public SparseInstanceData(double[] attributeValues, int[] indexValues, int numberAttributes) {
     this.attributeValues = attributeValues;
@@ -38,7 +41,8 @@
   /**
    * Instantiates a new sparse instance data.
    *
-   * @param length the length
+   * @param length
+   *          the length
    */
   public SparseInstanceData(int length) {
     this.attributeValues = new double[length];
@@ -62,7 +66,8 @@
   /**
    * Sets the attribute values.
    *
-   * @param attributeValues the new attribute values
+   * @param attributeValues
+   *          the new attribute values
    */
   public void setAttributeValues(double[] attributeValues) {
     this.attributeValues = attributeValues;
@@ -80,7 +85,8 @@
   /**
    * Sets the index values.
    *
-   * @param indexValues the new index values
+   * @param indexValues
+   *          the new index values
    */
   public void setIndexValues(int[] indexValues) {
     this.indexValues = indexValues;
@@ -98,7 +104,8 @@
   /**
    * Sets the number of attributes.
    *
-   * @param numberAttributes the new number attributes
+   * @param numberAttributes
+   *          the new number attributes
    */
   public void setNumberAttributes(int numberAttributes) {
     this.numberAttributes = numberAttributes;
@@ -127,7 +134,8 @@
   /**
    * Value.
    *
-   * @param indexAttribute the index attribute
+   * @param indexAttribute
+   *          the index attribute
    * @return the double
    */
   @Override
@@ -145,7 +153,8 @@
   /**
    * Checks if is missing.
    *
-   * @param indexAttribute the index attribute
+   * @param indexAttribute
+   *          the index attribute
    * @return true, if is missing
    */
   @Override
@@ -166,7 +175,8 @@
   /**
    * Index.
    *
-   * @param indexAttribute the index attribute
+   * @param indexAttribute
+   *          the index attribute
    * @return the int
    */
   @Override
@@ -177,7 +187,8 @@
   /**
    * Value sparse.
    *
-   * @param indexAttribute the index attribute
+   * @param indexAttribute
+   *          the index attribute
    * @return the double
    */
   @Override
@@ -188,7 +199,8 @@
   /**
    * Checks if is missing sparse.
    *
-   * @param indexAttribute the index attribute
+   * @param indexAttribute
+   *          the index attribute
    * @return true, if is missing sparse
    */
   @Override
@@ -213,8 +225,10 @@
   /**
    * Sets the value.
    *
-   * @param attributeIndex the attribute index
-   * @param d the d
+   * @param attributeIndex
+   *          the attribute index
+   * @param d
+   *          the d
    */
   @Override
   public void setValue(int attributeIndex, double d) {
@@ -229,8 +243,7 @@
   /**
    * Locates the greatest index that is not greater than the given index.
    *
-   * @return the internal index of the attribute index. Returns -1 if no index
-   * with this property could be found
+   * @return the internal index of the attribute index. Returns -1 if no index with this property could be found
    */
   public int locateIndex(int index) {
 
@@ -262,7 +275,8 @@
   /**
    * Deletes an attribute at the given position (0 to numAttributes() - 1).
    * 
-   * @param pos the attribute's position
+   * @param position
+   *          the attribute's position
    */
   @Override
   public void deleteAttributeAt(int position) {
@@ -296,9 +310,46 @@
   }
 
   @Override
-  public InstanceData copy() {
-    return new SparseInstanceData(this.attributeValues,this.indexValues,this.numberAttributes);
+  public void insertAttributeAt(int position) {
+    if ((position < 0) || (position > numAttributes())) {
+      throw new IllegalArgumentException("Can't insert attribute: index out "
+          + "of range");
+    }
+    int index = locateIndex(position);
+
+    this.numberAttributes++;
+    if ((index >= 0) && (indexValues[index] == position)) {
+      int[] tempIndices = new int[indexValues.length + 1];
+      double[] tempValues = new double[attributeValues.length + 1];
+      System.arraycopy(indexValues, 0, tempIndices, 0, index);
+      System.arraycopy(attributeValues, 0, tempValues, 0, index);
+      tempIndices[index] = position;
+      tempValues[index] = Double.NaN; //Missing Value
+      for (int i = index; i < indexValues.length; i++) {
+        tempIndices[i + 1] = indexValues[i] + 1;
+        tempValues[i + 1] = attributeValues[i];
+      }
+      indexValues = tempIndices;
+      attributeValues = tempValues;
+    } else {
+      int[] tempIndices = new int[indexValues.length + 1];
+      double[] tempValues = new double[attributeValues.length + 1];
+      System.arraycopy(indexValues, 0, tempIndices, 0, index + 1);
+      System.arraycopy(attributeValues, 0, tempValues, 0, index + 1);
+      tempIndices[index + 1] = position;
+      tempValues[index + 1] = Double.NaN; //Missing Value
+      for (int i = index + 1; i < indexValues.length; i++) {
+        tempIndices[i + 1] = indexValues[i] + 1;
+        tempValues[i + 1] = attributeValues[i];
+      }
+      indexValues = tempIndices;
+      attributeValues = tempValues;
+    }
   }
 
+  @Override
+  public InstanceData copy() {
+    return new SparseInstanceData(this.attributeValues, this.indexValues, this.numberAttributes);
+  }
 
 }
