diff --git a/NPLib/VDetector/DetectorManager.cxx b/NPLib/VDetector/DetectorManager.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..398198c956ba99c9791339f38dd3d3291b79f9b0
--- /dev/null
+++ b/NPLib/VDetector/DetectorManager.cxx
@@ -0,0 +1,330 @@
+#include "DetectorManager.h"
+
+//	STL
+#include <iostream>
+#include <fstream>
+#include <cstdlib>
+
+//	Detector	
+#include "../MUST2/TMust2Physics.h"
+#include "../SSSD/TSSSDPhysics.h"
+#include "../Plastic/TPlasticPhysics.h"
+#include "../GASPARD/GaspardTracker.h"
+
+
+/////////////////////////////////////////////////////////////////////////////////////////////////
+//	Default Constructor
+DetectorManager::DetectorManager()	
+{
+}
+
+
+
+/////////////////////////////////////////////////////////////////////////////////////////////////	
+//	Default Desstructor
+DetectorManager::~DetectorManager()
+{
+}
+
+
+
+/////////////////////////////////////////////////////////////////////////////////////////////////
+//	Read stream at ConfigFile and pick-up Token declaration of Detector
+void DetectorManager::ReadConfigurationFile(string Path)	
+{
+   ////////General Reading needs////////
+   string LineBuffer;
+   string DataBuffer;
+
+   /////////Boolean////////////////////
+   bool MUST2               = false;
+   bool AddThinSi           = false;
+   bool ScintillatorPlastic = false;
+   bool GeneralTarget       = false;
+   bool GPDTracker          = false;
+
+   //////////////////////////////////////////////////////////////////////////////////////////
+   string GlobalPath = getenv("NPTOOL");
+   Path = GlobalPath + "/Inputs/DetectorConfiguration/" + Path;
+   ifstream ConfigFile;
+   ConfigFile.open(Path.c_str());
+
+   if (ConfigFile.is_open()) {
+      cout << "/////////////////////////////" << endl;
+      cout << " Configuration file " << Path << " loading " << endl;
+   }
+   else {
+      cout << " Error, no configuration file" << Path << " found" << endl;
+      return;
+   }
+
+
+   while (!ConfigFile.eof()) {
+      // Pick-up next line
+      getline(ConfigFile, LineBuffer);
+      //Search for comment Symbol: %
+      if (LineBuffer.compare(0, 1, "%") == 0) {   /*Do  Nothing*/ ;}
+
+      ////////////////////////////////////////////
+      //////////// Search for Gaspard ////////////
+      ////////////////////////////////////////////
+      else if (LineBuffer.compare(0, 14, "GaspardTracker") == 0 && GPDTracker == false) {
+         GPDTracker = true ;
+         cout << "//////// Gaspard Tracker ////////" << endl;
+
+         // Instantiate the new array as a VDetector Object
+         VDetector* myDetector = new GaspardTracker();
+
+         // Read Position of Telescope
+         ConfigFile.close();
+         myDetector->ReadConfiguration(Path);
+         ConfigFile.open(Path.c_str());
+
+         // Add array to the VDetector Vector
+         AddDetector("GASPARD", myDetector);
+      }
+
+      ////////////////////////////////////////////
+      //////// Search for MUST2 Array  ////////
+      ////////////////////////////////////////////
+      else if (LineBuffer.compare(0, 10, "MUST2Array") == 0 && MUST2 == false) {
+         MUST2 = true;
+         cout << "//////// MUST2 Array ////////" << endl << endl;
+
+         // Instantiate the new array as a VDetector Object
+         VDetector* myDetector = new TMust2Physics();
+
+         // Read Position of Telescope
+         ConfigFile.close();
+         myDetector->ReadConfiguration(Path);
+         ConfigFile.open(Path.c_str());
+
+         // Add array to the VDetector Vector
+         AddDetector("MUST2", myDetector);
+      }
+
+      ////////////////////////////////////////////
+      ////////// Search for ThinSi (SSSD)/////////
+      ////////////////////////////////////////////
+      else if (LineBuffer.compare(0, 9, "AddThinSi") == 0 && AddThinSi == false) {
+         AddThinSi = true ;
+         cout << "//////// Thin Si ////////" << endl << endl;
+
+         // Instantiate the new array as a VDetector Object
+         VDetector* myDetector = new TSSSDPhysics();
+
+         // Read Position of Telescope
+         ConfigFile.close();
+         myDetector->ReadConfiguration(Path);
+         ConfigFile.open(Path.c_str());
+
+         // Add array to the VDetector Vector
+         AddDetector("SSSD", myDetector);
+      }
+
+      ////////////////////////////////////////////
+      ///////////// Search for Plastic ///////////
+      ////////////////////////////////////////////
+      else if (LineBuffer.compare(0, 19, "ScintillatorPlastic") == 0 && ScintillatorPlastic == false) {
+         ScintillatorPlastic = true;
+         cout << "//////// Plastic ////////" << endl << endl;
+
+         // Instantiate the new array as a VDetector Object
+         VDetector* myDetector = new TPlasticPhysics();
+         // Read Position of Telescope
+         ConfigFile.close();
+         myDetector->ReadConfiguration(Path);
+         ConfigFile.open(Path.c_str());
+
+         // Add array to the VDetector Vector
+         AddDetector("Plastic", myDetector);
+      }
+
+      ////////////////////////////////////////////
+      //////////// Search for Target /////////////
+      ////////////////////////////////////////////
+      else if (LineBuffer.compare(0, 13, "GeneralTarget") == 0 && GeneralTarget == false) {
+         GeneralTarget = true ;
+         cout << "////////// Target ///////////" << endl << endl;
+
+         // jump one line
+         getline(ConfigFile, LineBuffer);
+         getline(ConfigFile, LineBuffer);
+
+         bool check_Thickness = false;
+         bool check_Angle     = false;
+         bool check_Radius    = false;
+         bool check_Material  = false;
+         bool check_X         = false;
+         bool check_Y         = false;
+         bool check_Z         = false;
+
+         bool ReadingStatusTarget = true;
+         while (ReadingStatusTarget) {
+            ConfigFile >> DataBuffer;
+
+            // Search for comment Symbol %
+            if (DataBuffer.compare(0, 1, "%") == 0) {/*Do Nothing*/;}
+
+            else if (DataBuffer.compare(0, 10, "THICKNESS=") == 0) {
+               check_Thickness = true ;
+               ConfigFile >> DataBuffer;
+//               m_TargetThickness = atof(DataBuffer.c_str()) * micrometer;
+               m_TargetThickness = atof(DataBuffer.c_str());
+               cout << "Target Thickness: " << m_TargetThickness << endl;
+            }
+
+            else if (DataBuffer.compare(0, 6, "ANGLE=") == 0) {
+               check_Angle = true ;
+               ConfigFile >> DataBuffer;
+//               m_TargetAngle = atof(DataBuffer.c_str()) * deg;
+               m_TargetAngle = atof(DataBuffer.c_str());
+               cout << "Target Angle: " << m_TargetAngle << endl;
+            }
+
+            else if (DataBuffer.compare(0, 7, "RADIUS=") == 0) {
+               check_Radius = true ;
+               ConfigFile >> DataBuffer;
+//               m_TargetRadius = atof(DataBuffer.c_str()) * mm;
+               m_TargetRadius = atof(DataBuffer.c_str());
+               cout << "Target Radius: " <<  m_TargetRadius << endl;
+            }
+
+            else if (DataBuffer.compare(0, 9, "MATERIAL=") == 0) {
+               check_Material = true ;
+               ConfigFile >> DataBuffer;
+               m_TargetMaterial = DataBuffer;
+               cout << "Target Material: " << m_TargetMaterial << endl;
+            }
+
+            else if (DataBuffer.compare(0, 2, "X=") == 0) {
+               check_X = true ;
+               ConfigFile >> DataBuffer;
+//               m_TargetX = atoi(DataBuffer.c_str()) * mm;
+               m_TargetX = atoi(DataBuffer.c_str());
+               cout << "Target Coordinates (mm): ( " << m_TargetX << " ; ";
+            }
+
+            else if (DataBuffer.compare(0, 2, "Y=") == 0) {
+               check_Y = true ;
+               ConfigFile >> DataBuffer;
+//               m_TargetY = atoi(DataBuffer.c_str()) * mm;
+               m_TargetY = atoi(DataBuffer.c_str());
+               cout << m_TargetY << " ; ";
+            }
+
+            else if (DataBuffer.compare(0, 2, "Z=") == 0) {
+               check_Z = true ;
+               ConfigFile >> DataBuffer;
+//               m_TargetZ = atoi(DataBuffer.c_str()) * mm;
+               m_TargetZ = atoi(DataBuffer.c_str());
+               cout  << m_TargetZ << " )" << endl;
+            }
+
+            ///////////////////////////////////////////////////
+            // If no Target Token and no comments, toggle out
+            else {
+               ReadingStatusTarget = false; 
+               cout << "WARNING : Wrong Token Sequence: Getting out " << endl;
+            }
+
+            ///////////////////////////////////////////////////
+            // If all Token found toggle out
+            if (check_Thickness && check_Radius && check_Material && check_X && check_Y && check_Z)
+               ReadingStatusTarget = false;
+
+         }
+      }
+
+      //Nothing understandable
+      //else ;
+   }
+
+   ConfigFile.close();
+
+   InitializeRootInput();
+   InitializeRootOutput();
+
+   return;
+}
+
+
+
+/////////////////////////////////////////////////////////////////////////////////////////////////	
+void DetectorManager::BuildPhysicalEvent()						
+{
+   map<string,VDetector*>::iterator it;
+
+   for (it = m_Detector.begin(); it != m_Detector.end(); ++it) {
+      it->second->BuildPhysicalEvent();
+   }
+}
+
+
+
+/////////////////////////////////////////////////////////////////////////////////////////////////
+void DetectorManager::BuildSimplePhysicalEvent()
+{
+   map<string,VDetector*>::iterator it;
+
+   for (it = m_Detector.begin(); it != m_Detector.end(); ++it) {
+      it->second->BuildSimplePhysicalEvent();
+   }
+}
+
+
+
+/////////////////////////////////////////////////////////////////////////////////////////////////
+void DetectorManager::InitializeRootInput()						
+{
+   map<string,VDetector*>::iterator it;
+
+   for (it = m_Detector.begin(); it != m_Detector.end(); ++it) {
+      it->second->InitializeRootInput();
+   }
+}
+
+
+
+/////////////////////////////////////////////////////////////////////////////////////////////////	
+void DetectorManager::InitializeRootOutput()	
+{
+   map<string,VDetector*>::iterator it;
+
+   for (it = m_Detector.begin(); it != m_Detector.end(); ++it) {
+      it->second->InitializeRootOutput();
+   }   
+}
+
+
+
+/////////////////////////////////////////////////////////////////////////////////////////////////
+void DetectorManager::AddDetector(string DetectorName , VDetector* newDetector)
+{
+   m_Detector[DetectorName] = newDetector;
+}
+
+
+
+/////////////////////////////////////////////////////////////////////////////////////////////////
+void DetectorManager::ClearEventPhysics()
+{
+   map<string,VDetector*>::iterator it;
+
+   for (it = m_Detector.begin(); it != m_Detector.end(); ++it) {
+      it->second->ClearEventPhysics();
+   }
+}
+
+
+
+/////////////////////////////////////////////////////////////////////////////////////////////////
+void DetectorManager::ClearEventData()
+{
+   map<string,VDetector*>::iterator it;
+
+   for (it = m_Detector.begin(); it != m_Detector.end(); ++it) {
+      it->second->ClearEventData();
+   }
+}
+			
diff --git a/NPLib/VDetector/DetectorManager.h b/NPLib/VDetector/DetectorManager.h
new file mode 100644
index 0000000000000000000000000000000000000000..8f39b6d50c689eaa20858fa5e119ece0e4c59851
--- /dev/null
+++ b/NPLib/VDetector/DetectorManager.h
@@ -0,0 +1,62 @@
+#ifndef DetectorManager_h
+#define DetectorManager_h
+
+//	NPL
+#include "VDetector.h"
+
+//	STL
+#include <string>
+#include <map>
+
+using namespace std ;
+using namespace NPA ;
+
+// This class manage a map of virtual detector
+namespace NPA
+	{
+		class DetectorManager
+			{
+				public:
+				   DetectorManager();
+				   ~DetectorManager();
+
+				public:
+				   // Read stream at Path and pick-up Token declaration of Detector
+				   void	ReadConfigurationFile(string Path);
+				   void	BuildPhysicalEvent();
+				   void	BuildSimplePhysicalEvent();
+				   void	InitializeRootInput();
+				   void	InitializeRootOutput();
+				   void	AddDetector(string,VDetector*);
+				   void	ClearEventPhysics();
+				   void	ClearEventData();
+
+				public:	
+				   // The map containning all detectors
+				   // Using a Map one can access to any detector using its name
+				   map<string,VDetector*> m_Detector;
+
+				   // Special treatment for the target for the moment
+				   // If necessary we should change it to treat it as 
+				   // a full "detector"
+				private:
+				   double m_TargetThickness;
+				   double m_TargetAngle;
+				   double m_TargetRadius;
+				   string m_TargetMaterial;
+				   double m_TargetX;
+				   double m_TargetY;
+				   double m_TargetZ;
+
+				public:
+				   double GetTargetThickness()     {return m_TargetThickness;}
+				   string GetTargetMaterial()      {return m_TargetMaterial;}
+				   double GetTargetRadius()        {return m_TargetRadius;}
+				   double GetTargetAngle()         {return m_TargetAngle;}
+				   double GetTargetX()             {return m_TargetX;}
+				   double GetTargetY()             {return m_TargetY;}
+				   double GetTargetZ()             {return m_TargetZ;}
+			};
+	}
+
+#endif