diff --git a/Reconstruction/Tracking/CMakeLists.txt b/Reconstruction/Tracking/CMakeLists.txt
index f3e77b4721987efb6a6cd5d7888f7455927bf61d..9ea9ecd6794902b915681f461703868feabd6909 100644
--- a/Reconstruction/Tracking/CMakeLists.txt
+++ b/Reconstruction/Tracking/CMakeLists.txt
@@ -1,9 +1,12 @@
+gaudi_add_header_only_library(TrackingLib)
+
 # Modules
 gaudi_add_module(Tracking
                  SOURCES src/Clupatra/ClupatraAlg.cpp
                          src/Clupatra/clupatra_new.cpp
                          src/FullLDCTracking/FullLDCTrackingAlg.cpp
                          src/TruthTracker/TruthTrackerAlg.cpp
+                         src/FitterTool/KalTestTool.cpp
                  LINK GearSvc
                       EventSeeder
                       TrackSystemSvcLib
diff --git a/Reconstruction/Tracking/include/Tracking/ITrackFitterTool.h b/Reconstruction/Tracking/include/Tracking/ITrackFitterTool.h
new file mode 100644
index 0000000000000000000000000000000000000000..4de2b46e80e807241e2898788fa03f1a64c085d2
--- /dev/null
+++ b/Reconstruction/Tracking/include/Tracking/ITrackFitterTool.h
@@ -0,0 +1,40 @@
+#ifndef ITrackFitterTool_h
+#define ITrackFitterTool_h
+
+/*
+ * Description:
+ *   ITrackFitterTool is used to fit a track candidate to obtain track parameter
+ *
+ * The interface:
+ *   * Fit: peform on tracker hits according prepared geometry
+ *
+ * Author: FU Chengdong <fucd@ihep.ac.cn>
+ */
+
+#include "GaudiKernel/IAlgTool.h"
+#include "edm4hep/TrackState.h"
+#include <vector>
+
+
+
+namespace edm4hep{
+  class MutableTrack;
+  class TrackerHit;
+}
+
+class ITrackFitterTool: virtual public IAlgTool {
+ public:
+
+  DeclareInterfaceID(ITrackFitterTool, 0, 1);
+  virtual ~ITrackFitterTool() {}
+
+  virtual int Fit(edm4hep::MutableTrack track, std::vector<edm4hep::TrackerHit>& trackHits,
+                  const decltype(edm4hep::TrackState::covMatrix)& covMatrix, double maxChi2perHit, bool backward) = 0;
+  virtual int Fit(edm4hep::MutableTrack track, std::vector<edm4hep::TrackerHit>& trackHits,
+                  edm4hep::TrackState trackState, double maxChi2perHit, bool backward) = 0;
+  virtual std::vector<std::pair<edm4hep::TrackerHit, double> >& GetHitsInFit() = 0;
+  virtual std::vector<std::pair<edm4hep::TrackerHit, double> >& GetOutliers() = 0;
+  virtual void Clear() = 0;
+};
+
+#endif
diff --git a/Reconstruction/Tracking/src/FitterTool/KalTestTool.cpp b/Reconstruction/Tracking/src/FitterTool/KalTestTool.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..773f1998a17af850fd5f06d42b1ef3d5d0d5a79a
--- /dev/null
+++ b/Reconstruction/Tracking/src/FitterTool/KalTestTool.cpp
@@ -0,0 +1,103 @@
+#include "KalTestTool.h"
+
+#include "TrackSystemSvc/ITrackSystemSvc.h"
+#include "TrackSystemSvc/MarlinTrkUtils.h"
+#include "TrackSystemSvc/IMarlinTrack.h"
+#include "DetInterface/IGeomSvc.h"
+
+#include "DD4hep/Detector.h"
+#include "DD4hep/DD4hepUnits.h"
+
+#include "edm4hep/TrackerHit.h"
+#include "edm4hep/TrackState.h"
+#include "edm4hep/MutableTrack.h"
+
+DECLARE_COMPONENT(KalTestTool)
+
+StatusCode KalTestTool::initialize() {
+  StatusCode sc;
+  always() << m_fitterName << endmsg;
+  if (m_fitterName=="KalTest") {
+    auto _trackSystemSvc = service<ITrackSystemSvc>("TrackSystemSvc");
+    if (!_trackSystemSvc) {
+      error() << "Failed to find TrackSystemSvc ..." << endmsg;
+      return StatusCode::FAILURE;
+    }
+    m_factoryMarlinTrk = _trackSystemSvc->getTrackSystem(this);
+    m_factoryMarlinTrk->setOption(MarlinTrk::IMarlinTrkSystem::CFG::useQMS, m_useQMS);
+    m_factoryMarlinTrk->setOption(MarlinTrk::IMarlinTrkSystem::CFG::usedEdx, m_usedEdx);
+    m_factoryMarlinTrk->setOption(MarlinTrk::IMarlinTrkSystem::CFG::useSmoothing, m_useSmoothing);
+    m_factoryMarlinTrk->init();
+  }
+  else {
+    error() << "fitter " << m_fitterName << " has not been imported" << endmsg;
+    return StatusCode::FAILURE;
+  }
+
+  auto _geomSvc = service<IGeomSvc>("GeomSvc");
+  if ( !_geomSvc ) {
+    error() << "Failed to find GeomSvc ..." << endmsg;
+    return StatusCode::FAILURE;
+  }
+
+  if (m_magneticField.value()==0) {
+    const dd4hep::Direction& field = _geomSvc->lcdd()->field().magneticField(dd4hep::Position(0,0,0));
+    double Bz = field.z()/dd4hep::tesla;
+    if (Bz==0) {
+      error() << "magnetic field = 0, KalmanFilter cannot run" << endmsg;
+      return StatusCode::FAILURE;
+    }
+    m_magneticField = Bz;
+  }
+
+  return sc;
+}
+
+StatusCode KalTestTool::finalize() {
+  StatusCode sc;
+  return sc;
+}
+
+int KalTestTool::Fit(edm4hep::MutableTrack track, std::vector<edm4hep::TrackerHit>& trackHits,
+			  const decltype(edm4hep::TrackState::covMatrix)& covMatrix, double maxChi2perHit, bool backward) {
+  if (m_hitsInFit.size()!=0 || m_outliers.size()!=0) {
+    error() << "Important! vector not clear, still store the data of last event!" << endmsg;
+    return 0;
+  }
+
+  if (m_fitterName=="KalTest") {
+    debug() << "start..." << endmsg;
+    std::shared_ptr<MarlinTrk::IMarlinTrack> marlinTrack(m_factoryMarlinTrk->createTrack());
+    debug() << "created MarlinKalTestTrack" << endmsg;
+    int status = MarlinTrk::createFinalisedLCIOTrack(marlinTrack.get(), trackHits, &track, backward, covMatrix, m_magneticField, maxChi2perHit);
+
+    marlinTrack->getHitsInFit(m_hitsInFit);
+    marlinTrack->getOutliers(m_outliers);
+    return status;
+  }
+  
+  error() << "Don't support the Fitter " << m_fitterName << endmsg;
+  return 0;
+}
+
+int KalTestTool::Fit(edm4hep::MutableTrack track, std::vector<edm4hep::TrackerHit>& trackHits,
+                          edm4hep::TrackState trackState, double maxChi2perHit, bool backward) {
+  if (m_hitsInFit.size()!=0 || m_outliers.size()!=0) {
+    error() << "Important! vector not clear, still store the data of last event!" << endmsg;
+    return 0;
+  }
+
+  if (m_fitterName=="KalTest") {
+    debug() << "start..." << endmsg;
+    std::shared_ptr<MarlinTrk::IMarlinTrack> marlinTrack(m_factoryMarlinTrk->createTrack());
+    debug() << "created MarlinKalTestTrack" << endmsg;
+    int status = MarlinTrk::createFinalisedLCIOTrack(marlinTrack.get(), trackHits, &track, backward, &trackState, m_magneticField, maxChi2perHit);
+
+    marlinTrack->getHitsInFit(m_hitsInFit);
+    marlinTrack->getOutliers(m_outliers);
+    return status;
+  }
+
+  error() << "Don't support the Fitter " << m_fitterName << endmsg;
+  return 0;
+}
diff --git a/Reconstruction/Tracking/src/FitterTool/KalTestTool.h b/Reconstruction/Tracking/src/FitterTool/KalTestTool.h
new file mode 100644
index 0000000000000000000000000000000000000000..0cce58bc46c56d8bc15c0a4670205e58c27aaf38
--- /dev/null
+++ b/Reconstruction/Tracking/src/FitterTool/KalTestTool.h
@@ -0,0 +1,43 @@
+#ifndef KalTestTool_h
+#define KalTestTool_h
+
+#include "GaudiKernel/AlgTool.h"
+#include "Tracking/ITrackFitterTool.h"
+#include <vector>
+
+namespace MarlinTrk {
+  class IMarlinTrkSystem ;
+}
+
+class KalTestTool : public extends<AlgTool, ITrackFitterTool> {
+ public:
+  using extends::extends;
+  //KalTestTool(void* p) { m_pAlgUsing=p; };
+  
+  virtual int Fit(edm4hep::MutableTrack track, std::vector<edm4hep::TrackerHit>& trackHits,
+		  const decltype(edm4hep::TrackState::covMatrix)& covMatrix, double maxChi2perHit, bool backward = true) override;
+  virtual int Fit(edm4hep::MutableTrack track, std::vector<edm4hep::TrackerHit>& trackHits,
+                  edm4hep::TrackState trackState, double maxChi2perHit, bool backward = true) override;
+
+  StatusCode initialize() override;
+  StatusCode finalize() override;
+
+  std::vector<std::pair<edm4hep::TrackerHit, double> >& GetHitsInFit() override {return m_hitsInFit;};
+  std::vector<std::pair<edm4hep::TrackerHit, double> >& GetOutliers() override {return m_outliers;};
+  void Clear() override {m_hitsInFit.clear(); m_outliers.clear();};
+
+ private:
+  Gaudi::Property<std::string>    m_fitterName{this, "Fitter", "KalTest"};
+  Gaudi::Property<bool>           m_useQMS{this, "MSOn", true};
+  Gaudi::Property<bool>           m_usedEdx{this, "EnergyLossOn", true};
+  Gaudi::Property<bool>           m_useSmoothing{this, "Smooth", true};
+  Gaudi::Property<double>         m_magneticField{this, "MagneticField", 0};
+  
+  MarlinTrk::IMarlinTrkSystem* m_factoryMarlinTrk = nullptr;
+
+  void* m_pAlgUsing = nullptr;
+  std::vector<std::pair<edm4hep::TrackerHit, double> > m_hitsInFit ;
+  std::vector<std::pair<edm4hep::TrackerHit, double> > m_outliers ;
+};
+
+#endif