Index: ModelGlue/gesture/ModelGlue.cfm
===================================================================
--- ModelGlue/gesture/ModelGlue.cfm	(revision 245)
+++ ModelGlue/gesture/ModelGlue.cfm	(working copy)
@@ -8,11 +8,14 @@
 <cfparam name="ModelGlue_LOCAL_COLDSPRING_DEFAULT_ATTRIBUTES" default="#structNew()#" />
 <cfparam name="ModelGlue_LOCAL_COLDSPRING_DEFAULT_PROPERTIES" default="#structNew()#" />
 <cfparam name="ModelGlue_VERSION_INDICATOR" default="GESTURE" />
+<cfparam name="ModelGlue_INITIALIZATION_LOCK_TIMEOUT" default="60" />
 <cfparam name="request._modelglue.bootstrap" default="#structNew()#" />
 <cfparam name="request._modelglue.bootstrap.blockEvent" default="0" />
 
 <cfset request._modelglue.bootstrap.initializationRequest = false />
 <cfset request._modelglue.bootstrap.appKey = ModelGlue_APP_KEY />
+<cfset request._modelglue.bootstrap.initializationLockPrefix = expandPath(".") & "/.modelglue" />
+<cfset request._modelglue.bootstrap.initializationLockTimeout = ModelGlue_INITIALIZATION_LOCK_TIMEOUT />
 
 <cfif not structKeyExists(application, ModelGlue_APP_KEY) 
 			or (
@@ -22,7 +25,7 @@
 			or (
 					application[ModelGlue_APP_KEY].configuration.reload
 			)>
-	<cflock name="#expandPath(".")#/.modelglue.loading" type="exclusive" timeout="60">
+	<cflock name="#request._modelglue.bootstrap.initializationLockPrefix#.loading" type="exclusive" timeout="#request._modelglue.bootstrap.initializationLockTimeout#">
 		<cfif not structKeyExists(application, ModelGlue_APP_KEY)
 					or (
 							structKeyExists(url, application[ModelGlue_APP_KEY].configuration.reloadKey)
Index: ModelGlue/gesture/eventrequest/EventContext.cfc
===================================================================
--- ModelGlue/gesture/eventrequest/EventContext.cfc	(revision 245)
+++ ModelGlue/gesture/eventrequest/EventContext.cfc	(working copy)
@@ -150,10 +150,10 @@
 	<cftry>
 		<cfif isArray(variables._requestPhases) and arrayLen(variables._requestPhases)>
 			<cfloop from="1" to="#arrayLen(variables._requestPhases)#" index="i">
-				<cfset this.addTraceStatement(variables._requestPhases[i].name, "Beginning request phase.") /> 
-				
-				<cfset variables._requestPhases[i].execute(this) />
-				
+				<cfset this.addTraceStatement(variables._requestPhases[i].name, "Setting up request phase.") /> 
+				<cfset variables._requestPhases[i].setup(this,request._modelglue.bootstrap.initializationLockPrefix,request._modelglue.bootstrap.initializationLockTimeout) />
+				<cfset this.addTraceStatement(variables._requestPhases[i].name, "Executing request phase.") /> 
+				<cfset variables._requestPhases[i].execute(this) />				
 				<cfset this.addTraceStatement(variables._requestPhases[i].name, "Request phase complete.") /> 
 			</cfloop>
 		<cfelse>
Index: ModelGlue/gesture/eventrequest/phase/Initialization.cfc
===================================================================
--- ModelGlue/gesture/eventrequest/phase/Initialization.cfc	(revision 245)
+++ ModelGlue/gesture/eventrequest/phase/Initialization.cfc	(working copy)
@@ -4,30 +4,29 @@
 	
 <cfset this.name = "Initialization" />
 	
-<cffunction name="execute" returntype="void" output="false" hint="Executes the request phase.">
-	<cfargument name="eventContext" hint="I am the event context to act upon.  Duck typed for speed.  Should have no queued events when execute() is called, but this isn't checked (to save time)." />
+<cffunction name="load" access="private" returntype="void" output="false" hint="I perform the loading for this phase.">
+	<cfargument name="eventContext" hint="I am the event context to use for loading.  Duck typed for speed.  Should have no queued events, but this isn't checked (to save time)." />
 	
 	<cfset var modelglue = arguments.eventContext.getModelGlue() />
 	<cfset var event = "" />
 	
-	<!--- Only do anything if this is a initialization request. --->
-	<cfif request._modelglue.bootstrap.initializationRequest>
-		<!--- 
-			Before event queue runs, we need to load any configured modules.
-		--->
-		
-		<cfset loadModules(modelglue) />
-		
-		<!--- Add the newly loaded event to the queue. --->
-		<cfset event =  modelglue.getEventHandler("modelglue.onApplicationInitialization") />
-		<cfset arguments.eventContext.addEventHandler(event) />
-		
-		<!--- Tell the context to run its queue. --->
-		<cfset arguments.eventContext.executeEventQueue() />
+	<cfset super.load(arguments.eventContext) />
 	
-		<cfset event =  modelglue.getEventHandler("modelglue.onApplicationStoredInScope") />
-		<cfset arguments.eventContext.addEventHandler(event) />
-	</cfif>	
+	<!--- Add the newly loaded event to the queue. --->
+	<cfset event =  modelglue.getEventHandler("modelglue.onApplicationInitialization") />
+	<cfset arguments.eventContext.addEventHandler(event) />
+	
+	<!--- Tell the context to run its queue. --->
+	<cfset arguments.eventContext.executeEventQueue() />
+
+	<cfset event =  modelglue.getEventHandler("modelglue.onApplicationStoredInScope") />
+	<cfset arguments.eventContext.addEventHandler(event) />
+</cffunction>
+
+<cffunction name="execute" returntype="void" output="false" hint="Executes the request phase.">
+	<cfargument name="eventContext" hint="I am the event context to act upon.  Duck typed for speed.  Should have no queued events when execute() is called, but this isn't checked (to save time)." />
+
+	<!--- This is a load-only phase: Nothing to do on execute --->
 </cffunction>
 
 </cfcomponent>
\ No newline at end of file
Index: ModelGlue/gesture/eventrequest/phase/ModuleLoadingRequestPhase.cfc
===================================================================
--- ModelGlue/gesture/eventrequest/phase/ModuleLoadingRequestPhase.cfc	(revision 245)
+++ ModelGlue/gesture/eventrequest/phase/ModuleLoadingRequestPhase.cfc	(working copy)
@@ -10,16 +10,20 @@
 	<cfset variables._modules = arguments.modules />	
 </cffunction>
 
-<cffunction name="loadModules" access="private" output="false" hint="Loads modules associated with this phase if we're in an initializing request.">
+<cffunction name="load" access="private" returntype="void" output="false" hint="I perform the loading for this phase.">
+	<cfargument name="eventContext" hint="I am the event context to use for loading.  Duck typed for speed.  Should have no queued events, but this isn't checked (to save time)." />
+	
+	<cfset loadModules(arguments.eventContext.getModelGlue()) />
+</cffunction>
+
+<cffunction name="loadModules" access="private" output="false" hint="Loads modules associated with this phase.">
 	<cfargument name="modelglue" />
 	
 	<cfset var i = "" />
 	
-	<cfif request._modelglue.bootstrap.initializationRequest>
-		<cfloop from="1" to="#arrayLen(variables._modules)#" index="i">
-			<cfset variables._moduleLoader.load(modelglue, variables._modules[i]) />
-		</cfloop>
-	</cfif>
+	<cfloop from="1" to="#arrayLen(variables._modules)#" index="i">
+		<cfset variables._moduleLoader.load(modelglue, variables._modules[i]) />
+	</cfloop>
 </cffunction>
 
 </cfcomponent>
\ No newline at end of file
Index: ModelGlue/gesture/eventrequest/phase/Configuration.cfc
===================================================================
--- ModelGlue/gesture/eventrequest/phase/Configuration.cfc	(revision 245)
+++ ModelGlue/gesture/eventrequest/phase/Configuration.cfc	(working copy)
@@ -4,28 +4,35 @@
 
 <cfset this.name = "Configuration" />
 
+<cffunction name="load" access="private" returntype="void" output="false" hint="I perform the loading for this phase.">
+	<cfargument name="eventContext" hint="I am the event context to use for loading.  Duck typed for speed.  Should have no queued events, but this isn't checked (to save time)." />
+	
+	<cfset var modelglue = arguments.eventContext.getModelGlue() />
+	<cfset var event = "" />
+	
+	<cfset super.load(arguments.eventContext) />
+	
+	<!--- Add the newly loaded event to the queue. --->
+	<cfset event =  modelglue.getEventHandler("modelglue.readyForModuleLoading") />
+	<cfset arguments.eventContext.addEventHandler(event) />
+	
+	<!--- Tell the context to run its queue. --->
+	<cfset arguments.eventContext.executeEventQueue() />
+</cffunction>
+
 <cffunction name="execute" returntype="void" output="false" hint="Executes the request phase.">
 	<cfargument name="eventContext" hint="I am the event context to act upon.  Duck typed for speed.  Should have no queued events when execute() is called, but this isn't checked (to save time)." />
 	
 	<cfset var modelglue = arguments.eventContext.getModelGlue() />
 	<cfset var event = "" />
 	
-	<!--- Only do anything if this isn't an initialization request. --->
-	<cfif request._modelglue.bootstrap.initializationRequest>
-		<!--- 
-			Before event queue runs, we need to load any configured modules.
-		--->
-		<cfset loadModules(modelglue) />
-		
-		<!--- Add the newly loaded event to the queue. --->
-		<cfset event =  modelglue.getEventHandler("modelglue.readyForModuleLoading") />
-		<cfset arguments.eventContext.addEventHandler(event) />
-		<cfset event =  modelglue.getEventHandler("modelglue.modulesLoaded") />
-		<cfset arguments.eventContext.addEventHandler(event) />
-		
-		<!--- Tell the context to run its queue. --->
-		<cfset arguments.eventContext.executeEventQueue() />
-	</cfif>
+	<!--- Add the newly loaded event to the queue. --->
+	<cfset event =  modelglue.getEventHandler("modelglue.modulesLoaded") />
+	<cfset arguments.eventContext.addEventHandler(event) />
+	
+	<!--- Tell the context to run its queue. --->
+	<cfset arguments.eventContext.executeEventQueue() />
 </cffunction>
 
+
 </cfcomponent>
\ No newline at end of file
Index: ModelGlue/gesture/eventrequest/phase/Population.cfc
===================================================================
--- ModelGlue/gesture/eventrequest/phase/Population.cfc	(revision 245)
+++ ModelGlue/gesture/eventrequest/phase/Population.cfc	(working copy)
@@ -10,11 +10,6 @@
 	<cfset var modelglue = arguments.eventContext.getModelGlue() />
 	<cfset var event = "" />
 	
-	<!--- 
-		Before event queue runs, we need to load any configured modules.
-	--->
-	<cfset loadModules(modelglue) />
-	
 	<!--- Add the newly loaded event to the queue. --->
 	<cfset event =  modelglue.getEventHandler("modelglue.onEventContextCreation") />
 	<cfset arguments.eventContext.addEventHandler(event) />
Index: ModelGlue/gesture/eventrequest/phase/Invocation.cfc
===================================================================
--- ModelGlue/gesture/eventrequest/phase/Invocation.cfc	(revision 245)
+++ ModelGlue/gesture/eventrequest/phase/Invocation.cfc	(working copy)
@@ -4,6 +4,19 @@
 
 <cfset this.name = "Invocation" />
 
+<cffunction name="load" access="private" returntype="void" output="false" hint="I perform the loading for this phase.">
+	<cfargument name="eventContext" hint="I am the event context to use for loading.  Duck typed for speed.  Should have no queued events, but this isn't checked (to save time)." />
+	
+	<cfset var modelglue = arguments.eventContext.getModelGlue() />
+	<cfset var event = "" />
+	
+	<cfset super.load(arguments.eventContext) />
+	
+	<!--- onApplicationStart --->
+	<cfset event =  modelglue.getEventHandler("modelglue.onApplicationStart") />
+	<cfset arguments.eventContext.addEventHandler(event) />
+</cffunction>
+
 <cffunction name="execute" returntype="void" output="false" hint="Executes the request phase.">
 	<cfargument name="eventContext" hint="I am the event context to act upon.  Duck typed for speed.  Should have no queued events when execute() is called, but this isn't checked (to save time)." />
 
@@ -12,14 +25,6 @@
 	<cfset var initialEventHandler = "" />
 	<cfset var event = "" />
 
-	<cfset loadModules(modelglue) />
-	
-	<!--- onApplicationStart --->
-	<cfif request._modelglue.bootstrap.initializationRequest>
-		<cfset event =  modelglue.getEventHandler("modelglue.onApplicationStart") />
-		<cfset arguments.eventContext.addEventHandler(event) />
-	</cfif>
-
 	<!--- onSessionStart --->
 	<cfif structKeyExists(request._modelglue.bootstrap, "sessionStart")>
 		<cfset event =  modelglue.getEventHandler("modelglue.onSessionStart") />
Index: ModelGlue/gesture/eventrequest/EventRequestPhase.cfc
===================================================================
--- ModelGlue/gesture/eventrequest/EventRequestPhase.cfc	(revision 245)
+++ ModelGlue/gesture/eventrequest/EventRequestPhase.cfc	(working copy)
@@ -1,6 +1,32 @@
 <cfcomponent output="false" hint="I represent a phase inside of an event request.  I'm basically a Command script for how this phase should execute.">
 
 <cfset this.name = "Unknown request phase." />
+<cfset this.loaded = false />
+
+<cffunction name="setup" returntype="void" output="false" hint="I make sure the phase is loaded exactly once.">
+	<cfargument name="eventContext" hint="I am the event context to use for loading.  Duck typed for speed.  Should have no queued events, but this isn't checked (to save time)." />
+	<cfargument name="lockPrefix" type="string" required="true" hint="Prefix for name of lock to use for setup" />
+	<cfargument name="lockTimeout" type="numeric" required="true" hint="Timeout for setup lock" />
+	
+	<cfif not this.loaded>
+		<cflock type="exclusive" name="#arguments.lockPrefix#.phase.#this.name#.loading" timeout="#arguments.lockTimeout#">
+			<!--- Load could have been completed by a thread which held the lock before this thread, so check again --->
+			<cfif not this.loaded>
+				<cfset load(arguments.eventContext) />
+				<cfset this.loaded = true />
+			</cfif>
+		</cflock>
+	</cfif>
+</cffunction>
+
+<cffunction name="load" access="private" returntype="void" output="false" hint="I perform the loading for this phase.">
+	<cfargument name="eventContext" hint="I am the event context to use for loading.  Duck typed for speed.  Should have no queued events, but this isn't checked (to save time)." />
+	<!--- 
+		Custom phases: 
+		
+		Put things to do _before_ the first execute.
+	--->
+</cffunction>
 
 <cffunction name="execute" returntype="void" output="false" hint="Executes the request phase.">
 	<cfargument name="eventContext" hint="I am the event context to act upon.  Duck typed for speed.  Should have no queued events when execute() is called, but this isn't checked (to save time)." />
Index: ModelGlue/gesture/test/ModelGlueAbstractTestCase.cfc
===================================================================
--- ModelGlue/gesture/test/ModelGlueAbstractTestCase.cfc	(revision 245)
+++ ModelGlue/gesture/test/ModelGlueAbstractTestCase.cfc	(working copy)
@@ -17,6 +17,8 @@
 		
 		<cfset request._modelglue.bootstrap.bootstrapper = bootstrapper />
 		<cfset request._modelglue.bootstrap.initializationRequest = true />
+		<cfset request._modelglue.bootstrap.initializationLockPrefix = expandPath(".") & "/.modelglue" />
+		<cfset request._modelglue.bootstrap.initializationLockTimeout = 60 />
 		
 		<cfreturn bootstrapper>
 	</cffunction>
Index: ModelGlue/gesture/modules/internal/initialization/controller/InitializationController.cfc
===================================================================
--- ModelGlue/gesture/modules/internal/initialization/controller/InitializationController.cfc	(revision 245)
+++ ModelGlue/gesture/modules/internal/initialization/controller/InitializationController.cfc	(working copy)
@@ -6,14 +6,10 @@
 	<cfset var mg = "" />
 	<cfset var boot = "" />
 
-	<cfset arguments.event.setValue("modelglueReloaded", request._modelglue.bootstrap.initializationRequest) />
+	<cfset mg = request._modelglue.bootstrap.framework />
+	<cfset boot = request._modelglue.bootstrap.bootstrapper />
 	
-	<cfif request._modelglue.bootstrap.initializationRequest>
-		<cfset mg = request._modelglue.bootstrap.framework />
-		<cfset boot = request._modelglue.bootstrap.bootstrapper />
-		
-		<cfset application[boot.applicationKey] = mg />
-	</cfif>
+	<cfset application[boot.applicationKey] = mg />
 
 </cffunction>
 
Index: ModelGlue/gesture/modules/internal/configuration/controller/ConfigurationController.cfc
===================================================================
--- ModelGlue/gesture/modules/internal/configuration/controller/ConfigurationController.cfc	(revision 245)
+++ ModelGlue/gesture/modules/internal/configuration/controller/ConfigurationController.cfc	(working copy)
@@ -11,15 +11,13 @@
 	<!--- If we have a case of someone loading MG w/o their own XML file, consider empty string as an already-loaded module. --->
 	<cfset loadedModules[""] = true >
 	
-	<cfif arguments.event.getValue("modelglueReloaded")>	
-		<cfset arguments.event.addTraceStatement("Configuration", "Loading Initial XML Module") />
-		<cfset mg = getModelGlue() />
-		<cfset cfg = mg.getBean("modelglue.ModelGlueConfiguration") />
-		
-		<cfset loader = mg.getInternalBean("modelglue.ModuleLoaderFactory").create("XML") />
-		
-		<cfset loader.load(mg, cfg.getPrimaryModule(), loadedModules) />
-	</cfif>
+	<cfset arguments.event.addTraceStatement("Configuration", "Loading Initial XML Module") />
+	<cfset mg = getModelGlue() />
+	<cfset cfg = mg.getBean("modelglue.ModelGlueConfiguration") />
+	
+	<cfset loader = mg.getInternalBean("modelglue.ModuleLoaderFactory").create("XML") />
+	
+	<cfset loader.load(mg, cfg.getPrimaryModule(), loadedModules) />
 </cffunction>
 
 </cfcomponent>
\ No newline at end of file
