diff --git a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/ConnectionRef.scala b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/ConnectionRef.scala
index 5000ac944e6fed30faeb6e04d2b25b28126bba5b..e3c724473c6e9a3cd1dd76a1b6a8f0d2db184e0e 100644
--- a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/ConnectionRef.scala
+++ b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/ConnectionRef.scala
@@ -1,6 +1,6 @@
 package fr.univ_lille.cristal.emeraude.n2s3.features.builder
 
-import fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.{ConnectionSet, ExternalConnectionPolicy}
+import fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.{ConnectionSet, ConnectionPolicy}
 
 /**
   * Models a connection between two neuron groups.
@@ -8,7 +8,7 @@ import fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.{Connecti
   * @param to [[NeuronGroupRef]]  destination of the connection
   * @param connectionType the kind of connection used
   */
-class ConnectionRef(from: NeuronGroupRef, to: NeuronGroupRef, connectionType: ExternalConnectionPolicy) {
+class ConnectionRef(from: NeuronGroupRef, to: NeuronGroupRef, connectionType: ConnectionPolicy) {
 
   var deployed = false
   def isDeployed = this.deployed
diff --git a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/NeuronGroupRef.scala b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/NeuronGroupRef.scala
index 47604935000c5fa8081df0dbeffb249fb40e78d3..1e679e5f9d6b278df6236560dc42ecec32ce51fa 100644
--- a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/NeuronGroupRef.scala
+++ b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/NeuronGroupRef.scala
@@ -3,7 +3,7 @@ package fr.univ_lille.cristal.emeraude.n2s3.features.builder
 import fr.univ_lille.cristal.emeraude.n2s3.core.Neuron.SetSynchronizer
 import fr.univ_lille.cristal.emeraude.n2s3.core._
 import fr.univ_lille.cristal.emeraude.n2s3.core.actors.NetworkEntityActor
-import fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.ExternalConnectionPolicy
+import fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.ConnectionPolicy
 import fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.types.FullConnection
 import fr.univ_lille.cristal.emeraude.n2s3.features.io.input.Shape
 import fr.univ_lille.cristal.emeraude.n2s3.models.qbg.FixedParameter
@@ -91,11 +91,11 @@ class NeuronGroupRef(n2s3: N2S3) extends NetworkEntityRef {
     this
   }
 
-  def connectToItselfUsing(connectionType: ExternalConnectionPolicy = new FullConnection) : ConnectionRef = {
+  def connectToItselfUsing(connectionType: ConnectionPolicy = new FullConnection) : ConnectionRef = {
     this.connectTo(this, connectionType)
   }
 
-  def connectTo(layer: NeuronGroupRef, connectionType: ExternalConnectionPolicy = new FullConnection) : ConnectionRef = {
+  def connectTo(layer: NeuronGroupRef, connectionType: ConnectionPolicy = new FullConnection) : ConnectionRef = {
     val ref = new ConnectionRef(this, layer, connectionType)
     this.connections += ref
     ref
diff --git a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/NeuronLayer.scala b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/NeuronLayer.scala
index be583efb0b0fbb6601a09c0165683915cb0068e6..d2594311de0b37833a9697e08bcfda1d1b950f27 100644
--- a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/NeuronLayer.scala
+++ b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/NeuronLayer.scala
@@ -1,7 +1,7 @@
 package fr.univ_lille.cristal.emeraude.n2s3.features.builder
 
 import fr.univ_lille.cristal.emeraude.n2s3.core.{NetworkEntityPath, NeuronConnection}
-import fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.{ConnectionSet, ExternalConnectionPolicy, InternalConnectionPolicy}
+import fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.{ConnectionSet, ConnectionPolicy, InternalConnectionPolicy}
 import fr.univ_lille.cristal.emeraude.n2s3.features.io.input.Shape
 import fr.univ_lille.cristal.emeraude.n2s3.features.learning.{BackPropagationMethod, DefaultBackPropagationMethod}
 
diff --git a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/connection/ConnectionPolicy.scala b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/connection/AbstractConnectionPolicy.scala
similarity index 78%
rename from n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/connection/ConnectionPolicy.scala
rename to n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/connection/AbstractConnectionPolicy.scala
index 434c58f51c7cf3eca04ca1af8153d0838da8d6f3..e6fde115cd8dac787441907950bc8a4fe9a9e1cd 100644
--- a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/connection/ConnectionPolicy.scala
+++ b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/connection/AbstractConnectionPolicy.scala
@@ -22,7 +22,7 @@ class ConnectionSet(list : Traversable[(NetworkEntityPath, NetworkEntityPath)])
   def size = list.size
 }
 
-trait ConnectionPolicy {
+trait AbstractConnectionPolicy {
 
   var defaultConnectionConstructor : Option[() => NeuronConnection] = None
 
@@ -45,7 +45,7 @@ trait ConnectionPolicy {
   }
 }
 
-trait ExternalConnectionPolicy extends ConnectionPolicy {
+trait ConnectionPolicy extends AbstractConnectionPolicy {
 
   final def create(from : NeuronGroupRef, to : NeuronGroupRef) : ConnectionSet = {
     construct(generate(from, to))
@@ -65,7 +65,8 @@ trait ExternalConnectionPolicy extends ConnectionPolicy {
  def connects(aNeuron: NeuronRef, anotherNeuron: NeuronRef): Boolean
 }
 
-trait InternalConnectionPolicy extends ConnectionPolicy {
+@deprecated("Use [[ExternalConnectionPolicyInstead]]", "4/8/2016")
+trait InternalConnectionPolicy extends AbstractConnectionPolicy {
   final def create(layer : NeuronGroupRef) : ConnectionSet = {
     construct(generate(layer))
   }
@@ -76,16 +77,4 @@ trait InternalConnectionPolicy extends ConnectionPolicy {
 
   def generate(layer : NeuronGroupRef) : Traversable[Connection]
   def generate(layer : NeuronIterable) : Traversable[Connection]
-}
-
-object NoConnection extends ExternalConnectionPolicy {
-  def generate(from : NeuronIterable, to : NeuronIterable) = None
-
-  override def generate(from: NeuronGroupRef, to: NeuronGroupRef): Traversable[Connection] = None
-
- /********************************************************************************************************************
-  * Testing
-  ******************************************************************************************************************/
-
-  override def connects(aNeuron: NeuronRef, anotherNeuron: NeuronRef): Boolean = false
 }
\ No newline at end of file
diff --git a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/connection/types/ConvolutionalConnection.scala b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/connection/types/ConvolutionalConnection.scala
index 850e9bc4e77ec2bfe58f9ed2ff7463afdda6fef1..20e99285b6318ea4a3fb024b49144ad7686024e9 100644
--- a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/connection/types/ConvolutionalConnection.scala
+++ b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/connection/types/ConvolutionalConnection.scala
@@ -2,7 +2,7 @@ package fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.types
 
 import fr.univ_lille.cristal.emeraude.n2s3.core.models.convolutional.SharedNeuronConnection
 import fr.univ_lille.cristal.emeraude.n2s3.features.builder.{NeuronGroupRef, NeuronIterable, NeuronRef}
-import fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.{Connection, ExternalConnectionPolicy}
+import fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.{Connection, ConnectionPolicy}
 import fr.univ_lille.cristal.emeraude.n2s3.features.builder.convolutional.Filter2D
 
 import scala.collection.mutable
@@ -10,7 +10,7 @@ import scala.collection.mutable
 /**
   * Created by falezp on 23/05/16.
   */
-class ConvolutionalConnection[A](filters : Traversable[Filter2D], connectionConstructor : A => SharedNeuronConnection[A], sharedObjConstructor : () => A) extends ExternalConnectionPolicy {
+class ConvolutionalConnection[A](filters : Traversable[Filter2D], connectionConstructor : A => SharedNeuronConnection[A], sharedObjConstructor : () => A) extends ConnectionPolicy {
 
   def generate(from: NeuronIterable, to: NeuronIterable): Traversable[Connection] = {
     assert(from.shape.dimensionNumber == 2 && to.shape.dimensionNumber == 3)
diff --git a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/connection/types/FullConnection.scala b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/connection/types/FullConnection.scala
index 97dcad50488390d4856debc21a4045ff85d0f54f..45eae4916d1bb11f22e1512e6a9b2dbd5574eb1e 100644
--- a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/connection/types/FullConnection.scala
+++ b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/connection/types/FullConnection.scala
@@ -2,12 +2,12 @@ package fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.types
 
 import fr.univ_lille.cristal.emeraude.n2s3.core.NeuronConnection
 import fr.univ_lille.cristal.emeraude.n2s3.features.builder.{NeuronGroupRef, NeuronIterable, NeuronRef}
-import fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.{Connection, ExternalConnectionPolicy}
+import fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.{Connection, ConnectionPolicy}
 
 /**
   * Created by falezp on 23/05/16.
   */
-class FullConnection(neuronConnectionConstructor : Option[() => NeuronConnection]) extends ExternalConnectionPolicy {
+class FullConnection(neuronConnectionConstructor : Option[() => NeuronConnection]) extends ConnectionPolicy {
 
   def this(){
     this(None)
diff --git a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/connection/types/FullExceptSelfConnection.scala b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/connection/types/FullExceptSelfConnection.scala
index e6acebc66b17a382ea5adda2d78530a6b7182403..97ef7f9b914898a8485289bf30f9497f7245c976 100644
--- a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/connection/types/FullExceptSelfConnection.scala
+++ b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/connection/types/FullExceptSelfConnection.scala
@@ -1,12 +1,12 @@
 package fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.types
 
 import fr.univ_lille.cristal.emeraude.n2s3.features.builder.{NeuronGroupRef, NeuronIterable, NeuronRef}
-import fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.{Connection, ExternalConnectionPolicy}
+import fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.{Connection, ConnectionPolicy}
 
 /**
   * Created by falezp on 23/05/16.
   */
-class FullExceptSelfConnection extends ExternalConnectionPolicy {
+class FullExceptSelfConnection extends ConnectionPolicy {
 
   def generate(from : NeuronIterable, to : NeuronIterable) = {
     assert(from.size == to.size)
diff --git a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/connection/types/ManualConnection.scala b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/connection/types/ManualConnection.scala
index bde2c0b225995eec0fc76ec2fe315014dbddb287..39060307b1a7b18c052dd2853c05d93dd3905d4e 100644
--- a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/connection/types/ManualConnection.scala
+++ b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/connection/types/ManualConnection.scala
@@ -2,12 +2,12 @@ package fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.types
 
 import fr.univ_lille.cristal.emeraude.n2s3.core.NeuronConnection
 import fr.univ_lille.cristal.emeraude.n2s3.features.builder.{NeuronGroupRef, NeuronIterable, NeuronRef}
-import fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.{InternalConnectionPolicy, Connection, ExternalConnectionPolicy}
+import fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.{InternalConnectionPolicy, Connection, ConnectionPolicy}
 
 /**
   * Created by falezp on 14/10/16.
   */
-class ManualConnection(connections : Traversable[(Int, Int, Option[NeuronConnection])]) extends ExternalConnectionPolicy {
+class ManualConnection(connections : Traversable[(Int, Int, Option[NeuronConnection])]) extends ConnectionPolicy {
 
   def generate(from : NeuronIterable, to : NeuronIterable) = {
     throw new UnsupportedOperationException
diff --git a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/connection/types/MaxPoolingConnection.scala b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/connection/types/MaxPoolingConnection.scala
index 8460715db1a287b09f32817c62dbf4cf550f7784..9b8104045f31b73896be15ffded057439dd6a496 100644
--- a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/connection/types/MaxPoolingConnection.scala
+++ b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/connection/types/MaxPoolingConnection.scala
@@ -1,13 +1,13 @@
 package fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.types
 
 import fr.univ_lille.cristal.emeraude.n2s3.features.builder.{NeuronGroupRef, NeuronIterable, NeuronRef}
-import fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.{Connection, ExternalConnectionPolicy}
+import fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.{Connection, ConnectionPolicy}
 import fr.univ_lille.cristal.emeraude.n2s3.features.io.input.Shape
 
 /**
   * Created by falezp on 27/05/16.
   */
-class MaxPoolingConnection(reduceFactors : Int*) extends ExternalConnectionPolicy {
+class MaxPoolingConnection(reduceFactors : Int*) extends ConnectionPolicy {
 
   def generate(from : NeuronIterable, to : NeuronIterable) : Traversable[Connection] = {
     assert(from.shape.dimensionNumber == to.shape.dimensionNumber && to.shape.dimensions.zip(reduceFactors).map(e => e._1*e._2) == from.shape)
diff --git a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/connection/types/OneToOneConnection.scala b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/connection/types/OneToOneConnection.scala
index 4d2e7b07925098118f0623011783cfc5e0889968..7fce1516c05f2437b0ffef7a617d89e4dfcda4bc 100644
--- a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/connection/types/OneToOneConnection.scala
+++ b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/connection/types/OneToOneConnection.scala
@@ -5,9 +5,9 @@
 package fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.types
 
 import fr.univ_lille.cristal.emeraude.n2s3.features.builder.{NeuronGroupRef, NeuronIterable, NeuronRef}
-import fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.{Connection, ExternalConnectionPolicy}
+import fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.{Connection, ConnectionPolicy}
 
-class OneToOneConnection extends ExternalConnectionPolicy {
+class OneToOneConnection extends ConnectionPolicy {
 	def generate(from : NeuronIterable, to : NeuronIterable) = {
 		assert(from.size == to.size)
 		from.toSeq.zip(to.toSeq).map{ case (in, out) => Connection(in, out)}
diff --git a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/connection/types/RandomConnection.scala b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/connection/types/RandomConnection.scala
index 8c4026a005961d8353a872364e589f16dfc06cf1..695ce76f589f9639220bd210e468c5dbfb293259 100644
--- a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/connection/types/RandomConnection.scala
+++ b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/connection/types/RandomConnection.scala
@@ -2,14 +2,14 @@ package fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.types
 
 import fr.univ_lille.cristal.emeraude.n2s3.core.NeuronConnection
 import fr.univ_lille.cristal.emeraude.n2s3.features.builder.{NeuronGroupRef, NeuronIterable, NeuronRef}
-import fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.{Connection, ExternalConnectionPolicy}
+import fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.{Connection, ConnectionPolicy}
 
 import scala.util.Random
 
 /**
   * Created by falezp on 07/07/16.
   */
-class RandomConnection(connectionRate : Float, connectionConstructor : () => NeuronConnection) extends ExternalConnectionPolicy {
+class RandomConnection(connectionRate : Float, connectionConstructor : () => NeuronConnection) extends ConnectionPolicy {
   def generate(from : NeuronIterable, to : NeuronIterable) = {
     for {
       in <- from
diff --git a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/connection/types/WinnerTakeAllConnection.scala b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/connection/types/WinnerTakeAllConnection.scala
index a1143e9e66214f450b8b9d357906d30ec61f437a..121d7789185810658ae8f7fd11d9bdd32bb5bd72 100644
--- a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/connection/types/WinnerTakeAllConnection.scala
+++ b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/connection/types/WinnerTakeAllConnection.scala
@@ -2,12 +2,12 @@ package fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.types
 
 import fr.univ_lille.cristal.emeraude.n2s3.core.NeuronConnection
 import fr.univ_lille.cristal.emeraude.n2s3.features.builder.{NeuronGroupRef, NeuronIterable, NeuronRef}
-import fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.{Connection, ExternalConnectionPolicy}
+import fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.{Connection, ConnectionPolicy}
 
 /**
   * Created by falezp on 23/05/16.
   */
-class WinnerTakeAllConnection(inhibitoryConnection : () => NeuronConnection) extends ExternalConnectionPolicy {
+class WinnerTakeAllConnection(inhibitoryConnection : () => NeuronConnection) extends ConnectionPolicy {
 
   def generate(from : NeuronIterable, to : NeuronIterable) = {
     new OneToOneConnection().generate(from, to)++
diff --git a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/convolutional/LayerBuilder.scala b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/convolutional/LayerBuilder.scala
index a9aa54560558987aac30d0c228729d00a61bc771..762d680b8af56001a7b87a7713b8befe8e6dac5f 100644
--- a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/convolutional/LayerBuilder.scala
+++ b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/builder/convolutional/LayerBuilder.scala
@@ -3,7 +3,7 @@ package fr.univ_lille.cristal.emeraude.n2s3.features.builder.convolutional
 import fr.univ_lille.cristal.emeraude.n2s3.core._
 import fr.univ_lille.cristal.emeraude.n2s3.features.builder._
 import fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.types.FullConnection
-import fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.{ExternalConnectionPolicy, InternalConnectionPolicy}
+import fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.{ConnectionPolicy, InternalConnectionPolicy}
 import fr.univ_lille.cristal.emeraude.n2s3.features.io.input.Shape
 import fr.univ_lille.cristal.emeraude.n2s3.features.learning.{BackPropagationMethod, DefaultBackPropagationMethod}
 
@@ -27,8 +27,8 @@ abstract class LayerBuilder extends NetworkBuilder {
 
   var flatHierarchy = false
   var shape = Shape()
-  var connectionPolicy : Option[ExternalConnectionPolicy] = None
-  var layerConnectionPolicy : Option[ExternalConnectionPolicy] = None
+  var connectionPolicy : Option[ConnectionPolicy] = None
+  var layerConnectionPolicy : Option[ConnectionPolicy] = None
   var layerRootConstructor : () => NetworkContainer = defaultContainerConstructor
 
   val internalConnections = mutable.ArrayBuffer[InternalConnectionPolicy]()
@@ -106,12 +106,12 @@ abstract class LayerBuilder extends NetworkBuilder {
     this
   }
 
-  def setConnectionPolicy(connectionPolicy : ExternalConnectionPolicy) : this.type = {
+  def setConnectionPolicy(connectionPolicy : ConnectionPolicy) : this.type = {
     this.connectionPolicy = Some(connectionPolicy)
     this
   }
 
-  protected def setDefaultLayerConnectionPolicy(connectionPolicy : ExternalConnectionPolicy) : this.type = {
+  protected def setDefaultLayerConnectionPolicy(connectionPolicy : ConnectionPolicy) : this.type = {
     this.layerConnectionPolicy = Some(connectionPolicy)
     this
   }
diff --git a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/combinatorial/GeneticAlgorithm.scala b/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/combinatorial/GeneticAlgorithm.scala
deleted file mode 100644
index 3f2efe3ebd71111fd541d83810e014773f3aa332..0000000000000000000000000000000000000000
--- a/n2s3/src/main/scala/fr/univ_lille/cristal/emeraude/n2s3/features/combinatorial/GeneticAlgorithm.scala
+++ /dev/null
@@ -1,66 +0,0 @@
-package fr.univ_lille.cristal.emeraude.n2s3.features.combinatorial
-
-import scala.annotation.tailrec
-import scala.util.Random
-
-/**
-  * Created by falezp on 12/04/16.
-  */
-trait Candidate {
-
-  def evaluate() : Int
-
-}
-
-class GeneticAlgorithm[CandidateType <: Candidate](populationSize : Int, generationNumber : Int, crossOverNumber : Int, mutationNumber : Int,
-                                                   crossOverFunction : (CandidateType, CandidateType) => CandidateType, mutationFunction : CandidateType => CandidateType, maximize : Boolean = true) {
-
-  val unknownScore = -1
-
-  def execute(initialPopulation : Seq[CandidateType]) : (CandidateType, Int) = {
-
-    val rand = Random
-
-    @tailrec
-    def innerExecute(population : Map[CandidateType, Int], generation : Int) : (CandidateType, Int) = {
-      if(generation < generationNumber) {
-        println("[Genetic Algorithm] Generation " + (generation + 1))
-
-        val populationCrossOver = scala.collection.mutable.ArrayBuffer[CandidateType]()
-        for (crossOver <- 0 until crossOverNumber) {
-          val parentIndex1 = rand.nextInt(population.size)
-
-          val parentIndex2Raw = rand.nextInt(population.size - 1)
-          val parentIndex2 = if (parentIndex2Raw < parentIndex1) parentIndex2Raw else parentIndex2Raw + 1
-
-          populationCrossOver += crossOverFunction(population.toList(parentIndex1)._1, population.toList(parentIndex2)._1)
-        }
-
-        val populationMutation = scala.collection.mutable.ArrayBuffer[CandidateType]()
-        for (mutation <- 0 until mutationNumber) {
-          populationMutation += mutationFunction(population.toList(rand.nextInt(population.size))._1)
-        }
-
-        val populationFinal = population ++ populationCrossOver.map(candidate => (candidate, unknownScore)) ++ populationMutation.map(candidate => (candidate, unknownScore))
-
-        val sortedPopulation = populationFinal.map { case (candidate, score) =>
-          (candidate, if (score == unknownScore) candidate.evaluate() else score)
-        }.toSeq.sortBy(_._2)
-
-        println("### Score Generation "+generation+" ###")
-        sortedPopulation.zipWithIndex.foreach{ case(entry, index) => println("#"+index+" : "+entry._2) }
-
-        val best = if(maximize) sortedPopulation.maxBy(_._2) else sortedPopulation.minBy(_._2)
-        println("Best Solution : "+best._2)
-        println(best._1.toString)
-
-        innerExecute(if(maximize) sortedPopulation.reverse.take(populationSize).toMap else sortedPopulation.take(populationSize).toMap, generation+1)
-      }
-      else {
-        if(maximize) population.maxBy(_._2) else population.minBy(_._2)
-      }
-    }
-    innerExecute(Map(initialPopulation.map(candidate => (candidate, unknownScore)):_*), 0)
-  }
-
-}
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 90872cb52df9584648045d126ccc6de5c93e865c..5b6020661ee50ad4fdfcb5961c34a75fcf2deb09 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
@@ -4,7 +4,7 @@ import fr.univ_lille.cristal.emeraude.n2s3.UnitSpec
 import fr.univ_lille.cristal.emeraude.n2s3.core.MockNeuron
 import fr.univ_lille.cristal.emeraude.n2s3.core.exceptions.N2S3Exception
 import fr.univ_lille.cristal.emeraude.n2s3.features.builder._
-import fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.{Connection, ExternalConnectionPolicy}
+import fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.{Connection, ConnectionPolicy}
 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}
@@ -96,7 +96,7 @@ class TestIntegrationN2S3 extends UnitSpec {
       .setNeuronModel(MockNeuron)
 
     var called = 0
-    inputLayer.connectTo(rbmLayer, new ExternalConnectionPolicy{
+    inputLayer.connectTo(rbmLayer, new ConnectionPolicy{
       override def generate(from: NeuronIterable, to: NeuronIterable): Traversable[Connection] = {
         called = called + 1
         List()
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 01de0dd680621e4f3d9f75c96b0166ad67508042..0322e05a52caedec89b29bdaa4f02eb89cb63744 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
@@ -3,7 +3,7 @@ package fr.univ_lille.cristal.emeraude.n2s3.apps.bio
 import fr.univ_lille.cristal.emeraude.n2s3.core.NeuronConnection
 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.connection.{Connection, ExternalConnectionPolicy}
+import fr.univ_lille.cristal.emeraude.n2s3.features.builder.connection.{Connection, ConnectionPolicy}
 import fr.univ_lille.cristal.emeraude.n2s3.features.builder.{N2S3, NeuronGroupRef, NeuronIterable, NeuronRef}
 import fr.univ_lille.cristal.emeraude.n2s3.features.io.input._
 import fr.univ_lille.cristal.emeraude.n2s3.features.learning.SpikeProp
@@ -52,7 +52,7 @@ class XOREntry(val limit : Int) extends N2S3InputStream[InputSeq[N2S3Input]] {
   override def atEnd(): Boolean = cursor >= limit
 }
 
-class MultipleDelayConnection(delays : Seq[Time], neuronConnectionConstructor : (Int, Int, Time) => NeuronConnection) extends ExternalConnectionPolicy {
+class MultipleDelayConnection(delays : Seq[Time], neuronConnectionConstructor : (Int, Int, Time) => NeuronConnection) extends ConnectionPolicy {
   def generate(from : NeuronIterable, to : NeuronIterable) = {
     for {
       (in, in_index) <- from.toSeq.zipWithIndex