diff --git a/Tests/testFmbGalaxyCsv.cpp b/Tests/testFmbGalaxyCsv.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..8a02af090ce45e67cbeeb8f81298ddea568b8e35
--- /dev/null
+++ b/Tests/testFmbGalaxyCsv.cpp
@@ -0,0 +1,129 @@
+#include <iostream>
+
+#include <cstdio>
+#include <cstdlib>
+
+#include "../Src/Utils/FTic.hpp"
+#include "../Src/Utils/FParameters.hpp"
+
+#include "../Src/Containers/FOctree.hpp"
+#include "../Src/Containers/FVector.hpp"
+
+#include "../Src/Core/FFmmAlgorithm.hpp"
+#include "../Src/Core/FFmmAlgorithmThread.hpp"
+
+#include "../Src/Kernels/FElecForcesKernels.hpp"
+#include "../Src/Kernels/FComputeCell.hpp"
+#include "../Src/Fmb/FFmbComponents.hpp"
+
+#include "../Src/Extensions/FExtendVelocity.hpp"
+
+#include "../Src/Files/FTreeCsvSaver.hpp"
+#include "../Src/Files/FFmaLoader.hpp"
+#include "../Src/Arranger/FOctreeArranger.hpp"
+
+
+class FmbVeloParticle : public FmbParticle, public FExtendVelocity {
+};
+
+template <class ParticleClass>
+class GalaxyLoader : public FFmaLoader<ParticleClass> {
+public:
+    GalaxyLoader(const char* const filename) : FFmaLoader<ParticleClass>(filename) {
+    }
+
+    void fillParticle(ParticleClass& inParticle){
+        FReal x,y,z,data, vx, vy, vz;
+        this->file >> x >> y >> z >> data >> vx >> vy >> vz;
+        inParticle.setPosition(x,y,z);
+        inParticle.setPhysicalValue(data);
+        inParticle.setVelocity(vx,vy,vz);
+    }
+};
+
+
+template <class OctreeClass, class ContainerClass , class ParticleClass>
+class MassSaver : public FTreeCsvSaver<OctreeClass,ContainerClass, ParticleClass> {
+public:
+    MassSaver(const char inBasefile[], const bool inIncludeHeader = false)
+        : FTreeCsvSaver<OctreeClass,ContainerClass, ParticleClass> (inBasefile,inIncludeHeader) {
+    }
+
+    virtual FReal getValue(ParticleClass*const part){
+        return part->getPhysicalValue();
+    }
+};
+
+// Simply create particles and try the kernels
+int main(int argc, char ** argv){
+    typedef FmbVeloParticle         ParticleClass;
+    typedef FComputeCell            CellClass;
+    typedef FVector<ParticleClass>  ContainerClass;
+
+    typedef FSimpleLeaf<ParticleClass, ContainerClass >                     LeafClass;
+    typedef FOctree<ParticleClass, CellClass, ContainerClass , LeafClass >  OctreeClass;
+    typedef FElecForcesKernels<ParticleClass, CellClass, ContainerClass >   KernelClass;
+
+    typedef FFmmAlgorithmThread<OctreeClass, ParticleClass, CellClass, ContainerClass, KernelClass, LeafClass > FmmClass;
+    ///////////////////////What we do/////////////////////////////
+    std::cout << ">> This executable has to be used to test fmb algorithm.\n";
+    //////////////////////////////////////////////////////////////
+
+    const int NbLevels = FParameters::getValue(argc,argv,"-h", 6);
+    const int SizeSubLevels = FParameters::getValue(argc,argv,"-sh", 3);
+    const FReal DT          = FParameters::getValue(argc,argv,"-dt", FReal(0.1));
+    const int DevP          = FParameters::getValue(argc,argv,"-p", 5);
+
+    FComputeCell::Init(DevP);
+
+    GalaxyLoader<ParticleClass> loader("../Data/galaxy.fma.tmp");
+
+    // -----------------------------------------------------
+
+    OctreeClass tree(NbLevels, SizeSubLevels, loader.getBoxWidth(), loader.getCenterOfBox());
+
+    // -----------------------------------------------------
+
+    std::cout << "Creating & Inserting " << loader.getNumberOfParticles() << " particles ..." << std::endl;
+    std::cout << "\tHeight : " << NbLevels << " \t sub-height : " << SizeSubLevels << std::endl;
+
+    {
+        ParticleClass particleToFill;
+        particleToFill.setPhysicalValue(FReal(0.10));
+
+        for(int idxPart = 0 ; idxPart < loader.getNumberOfParticles() ; ++idxPart){
+            loader.fillParticle(particleToFill);
+            tree.insert(particleToFill);
+        }
+    }
+
+    // -----------------------------------------------------
+
+    KernelClass kernels( DevP, NbLevels, loader.getBoxWidth());
+    FmmClass algo( &tree, &kernels);
+    FOctreeArranger<OctreeClass, ContainerClass, ParticleClass> arranger(&tree);
+    MassSaver<OctreeClass, ContainerClass, ParticleClass> saver("./out/test%d.csv");
+
+    for(int idx = 0; idx < 100 ; ++idx){
+        algo.execute();
+        { // update velocity and position
+            typename OctreeClass::Iterator octreeIterator(&tree);
+            octreeIterator.gotoBottomLeft();
+            do{
+                typename ContainerClass::BasicIterator iter(*octreeIterator.getCurrentListTargets());
+                while( iter.hasNotFinished() ){
+                    kernels.computeVelocity(&iter.data(), DT);
+                    kernels.updatePosition(&iter.data(), DT);
+                    iter.gotoNext();
+                }
+            } while(octreeIterator.moveRight());
+        }
+        // update tree and vtk
+        arranger.rearrange(true);
+        saver.exportTree(&tree);
+    }
+
+    // -----------------------------------------------------
+
+    return 0;
+}