diff --git a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/input/AERInputStream.scala b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/input/AERInputStream.scala
index aee002881980fdb2c602eb68115e2181afd1968e..e374002aae5f80069bf2f9e5d08b4532b9177aa8 100644
--- a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/input/AERInputStream.scala
+++ b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/input/AERInputStream.scala
@@ -4,7 +4,7 @@ import java.io.{EOFException, File}
 
 import fr.univ_lille.cristal.emeraude.n2s3.core.actors.ShapelessSpike
 import fr.univ_lille.cristal.emeraude.n2s3.support.GlobalTypesAlias.Timestamp
-import fr.univ_lille.cristal.emeraude.n2s3.support.io.{Input, InputSeq, N2S3Input, N2S3InputSpike}
+import fr.univ_lille.cristal.emeraude.n2s3.support.io._
 import net.sf.jaer.aemonitor.AEPacketRaw
 import net.sf.jaer.eventio.AEFileInputStream
 
@@ -92,17 +92,14 @@ case class AERInput(timestamp: Timestamp, address : Int) extends Input {
  * @param filename: String, the name of the file to read from
  */
 //TODO: expliquer la relation entre AERInputStream AERInput
-class AERInputStream(filename: String, s : Shape, chunkSize : Int = 64) extends N2S3InputStream[InputSeq[AERInput]] with StreamTimestampsManager {
+class AERInputStream(filename: String, s : Shape, chunkSize : Int = 64) extends InputStream[InputSeq[AERInput]] with StreamTimestampsManager {
 
   val aeis = new AEFileInputStream(new File(filename))
   val startTime = aeis.getFirstTimestamp
   val numberImage = aeis.size().toInt
   var peekEvent: Option[Seq[AERInput]] = None
-
   var lastPrint = 0
 
-  this.stageStrategy = new EndStageOnStreamEnd
-
   aeis.mark()
 
   /**
@@ -110,7 +107,6 @@ class AERInputStream(filename: String, s : Shape, chunkSize : Int = 64) extends
    */
   override def reset() : Unit = {
     maxPrefix()
-    this.stageStrategy.streamFinished()
     this.peekEvent = None
     aeis.rewind() }
 
@@ -142,7 +138,6 @@ class AERInputStream(filename: String, s : Shape, chunkSize : Int = 64) extends
    */
   def readAllEvents() = eventsFromAEPacket(aeis.readPacketByNumber(aeis.size().toInt))
 
-  override def shape: Shape = s
   override def next() = this.innerNext(chunkSize)
 
   def innerNext(n: Int): InputSeq[AERInput] = {
diff --git a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/input/DigitalHexInputStream.scala b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/input/DigitalHexInputStream.scala
index bfd382305eb093019043759613a69841a91ecdce..9a0117b8199aabdb5c17666304cff43febdd3572 100644
--- a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/input/DigitalHexInputStream.scala
+++ b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/input/DigitalHexInputStream.scala
@@ -1,5 +1,7 @@
 package fr.univ_lille.cristal.emeraude.n2s3.features.io.input
 
+import fr.univ_lille.cristal.emeraude.n2s3.support.io.InputStream
+
 /**
   * Factory for [[DigitalHexInputStream]].
   */
@@ -12,7 +14,7 @@ object DigitalHexEntry {
   * An input stream that generates hexadecimal chars in a 3x5 picture of binary pixels.
   * This stream is generated in memory.
   */
-class DigitalHexInputStream extends N2S3InputStream[SampleInput] {
+class DigitalHexInputStream extends InputStream[SampleInput] {
 
 
   val characters = List(
diff --git a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/input/EndStageOnStreamEnd.scala b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/input/EndStageOnStreamEnd.scala
deleted file mode 100644
index 197b58a3f4ba8ebf6fef9d0b2c820a33bf4fb72f..0000000000000000000000000000000000000000
--- a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/input/EndStageOnStreamEnd.scala
+++ /dev/null
@@ -1,26 +0,0 @@
-package fr.univ_lille.cristal.emeraude.n2s3.features.io.input
-
-import fr.univ_lille.cristal.emeraude.n2s3.core.InputLayer
-
-/**
-  * Created by guille on 6/10/16.
-  */
-
-abstract class InputStageStrategy() {
-  var inputLayer: Option[InputLayer] = None
-  protected def doEndOfStage() = this.inputLayer match{
-    case Some(layer) =>
-    case None =>
-  }
-
-  def streamFinished() = { this.doEndOfStage() }
-  def itemProcessed()
-}
-
-class EndStageOnItemProcessed() extends InputStageStrategy {
-  override def itemProcessed(): Unit = { this.doEndOfStage() }
-}
-
-class EndStageOnStreamEnd() extends InputStageStrategy {
-  override def itemProcessed(): Unit = { /*Do Nothing*/ }
-}
diff --git a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/input/FontInputStream.scala b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/input/FontInputStream.scala
index ff8e984554e09f554bba9f52470e2fe975205ddc..5ca5f6b2b1f801797ee2452361fa8c556ad0a968 100644
--- a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/input/FontInputStream.scala
+++ b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/input/FontInputStream.scala
@@ -2,6 +2,8 @@ package fr.univ_lille.cristal.emeraude.n2s3.features.io.input
 
 import java.io.File
 import javax.imageio.ImageIO
+
+import fr.univ_lille.cristal.emeraude.n2s3.support.io.InputStream
 /*
 object FontInput {
 
@@ -17,8 +19,7 @@ object FontInput {
 /**
   * Created by falezp on 20/04/16.
   */
-class FontInputStream(filename : String, characterWidth : Int, characterHeight : Int, labels : List[String]) extends
-N2S3InputStream[SampleInput]{
+class FontInputStream(filename : String, characterWidth : Int, characterHeight : Int, labels : List[String]) extends InputStream[SampleInput]{
 
   val image = ImageIO.read(new File(filename))
   val characters = labels.zipWithIndex.map{ case (name, c) =>
@@ -45,6 +46,4 @@ N2S3InputStream[SampleInput]{
   def reset() = {
     cursor = 0
   }
-
-  override def shape: Shape = Shape(characterWidth, characterHeight)
 }
diff --git a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/input/LFWReader.scala b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/input/LFWReader.scala
index 8ff3178ee4f95f3c78026bf1cdaa309f104577b0..6dc60b644178f065a7db3c8569fdd5163e904e48 100644
--- a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/input/LFWReader.scala
+++ b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/input/LFWReader.scala
@@ -3,6 +3,8 @@ package fr.univ_lille.cristal.emeraude.n2s3.features.io.input
 import java.io.File
 import javax.imageio.ImageIO
 
+import fr.univ_lille.cristal.emeraude.n2s3.support.io.InputStream
+
 import scala.util.Random
 /**
   * Created by falezp on 18/08/16.
@@ -14,12 +16,10 @@ object LFWEntry {
   def apply() = new StreamEntry[SampleInput](Shape(width, height))
 }
 
-class LFWReader(directoryPath : String) extends N2S3InputStream[SampleInput] {
+class LFWReader(directoryPath : String) extends InputStream[SampleInput] {
 
   val mainDirectory = new File(directoryPath)
 
-  override def shape: Shape = Shape(LFWEntry.width, LFWEntry.height)
-
   override def next(): SampleInput = {
 
     val subDirectories = mainDirectory.listFiles()
diff --git a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/input/MnistFileInputStream.scala b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/input/MnistFileInputStream.scala
index e3ad522dc1a9a7159fe3be049066754fb1838061..d326c0a005f70933dc5639660981b2d87190d1c5 100644
--- a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/input/MnistFileInputStream.scala
+++ b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/input/MnistFileInputStream.scala
@@ -2,6 +2,8 @@ package fr.univ_lille.cristal.emeraude.n2s3.features.io.input
 
 import java.io.{DataInputStream, FileInputStream, IOException}
 
+import fr.univ_lille.cristal.emeraude.n2s3.support.io.InputStream
+
 /**
  * Class Reader for mnist file
  */
@@ -10,7 +12,7 @@ object MnistEntry {
   def apply() = new StreamEntry[SampleInput](Shape(28, 28))
 }
 
-class MnistFileInputStream(val imageFile: String, val labelFile: String, val sizeOfChunk: Int  = 64) extends N2S3InputStream[SampleInput] {
+class MnistFileInputStream(val imageFile: String, val labelFile: String, val sizeOfChunk: Int  = 64) extends InputStream[SampleInput] {
 
 
   //Magic number
diff --git a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/input/N2S3InputStream.scala b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/input/N2S3InputStream.scala
index f9bf5b3b71b9a72a5a0324d414808497c8b6752b..bedcb62fe29c9e376b210e91d3405ec42a972391 100644
--- a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/input/N2S3InputStream.scala
+++ b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/input/N2S3InputStream.scala
@@ -1,39 +1,18 @@
 package fr.univ_lille.cristal.emeraude.n2s3.features.io.input
 
-import fr.univ_lille.cristal.emeraude.n2s3.core.InputLayer
 import fr.univ_lille.cristal.emeraude.n2s3.support.io.InputStreamCombinators._
 import fr.univ_lille.cristal.emeraude.n2s3.support.io._
 
-/**
-  * Created by guille on 6/3/16.
-  */
-
-abstract class N2S3InputStream[T] extends InputStream[T]{
-
-  def shape : Shape
-
-  var stageStrategy: InputStageStrategy = new EndStageOnItemProcessed()
-  def getStageManagementStrategy() = this.stageStrategy
-
-  def labelChange(label : String) = {
-    //stageStrategy.inputLayer.get.labelChange(label)
-  }
-
-  def setContainer(container : InputLayer) : Unit = {
-    stageStrategy.inputLayer = Some(container)
-  }
-}
-
 abstract class StreamConverter[I <: InputSeq[_], O <: InputSeq[_]] {
 
-  private var inputStream : N2S3InputStream[I] = _
+  private var inputStream : InputStream[I] = _
   protected var shape = Shape()
 
   def setShape(shape : Shape) : Unit = {
     this.shape = shape
   }
 
-  def setStream(inputStream : N2S3InputStream[I]) = {
+  def setStream(inputStream : InputStream[I]) = {
     this.inputStream = inputStream
   }
   def atEnd() = inputStream.atEnd()
@@ -52,27 +31,17 @@ abstract class StreamConverter[I <: InputSeq[_], O <: InputSeq[_]] {
 }
 
 object N2S3InputStreamCombinators{
-  implicit def streamCombinator[T](stream: N2S3InputStream[T]): N2S3InputStreamCombinator[T, T] = {
+  implicit def streamCombinator[T](stream: InputStream[T]): N2S3InputStreamCombinator[T, T] = {
     new N2S3InputStreamCombinator(stream)
   }
 }
 
-class N2S3InputStreamCombinator[T, T2](originalStream: N2S3InputStream[T], combinedStream: InputStream[T2]) extends N2S3InputStream[T2] {
+class N2S3InputStreamCombinator[T, T2](originalStream: InputStream[T], combinedStream: InputStream[T2]) extends InputStream[T2] {
 
-  def this(stream: N2S3InputStream[T]) {
+  def this(stream: InputStream[T]) {
     this(stream, stream.asInstanceOf[InputStream[T2]])
   }
 
-  override def setContainer(container : InputLayer) : Unit = {
-    super.setContainer(container)
-    originalStream.setContainer(container)
-
-    combinedStream match {
-      case value: N2S3InputStream[_] => value.setContainer(container)
-      case _ =>
-    }
-  }
-
   def take(i: Int) = {
     val newCombinedStream = combinedStream.take(i)
     new N2S3InputStreamCombinator(originalStream, newCombinedStream)
@@ -103,9 +72,6 @@ class N2S3InputStreamCombinator[T, T2](originalStream: N2S3InputStream[T], combi
     new N2S3InputStreamCombinator(originalStream, newCombinedStream)
   }
 
-  override def shape : Shape = originalStream.shape
-  override def getStageManagementStrategy() = originalStream.getStageManagementStrategy()
-
   override def next(): T2 = combinedStream.next()
   override def atEnd(): Boolean = combinedStream.atEnd()
   override def reset(): Unit = combinedStream.reset()
diff --git a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/input/SeventSegment.scala b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/input/SeventSegment.scala
index da6c375ab08c91ac4e0177e3f6f675a7047116e8..7e9778b8312e0f03955ff6e01b305c2b5bab2e3b 100644
--- a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/input/SeventSegment.scala
+++ b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/input/SeventSegment.scala
@@ -1,5 +1,7 @@
 package fr.univ_lille.cristal.emeraude.n2s3.features.io.input
 
+import fr.univ_lille.cristal.emeraude.n2s3.support.io.InputStream
+
 /**
   * Created by falezp on 31/08/16.
   */
@@ -8,7 +10,7 @@ object SevenSegmentEntry {
   def apply() = new StreamEntry[SampleInput](Shape(7, 2))
 }
 
-class SevenSegmentInputStream extends N2S3InputStream[SampleInput] {
+class SevenSegmentInputStream extends InputStream[SampleInput] {
 
 
   val characters = List(
diff --git a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/input/StreamSupport.scala b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/input/StreamSupport.scala
index 5f23bfe6af86e4c431eaab682d781ebfd638ac01..156b9cd4b5046a98b5d608ce50a4d4e647c8bec2 100644
--- a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/input/StreamSupport.scala
+++ b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/input/StreamSupport.scala
@@ -3,7 +3,7 @@ package fr.univ_lille.cristal.emeraude.n2s3.features.io.input
 import java.io.EOFException
 
 import fr.univ_lille.cristal.emeraude.n2s3.support.GlobalTypesAlias.Timestamp
-import fr.univ_lille.cristal.emeraude.n2s3.support.io.{Input, InputSeq, N2S3Input}
+import fr.univ_lille.cristal.emeraude.n2s3.support.io.{Input, InputSeq, InputStream, N2S3Input}
 
 import scala.collection.mutable.ArrayBuffer
 
@@ -82,7 +82,7 @@ class StreamSupport[I <: InputSeq[_ <: Input], O <: InputSeq[_  <: Input]](val s
       output.innerProcess(outputConverter.dataConverter(data))
   }
 
-  def append(stream : N2S3InputStream[I]) : Unit = {
+  def append(stream : InputStream[I]) : Unit = {
     input.append(stream)
   }
 
@@ -97,15 +97,14 @@ class StreamSupport[I <: InputSeq[_ <: Input], O <: InputSeq[_  <: Input]](val s
 
 class StreamEntry[I <: InputSeq[_ <: Input]](shape : Shape) extends StreamSupport[I, I](shape) {
 
-  private val entryStreams = new ArrayBuffer[N2S3InputStream[I]]
+  private val entryStreams = new ArrayBuffer[InputStream[I]]
   private var entryCursor = 0
 
   override def getEntry : StreamEntry[I] = {
     this
   }
 
-  override def append(stream : N2S3InputStream[I]) : Unit = {
-    assert(stream.shape == this.shape)
+  override def append(stream : InputStream[I]) : Unit = {
     entryStreams += stream
   }
 
diff --git a/n2s3/src/test/scala/fr/univ_lille/cristal/emeraude/n2s3/core/TestInput.scala b/n2s3/src/test/scala/fr/univ_lille/cristal/emeraude/n2s3/core/TestInput.scala
index 394ce772b2865ec90f39612d43b2829a047cd659..2803878947cf3c99780cb2d9f63a855fedd62123 100644
--- a/n2s3/src/test/scala/fr/univ_lille/cristal/emeraude/n2s3/core/TestInput.scala
+++ b/n2s3/src/test/scala/fr/univ_lille/cristal/emeraude/n2s3/core/TestInput.scala
@@ -13,7 +13,7 @@ import fr.univ_lille.cristal.emeraude.n2s3.support.io._
   * Created by falezp on 03/05/16.
   */
 
-class MockStream(numberOfInput : Int, timeLength : Int) extends N2S3InputStream[InputSeq[N2S3Input]] {
+class MockStream(numberOfInput : Int, timeLength : Int) extends InputStream[InputSeq[N2S3Input]] {
 
   var currentTimestamp : Timestamp = 0
 
@@ -27,8 +27,6 @@ class MockStream(numberOfInput : Int, timeLength : Int) extends N2S3InputStream[
   def reset() : Unit = {
     currentTimestamp = 0
   }
-
-  override def shape: Shape = Shape(numberOfInput)
 }
 
 class TestInput extends UnitActorSpec {
diff --git a/n2s3/src/test/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/TestAERInputStream.scala b/n2s3/src/test/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/TestAERInputStream.scala
index 65f963cc3567402b9d4020a644f953bb6cc62cd4..17e8a61a728e46d51bf9e6d6c46f1173d2b7d8c5 100644
--- a/n2s3/src/test/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/TestAERInputStream.scala
+++ b/n2s3/src/test/scala/fr/univ_lille/cristal/emeraude/n2s3/features/io/TestAERInputStream.scala
@@ -46,17 +46,6 @@ class TestAERInputStream extends UnitSpec {
     inputStream.numberImage shouldBe 6505992
   }
 
-  "AERInputStream" should "know number of rows per image" in {
-    val inputStream = new AERInputStream(filename, Shape(128, 128))
-    inputStream.shape(0) shouldBe 128
-  }
-
-  "AERInputStream" should "know number of columns per image" in {
-    val inputStream = new AERInputStream(filename, Shape(128, 128))
-    inputStream.shape(1) shouldBe 128
-  }
-
-
   "AERInputStream next" should "be able to read all images without throwing an exception" in {
     val inputStream = new AERInputStream(filename, Shape(128, 128), 1)
     for (i <- 0 until inputStream.numberImage) {
diff --git a/n2s3/src/test/scala/fr/univ_lille/cristal/emeraude/n2s3/integration/TestIntegrationN2S3.scala b/n2s3/src/test/scala/fr/univ_lille/cristal/emeraude/n2s3/integration/TestIntegrationN2S3.scala
index 5b6020661ee50ad4fdfcb5961c34a75fcf2deb09..a996d8dc99eae1116262f4e241b5d991ffd43302 100644
--- a/n2s3/src/test/scala/fr/univ_lille/cristal/emeraude/n2s3/integration/TestIntegrationN2S3.scala
+++ b/n2s3/src/test/scala/fr/univ_lille/cristal/emeraude/n2s3/integration/TestIntegrationN2S3.scala
@@ -8,7 +8,7 @@ import fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.{Connecti
 import fr.univ_lille.cristal.emeraude.n2s3.features.io.input._
 import fr.univ_lille.cristal.emeraude.n2s3.support.UnitCast._
 import fr.univ_lille.cristal.emeraude.n2s3.support.actors.{ActorPerNeuronGroupPolicy, LocalActorDeploymentStrategy}
-import fr.univ_lille.cristal.emeraude.n2s3.support.io.SequenceInputStream
+import fr.univ_lille.cristal.emeraude.n2s3.support.io.{InputStream, SequenceInputStream}
 
 
 
@@ -22,8 +22,8 @@ class TestIntegrationN2S3 extends UnitSpec {
     stream >> new SampleToSpikeTrainConverter(0, 23, 150 MilliSecond, 350 MilliSecond)
   }
 
-  def newTestInputStream: N2S3InputStream[SampleInput] = {
-    new N2S3InputStream[SampleInput] {
+  def newTestInputStream: InputStream[SampleInput] = {
+    new InputStream[SampleInput] {
       val stream = new SequenceInputStream[SampleInput](List(SampleInput(label = "label", sample = List(SampleUnitInput(1, 0, 1), SampleUnitInput(1, 0, 1)))))
 
       override def next(): SampleInput = stream.next()
@@ -31,8 +31,6 @@ class TestIntegrationN2S3 extends UnitSpec {
       override def atEnd(): Boolean = stream.atEnd()
 
       override def reset(): Unit = stream.reset()
-
-      override def shape: Shape = Shape(1, 2)
     }
   }
 
@@ -61,6 +59,9 @@ class TestIntegrationN2S3 extends UnitSpec {
     val inputStream = this.newTestStreamEntry()
 
     val inputLayer = n2s3.createInput(inputStream)
+    n2s3
+      .createNeuronGroup("group", 2)
+      .setNeuronModel(MockNeuron)
     n2s3.run()
 
     val actorBeforeSecondStart = inputLayer.actorPath.get.actor
@@ -97,11 +98,6 @@ class TestIntegrationN2S3 extends UnitSpec {
 
     var called = 0
     inputLayer.connectTo(rbmLayer, new ConnectionPolicy{
-      override def generate(from: NeuronIterable, to: NeuronIterable): Traversable[Connection] = {
-        called = called + 1
-        List()
-      }
-
       override def generate(from: NeuronGroupRef, to: NeuronGroupRef): Traversable[Connection] = {
         called = called + 1
         List()
@@ -159,6 +155,7 @@ class TestIntegrationN2S3 extends UnitSpec {
   "Change input stream" should "change stream in actor if already deployed" in {
     val n2s3 = new N2S3()
     val inputStream = this.newTestStreamEntry()
+    n2s3.createInput(inputStream)
     n2s3.createNeuronGroup("group", 2)
         .setNeuronModel(MockNeuron)
     n2s3.run()
diff --git a/n2s3_examples/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/apps/bio/Masquelier.scala b/n2s3_examples/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/apps/bio/Masquelier.scala
index ba662d7e0852798651c59ca99f5306ac52109c3d..6e3196254017194fefa2b7c1022cdf42748a1e8a 100644
--- a/n2s3_examples/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/apps/bio/Masquelier.scala
+++ b/n2s3_examples/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/apps/bio/Masquelier.scala
@@ -20,13 +20,13 @@ import fr.univ_lille.cristal.emeraude.n2s3.models.qbg.NeuronPotentialEvent
 import fr.univ_lille.cristal.emeraude.n2s3.support.GlobalTypesAlias.Timestamp
 import fr.univ_lille.cristal.emeraude.n2s3.support.actors.LocalActorDeploymentStrategy
 import fr.univ_lille.cristal.emeraude.n2s3.support.event.Subscribe
-import fr.univ_lille.cristal.emeraude.n2s3.support.io.{InputSeq, N2S3Input, N2S3InputEnd, N2S3InputSpike}
+import fr.univ_lille.cristal.emeraude.n2s3.support.io._
 import fr.univ_lille.cristal.emeraude.n2s3.support.{InputDistribution, Time}
 
 import scala.concurrent.Await
 import scala.util.Random
 
-class SpikePatternGenerator(entryNumber : Int, patternDuration : Time, spikeFrequency : Float, patternFrequency : Float) extends N2S3InputStream[InputSeq[N2S3Input]] {
+class SpikePatternGenerator(entryNumber : Int, patternDuration : Time, spikeFrequency : Float, patternFrequency : Float) extends InputStream[InputSeq[N2S3Input]] {
 
   private val pattern = (0 until entryNumber/2).map { _ =>
     InputDistribution.poisson(Random, 0, patternDuration.timestamp, patternDuration.asSecond*spikeFrequency)
@@ -85,8 +85,6 @@ class SpikePatternGenerator(entryNumber : Int, patternDuration : Time, spikeFreq
     writer.close()
   }
 
-  override def shape: Shape = Shape(entryNumber)
-
   override def next(): InputSeq[N2S3Input] = {
     val chunkSize = 64
 
diff --git a/n2s3_examples/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/apps/bio/SmallReservoir.scala b/n2s3_examples/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/apps/bio/SmallReservoir.scala
index 04bac8e64cca61f82e33feb5ff8629efd90b21f7..5091b25a8c1b7ae87188b28a680cbe341cee2a31 100644
--- a/n2s3_examples/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/apps/bio/SmallReservoir.scala
+++ b/n2s3_examples/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/apps/bio/SmallReservoir.scala
@@ -29,7 +29,7 @@ import scala.util.Random
   * Created by falezp on 14/10/16.
   */
 
-class MoveEntry extends N2S3InputStream[InputSeq[N2S3Input]] {
+class MoveEntry extends InputStream[InputSeq[N2S3Input]] {
 
   val entrySize = 10
   val velocity = 2 MilliSecond // per entry point
@@ -61,8 +61,6 @@ class MoveEntry extends N2S3InputStream[InputSeq[N2S3Input]] {
     }.sortBy(_._1)
   }
 
-  override def shape: Shape = Shape(entrySize)
-
   override def next(): InputSeq[N2S3Input] = {
    /* val chunkSize = 64
 
diff --git a/n2s3_examples/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/apps/bio/SupervisedDelay.scala b/n2s3_examples/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/apps/bio/SupervisedDelay.scala
index 5f90beefbcd98a9d9e41f406c9ad05416400a3b3..cfcb86cdfe7bde3ef8e4b356cf01abd12c33604d 100644
--- a/n2s3_examples/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/apps/bio/SupervisedDelay.scala
+++ b/n2s3_examples/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/apps/bio/SupervisedDelay.scala
@@ -3,24 +3,22 @@ package fr.univ_lille.cristal.emeraude.n2s3.apps.bio
 import fr.univ_lille.cristal.emeraude.n2s3.core.actors.ShapelessSpike
 import fr.univ_lille.cristal.emeraude.n2s3.core.models.properties.MembraneThresholdFloat
 import fr.univ_lille.cristal.emeraude.n2s3.features.builder.N2S3
-import fr.univ_lille.cristal.emeraude.n2s3.features.io.input.{N2S3InputStream, Shape, StreamEntry}
+import fr.univ_lille.cristal.emeraude.n2s3.features.io.input.{Shape, StreamEntry}
 import fr.univ_lille.cristal.emeraude.n2s3.features.learning.SpikeProp
 import fr.univ_lille.cristal.emeraude.n2s3.models.bio.{FixedSynapse, SRM2Neuron}
 import fr.univ_lille.cristal.emeraude.n2s3.support.UnitCast._
-import fr.univ_lille.cristal.emeraude.n2s3.support.io.{InputSeq, N2S3Input, N2S3InputLabel, N2S3InputSpike}
+import fr.univ_lille.cristal.emeraude.n2s3.support.io._
 
 import scala.util.Random
 /**
   * Created by falezp on 21/10/16.
   */
 
-class DelayEntry(n : Int) extends N2S3InputStream[InputSeq[N2S3Input]] {
+class DelayEntry(n : Int) extends InputStream[InputSeq[N2S3Input]] {
 
   val inputInterval = 50 MilliSecond
   var cursor = 0
 
-  override def shape: Shape = Shape(1)
-
   override def next(): InputSeq[N2S3Input] = {
     cursor += 1
     new InputSeq(Seq(N2S3InputSpike(ShapelessSpike, inputInterval.timestamp*(cursor-1), Seq(0)),
diff --git a/n2s3_examples/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/apps/bio/SupervisedXOR.scala b/n2s3_examples/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/apps/bio/SupervisedXOR.scala
index 0322e05a52caedec89b29bdaa4f02eb89cb63744..bb7d8361cd5ba148b01d4a002e5c167797cf47c9 100644
--- a/n2s3_examples/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/apps/bio/SupervisedXOR.scala
+++ b/n2s3_examples/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/apps/bio/SupervisedXOR.scala
@@ -11,14 +11,14 @@ import fr.univ_lille.cristal.emeraude.n2s3.features.logging.ExportNetworkTopolog
 import fr.univ_lille.cristal.emeraude.n2s3.models.bio._
 import fr.univ_lille.cristal.emeraude.n2s3.support.Time
 import fr.univ_lille.cristal.emeraude.n2s3.support.UnitCast._
-import fr.univ_lille.cristal.emeraude.n2s3.support.io.{InputSeq, N2S3Input, N2S3InputLabel, N2S3InputSpike}
+import fr.univ_lille.cristal.emeraude.n2s3.support.io._
 
 import scala.util.Random
 /**
   * Created by falezp on 19/10/16.
   */
 
-class XOREntry(val limit : Int) extends N2S3InputStream[InputSeq[N2S3Input]] {
+class XOREntry(val limit : Int) extends InputStream[InputSeq[N2S3Input]] {
 
   val inputDelay = 6 MilliSecond
   val inputInterval = 50 MilliSecond
@@ -31,8 +31,6 @@ class XOREntry(val limit : Int) extends N2S3InputStream[InputSeq[N2S3Input]] {
       Seq(1.0, 1.0, 0.0) -> "0"
   )
 
-  override def shape: Shape = Shape(3)
-
   override def next(): InputSeq[N2S3Input] = {
     val currData = data(Random.nextInt(data.size))
 
@@ -53,7 +51,7 @@ class XOREntry(val limit : Int) extends N2S3InputStream[InputSeq[N2S3Input]] {
 }
 
 class MultipleDelayConnection(delays : Seq[Time], neuronConnectionConstructor : (Int, Int, Time) => NeuronConnection) extends ConnectionPolicy {
-  def generate(from : NeuronIterable, to : NeuronIterable) = {
+  override def generate(from : NeuronIterable, to : NeuronIterable) = {
     for {
       (in, in_index) <- from.toSeq.zipWithIndex
       (out, out_index) <- to.toSeq.zipWithIndex
diff --git a/n2s3_examples/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/apps/ternary/BitStream.scala b/n2s3_examples/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/apps/ternary/BitStream.scala
index 76b4b4bc3722aa0ed070194e1332fc27b34372dc..ff4a12664b3452f3a3137b7f550a6645860b2e2d 100644
--- a/n2s3_examples/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/apps/ternary/BitStream.scala
+++ b/n2s3_examples/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/apps/ternary/BitStream.scala
@@ -19,7 +19,7 @@ import fr.univ_lille.cristal.emeraude.n2s3.support.GlobalTypesAlias.Timestamp
 import fr.univ_lille.cristal.emeraude.n2s3.support.UnitCast._
 import fr.univ_lille.cristal.emeraude.n2s3.support.actors.LocalActorDeploymentStrategy
 import fr.univ_lille.cristal.emeraude.n2s3.support.event.Subscribe
-import fr.univ_lille.cristal.emeraude.n2s3.support.io.{InputSeq, N2S3Input, N2S3InputEnd, N2S3InputSpike}
+import fr.univ_lille.cristal.emeraude.n2s3.support.io._
 
 import scala.collection.mutable.ListBuffer
 import scala.concurrent.Await
@@ -28,7 +28,7 @@ import scala.util.Random
   * Created by falezp on 14/10/16.
   */
 
-class BitStreamEntry(pattern : Seq[Boolean]) extends N2S3InputStream[InputSeq[N2S3Input]] {
+class BitStreamEntry(pattern : Seq[Boolean]) extends InputStream[InputSeq[N2S3Input]] {
 
   var inputData = Seq[Float]()
   var labelTimestamps = ListBuffer[Timestamp]()
@@ -48,8 +48,6 @@ class BitStreamEntry(pattern : Seq[Boolean]) extends N2S3InputStream[InputSeq[N2
 
   var currentTimestamp : Timestamp = 0L
 
-  override def shape: Shape = Shape(1)
-
   override def next(): InputSeq[N2S3Input] = {
     while(currentTimestamp.toInt < inputData.size && inputData(currentTimestamp.toInt) != 1f)
       currentTimestamp += 1
diff --git a/n2s3_examples/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/apps/ternary/PatternStart.scala b/n2s3_examples/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/apps/ternary/PatternStart.scala
index 93602a3049bf99d59d6f0be2f96192c17cd61cd2..ea6439cbe9088ad56750d8bfa91da4ed257cfb11 100644
--- a/n2s3_examples/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/apps/ternary/PatternStart.scala
+++ b/n2s3_examples/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/apps/ternary/PatternStart.scala
@@ -20,13 +20,13 @@ import fr.univ_lille.cristal.emeraude.n2s3.support.GlobalTypesAlias.Timestamp
 import fr.univ_lille.cristal.emeraude.n2s3.support.UnitCast._
 import fr.univ_lille.cristal.emeraude.n2s3.support.actors.LocalActorDeploymentStrategy
 import fr.univ_lille.cristal.emeraude.n2s3.support.event.Subscribe
-import fr.univ_lille.cristal.emeraude.n2s3.support.io.{InputSeq, N2S3Input, N2S3InputEnd, N2S3InputSpike}
+import fr.univ_lille.cristal.emeraude.n2s3.support.io._
 import fr.univ_lille.cristal.emeraude.n2s3.support.{InputDistribution, Time}
 
 import scala.concurrent.Await
 import scala.util.Random
 
-class SpikePatternGenerator(entryNumber : Int, patternDuration : Time, spikeFrequency : Float, patternFrequency : Float) extends N2S3InputStream[InputSeq[N2S3Input]] {
+class SpikePatternGenerator(entryNumber : Int, patternDuration : Time, spikeFrequency : Float, patternFrequency : Float) extends InputStream[InputSeq[N2S3Input]] {
 
   private val pattern = (0 until entryNumber/2).map { _ =>
     InputDistribution.poisson(Random, 0, patternDuration.timestamp, patternDuration.asSecond*spikeFrequency)
@@ -77,8 +77,6 @@ class SpikePatternGenerator(entryNumber : Int, patternDuration : Time, spikeFreq
     writer.close()
   }
 
-  override def shape: Shape = Shape(entryNumber)
-
   override def next(): InputSeq[N2S3Input] = {
     val chunkSize = 64
 
diff --git a/n2s3_examples/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/apps/ternary/SmallReservoir.scala b/n2s3_examples/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/apps/ternary/SmallReservoir.scala
index a3936bf926c4c2186b808c0bb258e903bb72af5a..4350a2590c67c87184b5ff1c9ac742167ee35569 100644
--- a/n2s3_examples/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/apps/ternary/SmallReservoir.scala
+++ b/n2s3_examples/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/apps/ternary/SmallReservoir.scala
@@ -23,7 +23,7 @@ import scala.util.Random
   * Created by falezp on 14/10/16.
   */
 
-class MoveEntry extends N2S3InputStream[InputSeq[N2S3Input]] {
+class MoveEntry extends InputStream[InputSeq[N2S3Input]] {
 
   val entrySize = 10
   val velocity = 10 MicroSecond // per entry point
@@ -52,8 +52,6 @@ class MoveEntry extends N2S3InputStream[InputSeq[N2S3Input]] {
     }.sortBy(_._1)
   }
 
-  override def shape: Shape = Shape(entrySize)
-
   override def next(): InputSeq[N2S3Input] = {
     val chunkSize = 64