diff --git a/src/main/java/org/nrg/xnat/initialization/RootConfig.java b/src/main/java/org/nrg/xnat/initialization/RootConfig.java
index 3f7f48c6e9d88f37c4c6c42cb3093279c955f7fc..50af4ad7d9c82fb65a61ec6a52ca7cad32b8f061 100644
--- a/src/main/java/org/nrg/xnat/initialization/RootConfig.java
+++ b/src/main/java/org/nrg/xnat/initialization/RootConfig.java
@@ -19,17 +19,18 @@ import java.util.List;
 
 @Configuration
 @ComponentScan({"org.nrg.framework.datacache.impl.hibernate",
-        "org.nrg.framework.services.impl",
-        "org.nrg.xdat.daos",
-        "org.nrg.xdat.services",
-        "org.nrg.xft.daos",
-        "org.nrg.xft.services", "org.nrg.xapi.configuration",
-        "org.nrg.xnat.helpers.merge",
-        "org.nrg.xnat.configuration",
-        "org.nrg.xnat.services",
-        "org.nrg.prefs.repositories",
-        "org.nrg.prefs.services.impl.hibernate",
-        "org.nrg.dicomtools.filters"})
+                "org.nrg.framework.services.impl",
+                "org.nrg.xdat.daos",
+                "org.nrg.xdat.services",
+                "org.nrg.xft.daos",
+                "org.nrg.xft.services",
+                "org.nrg.xapi.configuration",
+                "org.nrg.xnat.helpers.merge",
+                "org.nrg.xnat.configuration",
+                "org.nrg.xnat.services",
+                "org.nrg.prefs.repositories",
+                "org.nrg.prefs.services.impl.hibernate",
+                "org.nrg.dicomtools.filters"})
 @ImportResource({"WEB-INF/conf/xnat-security.xml", "WEB-INF/conf/orm-config.xml", "WEB-INF/conf/mq-context.xml"})
 public class RootConfig {
 
diff --git a/src/main/java/org/nrg/xnat/initialization/XnatWebAppInitializer.java b/src/main/java/org/nrg/xnat/initialization/XnatWebAppInitializer.java
index 85797a83052236288fa4c3da6a0eb455ddec11c2..b0d1ce4f4e90ec1f10063a64faac811514264365 100644
--- a/src/main/java/org/nrg/xnat/initialization/XnatWebAppInitializer.java
+++ b/src/main/java/org/nrg/xnat/initialization/XnatWebAppInitializer.java
@@ -5,16 +5,22 @@ import org.apache.axis.transport.http.AxisHTTPSessionListener;
 import org.apache.axis.transport.http.AxisServlet;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.turbine.Turbine;
-import org.nrg.dcm.DicomSCPManager;
+import org.nrg.framework.processors.XnatModuleBean;
 import org.nrg.xdat.servlet.XDATAjaxServlet;
 import org.nrg.xdat.servlet.XDATServlet;
 import org.nrg.xnat.restlet.servlet.XNATRestletServlet;
 import org.nrg.xnat.restlet.util.UpdateExpirationCookie;
 import org.nrg.xnat.security.XnatSessionEventPublisher;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.core.io.Resource;
+import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
+import org.springframework.core.io.support.PropertiesLoaderUtils;
 import org.springframework.web.filter.DelegatingFilterProxy;
 import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
 
 import javax.servlet.*;
+import java.io.IOException;
 import java.util.*;
 
 public class XnatWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@@ -57,7 +63,10 @@ public class XnatWebAppInitializer extends AbstractAnnotationConfigDispatcherSer
 
     @Override
     protected Class<?>[] getRootConfigClasses() {
-        return new Class<?>[] { RootConfig.class };
+        final List<Class<?>> configClasses = new ArrayList<>();
+        configClasses.add(RootConfig.class);
+        configClasses.addAll(getModuleConfigs());
+        return configClasses.toArray(new Class[configClasses.size()]);
     }
 
     @Override
@@ -65,6 +74,26 @@ public class XnatWebAppInitializer extends AbstractAnnotationConfigDispatcherSer
         return new Class<?>[0];
     }
 
+    private List<Class<?>> getModuleConfigs() {
+        final List<Class<?>> moduleConfigs = new ArrayList<>();
+        try {
+            final PathMatchingResourcePatternResolver resolver  = new PathMatchingResourcePatternResolver();
+            final Resource[]                          resources = resolver.getResources("classpath*:META-INF/xnat/**/*-module.properties");
+            for (final Resource resource : resources) {
+                final Properties     properties   = PropertiesLoaderUtils.loadProperties(resource);
+                final XnatModuleBean module       = new XnatModuleBean(properties);
+                final Class<?>       moduleConfig = module.getConfigClass();
+                moduleConfigs.add(moduleConfig);
+            }
+        } catch (IOException e) {
+            throw new RuntimeException("An error occurred trying to locate XNAT module definitions.");
+        } catch (ClassNotFoundException e) {
+            _log.error("Did not find a class specified in a module definition.", e);
+        }
+
+        return moduleConfigs;
+    }
+
     private void addServlet(final Class<? extends Servlet> clazz, final int loadOnStartup, final String... mappings) {
         final String                      name = StringUtils.uncapitalize(clazz.getSimpleName());
         final ServletRegistration.Dynamic registration  = _context.addServlet(name, clazz);
@@ -105,5 +134,6 @@ public class XnatWebAppInitializer extends AbstractAnnotationConfigDispatcherSer
         private ServletContext _context;
     }
 
+    private static final Logger _log = LoggerFactory.getLogger(XnatWebAppInitializer.class);
     private ServletContext _context;
 }
diff --git a/src/main/webapp/META-INF/context.xml b/src/main/webapp/META-INF/context.xml
new file mode 100644
index 0000000000000000000000000000000000000000..16bd2bec3ce56149a803754e2972b96d298abe37
--- /dev/null
+++ b/src/main/webapp/META-INF/context.xml
@@ -0,0 +1,6 @@
+<?xml version='1.0' encoding='utf-8'?>
+<Context antiResourceLocking="true">
+    <Loader className="org.apache.catalina.loader.VirtualWebappLoader" searchVirtualFirst="true" virtualClasspath="${xnat.home}/plugins/*.jar"/>
+    <JarScanner scanAllDirectories="true" />
+    <Parameter name="xnatHome" value="${xnat.home}"/>
+</Context>
diff --git a/src/main/webapp/WEB-INF/conf/InstanceSettings.xml b/src/main/webapp/WEB-INF/conf/InstanceSettings.xml
index a1ae1fb6c453dd766fcad64b1e41285fba39f470..a176477249c0a9a4b2ea8352e5fa38ab49692b19 100644
--- a/src/main/webapp/WEB-INF/conf/InstanceSettings.xml
+++ b/src/main/webapp/WEB-INF/conf/InstanceSettings.xml
@@ -1,22 +1,26 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<Instance_Settings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="schemas/xdat/instance.xsd"
-				   site_url="http://localhost:8080" admin_email="administrator@xnat.org" archive_root_path="/data/xnat/archive"
-				   prearchive_path="/data/xnat/prearchive" cache_path="/data/xnat/cache"
-				   smtp_server="irony.wusm.wustl.edu" ftp_path="/data/xnat/ftp" build_path="/data/xnat/build"
-				   pipeline_path="/data/xnat/pipeline" require_login="true" user_registration="false" enable_csrf_token="true">
-	<Databases>
-		<Database Type="POSTGRESQL" Id="xnat" Driver="org.postgresql.Driver" Url="jdbc:postgresql://localhost/xnat" User="xnat" Pass="xnat" MaxConnections="10"/>
-	</Databases>
-	<Models>
-		<Data_Model File_Name="security.xsd" File_Location="schemas/security" DB="xnat"/>
-		<Data_Model File_Name="birnprov.xsd" File_Location="schemas/birn" DB="xnat"/>
-		<Data_Model File_Name="xnat.xsd" File_Location="schemas/xnat" DB="xnat"/>
-		<Data_Model File_Name="workflow.xsd" File_Location="schemas/pipeline" DB="xnat"/>
-		<Data_Model File_Name="repository.xsd" File_Location="schemas/pipeline" DB="xnat"/>
-		<Data_Model File_Name="project.xsd" File_Location="schemas/project" DB="xnat"/>
-		<Data_Model File_Name="assessments.xsd" File_Location="schemas/assessments" DB="xnat"/>
-		<Data_Model File_Name="catalog.xsd" File_Location="schemas/catalog" DB="xnat"/>
-		<Data_Model File_Name="protocolValidation.xsd" File_Location="schemas/validation" DB="xnat"/>
-		<Data_Model File_Name="screeningAssessment.xsd" File_Location="schemas/screening" DB="xnat"/>
-	</Models>
+<Instance_Settings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+                   xsi:noNamespaceSchemaLocation="schemas/xdat/instance.xsd"
+                   site_url="http://localhost:8080" admin_email="administrator@xnat.org"
+                   archive_root_path="/data/xnat/archive"
+                   prearchive_path="/data/xnat/prearchive" cache_path="/data/xnat/cache"
+                   smtp_server="mail.server" ftp_path="/data/xnat/ftp" build_path="/data/xnat/build"
+                   pipeline_path="/data/xnat/pipeline" require_login="true" user_registration="false"
+                   enable_csrf_token="true">
+    <Databases>
+        <Database Type="POSTGRESQL" Id="xnat" Driver="org.postgresql.Driver" Url="jdbc:postgresql://localhost/xnat"
+                  User="xnat" Pass="xnat" MaxConnections="10"/>
+    </Databases>
+    <Models>
+        <Data_Model File_Name="security.xsd" File_Location="schemas/security" DB="xnat"/>
+        <Data_Model File_Name="birnprov.xsd" File_Location="schemas/birn" DB="xnat"/>
+        <Data_Model File_Name="xnat.xsd" File_Location="schemas/xnat" DB="xnat"/>
+        <Data_Model File_Name="workflow.xsd" File_Location="schemas/pipeline" DB="xnat"/>
+        <Data_Model File_Name="repository.xsd" File_Location="schemas/pipeline" DB="xnat"/>
+        <Data_Model File_Name="project.xsd" File_Location="schemas/project" DB="xnat"/>
+        <Data_Model File_Name="assessments.xsd" File_Location="schemas/assessments" DB="xnat"/>
+        <Data_Model File_Name="catalog.xsd" File_Location="schemas/catalog" DB="xnat"/>
+        <Data_Model File_Name="protocolValidation.xsd" File_Location="schemas/validation" DB="xnat"/>
+        <Data_Model File_Name="screeningAssessment.xsd" File_Location="schemas/screening" DB="xnat"/>
+    </Models>
 </Instance_Settings>
diff --git a/src/main/webapp/WEB-INF/conf/services.properties b/src/main/webapp/WEB-INF/conf/services.properties
index 20628b2e84df9ce746accb503a5d3fce3af92981..17081f1e259c05cd75b9755771a3583cc46d0e9d 100644
--- a/src/main/webapp/WEB-INF/conf/services.properties
+++ b/src/main/webapp/WEB-INF/conf/services.properties
@@ -10,13 +10,13 @@
 #
 site.title=XNAT
 
-datasource.name=xnat17
+datasource.name=xnat
 datasource.driver=org.postgresql.Driver
-datasource.url=jdbc:postgresql://localhost/xnat17
+datasource.url=jdbc:postgresql://localhost/xnat
 datasource.username=xnat
 datasource.password=xnat
 
-mailserver.host=irony.wusm.wustl.edu
+mailserver.host=mail.server
 mailserver.port=25
 mailserver.username=
 mailserver.password=
@@ -61,7 +61,7 @@ security.sessions.concurrent_max=1000
 # The following parameters are used to allow/force users to enter change justifications when modifying data.
 audit.require_change_justification=false
 audit.show_change_justification=false
-	
+
 # Sets default values for the ActiveMQ configuration.
 amq.usage.temp=128mb
 amq.usage.mem=512mb