diff --git a/Generators/GeneratorFilters/CMakeLists.txt b/Generators/GeneratorFilters/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..6ed699b734a9c848a95acf494dd11d0c2da40a38
--- /dev/null
+++ b/Generators/GeneratorFilters/CMakeLists.txt
@@ -0,0 +1,47 @@
+################################################################################
+# Package: GeneratorFilters
+################################################################################
+
+# Declare the package name:
+atlas_subdir( GeneratorFilters )
+
+# Declare the package's dependencies:
+atlas_depends_on_subdirs( PUBLIC
+                          Control/StoreGate
+                          GaudiKernel
+                          Generators/GeneratorModules
+                          PRIVATE
+                          Control/AthenaKernel
+                          Control/CxxUtils
+                          Event/EventInfo
+                          Event/xAOD/xAODJet
+                          Event/xAOD/xAODTruth
+                          Generators/TruthUtils
+                          PhysicsAnalysis/AnalysisCommon/ParticleEvent
+                          PhysicsAnalysis/TruthParticleID/McParticleEvent
+                          Reconstruction/MissingETEvent )
+
+# External dependencies:
+find_package( CLHEP )
+find_package( HepMC )
+find_package( HepPDT )
+find_package( ROOT COMPONENTS Core Tree MathCore Hist RIO pthread MathMore Minuit Minuit2 Matrix Physics HistPainter Rint )
+
+# Component(s) in the package:
+atlas_add_library( GeneratorFiltersLib
+                   src/*.cxx
+                   PUBLIC_HEADERS GeneratorFilters
+                   INCLUDE_DIRS ${ROOT_INCLUDE_DIRS} ${CLHEP_INCLUDE_DIRS} ${HEPMC_INCLUDE_DIRS}
+                   PRIVATE_INCLUDE_DIRS ${HEPPDT_INCLUDE_DIRS}
+                   DEFINITIONS ${CLHEP_DEFINITIONS}
+                   LINK_LIBRARIES ${ROOT_LIBRARIES} ${CLHEP_LIBRARIES} ${HEPMC_LIBRARIES} GaudiKernel StoreGateLib SGtests GeneratorModulesLib
+                   PRIVATE_LINK_LIBRARIES ${HEPPDT_LIBRARIES} AthenaKernel CxxUtils EventInfo xAODJet xAODTruth TruthUtils ParticleEvent McParticleEvent MissingETEvent )
+
+atlas_add_component( GeneratorFilters
+                     src/components/*.cxx
+                     INCLUDE_DIRS ${HEPPDT_INCLUDE_DIRS} ${ROOT_INCLUDE_DIRS} ${CLHEP_INCLUDE_DIRS} ${HEPMC_INCLUDE_DIRS}
+                     LINK_LIBRARIES ${HEPPDT_LIBRARIES} ${ROOT_LIBRARIES} ${CLHEP_LIBRARIES} ${HEPMC_LIBRARIES} StoreGateLib SGtests GaudiKernel GeneratorModulesLib AthenaKernel CxxUtils EventInfo xAODJet xAODTruth TruthUtils ParticleEvent McParticleEvent MissingETEvent GeneratorFiltersLib )
+
+# Install files from the package:
+atlas_install_joboptions( share/*.py )
+
diff --git a/Generators/GeneratorFilters/GeneratorFilters/BSignalFilter.h b/Generators/GeneratorFilters/GeneratorFilters/BSignalFilter.h
index 948f95e47864e9f167a256d9f06bdf118cbd0683..fa9a8746ebe146f3482ea233e6a03b2300f8e47a 100644
--- a/Generators/GeneratorFilters/GeneratorFilters/BSignalFilter.h
+++ b/Generators/GeneratorFilters/GeneratorFilters/BSignalFilter.h
@@ -67,7 +67,7 @@ class BSignalFilter : public GenFilter
   // Find child
   void FindAllChildren(const HepMC::GenParticle* mother,std::string treeIDStr,  
 		       bool fromFinalB, bool &foundSignal, bool &passedAllCuts,
-		       TLorentzVector &p1, TLorentzVector &p2) const;
+		       TLorentzVector &p1, TLorentzVector &p2, bool fromSelectedB) const;
 
   // Check whether child has pass cuts
   bool FinalStatePassedCuts(const HepMC::GenParticle* child) const; 
diff --git a/Generators/GeneratorFilters/src/BSignalFilter.cxx b/Generators/GeneratorFilters/src/BSignalFilter.cxx
index cc33e85e858166c35388f6a8e0820bd0fcb5e59a..667f5c92442d61e3ae723257063e3dd33ec8c0f6 100644
--- a/Generators/GeneratorFilters/src/BSignalFilter.cxx
+++ b/Generators/GeneratorFilters/src/BSignalFilter.cxx
@@ -253,7 +253,7 @@ StatusCode BSignalFilter::filterEvent()
 		      bool havePassedCuts=true;
 		      TLorentzVector CandPart1, CandPart2;
 		      //
-		      FindAllChildren((*pitr),"",false,isSignal,havePassedCuts,CandPart1,CandPart2);
+		      FindAllChildren((*pitr),"",false,isSignal,havePassedCuts,CandPart1,CandPart2,false);
 		      //
 		      ATH_MSG_DEBUG("");
 		      ATH_MSG_DEBUG(" ------------------------------- ");
@@ -396,26 +396,14 @@ bool BSignalFilter::LVL2_eMu_Trigger(const HepMC::GenParticle* child) const
 
 void BSignalFilter::FindAllChildren(const HepMC::GenParticle* mother,std::string treeIDStr,
 				    bool fromFinalB, bool &foundSignal, bool &passedAllCuts,
-				    TLorentzVector &p1, TLorentzVector &p2) const
+				    TLorentzVector &p1, TLorentzVector &p2, bool fromSelectedB) const
 {
   int pID = mother->pdg_id();
   //
   if ( !(mother->end_vertex()) && (mother->status() != 2) )  // i.e. this is a final state
     {
-      bool hasChildGoodParent = false;
+      bool hasChildGoodParent = fromFinalB && (fromSelectedB || m_B_pdgid==0);
       //
-      HepMC::GenVertex::particle_iterator firstChildParent, lastChildParent, thisChildParent;
-      firstChildParent = mother->production_vertex()->particles_begin(HepMC::parents);
-      lastChildParent  = mother->production_vertex()->particles_end(HepMC::parents);
-      for( thisChildParent = firstChildParent; thisChildParent != lastChildParent++; ++thisChildParent )
-	{
-	  int SigChild_parentID = (*thisChildParent)->pdg_id();
-	  if( SigChild_parentID == m_B_pdgid ){
-	    hasChildGoodParent = true;
-	  }else if( MC::PID::isHadron(pID) && MC::PID::isCharged(pID) && SigChild_parentID == 333 ){ // If the parent is a phi(1020)
-	    hasChildGoodParent = true;
-	  }
-	}
       if( fromFinalB && hasChildGoodParent )
 	{
 	  foundSignal=true;
@@ -468,7 +456,7 @@ void BSignalFilter::FindAllChildren(const HepMC::GenParticle* mother,std::string
       stringstream childCntSS; childCntSS << childCnt;
       childIDStr = treeIDStr + childCntSS.str();
       PrintChild( (*thisChild), childIDStr, fromFinalB );
-      FindAllChildren( (*thisChild),childIDStr,fromFinalB,foundSignal,passedAllCuts,p1,p2);
+      FindAllChildren( (*thisChild),childIDStr,fromFinalB,foundSignal,passedAllCuts,p1,p2,(pID==m_B_pdgid) || fromSelectedB);
     }
 
   return;