diff --git a/FWCore/src/components/LCIO2Plcio.cpp b/FWCore/src/components/LCIO2Plcio.cpp
index 26a2204091ede7017f67b41456a8c51df157ad8c..146502f1a096bb79066b02820b22cbe8ae864ea5 100644
--- a/FWCore/src/components/LCIO2Plcio.cpp
+++ b/FWCore/src/components/LCIO2Plcio.cpp
@@ -36,6 +36,14 @@ static plcio::FloatThree FloatThreeFROMFloatVec(std::vector<T> vec){
   return plcio::FloatThree(tmp);
 }
 
+template<typename T>
+static plcio::DoubleThree DoubleThreeFROMConstPtr(const T* vpos){
+  double tmp[3];
+  for(unsigned i=0; i<3; i++)
+    tmp[i] = vpos[i];
+  return plcio::DoubleThree(tmp);
+}
+
 std::array<float, 6> vec6_2_arr6(std::vector<float> vec){
   std::array<float, 6> arr;
   for(unsigned i=0; i<6; i++){
@@ -51,7 +59,9 @@ LCIO2Plcio::LCIO2Plcio(){
   map_cvt.insert(std::make_pair<std::string, fptr>("SimCalorimeterHit", Convertor_SimCalorimeterHit));
   map_cvt.insert(std::make_pair<std::string, fptr>("Cluster", Convertor_Cluster));
   map_cvt.insert(std::make_pair<std::string, fptr>("Track", Convertor_Track));
+  map_cvt.insert(std::make_pair<std::string, fptr>("TrackerHit", Convertor_TrackerHit));
   map_cvt.insert(std::make_pair<std::string, fptr>("TPCHit", Convertor_TPCHit));
+  map_cvt.insert(std::make_pair<std::string, fptr>("ParticleID", Convertor_ParticleID));
 }
 LCIO2Plcio::LCIO2Plcio(EVENT::LCCollection* collection){
   LCIO2Plcio();
@@ -274,6 +284,7 @@ podio::CollectionBase* LCIO2Plcio::Convertor_Cluster(EVENT::LCCollection* lc_col
       for(unsigned k=0,K=lc_col->getNumberOfElements(); k<K; k++){
         if(lcio_seq3[j] == lc_col->getElementAt(k)){
           pl_var.addCluster(pl_col->at(k));
+	  break;
 	}
       }
     }
@@ -282,6 +293,26 @@ podio::CollectionBase* LCIO2Plcio::Convertor_Cluster(EVENT::LCCollection* lc_col
   return pl_col;
 }
 
+// QUEST::isAvailable dows not analyze;
+podio::CollectionBase* LCIO2Plcio::Convertor_ParticleID(EVENT::LCCollection* lc_col){
+  plcio::ParticleIDCollection* pl_col = new plcio::ParticleIDCollection();
+
+  for( unsigned i=0,N=lc_col->getNumberOfElements() ; i< N ; ++i){
+    EVENT::ParticleID* lc_var = (EVENT::ParticleID*) lc_col->getElementAt(i);
+    plcio::ParticleID pl_var = (plcio::ParticleID) pl_col->create();
+
+    pl_var.setType( lc_var->getType() );
+    pl_var.setPDG( lc_var->getPDG() );
+    pl_var.setAlgorythmType( lc_var->getAlgorithmType() );
+    pl_var.setLikelihood( lc_var->getLikelihood() );
+    EVENT::FloatVec vec_float = lc_var->getParameters();
+    for(unsigned j=0; j<vec_float.size(); j++){
+      pl_var.addParameter(vec_float[j]);
+    }
+  }
+  return pl_col;
+}
+
 podio::CollectionBase* LCIO2Plcio::Convertor_ReconstructedParticle(EVENT::LCCollection* lc_col){
   plcio::ReconstructedParticleCollection* pl_col = new plcio::ReconstructedParticleCollection();
 
@@ -305,6 +336,7 @@ podio::CollectionBase* LCIO2Plcio::Convertor_ReconstructedParticle(EVENT::LCColl
 
     // QUEST: boolean to int: isPrimary, str2int: getAlgorithmType;
     // pl_var.setStartVertex( lc_var->getStartVertex() ) 
+    // ignorant;
     std::array<float, 6> arr_6;
     EVENT::FloatVec fvec = lc_var->getStartVertex()->getCovMatrix();
     for(unsigned j=0; j<6; j++){
@@ -320,48 +352,90 @@ podio::CollectionBase* LCIO2Plcio::Convertor_ReconstructedParticle(EVENT::LCColl
       //lc_var->getStartVertex()->getAlgorithmType()
     ) );
 
-    // QUEST: LCIO/ParticleID has a int algType;
-    //pl_var.setParticleIDUsed( lc_var->igetParticleIDUsed() );
-    pl_var.setParticleIDUsed( plcio::ConstParticleID(
-      lc_var->getParticleIDUsed()->getType(),
-      lc_var->getParticleIDUsed()->getPDG(),
-      lc_var->getParticleIDUsed()->getAlgorithmType(),
-      lc_var->getParticleIDUsed()->getLikelihood()
-    ) );
+    //pl_var.setParticleIDUsed( lc_var->getParticleIDUsed() );
+    EVENT::ParticleID* lc_locx = lc_var->getParticleIDUsed();
+    CollectionsVec vec_cols = map_cols["ParticleID"];
+    EVENT::LCCollection* lc_mapcol = (EVENT::LCCollection*)vec_cols[0].first;
+    plcio::ParticleIDCollection* pl_mapcol = (plcio::ParticleIDCollection*)vec_cols[0].second;
 
-    //pl_var.addCluster();
-    // QUEST: set value directly;
+    for(unsigned k=0, LCsize=lc_mapcol->getNumberOfElements(); k<LCsize; k++){
+      if(lc_locx == lc_mapcol->getElementAt(k))
+        pl_var.setParticleIDUsed(pl_mapcol->at(k));
+    }
+    
 
+    //pl_var.addCluster();
     std::vector<EVENT::Cluster*> vec_clust = lc_var->getClusters();
     for(unsigned j=0; j<vec_clust.size(); j++){
-      for(unsigned k=0; k<6; k++){
-        arr_6[k] = vec_clust[j]->getPositionError()[k];
-      }
+      CollectionsVec vec_cols = map_cols["Cluster"];
+      EVENT::LCCollection* lc_mapcol = (EVENT::LCCollection*)vec_cols[0].first;
+      plcio::ClusterCollection* pl_mapcol = (plcio::ClusterCollection*)vec_cols[0].second;
 
-      pl_var.addCluster( plcio::ConstCluster(
-        vec_clust[j]->getType(),
-        vec_clust[j]->getEnergy(),
-        vec_clust[j]->getEnergyError(),
-        FloatThreeFROMConstPtr( vec_clust[j]->getPosition() ),
-        arr_6,
-        vec_clust[j]->getITheta(),
-        vec_clust[j]->getIPhi(),
-        FloatThreeFROMFloatVec( vec_clust[j]->getDirectionError() )
-      ) );
+      for(unsigned k=0; k<lc_mapcol->getNumberOfElements(); k++){
+        if( vec_clust[j] == lc_mapcol->getElementAt(k) )
+          pl_var.addCluster( pl_mapcol->at(k) );
+      }
     }
 
     //pl_var.addTrack();
-    // QUEST: set value directly;
     EVENT::TrackVec vec_track = lc_var->getTracks();
     for(unsigned j=0; j<vec_track.size(); j++){
-      pl_var.addTrack(plcio::ConstTrack(
-       // plcio/include/plcio/TrackConst.h
-       //  LCIO/include/EVENT/Track.h 
-      ));
+      CollectionsVec vec_cols = map_cols["Track"];
+      EVENT::LCCollection* lc_mapcol = (EVENT::LCCollection*)vec_cols[0].first;
+      plcio::TrackCollection* pl_mapcol = (plcio::TrackCollection*)vec_cols[0].second;
+
+      for(unsigned k=0; k<lc_mapcol->getNumberOfElements(); k++)
+        if(vec_track[j] == lc_mapcol->getElementAt(k))
+          pl_var.addTrack(pl_mapcol->at(k));
     }
 
-    //pl_var.addParticle();
-    //pl_var.addParticleID();
+    //pl_var.addParticleID( lc->getParticleIDs);
+    EVENT::ParticleIDVec vec_ParticleID = lc_var->getParticleIDs();
+    for(unsigned j=0; j<vec_ParticleID.size(); j++){
+      CollectionsVec vec_cols = map_cols["ParticleID"];
+      EVENT::LCCollection* lc_mapcol = (EVENT::LCCollection*)vec_cols[0].first;
+      plcio::ParticleIDCollection* pl_mapcol = (plcio::ParticleIDCollection*)vec_cols[0].second;
+
+      for(unsigned k=0,M=lc_mapcol->getNumberOfElements(); k<M; k++){
+        if(vec_ParticleID[j] == lc_mapcol->getElementAt(k))
+          pl_var.addParticleID( pl_mapcol->at(k) );
+      }
+    }
+  }
+  //pl_var.addParticle();
+  for(unsigned i=0, N=lc_col->getNumberOfElements(); i<N; i++){
+    EVENT::ReconstructedParticle* lc_var = (EVENT::ReconstructedParticle*)lc_col->getElementAt(i);
+    EVENT::ReconstructedParticleVec vec_RecPtc = lc_var->getParticles();
+
+    for(unsigned j=0; j<vec_RecPtc.size(); j++){
+      for(unsigned k=0, M=lc_col->getNumberOfElements(); k<M; k++){
+        if(vec_RecPtc[j] == lc_col->getElementAt(k))
+          pl_col->at(i).addParticle( pl_col->at(k) );
+      }
+    }
+  }
+
+  return pl_col;
+}
+
+podio::CollectionBase* LCIO2Plcio::Convertor_TrackerHit(EVENT::LCCollection* lc_col){
+  plcio::TrackerHitCollection* pl_col = new plcio::TrackerHitCollection();
+  
+  for(unsigned i=0,N=lc_col->getNumberOfElements(); i<N; i++){
+    EVENT::TrackerHit* lc_var = (EVENT::TrackerHit*) lc_col->getElementAt(i);
+    plcio::TrackerHit  pl_var = (plcio::TrackerHit) pl_col->create();
+    
+    pl_var.setCellID0(lc_var->getCellID0());
+    pl_var.setCellID1(lc_var->getCellID1());
+
+    pl_var.setType(lc_var->getType());
+    pl_var.setQuality(lc_var->getQuality());
+    pl_var.setTime(lc_var->getTime());
+    pl_var.setEDep(lc_var->getEDep());
+    pl_var.setEDepError(lc_var->getEDepError());
+    pl_var.setEdx(lc_var->getdEdx());
+    pl_var.setPosition( DoubleThreeFROMConstPtr(lc_var->getPosition()));
+    pl_var.setCovMatrix( vec6_2_arr6(lc_var->getCovMatrix()));
   }
   return pl_col;
 }
@@ -381,33 +455,19 @@ podio::CollectionBase* LCIO2Plcio::Convertor_Track(EVENT::LCCollection* lc_col){
     pl_var.setRadiusOfInnermostHit( lc_var->getRadiusOfInnermostHit() );
 
     //pl_var.addTrackerHit( lc_var->getTrackerHits() );
+    //rely on TrackerHits collection;
+    //corresoponding with TrackerHit collection; 
     EVENT::TrackerHitVec lcio_seq1 = lc_var->getTrackerHits();
     for(unsigned j=0; j<lcio_seq1.size(); j++){
       EVENT::TrackerHit* lc_locx = lcio_seq1[j];
-
-      const double* lcio_v = lc_locx->getPosition();
-      double plcio_v[3];
-      plcio_v[0] = lcio_v[0];
-      plcio_v[1] = lcio_v[1];
-      plcio_v[2] = lcio_v[2];
-
-      std::array<float, 6> plcio_arr6;
-      for(unsigned k=0; k<6; k++){
-        plcio_arr6[k] = lc_locx->getCovMatrix()[k];
-      }
-
-      pl_var.addTrackerHit(plcio::ConstTrackerHit(
-        lc_locx->getCellID0(),
-        lc_locx->getCellID1(),
-        lc_locx->getType(),
-        lc_locx->getQuality(),
-        lc_locx->getTime(),
-        lc_locx->getEDep(),
-        lc_locx->getEDepError(),
-        lc_locx->getdEdx(),
-        plcio::DoubleThree(plcio_v),
-        plcio_arr6
-      ));
+      CollectionsVec vec_cols = map_cols["TrackerHit"];
+      EVENT::LCCollection* lc_mapcol = (EVENT::LCCollection*)vec_cols[0].first;
+      plcio::TrackerHitCollection* pl_mapcol = (plcio::TrackerHitCollection*) vec_cols[0].second;
+
+      for(unsigned k=0; k<lc_mapcol->getNumberOfElements(); k++){
+        if( lc_locx == lc_mapcol->getElementAt(k) )
+          pl_var.addTrackerHit( pl_mapcol->at(k) );
+      } 
     }
 
     //pl_var.( lc_var->getSubdetectorHitNumbers() );
@@ -416,27 +476,39 @@ podio::CollectionBase* LCIO2Plcio::Convertor_Track(EVENT::LCCollection* lc_col){
       pl_var.addSubDetectorHitNumber(lcio_IntVec1[j]);
     }
 
-    //pl_var.( lc_var->getTracks() );
-    EVENT::TrackVec lcio_seq2 = lc_var->getTracks();
-    for(unsigned j=0; j<lcio_seq2.size(); j++){
-      EVENT::Track* lc_locx = lcio_seq2[j];
-
-      pl_var.addTrack(plcio::ConstTrack(
-        lc_locx->getType(),
-        lc_locx->getChi2(),
-        lc_locx->getNdf(),
-        lc_locx->getdEdx(),
-        lc_locx->getdEdxError(),
-        lc_locx->getRadiusOfInnermostHit()
-      ));
-    }
-
     //pl_var.( lc_var->getTrackStates() );
     EVENT::TrackStateVec lcio_seq3 = lc_var->getTrackStates();
     for(unsigned j=0; j<lcio_seq3.size(); j++){
       EVENT::TrackState* lc_locx = lcio_seq3[j];
+      std::array<float, 15> tmp_covM;
+      for(unsigned k=0; k<15; k++){
+        tmp_covM[k] = lc_locx->getCovMatrix()[k];
+      }
 
-      //pl_var.addTrackState(plcio::TrackState());
+      plcio::TrackState tmp;
+      tmp.D0 = lc_locx->getD0();
+      tmp.Z0 = lc_locx->getZ0();
+      tmp.covMatrix = tmp_covM; 
+      tmp.location = lc_locx->getLocation();
+      tmp.omega = lc_locx->getOmega();
+      tmp.phi = lc_locx->getPhi();
+      tmp.referencePoint = FloatThreeFROMConstPtr( lc_locx->getReferencePoint() );
+      tmp.tanLambda = lc_locx->getTanLambda();
+      pl_var.addTrackState( tmp );
+    }
+  }
+
+  //pl_var.( lc_var->getTracks() );
+  for(unsigned i=0; i<lc_col->getNumberOfElements(); i++){
+    EVENT::Track* lc_var = (EVENT::Track*)lc_col->getElementAt(i);
+    EVENT::TrackVec lcio_seq2 = lc_var->getTracks();
+
+    for(unsigned j=0; j<lcio_seq2.size(); j++){
+      EVENT::Track* lc_locx = lcio_seq2[j];
+      for(unsigned k=0; k<lc_col->getNumberOfElements(); k++){
+        if( lc_locx == lc_col->getElementAt(k) )
+          pl_col->at(i).addTrack(pl_col->at(k));
+      }
     }
   }
   return pl_col;
diff --git a/FWCore/src/components/LCIO2Plcio.h b/FWCore/src/components/LCIO2Plcio.h
index a49ab30e97866255b2a666aaf572171cbbf42e13..bca22a0ac3827639ef3311c5d743d221fa1cae0f 100644
--- a/FWCore/src/components/LCIO2Plcio.h
+++ b/FWCore/src/components/LCIO2Plcio.h
@@ -34,10 +34,14 @@
 #include "EVENT/TrackerHit.h"
 #include "EVENT/TrackState.h" 
 #include "plcio/Track.h"  
+#include "plcio/TrackerHit.h"  
 #include "plcio/TrackCollection.h"  
+#include "plcio/TrackerHitCollection.h"  
 #include "EVENT/ReconstructedParticle.h" 
 #include "plcio/ReconstructedParticle.h"  
 #include "plcio/ReconstructedParticleCollection.h"  
+#include "plcio/ParticleID.h"  
+#include "plcio/ParticleIDCollection.h"  
 
 #include <utility>
 // Forward declarations
@@ -75,10 +79,14 @@ public:
   static podio::CollectionBase* Convertor_SimCalorimeterHit(EVENT::LCCollection*);
   static podio::CollectionBase* Convertor_Cluster(EVENT::LCCollection*);
   static podio::CollectionBase* Convertor_Track(EVENT::LCCollection*);
+  static podio::CollectionBase* Convertor_TrackerHit(EVENT::LCCollection*);
+  static podio::CollectionBase* Convertor_TPCHit(EVENT::LCCollection*);
+
   static podio::CollectionBase* Convertor_ReconstructedParticle(EVENT::LCCollection*);
+  static podio::CollectionBase* Convertor_ParticleID(EVENT::LCCollection*);
+
   static podio::CollectionBase* Convertor_LCRelation(EVENT::LCCollection*);
   static podio::CollectionBase* Convertor_Vertex(EVENT::LCCollection*);
-  static podio::CollectionBase* Convertor_TPCHit(EVENT::LCCollection*);
 
   static void setMCParticle(EVENT::MCParticle*, plcio::MCParticle&);
   void setCollName(const std::string &collName){ CollName = collName; };