diff --git a/HySoP/CMake/ParmesTests.cmake b/HySoP/CMake/ParmesTests.cmake
index 5888dad433261f14c4f2f71db1576bef6c5efeac..91effc0c932e51020e205be86410eab7d5b4d622 100644
--- a/HySoP/CMake/ParmesTests.cmake
+++ b/HySoP/CMake/ParmesTests.cmake
@@ -3,15 +3,13 @@
 enable_testing()
 find_python_module(pytest REQUIRED)
 
-# ---  We create a new test for each test_XXX.py found in each directory (i.e. module) of parmepy ---
+# ---  We create a new test for each test_XXX.py found in each directory (i.e. module) of parmepy listed below ---
 
 set(py_src_dirs
   fields
   domain
   #operator
   problem
-  tools
-  numerics
   )
 
 if(USE_MPI)
@@ -29,32 +27,22 @@ endif()
 #   file(GLOB_RECURSE py_test_files "${test_dir}" RELATIVE_PATH parmepy/*/test_*.py)
 # endforeach()
 
-## Build a list of test_*.py files recursively for each directory of parmepy/${py_src_dirs}
+## Build a list of test_*.py files for each directory of parmepy/${py_src_dirs}
 set(py_test_files)
 foreach(testdir ${py_src_dirs})
-  file(GLOB_RECURSE testfiles
-           RELATIVE ${CMAKE_CURRENT_BINARY_DIR}
-           ${CMAKE_SOURCE_DIR}/parmepy/${testdir}/test_*.py)
-  set(py_test_files
-	   ${py_test_files} ${testfiles})
+  file(GLOB testfiles parmepy/${testdir}/tests/test_*.py)
+  set(py_test_files ${py_test_files} ${testfiles})
 endforeach()
 
-
 ## Handling doctest in *.py files recursively for each directory of parmepy/${py_src_dirs}
 ## that names are not __init__ or test_ and that contains '>>>'
 set(py_doctest_files)
 foreach(testdir ${py_src_dirs})
-  file(GLOB_RECURSE testfiles
-              RELATIVE ${CMAKE_CURRENT_BINARY_DIR}
-              ${CMAKE_SOURCE_DIR}/parmepy/${testdir}/*.py)
+  file(GLOB testfiles parmepy/${testdir}/*.py)
   foreach(testfile ${testfiles})
-    if(NOT ${testfile} MATCHES "__init__|test_")
-      file(STRINGS ${testfile} test_doctest
-	       REGEX ">>>")
-      if(NOT "${test_doctest}" STREQUAL "")
-        set(py_doctest_files
-  		 ${py_doctest_files} ${testfile})
-      endif()
+    file(STRINGS ${testfile} test_doctest REGEX ">>>")
+    if(NOT "${test_doctest}" STREQUAL "")
+      set(py_doctest_files ${py_doctest_files} ${testfile})
     endif()
   endforeach()
 endforeach()
@@ -65,7 +53,11 @@ message(STATUS "=== TESTS === ")
 foreach(testfile ${py_test_files})
   get_filename_component(testName ${testfile} NAME_WE)
   message(STATUS "Add test ${testfile} ...")
-  add_test(${testName} py.test -v ${testfile})
+  if(FULL_TEST)
+    add_test(NAME ${testName} COMMAND py.test -v --pep8 ${testfile})
+  else()
+    add_test(${testName} py.test -v ${testfile})
+  endif()
 endforeach()
 ## Add files containing doctests
 foreach(testfile ${py_doctest_files})
diff --git a/HySoP/CMakeLists.txt b/HySoP/CMakeLists.txt
index d73ebe57e75ac1fe4a7de390d4af087f8693aac6..b6f5d06973369d7dac5779abcb7e11ed417df3ac 100644
--- a/HySoP/CMakeLists.txt
+++ b/HySoP/CMakeLists.txt
@@ -39,6 +39,7 @@ option(WITH_FFTW "Link with fftw library (required for some Parmes solvers), def
 option(WITH_GPU "Use of GPU (required for some Parmes solvers), default = ON" ON)
 option(WITH_MAIN_FORTRAN "Create an executable (test purpose) from fortran sources in src/main, linked with libparmes, default = ON" ON)
 option(DEBUG "Enable debug mode for Parmes (0:disabled, 1:verbose, 2:trace, 3:verbose+trace). Default = 0" 0)
+option(FULL_TEST "Enable all test options (pep8 ...) - Default = OFF" OFF)
 
 if(NOT WITH_LIB_FORTRAN)
   message(WARNING "You deactivate libparmes (fortran) generation. This will disable fftw and scales fonctionnalities.")
@@ -151,7 +152,7 @@ add_custom_target(python-cleaninstall COMMAND rm -rf ${${PROJECT_NAME}_INSTALL_D
 file(GLOB_RECURSE PYCFILES "${CMAKE_SOURCE_DIR}/*.pyc"})
 add_custom_target(pyclean COMMAND rm -f ${PYCFILES}
   COMMAND make clean
-  COMMAND rm -rf ${CMAKE_BINARY_DIR}/build  ${CMAKE_BINARY_DIR}/ParmesDoc
+  COMMAND rm -rf ${CMAKE_BINARY_DIR}/build  ${CMAKE_BINARY_DIR}/DoxygenGeneratedDoc
   COMMAND rm ${CMAKE_SOURCE_DIR}/parmepy/__init__.py
   COMMENT "clean parmepy sources and build.")
 
diff --git a/HySoP/DoxyConf/parmes.doxyfile.in b/HySoP/DoxyConf/parmes.doxyfile.in
index c30e7a0550ebcafaa5ff7af254bcb42396aee69d..9051c0fecd1011d6d19cc52a43a886cc94558af1 100644
--- a/HySoP/DoxyConf/parmes.doxyfile.in
+++ b/HySoP/DoxyConf/parmes.doxyfile.in
@@ -52,7 +52,7 @@ PROJECT_LOGO           =
 # If a relative path is entered, it will be relative to the location 
 # where doxygen was started. If left blank the current directory will be used.
 
-OUTPUT_DIRECTORY       = @CMAKE_BINARY_DIR@/ParmesDoc
+OUTPUT_DIRECTORY       = @CMAKE_BINARY_DIR@/DoxygenGeneratedDoc
 
 # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 
 # 4096 sub-directories (in 2 levels) under the output directory of each output 
@@ -700,10 +700,7 @@ RECURSIVE              = YES
 # Note that relative paths are relative to the directory from which doxygen is 
 # run.
 
-EXCLUDE                = @CMAKE_SOURCE_DIR@/parmepy/unusedOrObsolet \
-                         @CMAKE_SOURCE_DIR@/parmepy/particular_solvers/integrator \
-                         @CMAKE_SOURCE_DIR@/parmepy/particular_solvers/interpolation \
-                         @CMAKE_SOURCE_DIR@/parmepy/particular_solvers/remesh
+EXCLUDE                = 
 
 # The EXCLUDE_SYMLINKS tag can be used to select whether or not files or 
 # directories that are symbolic links (a Unix file system feature) are excluded 
diff --git a/HySoP/ParmesConfig.cmake.in b/HySoP/ParmesConfig.cmake.in
index 0ffc839e0225d93bc5207d126c7ad06aa023591a..c435c411fef14a6ed82c1aa37508308a0fc4563e 100644
--- a/HySoP/ParmesConfig.cmake.in
+++ b/HySoP/ParmesConfig.cmake.in
@@ -14,7 +14,7 @@
 
 # Tell the user where to find ppmcore headers
 # Tell the user project where to find our headers and libraries
-set(@PACKAGE_NAME@_INCLUDE_DIRS "${${PACKAGE_NAME}_INCLUDE_DIRS}")
+set(@PACKAGE_NAME@_INCLUDE_DIRS "${${PACKAGE_SHORT_NAME}_INCLUDE_DIRS}")
 set(@PACKAGE_NAME@_EXTRA_INCLUDE_DIRS "${${PACKAGE_NAME}_EXTRA_INCLUDE_DIRS}")
 set(@PACKAGE_NAME@_LIBRARY_DIRS "${${PACKAGE_NAME}_LIB_DIR}")
 set(@PACKAGE_NAME@_MODULE_DIR "${${PACKAGE_NAME}_INCLUDE_DIRS}/Modules")
diff --git a/HySoP/hysop/domain/domain.py b/HySoP/hysop/domain/domain.py
index c1e85e5735a64b48568c41b09b1fd3d23035243b..95655cb00fdbf081ef691ba8ba9f9f85975de76f 100644
--- a/HySoP/hysop/domain/domain.py
+++ b/HySoP/hysop/domain/domain.py
@@ -50,4 +50,3 @@ if __name__ == "__main__":
     print __doc__
     print "- Provided class : Domain (abstract)."
     print Domain.__doc__
-
diff --git a/HySoP/hysop/mpi/tests/test_topology.py b/HySoP/hysop/mpi/tests/test_topology.py
index 7ea579587f84f6d18f6539c4d5208ac3b424563e..9a3898ced548b45cb5775fb5815b71f2de2ccfd5 100644
--- a/HySoP/hysop/mpi/tests/test_topology.py
+++ b/HySoP/hysop/mpi/tests/test_topology.py
@@ -1,6 +1,7 @@
 import parmepy as pp
 from parmepy.domain.box import Box
 from parmepy.mpi.topology import Cartesian
+from parmepy.constants import PARMES_INDEX
 
 ## @pytest.fixture
 ## def topology():
@@ -14,6 +15,7 @@ def test_create_topology1D():
     dom = Box()
     resolTopo = [33, 33, 17]
     topo = Cartesian(dom, 1, resolTopo)
+    topo.setUp()
 
     assert topo.domain == dom
     assert topo.dim == 1
@@ -25,6 +27,7 @@ def test_create_topology2D():
     dom = Box()
     resolTopo = [33, 33, 17]
     topo = Cartesian(dom, 2, resolTopo)
+    topo.setUp()
 
     assert topo.domain == dom
     assert topo.dim == 2
@@ -35,6 +38,7 @@ def test_create_topology3D():
     dom = Box()
     resolTopo = [33, 33, 17]
     topo = Cartesian(dom, 3, resolTopo)
+    topo.setUp()
 
     assert topo.domain == dom
     assert topo.dim == 3
@@ -46,7 +50,7 @@ def test_create_topology_with_dims():
     resolTopo = [33, 33, 17]
     topoDims = [pp.mpi.main_size, 1]
     topo = Cartesian.withResolution(dom, topoDims, resolTopo)
-
+    topo.setUp()
     assert topo.domain == dom
     assert topo.dim == 2
     assert topo.size == pp.mpi.main_size
@@ -64,10 +68,44 @@ def test_comparing_topologies():
     topo2 = Cartesian(dom, 2, [11, 33, 17])
     assert not topo == topo2
 
-if __name__ == "__main__":
 
+def test_bridge2D():
+    import math
+    Lx = Ly = 2 * math.pi
+    from parmepy.mpi.topology import Bridge
+    dom = Box(dimension=2, length=[Lx, Ly], origin=[0., 0.])
+    resolution = [65, 65]
+    topo2 = Cartesian(dom, 2, resolution)
+    topo2.setUp()
+    topo1 = Cartesian(dom, 1, resolution)
+    topo1.setUp()
+    bridge = Bridge(topo1, topo2)
+    print bridge
+    # We cannot really check something interesting,
+    # so we just create a bridge.
+
+
+def test_bridge3D():
+    import numpy as np
+    from parmepy.mpi.topology import Bridge
+    dom = Box()
+    resolution3d = np.asarray((65, 65, 65), dtype=PARMES_INDEX)
+    topo1 = Cartesian(dom, 3, resolution3d)
+    topo1.setUp()
+    topo2 = Cartesian(dom, 1, resolution3d)
+    topo2.setUp()
+    bridge = Bridge(topo1, topo2)
+    print bridge
+    # We cannot really check something interesting,
+    # so we just create a bridge.
+
+
+if __name__ == "__main__":
+    print "main"
+    test_create_topology_with_dims()
+    test_2D()
     #test_create_topology1D()
     #pp.mpi.main_comm.barrier()
 
-    test_create_topology2D()
-    pp.mpi.main_comm.barrier()
+    ## test_create_topology2D()
+    ## pp.mpi.main_comm.barrier()
diff --git a/HySoP/hysop/mpi/topology.py b/HySoP/hysop/mpi/topology.py
index c1dfe9c59159d12c360e261ec238c87bacb16f21..d31e093ba2269a4cbe307c2a7b5c054daa59632d 100644
--- a/HySoP/hysop/mpi/topology.py
+++ b/HySoP/hysop/mpi/topology.py
@@ -1,13 +1,31 @@
 """
 @package parmepy.mpi.topology
-MPI Topologies
-@todo merge CartesianTopology and Topology
+
+Parmes topologies definitions and related tools.
+A Parmes Topology is defined as the association of
+a mpi process distribution (mpi topology) and of a set of local meshes
+(one per process).
+
+At the time, only cartesian topologies with cartesian meshes are available.
+
+This module provides the following classes :
+- Cartesian : 1,2 or 3D parmes topology.
+- Bridge : bridge between two parmes topologies : i.e. what must be
+exchange between two topologies and how.
+
+To get more details try :
+\code
+>>> import parmepy.mpi.topology as topo
+>>> help(topo.Cartesian)
+>>> help(topo.Bridge)
+\endcode
+
 """
 
 from parmepy.constants import ORDER, np, PARMES_INDEX, debug
 from parmepy.mpi.mesh import SubMesh
-from main_var import main_comm, MPI, main_size
 from itertools import count
+from parmepy.mpi.main_var import main_comm, main_size, main_rank, MPI
 
 
 class Cartesian(object):
@@ -40,7 +58,8 @@ class Cartesian(object):
 
     @debug
     def __init__(self, domain, dim, globalMeshResolution,
-                 comm=main_comm, periods=None, ghosts=None, cutdir=None):
+                 comm=main_comm, periods=None, ghosts=None, cutdir=None,
+                 dims=None):
         ## Associated domain
         self.domain = domain
         ## An id for the topology
@@ -49,9 +68,10 @@ class Cartesian(object):
         self.dim = dim
         ## Communicator used to build the topology
         self.comm = comm
-
+        ## True if everything has been properly set for this topology
+        self.isUpToDate = False
         ## First of all we need to set dims (if not already set)
-        if not hasattr(self, 'dims'):
+        if dims is None:
             # If dims is not provided, computation of  the "optimal" processus
             # distribution for each direction of the grid topology.
             self.dims = np.asarray(MPI.Compute_dims(main_size, dim),
@@ -64,16 +84,18 @@ class Cartesian(object):
             self.dims.sort()
             if(ORDER == 'C'):
                 self.dims[:] = self.dims[::-1]
-
-        # default period status is periodic
-        if(periods is None):
-            ## Topology BC type
-            self.periods = self.dim * (True,)
         else:
+            self.dims = dims
+        print "rrrrrrrrrrrr", self.dims
+        # default period status is periodic
+        self.periods = np.ones((self.dim), dtype=np.bool)
+        if(periods is not None):
             assert (periods.size == self.dim)
-            self.periods = periods
-
-        self.topo = comm.Create_cart(self.dims, periods=self.periods)
+            self.periods[:] = periods[:]
+        print "peeppe", self.periods
+        print "dididi", self.dims
+        self.topo = comm.Create_cart(self.dims, periods=self.periods,
+                                     reorder=True)
 
         ## Size of the topology
         self.size = self.topo.Get_size()
@@ -154,24 +176,16 @@ class Cartesian(object):
         Create topology's Local Mesh
         """
         self.mesh = SubMesh(self, self.G_start, self.localGridResolution)
-
-        #        print "aiaiaiai", self.rank, self.coords, "aaa", self.localGridResolution, self.G_start, L_start, L_end
-##         print "local ...",  self.rank, " ", self.localGridResolution
-##         self.mesh = LocalMesh(self.rank,
-##                               resolution=self.localGridResolution,
-##                               start=start,
-##                               size=self.domain.length / (self.globalMeshResolution - 1),
-##                               dom_origin=self.domain.origin,
-##                               ghosts=self.ghosts)
+        self.isUpToDate = True
 
     @classmethod
     def withResolution(cls, domain, topoResolution,
                        globalMeshResolution, cutdir=None,
                        ghosts=None, periods=None):
 
-        cls.dims = np.asarray(topoResolution, dtype=PARMES_INDEX)
-        cls.dim = cls.dims.size
-        assert cls.dims.all(), "Topology error : you try to \
+        dims = np.asarray(topoResolution, dtype=PARMES_INDEX)
+        dim = dims.size
+        assert dims.all(), "Topology error : you try to \
             create a topology with 0 resolution in one direction."
 
         # We set three ways to choose which direction(s) will be distributed :
@@ -183,26 +197,26 @@ class Cartesian(object):
         # arrays: last dir first distributed.
         # 3 - topoDim < domain.distributed and cutdir as input argument :
         # we use cutdir to choose which direction(s) will be distributed.
-        if cls.dim < domain.dimension:
-            cls.dims.sort()
+        if dim < domain.dimension:
+            dims.sort()
             if(ORDER == 'C'):
-                cls.dims[:] = cls.dims[::-1]
+                dims[:] = dims[::-1]
 
-        return cls(domain, cls.dim, globalMeshResolution, cutdir=cutdir,
-                   periods=periods, ghosts=ghosts)
+        return cls(domain, dim, globalMeshResolution, cutdir=cutdir,
+                   periods=periods, ghosts=ghosts, dims=dims)
 
     @classmethod
     def withResolutionFixed(cls, domain, topoResolution,
                             globalMeshResolution, cutdir=None,
                             ghosts=None, periods=None):
 
-        cls.dims = np.asarray(topoResolution, dtype=PARMES_INDEX)
-        cls.dim = cls.dims.size
-        assert cls.dims.all(), "Topology error : you try to \
+        dims = np.asarray(topoResolution, dtype=PARMES_INDEX)
+        dim = dims.size
+        assert dims.all(), "Topology error : you try to \
             create a topology with 0 resolution in one direction."
 
-        return cls(domain, cls.dim, globalMeshResolution,
-                   cutdir=cutdir, periods=periods, ghosts=ghosts)
+        return cls(domain, dim, globalMeshResolution,
+                   cutdir=cutdir, periods=periods, ghosts=ghosts, dims=dims)
 
     def __eq__(self, other):
         """
@@ -237,6 +251,181 @@ class Cartesian(object):
         return s
 
 
+class Bridge(object):
+    """
+    A Bridge is the definition of what must be exchanged between two topologies
+    and how to do so.
+
+    For a bridge between topo1 and topo2, it will provide :
+    bridge.sendTo = [[rk, i, j, k, l, ...]]
+    bridge.recvFrom = [[rk, i, j, k, l, ...]]
+    where each line corresponds to a message that must be send
+    from current mpi process to process rk for sendTo or
+    receive by current mpi process from process rk for recvFrom.
+    The other columns give the numbers of the node of the mesh
+    that must be exchange.
+    Warning : index numbers corresponds to local nodes numbers.
+
+    In sendTo/recvFrom :
+    * First column : dest/source of the message.
+    Warning : rank number is given in main_comm.
+    * second-third columns : first and last index of nodes in the first dir
+    * 4th-5th : first and last index of nodes in the second dir
+    * and so on depending on the size of the domain
+    associated to the topologies.
+
+    """
+
+    @debug
+    def __init__(self, topoFrom, topoTo):
+        """
+        Bridge constructor.
+        @param source topology
+        @param targeted topology
+        """
+        ## Source topology
+        self.topoFrom = topoFrom
+        ## Targeted topology
+        self.topoTo = topoTo
+
+        # Both topologies must be uptodate
+        assert(topoFrom.isUpToDate)
+        assert(topoTo.isUpToDate)
+
+        # Both topologies must have the
+        # same number of mpi processes.
+        assert topoFrom.size == topoTo.size
+
+        dom = topoFrom.domain
+
+        # 1 - Get global mesh indices for each topology
+        size1 = topoFrom.size
+        start1 = topoFrom.mesh.global_start
+        end1 = topoFrom.mesh.global_end
+        iglob1 = np.zeros((size1, dom.dimension * 2), dtype=np.int32)
+        iglob1[main_rank, 0::2] = start1
+        iglob1[main_rank, 1::2] = end1
+
+        size2 = topoTo.size
+        start2 = topoTo.mesh.global_start
+        end2 = topoTo.mesh.global_end
+        iglob2 = np.zeros((size2, dom.dimension * 2), dtype=np.int32)
+        iglob2[main_rank, 0::2] = start2
+        iglob2[main_rank, 1::2] = end2
+
+        # 2 Distribute these indices.
+        main_comm.Allgather([iglob1[main_rank, :], MPI.INT], [iglob1, MPI.INT])
+        main_comm.Allgather([iglob2[main_rank, :], MPI.INT], [iglob2, MPI.INT])
+
+        # Connectivity :
+
+        ### sendTo[:,0] rank of the targeted process in main_comm
+        ##  sendTo[:,1:] local indices (start,end, ...)
+        ##  of the points to be sent for each direction.
+        ## Example (in 2D)
+        ## sendTo = [[ 1, 2, 5, 1, 3]
+        ##           [ 2, 0, 3, 1, 2]]
+        ## means that the current process must send to process 1
+        ## the points of indices 2:5 in first dir and 1:3 in second dir
+        ## and to process 2 those of indices 0:3 and 1:2
+        self.sendTo = np.zeros((0, 1 + dom.dimension * 2), dtype=np.int)
+        indexFrom = []
+        for dim in range(dom.dimension):
+            indexFrom.append(range(iglob1[main_rank, dim * 2],
+                                   iglob1[main_rank, dim * 2 + 1] + 1))
+
+        line = np.zeros((1 + 2 * dom.dimension), dtype=np.int32)
+        listRanks = [i for i in range(main_size) if i != main_rank]
+
+        for i in listRanks:
+            line[0] = i
+            hasInter = True
+            for dim in range(dom.dimension):
+                indexTo = range(iglob2[i, dim * 2], iglob2[i, dim * 2 + 1] + 1)
+                interRow = [k for k in indexFrom[dim] if k in indexTo]
+                interRow.sort()
+                if interRow.__len__():
+                    line[dim * 2 + 1] = interRow[0]
+                    line[dim * 2 + 2] = interRow[-1]
+                else:
+                    hasInter = False
+                    break
+
+            if hasInter:
+                self.sendTo = np.vstack((self.sendTo, line))
+
+        # --- Compute globalConnectivity on process 0 and distribute it ---
+        # Global Connectivity : each line corresponds to a message :
+        # globalConnectivity[i,:] = [i, j, 0, 3, 2, 6]
+        # means that process i must send to process j its mesh
+        # from node 0 to 3 in the first direction and from node 2 to
+        # 6 in the second dir AND that process j must receive the same mesh
+        # from process i. Nodes number given in the global index set.
+        # Warning : process ranks are given in mpi_main.
+        globalConnectivity = np.zeros((self.sendTo.shape[0], 2 +
+                                       dom.dimension * 2), dtype=np.int)
+
+        globalConnectivity[:, 1:] = self.sendTo.copy()
+        globalConnectivity[:, 0] = main_rank
+
+        if main_rank == 0:
+            for i in range(1, main_size):
+                temp = main_comm.recv(source=i)
+                globalConnectivity = np.vstack((globalConnectivity, temp))
+
+        else:
+            main_comm.ssend(globalConnectivity, dest=0)
+
+        ## recvFrom[:,0] rank of the sending process in main_comm
+        ## recvFrom[:,1:] local indices (start,end, ...)
+        ## of the points to be receive for each direction.
+        ## Example (in 2D)
+        ## recvFrom = [[1, 2, 5, 1, 3]]
+        ## means that the current process must receive from process 1
+        ## an array that will be saved at positions of indices 2:5
+        ## in the first dir and 1:3 in second dir
+        self.recvFrom = np.empty((), dtype=np.int32)
+        if main_rank == 0:
+            for fromRank in range(main_size):
+                cond1 = globalConnectivity[:, 1] == fromRank
+                cond2 = globalConnectivity[:, 0] != fromRank
+                cond = cond1 & cond2
+                sol = np.compress(cond, globalConnectivity, axis=0)
+                cond1 = np.ones((sol.shape[1]), dtype=np.bool)
+                cond1[1] = False
+                sol = np.compress(cond1, sol, axis=1)
+                if(fromRank != main_rank):
+                    main_comm.ssend(sol, dest=fromRank)
+                else:
+                    self.recvFrom = sol.copy()
+
+        else:
+            self.recvFrom = main_comm.recv(source=0)
+
+        # Final setup for recvFrom and sendTo : shift from
+        # global indices to local ones.
+
+        self.recvFrom[:, 1::2] = self.recvFrom[:, 1::2] - start2[:]
+        self.recvFrom[:, 2::2] = self.recvFrom[:, 2::2] - start2[:]
+        self.sendTo[:, 1::2] = self.sendTo[:, 1::2] - start1[:]
+        self.sendTo[:, 2::2] = self.sendTo[:, 2::2] - start1[:]
+
+    @debug
+    def setUp(self):
+        """
+
+        """
+
+    def __str__(self):
+        """ TopologyBridge info display """
+        s = '======== Bridge from topology ' + str(self.topoFrom.idTopo)
+        s += ' to topology ' + str(self.topoTo.idTopo) + ' ========\n'
+        s += '[' + str(main_rank) + '] sendTo :' + str(self.sendTo) + '\n'
+        s += '[' + str(main_rank) + '] recvFrom :' + str(self.recvFrom) + '\n'
+        s += '=================================\n'
+        return s
+
 if __name__ == "__main__":
     print "This module defines the following classes:"
     print "- Cartesian Topology: ", Cartesian.__doc__
+    print "- Bridge between topologies: ", Bridge.__doc__
diff --git a/HySoP/hysop/operator/analytic.py b/HySoP/hysop/operator/analytic.py
index 7074f37961acbe4b4987f4896e552f9e31200109..1e4f5be7320400864c89f0b7b841bd5cb84204f5 100644
--- a/HySoP/hysop/operator/analytic.py
+++ b/HySoP/hysop/operator/analytic.py
@@ -69,4 +69,4 @@ class Analytic(Operator):
 if __name__ == "__main__":
     print __doc__
     print "- Provided class : Advection"
-    print Advection.__doc__
+    print Analytic.__doc__
diff --git a/HySoP/hysop/operator/continuous.py b/HySoP/hysop/operator/continuous.py
index 11b96a3dbc482e050bbf5b4ef0e950156b9ea1e4..524fee91765b794fee53aa966c8ba86db5839864 100644
--- a/HySoP/hysop/operator/continuous.py
+++ b/HySoP/hysop/operator/continuous.py
@@ -26,6 +26,10 @@ class Operator(object):
         """
         ## Variables
         self.variables = variables
+        ## Input variables
+        self.input = []
+        ## Output variables
+        self.output = []
         ## Domain
         self.domain = self.variables[0].domain
         ## Fields discretes id
@@ -37,7 +41,7 @@ class Operator(object):
 
     def addVariable(self, cVariable):
         """
-        Add an continuous variables to the operator.
+        Add a continuous variables to the operator.
 
         @param cVariable : list of variables to add.
         """
@@ -80,4 +84,4 @@ class Operator(object):
 if __name__ == "__main__":
     print __doc__
     print "- Provided class : Operator"
-    print ContinuousOperator.__doc__
+    print Operator.__doc__
diff --git a/HySoP/hysop/unusedOrObsolet/DiscreteTransportProblem.py b/HySoP/unusedOrObsolet/DiscreteTransportProblem.py
similarity index 100%
rename from HySoP/hysop/unusedOrObsolet/DiscreteTransportProblem.py
rename to HySoP/unusedOrObsolet/DiscreteTransportProblem.py
diff --git a/HySoP/hysop/unusedOrObsolet/GPUParticularSolver.py b/HySoP/unusedOrObsolet/GPUParticularSolver.py
similarity index 100%
rename from HySoP/hysop/unusedOrObsolet/GPUParticularSolver.py
rename to HySoP/unusedOrObsolet/GPUParticularSolver.py
diff --git a/HySoP/hysop/unusedOrObsolet/GPUParticularSolver_GLRender.py b/HySoP/unusedOrObsolet/GPUParticularSolver_GLRender.py
similarity index 100%
rename from HySoP/hysop/unusedOrObsolet/GPUParticularSolver_GLRender.py
rename to HySoP/unusedOrObsolet/GPUParticularSolver_GLRender.py
diff --git a/HySoP/hysop/unusedOrObsolet/InterpolationDOp.py b/HySoP/unusedOrObsolet/InterpolationDOp.py
similarity index 100%
rename from HySoP/hysop/unusedOrObsolet/InterpolationDOp.py
rename to HySoP/unusedOrObsolet/InterpolationDOp.py
diff --git a/HySoP/hysop/unusedOrObsolet/ParticleField.py b/HySoP/unusedOrObsolet/ParticleField.py
similarity index 100%
rename from HySoP/hysop/unusedOrObsolet/ParticleField.py
rename to HySoP/unusedOrObsolet/ParticleField.py
diff --git a/HySoP/hysop/unusedOrObsolet/TagDOp.py b/HySoP/unusedOrObsolet/TagDOp.py
similarity index 100%
rename from HySoP/hysop/unusedOrObsolet/TagDOp.py
rename to HySoP/unusedOrObsolet/TagDOp.py
diff --git a/HySoP/hysop/unusedOrObsolet/VelocityDOp.py b/HySoP/unusedOrObsolet/VelocityDOp.py
similarity index 100%
rename from HySoP/hysop/unusedOrObsolet/VelocityDOp.py
rename to HySoP/unusedOrObsolet/VelocityDOp.py
diff --git a/HySoP/hysop/unusedOrObsolet/VelocityOp.py b/HySoP/unusedOrObsolet/VelocityOp.py
similarity index 100%
rename from HySoP/hysop/unusedOrObsolet/VelocityOp.py
rename to HySoP/unusedOrObsolet/VelocityOp.py
diff --git a/HySoP/hysop/unusedOrObsolet/VolumeDOp.py b/HySoP/unusedOrObsolet/VolumeDOp.py
similarity index 100%
rename from HySoP/hysop/unusedOrObsolet/VolumeDOp.py
rename to HySoP/unusedOrObsolet/VolumeDOp.py
diff --git a/HySoP/hysop/unusedOrObsolet/continuous.py b/HySoP/unusedOrObsolet/continuous.py
similarity index 100%
rename from HySoP/hysop/unusedOrObsolet/continuous.py
rename to HySoP/unusedOrObsolet/continuous.py
diff --git a/HySoP/hysop/unusedOrObsolet/differentialOperator.py b/HySoP/unusedOrObsolet/differentialOperator.py
similarity index 100%
rename from HySoP/hysop/unusedOrObsolet/differentialOperator.py
rename to HySoP/unusedOrObsolet/differentialOperator.py
diff --git a/HySoP/hysop/unusedOrObsolet/differentialOperator_d.py b/HySoP/unusedOrObsolet/differentialOperator_d.py
similarity index 100%
rename from HySoP/hysop/unusedOrObsolet/differentialOperator_d.py
rename to HySoP/unusedOrObsolet/differentialOperator_d.py
diff --git a/HySoP/hysop/unusedOrObsolet/discrete.py b/HySoP/unusedOrObsolet/discrete.py
similarity index 100%
rename from HySoP/hysop/unusedOrObsolet/discrete.py
rename to HySoP/unusedOrObsolet/discrete.py
diff --git a/HySoP/hysop/unusedOrObsolet/forward_euler.py b/HySoP/unusedOrObsolet/forward_euler.py
similarity index 100%
rename from HySoP/hysop/unusedOrObsolet/forward_euler.py
rename to HySoP/unusedOrObsolet/forward_euler.py
diff --git a/HySoP/hysop/unusedOrObsolet/obstacle_d_old.py b/HySoP/unusedOrObsolet/obstacle_d_old.py
similarity index 100%
rename from HySoP/hysop/unusedOrObsolet/obstacle_d_old.py
rename to HySoP/unusedOrObsolet/obstacle_d_old.py
diff --git a/HySoP/hysop/unusedOrObsolet/obstacle_old.py b/HySoP/unusedOrObsolet/obstacle_old.py
similarity index 100%
rename from HySoP/hysop/unusedOrObsolet/obstacle_old.py
rename to HySoP/unusedOrObsolet/obstacle_old.py
diff --git a/HySoP/hysop/unusedOrObsolet/runge_kutta.py b/HySoP/unusedOrObsolet/runge_kutta.py
similarity index 100%
rename from HySoP/hysop/unusedOrObsolet/runge_kutta.py
rename to HySoP/unusedOrObsolet/runge_kutta.py
diff --git a/HySoP/hysop/unusedOrObsolet/runge_kutta2stretching.py b/HySoP/unusedOrObsolet/runge_kutta2stretching.py
similarity index 100%
rename from HySoP/hysop/unusedOrObsolet/runge_kutta2stretching.py
rename to HySoP/unusedOrObsolet/runge_kutta2stretching.py
diff --git a/HySoP/hysop/unusedOrObsolet/runge_kutta3stretching.py b/HySoP/unusedOrObsolet/runge_kutta3stretching.py
similarity index 100%
rename from HySoP/hysop/unusedOrObsolet/runge_kutta3stretching.py
rename to HySoP/unusedOrObsolet/runge_kutta3stretching.py
diff --git a/HySoP/hysop/unusedOrObsolet/runge_kutta4stretching.py b/HySoP/unusedOrObsolet/runge_kutta4stretching.py
similarity index 100%
rename from HySoP/hysop/unusedOrObsolet/runge_kutta4stretching.py
rename to HySoP/unusedOrObsolet/runge_kutta4stretching.py