diff --git a/Event/xAOD/xAODTruthCnv/CMakeLists.txt b/Event/xAOD/xAODTruthCnv/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..67910e31268069f826812a5226392024d34781b4
--- /dev/null
+++ b/Event/xAOD/xAODTruthCnv/CMakeLists.txt
@@ -0,0 +1,30 @@
+################################################################################
+# Package: xAODTruthCnv
+################################################################################
+
+# Declare the package name:
+atlas_subdir( xAODTruthCnv )
+
+# Declare the package's dependencies:
+atlas_depends_on_subdirs( PRIVATE
+                          Control/AthenaBaseComps
+                          Control/AthenaKernel
+                          Control/DataModel
+                          Control/StoreGate
+                          Event/xAOD/xAODTruth
+                          GaudiKernel
+                          Generators/GeneratorObjects )
+
+# External dependencies:
+find_package( ROOT COMPONENTS Core Tree MathCore Hist RIO pthread )
+
+# Component(s) in the package:
+atlas_add_component( xAODTruthCnv
+                     src/*.cxx
+                     src/components/*.cxx
+                     INCLUDE_DIRS ${ROOT_INCLUDE_DIRS}
+                     LINK_LIBRARIES ${ROOT_LIBRARIES} AthenaBaseComps AthenaKernel DataModel StoreGateLib SGtests xAODTruth GaudiKernel GeneratorObjects )
+
+# Install files from the package:
+atlas_install_joboptions( share/*.py )
+
diff --git a/Event/xAOD/xAODTruthCnv/src/xAODTruthCnvAlg.cxx b/Event/xAOD/xAODTruthCnv/src/xAODTruthCnvAlg.cxx
index e86608a28ee594cc0ccca0e2e536da16b482c5bd..69818e3834c73f01c588c10423314015c5620f37 100644
--- a/Event/xAOD/xAODTruthCnv/src/xAODTruthCnvAlg.cxx
+++ b/Event/xAOD/xAODTruthCnv/src/xAODTruthCnvAlg.cxx
@@ -49,6 +49,7 @@ namespace xAODMaker {
     declareProperty("TruthLinks", m_truthLinkContainerName="xAODTruthLinks" );
     declareProperty( "WriteAllPileUpTruth", m_doAllPileUp = false);
     declareProperty( "WriteInTimePileUpTruth", m_doInTimePileUp = false);
+    declareProperty( "ForceRerun", m_forceRerun = false);
 
   }
 
@@ -75,11 +76,12 @@ namespace xAODMaker {
   StatusCode xAODTruthCnvAlg::execute() {
 
     // If the containers already exist then assume that nothing needs to be done
-    /// @todo Should this check be AND rather than OR?
-    if (evtStore()->contains< xAOD::TruthEventContainer >(m_xaodTruthEventContainerName) ||
-        evtStore()->contains< xAOD::TruthPileupEventContainer >(m_xaodTruthPUEventContainerName) ||
-        evtStore()->contains< xAOD::TruthParticleContainer >(m_xaodTruthParticleContainerName) ||
-        evtStore()->contains< xAOD::TruthVertexContainer >(m_xaodTruthVertexContainerName)) {
+    /// @todo Should this check be AND rather than OR? But pileup might be missing.
+    if ((evtStore()->contains< xAOD::TruthEventContainer >(m_xaodTruthEventContainerName) ||
+	 evtStore()->contains< xAOD::TruthPileupEventContainer >(m_xaodTruthPUEventContainerName) ||
+	 evtStore()->contains< xAOD::TruthParticleContainer >(m_xaodTruthParticleContainerName) ||
+	 evtStore()->contains< xAOD::TruthVertexContainer >(m_xaodTruthVertexContainerName)) && 
+	!m_forceRerun) {
       ATH_MSG_WARNING("xAOD Truth seems to be already available in the event");
       return StatusCode::SUCCESS;
     }
@@ -105,12 +107,16 @@ namespace xAODMaker {
       xTruthEventContainer->setStore( xTruthEventAuxContainer );
       ATH_MSG_DEBUG( "Recorded TruthEventContainer with key: " << m_xaodTruthEventContainerName );
       // Pile-up events
-      xAOD::TruthPileupEventContainer* xTruthPileupEventContainer = new xAOD::TruthPileupEventContainer();
-      CHECK( evtStore()->record( xTruthPileupEventContainer, m_xaodTruthPUEventContainerName ) );
-      xAOD::TruthPileupEventAuxContainer* xTruthPileupEventAuxContainer = new xAOD::TruthPileupEventAuxContainer();
-      CHECK( evtStore()->record( xTruthPileupEventAuxContainer, m_xaodTruthPUEventContainerName + "Aux." ) );
-      xTruthPileupEventContainer->setStore( xTruthPileupEventAuxContainer );
-      ATH_MSG_DEBUG( "Recorded TruthPileupEventContainer with key: " << m_xaodTruthPUEventContainerName );
+      xAOD::TruthPileupEventContainer* xTruthPileupEventContainer = 0;
+      xAOD::TruthPileupEventAuxContainer* xTruthPileupEventAuxContainer = 0;
+      if (m_doAllPileUp || m_doInTimePileUp) {
+	xTruthPileupEventContainer = new xAOD::TruthPileupEventContainer();
+	CHECK( evtStore()->record( xTruthPileupEventContainer, m_xaodTruthPUEventContainerName ) );
+	xTruthPileupEventAuxContainer = new xAOD::TruthPileupEventAuxContainer();
+	CHECK( evtStore()->record( xTruthPileupEventAuxContainer, m_xaodTruthPUEventContainerName + "Aux." ) );
+	xTruthPileupEventContainer->setStore( xTruthPileupEventAuxContainer );
+	ATH_MSG_DEBUG( "Recorded TruthPileupEventContainer with key: " << m_xaodTruthPUEventContainerName );
+      }
       // Particles
       xAOD::TruthParticleContainer* xTruthParticleContainer = new xAOD::TruthParticleContainer();
       CHECK( evtStore()->record( xTruthParticleContainer, m_xaodTruthParticleContainerName ) );
@@ -312,7 +318,7 @@ namespace xAODMaker {
           // (c) Put particle into container; Build Event<->Vertex element link
           ElementLink<xAOD::TruthVertexContainer> eltv(*xTruthVertexContainer, xTruthVertexContainer->size()-1);
           // Mark if this is the signal process vertex
-          if (vertex == signalProcessVtx) xTruthEvent->setSignalProcessVertexLink(eltv);
+          if ((vertex == signalProcessVtx) && isSignalProcess) xTruthEvent->setSignalProcessVertexLink(eltv);
           if (isSignalProcess) xTruthEvent->addTruthVertexLink(eltv);
 	  if (!isSignalProcess) xTruthPileupEvent->addTruthVertexLink(eltv);
           // (d) Assign incoming particles to the vertex, from the map
diff --git a/Event/xAOD/xAODTruthCnv/src/xAODTruthCnvAlg.h b/Event/xAOD/xAODTruthCnv/src/xAODTruthCnvAlg.h
index 7ed2cd824aa838db861e0853cc310a2cbdcb6ff0..d8b17b539d088f2801fba4a7dcd861860d2f4dc3 100644
--- a/Event/xAOD/xAODTruthCnv/src/xAODTruthCnvAlg.h
+++ b/Event/xAOD/xAODTruthCnv/src/xAODTruthCnvAlg.h
@@ -66,6 +66,9 @@ namespace xAODMaker {
     bool m_doAllPileUp;
     bool m_doInTimePileUp;
 
+    /// a flag to force rerunning (useful for rerunning on ESDs)
+    bool m_forceRerun;
+
   }; // class xAODTruthCnvAlg