diff --git a/include/PhysicsListManager.hh b/include/PhysicsListManager.hh
index edfc9bf5f6abede65c022c68522d9ddc8665652f..f6fdd55bd9015f7573d1e12b2a3abe3e12b35fbb 100644
--- a/include/PhysicsListManager.hh
+++ b/include/PhysicsListManager.hh
@@ -5,19 +5,18 @@
 #include "Module.hh"
 
 // slic
-//#include "PhysicsListFactory.hh"
 #include "PhysicsMessenger.hh"
 #include "Singleton.hh"
 
 // geant4
 #include "G4VUserPhysicsList.hh"
-#include "G4RunManager.hh"
 #include "G4Decay.hh"
 
 // std
 #include <string>
 
 class G4PhysListFactory;
+class G4VUserPhysicsList;
 
 namespace slic {
 
@@ -45,8 +44,10 @@ public:
 
     /**
      * Initialize the currently selected physics list.
+     * This will also register option physics such as optical
+     * and extended particle set.
      */
-    void initializePhysicsList();
+    G4VUserPhysicsList* createPhysicsList();
 
     /**
      * Set the name of the current physics list.
@@ -115,24 +116,15 @@ public:
 
 private:
 
-    /**
-     * Setup optical physics.
-     */
-    void setupOpticalProcesses();
-
     /**
      * Setup SUSY physics.
      */
     void setupSUSY();
 
-    /**
-     * Setup extended particle set from HepPDT.
-     */
-    void setupExtended();
-
 private:
 
     G4VUserPhysicsList* m_currentList;
+
     bool m_isInitialized;
     bool m_isFromDefault;
     bool m_enableLimits;
diff --git a/include/RunManager.hh b/include/RunManager.hh
index 33e963616234ee7646290316678ac3ce09e70fe7..30441c80f9c4f49c57a6398729b2c2779dcbe33c 100644
--- a/include/RunManager.hh
+++ b/include/RunManager.hh
@@ -103,14 +103,6 @@ protected:
 
 private:
 
-    /**
-     * Initialize the user actions defined by this application.
-     */
-    void initializeUserActions();
-
-private:
-
-    bool m_userActionsInitialized;
     int m_numberOfEventsToRun;
     bool m_abortRun;
 };
diff --git a/src/LCSUSYPhysics.cc b/src/LCSUSYPhysics.cc
index 433856142fce5784c3e6fb1277435cb18738c6a8..a1d408c05ed965c970db7a24ff3c2e67f7e1800f 100644
--- a/src/LCSUSYPhysics.cc
+++ b/src/LCSUSYPhysics.cc
@@ -24,7 +24,8 @@ LCSUSYPhysics::~LCSUSYPhysics() {
 #endif
 
 void LCSUSYPhysics::ConstructParticle() {
-        // Get the particle data table to be imported.
+
+    // Get the particle data table to be imported.
 	HepPDT::ParticleDataTable* pdtbl = HepPDTManager::instance()->getParticleDataTable();
 
 	// Loop over all particles.
diff --git a/src/PhysicsListManager.cc b/src/PhysicsListManager.cc
index fefd530de9da7e878f1a5c630c8e8a8543ae1cc7..b61df18a623bfee736098e424732a9a99fb2043e 100644
--- a/src/PhysicsListManager.cc
+++ b/src/PhysicsListManager.cc
@@ -2,7 +2,7 @@
 
 // geant4
 #include "G4RunManager.hh"
-#include "G4VModularPhysicsList.hh"
+#include "G4VUserPhysicsList.hh"
 #include "G4UserSpecialCuts.hh"
 #include "G4StepLimiter.hh"
 #include "G4PhysListFactory.hh"
@@ -13,121 +13,81 @@
 #include "LCExtendedParticles.hh"
 
 namespace slic {
+
 // QGSP_BERT is the default physics list.
 const std::string PhysicsListManager::m_defaultListName = std::string("QGSP_BERT");
 
 PhysicsListManager::PhysicsListManager() :
-		Module("PhysicsListManager"), m_currentList(0), m_isInitialized(false), m_isFromDefault(false), m_enableLimits(
-				false), m_setupLimits(false), m_enableOptical(false) {
-	// Set the current list to the default.
-	m_currentListName = m_defaultListName;
+        Module("PhysicsListManager"), m_currentList(0), m_isInitialized(false), m_isFromDefault(false), m_enableLimits(
+                false), m_setupLimits(false), m_enableOptical(false) {
+    // Set the current list to the default.
+    m_currentListName = m_defaultListName;
 
-	// Create the messenger class for the manager.
-	m_messenger = new PhysicsMessenger();
+    // Create the messenger class for the manager.
+    m_messenger = new PhysicsMessenger();
 
-	// Create the list factory.
-	m_factory = new G4PhysListFactory();
+    // Create the list factory.
+    m_factory = new G4PhysListFactory();
 }
 
 PhysicsListManager::~PhysicsListManager() {
 }
 
 void PhysicsListManager::setCurrentListName(const std::string& n) {
-	m_currentListName = n;
-	m_isFromDefault = false;
+    m_currentListName = n;
+    m_isFromDefault = false;
 }
 
-void PhysicsListManager::initializePhysicsList() {
-	if (!m_isInitialized) {
-#ifdef SLIC_LOG
-		if ( m_isFromDefault )
-		{
-			log() << LOG::okay << "Using default physics list <" << m_defaultListName << ">." << LOG::done;
-		}
-#endif
-
-		// Create the physics list from the name argument.
-		m_currentList = m_factory->GetReferencePhysList(m_currentListName);
-
-		// Enable optical processes.
-		if (enableOptical()) {
-			setupOpticalProcesses();
-		}
-
-		// Support for extended set of particles from PDT.
-		setupExtended();
+G4VUserPhysicsList* PhysicsListManager::createPhysicsList() {
 
-		// Register the physics list with the run manager.
-		G4RunManager::GetRunManager()->SetUserInitialization(m_currentList);
-
-		// Print out particle table.
-		//G4cout << "Dumping Geant4 particle table ..." << G4endl;
-		//G4ParticleTable::GetParticleTable()->DumpTable(); 
-
-		m_isInitialized = true;
-	}
 #ifdef SLIC_LOG
-	// Don't allow initialization to be called more than once.
-	else
-	{
-		log().error("Ignoring additional call to PhysicsListManager::initializePhysics() !!!");
-	}
+    if ( m_isFromDefault ) {
+        log() << LOG::okay << "Using default physics list <" << m_defaultListName << ">." << LOG::done;
+    }
 #endif
-}
-
-void PhysicsListManager::setupUserLimitsProcesses() {
-	G4ParticleTable* ptbl = G4ParticleTable::GetParticleTable();
 
-	G4ParticleTable::G4PTblDicIterator* piter = ptbl->GetIterator();
+    // Create the physics list from the name argument.
+    m_currentList = m_factory->GetReferencePhysList(m_currentListName);
 
-	G4UserSpecialCuts* cuts = new G4UserSpecialCuts("UserSpecialCuts");
-	G4StepLimiter* slim = new G4StepLimiter("StepLimiter");
+    // Enable optical processes.
+    if (enableOptical()) {
+        dynamic_cast<G4VModularPhysicsList*>(m_currentList)->RegisterPhysics(new LCOpticalPhysics("optical"));
+    }
 
-	piter->reset();
-	while ((*piter)()) {
-		G4ParticleDefinition* pdef = piter->value();
-		G4ProcessManager* pmgr = pdef->GetProcessManager();
+    if (HepPDTManager::instance()->getParticleDataTable()) {
+        dynamic_cast<G4VModularPhysicsList*>(m_currentList)->RegisterPhysics(new LCExtendedParticles());
+    }
 
-		// Add user limit processes for steps and special cuts.
-		if (pmgr) {
-			pmgr->AddProcess(slim, -1, -1, 3);
-
-			pmgr->AddProcess(cuts, -1, -1, 4);
-		} else {
-			G4Exception("", "", FatalException, "G4ProcessManager is null.");
-		}
-	}
-}
-
-void PhysicsListManager::setupOpticalProcesses() {
-#ifdef SLIC_LOG
-	log() << LOG::always << "Enabling optical physics processes for the current physics list." << LOG::done;
-#endif
-	G4VModularPhysicsList* l = dynamic_cast<G4VModularPhysicsList*>(m_currentList);
-	l->RegisterPhysics(new LCOpticalPhysics("optical"));
+    return m_currentList;
 }
 
-void PhysicsListManager::setupExtended() {
-#ifdef SLIC_LOG
-	log().always("Enabling extended PDT particles for the current physics list.");
-#endif
+void PhysicsListManager::setupUserLimitsProcesses() {
 
-	G4VModularPhysicsList* l = dynamic_cast<G4VModularPhysicsList*>(m_currentList);
-	if (HepPDTManager::instance()->getParticleDataTable()) {
-		l->RegisterPhysics(new LCExtendedParticles());
-	}
-#ifdef SLIC_LOG
-	else
-	{
-		log() << LOG::error << "HepPDTManager could not load particle data, so extended particles will not be enabled!" << LOG::done;
-	}
-#endif
+    G4ParticleTable* ptbl = G4ParticleTable::GetParticleTable();
+    G4ParticleTable::G4PTblDicIterator* piter = ptbl->GetIterator();
+    G4UserSpecialCuts* cuts = new G4UserSpecialCuts("UserSpecialCuts");
+    G4StepLimiter* slim = new G4StepLimiter("StepLimiter");
+
+    piter->reset();
+    while ((*piter)()) {
+        G4ParticleDefinition* pdef = piter->value();
+        G4ProcessManager* pmgr = pdef->GetProcessManager();
+
+        // Add user limit processes for steps and special cuts.
+        if (pmgr) {
+            pmgr->AddProcess(slim, -1, -1, 3);
+
+            pmgr->AddProcess(cuts, -1, -1, 4);
+        } else {
+            G4Exception("", "", FatalException, "G4ProcessManager is null.");
+        }
+    }
 }
 
 void PhysicsListManager::printAvailablePhysicsLists() {
-	const std::vector<G4String>& lists = m_factory->AvailablePhysLists();
-	for (std::vector<G4String>::const_iterator it = lists.begin(); it != lists.end(); it++) {
-		log().always(*it);
-	}
+    const std::vector<G4String>& lists = m_factory->AvailablePhysLists();
+    for (std::vector<G4String>::const_iterator it = lists.begin(); it != lists.end(); it++) {
+        log().always(*it);
+    }
 }
 }
diff --git a/src/RunManager.cc b/src/RunManager.cc
index f203499c0e18d2f9ace4c33c815ae83be64aa6e9..61f0c4d006102dbd7542b541b228f6a4ec6bc0b8 100644
--- a/src/RunManager.cc
+++ b/src/RunManager.cc
@@ -22,29 +22,27 @@
 namespace slic {
 
 RunManager::RunManager() :
-		Module("RunManager", false), m_userActionsInitialized(false), m_abortRun(false) {
+		Module("RunManager", false),m_abortRun(false) {
 }
 
 RunManager::~RunManager() {
 }
 
-void RunManager::initializeUserActions() {
-	SetUserAction(new PrimaryGeneratorAction());
-	SetUserAction(new RunAction());
-	SetUserAction(new EventAction());
-	SetUserAction(new TrackingAction());
-	SetUserAction(new SteppingAction());
-	SetUserAction(new StackingAction());
-	m_userActionsInitialized = true;
-}
-
 void RunManager::Initialize() {
+
+    // Init physics list.
+    G4VUserPhysicsList* list = PhysicsListManager::instance()->createPhysicsList();
+    G4RunManager::GetRunManager()->SetUserInitialization(list);
+
 	// This makes sure that physics initialization occurs before other user actions.
 	G4RunManager::Initialize();
 
-	// Initialize user actions here to avoid ordering problems.
-	if (!m_userActionsInitialized)
-		initializeUserActions();
+    SetUserAction(new PrimaryGeneratorAction());
+    SetUserAction(new RunAction());
+    SetUserAction(new EventAction());
+    SetUserAction(new TrackingAction());
+    SetUserAction(new SteppingAction());
+    SetUserAction(new StackingAction());
 
 	// Initialize the event generation manager.
 	EventSourceManager::instance();
@@ -59,23 +57,26 @@ void RunManager::Initialize() {
 }
 
 void RunManager::InitializePhysics() {
-	// Initialize the physics list.
-	PhysicsListManager::instance()->initializePhysicsList();
-
-	// Call the G4RunManager's intitialization method.
-	G4RunManager::InitializePhysics();
 
 	// Check if the LCDD subsystem got some limits.
 	LCDDProcessor* lcdd = LCDDProcessor::instance();
 	PhysicsListManager* pmgr = PhysicsListManager::instance();
 	if (lcdd->getLimitSetsBegin() != lcdd->getLimitSetsEnd()) {
+	    std::cout << "enabling phys limits" << std::endl;
 		pmgr->enableLimits(true);
 	}
 
 	// Enable physics limits, if necessary.
 	if (pmgr->enableLimits()) {
+	    std::cout << "setting up user limits processes" << std::endl;
 		pmgr->setupUserLimitsProcesses();
 	}
+
+    // Call the G4RunManager's intitialization method.
+    G4RunManager::InitializePhysics();
+
+    // Print out particle table.
+    //G4ParticleTable::GetParticleTable()->DumpTable();
 }
 
 void RunManager::InitializeGeometry() {
diff --git a/src/SlicApplication.cc b/src/SlicApplication.cc
index b80ccc89f5722248c634864c3729c155fc7baba0..a9743855febcd7c1aed1ef673d114a8f2371a041 100644
--- a/src/SlicApplication.cc
+++ b/src/SlicApplication.cc
@@ -91,9 +91,6 @@ void SlicApplication::initialize() {
 		// Create a new RunManager.
 		m_runManager = new RunManager();
 
-		// Initialize the physics list manager.
-		PhysicsListManager::instance();
-
 		// Initialize the LcioManager.
 		LcioManager::instance();
 
@@ -113,9 +110,6 @@ void SlicApplication::initialize() {
 #ifdef G4VIS_USE
 		initializeVis();
 #endif
-
-		HepPDTManager::instance();
-
 		// Set state variable.
 		m_isInitialized = true;
 	} else {