diff --git a/src/main/webapp/scripts/xnat/app/customPage.js b/src/main/webapp/scripts/xnat/app/customPage.js
index 3dd20bd8b1991bb92b18a88ce9aa0d7f614722a3..b2290809adf1c9b0c1c6d85ca31bb45723f00e7e 100644
--- a/src/main/webapp/scripts/xnat/app/customPage.js
+++ b/src/main/webapp/scripts/xnat/app/customPage.js
@@ -2,7 +2,11 @@
  * Retrieve custom pages via AJAX
  * Used in: /xnat-templates/screens/Page.vm
  */
-(function(NS, factory){
+
+var XNAT = getObject(XNAT);
+XNAT.app = getObject(XNAT.app||{});
+
+(function(factory){
     if (typeof define === 'function' && define.amd) {
         define(factory);
     }
@@ -10,14 +14,11 @@
         module.exports = factory();
     }
     else {
-        return factory(NS);
+        return factory();
     }
-}('app.customPage', function(NS, undefined){
-
-    // setExtendedObject() hasn't been tested yet
-    // var customPage = setExtendedObject(XNAT, NS);
+}(function(){
 
-    var customPage = getObject(eval('XNAT.'+NS)||{});
+    var customPage = getObject(XNAT.app.customPage||{});
 
     customPage.getName = function(){
         var name = getQueryStringValue('view');
diff --git a/src/main/webapp/xnat-templates/layouts/Basic.vm b/src/main/webapp/xnat-templates/layouts/Basic.vm
new file mode 100644
index 0000000000000000000000000000000000000000..b0f4c7f55ea3d971a6eed2f72231882696cbdcb5
--- /dev/null
+++ b/src/main/webapp/xnat-templates/layouts/Basic.vm
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+##Copyright 2005 Harvard University / Howard Hughes Medical Institute (HHMI) All Rights Reserved
+<!-- start xnat-templates/layouts/Basic.vm -->
+<!--[if lt IE 9]><html class="ie ie8 ltie9 ltie10"><![endif]-->
+<!--[if IE 9]><html class="ie ie9 ltie10"><![endif]-->
+<!--[if gt IE 9]><!--> <html> <!--<![endif]-->
+    $screen_placeholder
+<!-- end xnat-templates/layouts/Basic.vm -->
+</html>
\ No newline at end of file
diff --git a/src/main/webapp/xnat-templates/layouts/Content.vm b/src/main/webapp/xnat-templates/layouts/Content.vm
new file mode 100644
index 0000000000000000000000000000000000000000..d4a7e6327758486fbb5017b2ef14933530f718ee
--- /dev/null
+++ b/src/main/webapp/xnat-templates/layouts/Content.vm
@@ -0,0 +1,11 @@
+<!-- start xnat-templates/layouts/Content.vm -->
+
+## probably don't want to load these since
+## they may already be loaded elsewhere
+##
+## #parse("/navigations/BaseJS.vm")
+## #parse("/navigations/AppJS.vm")
+
+$screen_placeholder
+
+<!-- end xnat-templates/layouts/Content.vm -->
diff --git a/src/main/webapp/xnat-templates/navigations/AppJS.vm b/src/main/webapp/xnat-templates/navigations/AppJS.vm
new file mode 100644
index 0000000000000000000000000000000000000000..21060b3c0c50950d3bf850b9b1116f62e60c2464
--- /dev/null
+++ b/src/main/webapp/xnat-templates/navigations/AppJS.vm
@@ -0,0 +1,26 @@
+## Main JavaScript and CSS files for XNAT
+
+## only load once
+#if (!$appJS)
+
+    <!-- app.css loaded last -->
+    <link rel="stylesheet" type="text/css" href="$content.getURI('style/app.css?v=1.7.0a1')">
+
+    <link rel="stylesheet" type="text/css" href="$content.getURI('scripts/xmodal-v1/xmodal.css?v=1.7.0a1')">
+    <script src="$content.getURI('scripts/xmodal-v1/xmodal.js')"></script>
+    <script src="$content.getURI('scripts/xmodal-v1/xmodal-migrate.js')"></script>
+
+    <!-- XNAT JLAPI scripts -->
+    <script src="$content.getURI('scripts/xnat/url.js')"></script>
+    <script src="$content.getURI('scripts/xnat/xhr.js')"></script>
+    ##<script src="$content.getURI('scripts/xnat/widget.js')"></script>
+    <script src="$content.getURI('scripts/xnat/ui/popup.js')"></script>
+    <script src="$content.getURI('scripts/xnat/ui/dialog.js')"></script>
+
+    #set ($appJS = true)
+
+#else
+
+    <!-- AppJS is loaded -->
+
+#end
diff --git a/src/main/webapp/xnat-templates/navigations/BaseJS.vm b/src/main/webapp/xnat-templates/navigations/BaseJS.vm
new file mode 100644
index 0000000000000000000000000000000000000000..8743a995a912307f5ae23836520566e789c41569
--- /dev/null
+++ b/src/main/webapp/xnat-templates/navigations/BaseJS.vm
@@ -0,0 +1,50 @@
+## Base JavaScript files
+
+## only load once
+#if (!$baseJS)
+
+    <!-- load polyfills before ANY other JavaScript -->
+    <script src="$content.getURI('scripts/polyfills.js')"></script>
+
+    <!-- set global vars that are used often -->
+    <script>
+
+        var XNAT = XNAT || {};
+        var serverRoot = "$content.getURI('')";
+        var csrfToken = "$!data.getSession().getAttribute("XNAT_CSRF")";
+        var showReason = typeof $showReason != 'undefined' ? $showReason : null;
+        var requireReason = typeof $requireReason != 'undefined' ? $showReason : null;
+
+    </script>
+    ## separate script tags so not everything breaks if showReason or requireReason blows up
+
+    <!-- XNAT global functions (no dependencies) -->
+    <script src="$content.getURI('scripts/globals.js')"></script>
+
+    <!-- required libraries -->
+    <script src="$content.getURI('scripts/lib/loadjs/loadjs.js')"></script>
+    <script src="$content.getURI('scripts/lib/jquery/jquery.min.js')"></script>
+    <script src="$content.getURI('scripts/lib/jquery/jquery-migrate-1.2.1.min.js')"></script>
+    <script>
+        // alias jQuery to jq
+        var jq = jQuery;
+    </script>
+
+    <!-- jQuery plugins -->
+    <link rel="stylesheet" type="text/css" href="$content.getURI('scripts/lib/jquery-plugins/chosen/chosen.min.css?v=1.7.0a1')">
+    <script src="$content.getURI('scripts/lib/jquery-plugins/chosen/chosen.jquery.min.js')"></script>
+    <script src="$content.getURI('scripts/lib/jquery-plugins/jquery.maskedinput.min.js')"></script>
+
+    <!-- other libraries -->
+    <script src="$content.getURI('scripts/lib/spawn/spawn.js')"></script>
+
+    <!-- XNAT utility functions -->
+    <script src="$content.getURI('scripts/utils.js')"></script>
+
+    #set ($baseJS = true)
+
+#else
+
+    <!-- BaseJS is loaded -->
+
+#end
diff --git a/src/main/webapp/xnat-templates/navigations/HeaderIncludes.vm b/src/main/webapp/xnat-templates/navigations/HeaderIncludes.vm
index 9368f855816a9f23c9138b4ca2c45f6bc0bc5d9e..6de326674da63e26d033e1dd817613bf0b6aad5e 100755
--- a/src/main/webapp/xnat-templates/navigations/HeaderIncludes.vm
+++ b/src/main/webapp/xnat-templates/navigations/HeaderIncludes.vm
@@ -15,56 +15,12 @@
 <meta http-equiv="expires" content="-1">
 <meta http-equiv="expires" content="Tue, 01 Jan 1980 1:00:00 GMT">
 
-<!-- load polyfills before ANY other JavaScript -->
-<script type="text/javascript" src="$content.getURI('scripts/polyfills.js')"></script>
 
-<!-- set global vars that are used often -->
-<script type="text/javascript">
+## pull in the base JavaScript files
+$navigation.setTemplate("/BaseJS.vm")
 
-    var serverRoot = "$content.getURI('')";
-    var csrfToken = "$!data.getSession().getAttribute("XNAT_CSRF")";
-    var showReason = typeof $showReason != 'undefined' ? $showReason : null;
-    var requireReason = typeof $requireReason != 'undefined' ? $showReason : null;
 
-</script>
-## separate script tags so not everything breaks if showReason or requireReason blows up
-
-<!-- XNAT global functions (no dependencies) -->
-<script type="text/javascript" src="$content.getURI('scripts/globals.js')"></script>
-
-<!-- required libraries -->
 <script>
-    // loads minified versions by default
-    // add ?debug=true to the query string
-    // or #debug to the url hash to load
-    // the non-minified versions
-    writeScripts([
-        scriptUrl('lib/loadjs/loadjs'),
-        scriptUrl('lib/jquery/jquery|.min'),
-        scriptUrl('lib/jquery/jquery-migrate-1.2.1|.min'),
-    ]);
-</script>
-##<script type="text/javascript" src="$content.getURI('scripts/lib/loadjs/loadjs.js')"></script>
-##<script type="text/javascript" src="$content.getURI('scripts/lib/jquery/jquery.min.js')"></script>
-##<script type="text/javascript" src="$content.getURI('scripts/lib/jquery/jquery-migrate-1.2.1.min.js')"></script>
-<script type="text/javascript">
-    // use 'jq' to avoid _possible_ conflicts with Velocity
-    var jq = jQuery;
-</script>
-
-<!-- jQuery plugins -->
-<link rel="stylesheet" type="text/css" href="$content.getURI('scripts/lib/jquery-plugins/chosen/chosen.min.css?v=1.7.0a1')">
-<script type="text/javascript" src="$content.getURI('scripts/lib/jquery-plugins/chosen/chosen.jquery.min.js')"></script>
-<script type="text/javascript" src="$content.getURI('scripts/lib/jquery-plugins/jquery.maskedinput.min.js')"></script>
-<script type="text/javascript" src="$content.getURI('scripts/lib/jquery-plugins/jquery.spawn.js')"></script>
-
-<!-- other libraries -->
-<script type="text/javascript" src="$content.getURI('scripts/lib/spawn/spawn.js')"></script>
-
-<!-- XNAT utility functions -->
-<script type="text/javascript" src="$content.getURI('scripts/utils.js')"></script>
-
-<script type="text/javascript">
 
     /*
      * XNAT global namespace object, which will not be overwriten if
@@ -206,7 +162,7 @@
     })(XNAT.data.todaysDate);
 
 </script>
-<script type="text/javascript">
+<script>
     // initialize "Chosen" menus on DOM load
     // all <select class="chosen-menu"> elements
     // will be converted
@@ -214,39 +170,43 @@
     // the jQuery DOM-ready queue
     jq(function(){chosenInit()});
 </script>
-<script type="text/javascript" src="$content.getURI('scripts/xdat.js')"></script>
-<script type="text/javascript" src="$content.getURI('scripts/DynamicJSLoad.js')"></script>
+<script src="$content.getURI('scripts/xdat.js')"></script>
+<script src="$content.getURI('scripts/DynamicJSLoad.js')"></script>
 
 <!-- YAHOO USER INTERFACE files below here -->
-<script type="text/javascript" src="$content.getURI('scripts/yui/build/yahoo-dom-event/yahoo-dom-event.js')"></script>
-##<script type="text/javascript" src="$content.getURI('scripts/yui/build/event/event.js')"></script>
-<script type="text/javascript" src="$content.getURI('scripts/yui/build/event/event-min.js')"></script>
-<script type="text/javascript" src="$content.getURI('scripts/yui/build/container/container-min.js')"></script>
-<script type="text/javascript" src="$content.getURI('scripts/yui/build/menu/menu-min.js')"></script>
-<script type="text/javascript" src="$content.getURI('scripts/yui/build/element/element-beta-min.js')"></script>
-<script type="text/javascript" src="$content.getURI('scripts/yui/build/button/button-min.js')"></script>
-<script type="text/javascript" src="$content.getURI('scripts/yui/build/connection/connection-min.js')"></script>
-<script type="text/javascript" src="$content.getURI('scripts/yui/build/treeview/treeview-min.js')"></script>
-<script type="text/javascript" src="$content.getURI('scripts/yui/build/cookie/cookie-min.js')"></script>
-<script type="text/javascript" src="$content.getURI('scripts/yui/build/tabview/tabview-min.js')"></script>
-<script type="text/javascript" src="$content.getURI('scripts/yui/build/datasource/datasource-min.js')"></script>
-<script type="text/javascript" src="$content.getURI('scripts/yui/build/resize/resize-min.js')"></script>
-<script type="text/javascript" src="$content.getURI('scripts/yui/build/dragdrop/dragdrop-min.js')"></script>
-<script type="text/javascript" src="$content.getURI('scripts/yui/build/datatable/datatable-min.js')"></script>
-<script type="text/javascript" src="$content.getURI('scripts/yui/build/paginator/paginator-min.js')"></script>
-<script type="text/javascript" src="$content.getURI('scripts/yui/build/json/json-min.js')"></script>
-<script type="text/javascript" src="$content.getURI('scripts/yui/xnat_loader.js')"></script>
-<script type="text/javascript" src="$content.getURI('scripts/LeftBarTreeView.js')"></script>
-<script type="text/javascript" src="$content.getURI('scripts/justification/justification.js')"></script>
-<script type="text/javascript">
+<script src="$content.getURI('scripts/yui/build/yahoo-dom-event/yahoo-dom-event.js')"></script>
+##<script src="$content.getURI('scripts/yui/build/event/event.js')"></script>
+<script src="$content.getURI('scripts/yui/build/event/event-min.js')"></script>
+<script src="$content.getURI('scripts/yui/build/container/container-min.js')"></script>
+<script src="$content.getURI('scripts/yui/build/menu/menu-min.js')"></script>
+<script src="$content.getURI('scripts/yui/build/element/element-beta-min.js')"></script>
+<script src="$content.getURI('scripts/yui/build/button/button-min.js')"></script>
+<script src="$content.getURI('scripts/yui/build/connection/connection-min.js')"></script>
+<script src="$content.getURI('scripts/yui/build/treeview/treeview-min.js')"></script>
+<script src="$content.getURI('scripts/yui/build/cookie/cookie-min.js')"></script>
+<script src="$content.getURI('scripts/yui/build/tabview/tabview-min.js')"></script>
+<script src="$content.getURI('scripts/yui/build/datasource/datasource-min.js')"></script>
+<script src="$content.getURI('scripts/yui/build/resize/resize-min.js')"></script>
+<script src="$content.getURI('scripts/yui/build/dragdrop/dragdrop-min.js')"></script>
+<script src="$content.getURI('scripts/yui/build/datatable/datatable-min.js')"></script>
+<script src="$content.getURI('scripts/yui/build/paginator/paginator-min.js')"></script>
+<script src="$content.getURI('scripts/yui/build/json/json-min.js')"></script>
+<script src="$content.getURI('scripts/yui/xnat_loader.js')"></script>
+<script src="$content.getURI('scripts/LeftBarTreeView.js')"></script>
+<script src="$content.getURI('scripts/justification/justification.js')"></script>
+<script>
 
     // The YUIDOM alias is used throughout XNAT
     var YUIDOM = YAHOO.util.Dom;
 
     XNAT.dom = getObject(XNAT.dom||{});
-    XNAT.dom.addFormCSRF = function(__form){
-        __form = isDefined(__form) ? $$(__form) : jq('form');
-        __form.append('<input type="hidden" name="XNAT_CSRF" value="' + csrfToken + '">')
+    XNAT.dom.addFormCSRF = function(form){
+        $$(form||'form').each(function(){
+            var form$ = $(this);
+            if (!form$.has('input[name="XNAT_CSRF"]').length){
+                form$.append('<input type="hidden" name="XNAT_CSRF" value="' + csrfToken + '">')
+            }
+        });
     };
 
     jq(function(){
@@ -260,29 +220,19 @@
 <!-- YUI css -->
 <link rel="stylesheet" type="text/css" href="$content.getURI('scripts/yui/build/assets/skins/sam/skin.css?v=1.7.0a1')">
 
-<!-- xdat.css and xnat.css loaded last to override YUI styles -->
-<link rel="stylesheet" type="text/css" href="$content.getURI('style/app.css?v=1.7.0a1')">
-##<link rel="stylesheet" type="text/css" href="$content.getURI('style/xnat.css?v=1.7.0a1')">
-##<link rel="stylesheet" type="text/css" href="$content.getURI('style/icons.css?v=1.7.0a1')">
+<!-- date input stuff -->
+<link type="text/css" rel="stylesheet" href="$content.getURI('scripts/yui/build/calendar/assets/skins/sam/calendar.css?v=1.7.0a1')">
+##<script src="$content.getURI('scripts/yui/build/calendar/calendar.js')"></script>
+<script src="$content.getURI('scripts/yui/build/calendar/calendar-min.js')"></script>
+<script src="$content.getURI('scripts/ezCalendar.js')"></script>
+
 
-<link rel="stylesheet" type="text/css" href="$content.getURI('scripts/xmodal-v1/xmodal.css?v=1.7.0a1')">
-<script type="text/javascript" src="$content.getURI('scripts/xmodal-v1/xmodal.js')"></script>
-<script type="text/javascript" src="$content.getURI('scripts/xmodal-v1/xmodal-migrate.js')"></script>
+## pull in the XNAT app JavaScript files
+$navigation.setTemplate("/AppJS.vm")
 
-<link rel="stylesheet" type="text/css" href="$content.getURI('scripts/tabWrangler/tabWrangler.css?v=1.7.0a1')">
-<script type="text/javascript" src="$content.getURI('scripts/tabWrangler/tabWrangler.js')"></script>
 
-<!-- date input stuff -->
-<link type="text/css" rel="stylesheet" href="$content.getURI('scripts/yui/build/calendar/assets/skins/sam/calendar.css?v=1.7.0a1')">
-##<script type="text/javascript" src="$content.getURI('scripts/yui/build/calendar/calendar.js')"></script>
-<script type="text/javascript" src="$content.getURI('scripts/yui/build/calendar/calendar-min.js')"></script>
-<script type="text/javascript" src="$content.getURI('scripts/ezCalendar.js')"></script>
+<link rel="stylesheet" type="text/css" href="$content.getURI('scripts/tabWrangler/tabWrangler.css?v=1.7.0a1')">
+<script src="$content.getURI('scripts/tabWrangler/tabWrangler.js')"></script>
 
-<!-- XNAT JLAPI scripts -->
-<script type="text/javascript" src="$content.getURI('scripts/xnat/url.js')"></script>
-<script type="text/javascript" src="$content.getURI('scripts/xnat/xhr.js')"></script>
-##<script type="text/javascript" src="$content.getURI('scripts/xnat/widget.js')"></script>
-<script type="text/javascript" src="$content.getURI('scripts/xnat/ui/popup.js')"></script>
-<script type="text/javascript" src="$content.getURI('scripts/xnat/ui/dialog.js')"></script>
 
 #addGlobalCustomScreens("header")
diff --git a/src/main/webapp/xnat-templates/navigations/htmlOpen.vm b/src/main/webapp/xnat-templates/navigations/htmlOpen.vm
index 1e874a5dded171926a5181a4ee804f6e97f40cb1..f2b595ab704525605adf0587d783e93e47e9bb46 100644
--- a/src/main/webapp/xnat-templates/navigations/htmlOpen.vm
+++ b/src/main/webapp/xnat-templates/navigations/htmlOpen.vm
@@ -1,12 +1,8 @@
 <!DOCTYPE html>
 ##Copyright 2005 Harvard University / Howard Hughes Medical Institute (HHMI) All Rights Reserved
-<!--[if lt IE 7]> <html class="ie ie6 ltie7 ltie8 ltie9 ltie10 no-js"> <![endif]-->
-<!--[if IE 7]>    <html class="ie ie7 ltie8 ltie9 ltie10 no-js"> <![endif]-->
-<!--[if IE 8]>    <html class="ie ie8 ltie9 ltie10 no-js"> <![endif]-->
-<!--[if IE 9]>    <html class="ie ie9 ltie10 no-js"> <![endif]-->
-<!--[if gt IE 9]><!--> <html class="no-js"> <!--<![endif]-->
-##<!-- the "no-js" class is for Modernizr - are we even using that? -->
-
+<!--[if lt IE 9]><html class="ie ie8 ltie9 ltie10"><![endif]-->
+<!--[if IE 9]><html class="ie ie9 ltie10"><![endif]-->
+<!--[if gt IE 9]><!--><html><!--<![endif]-->
 <head>
 <script type="text/javascript">
     var XNAT = {};
diff --git a/src/main/webapp/xnat-templates/screens/Basic.vm b/src/main/webapp/xnat-templates/screens/Basic.vm
new file mode 100644
index 0000000000000000000000000000000000000000..98eb09a9107efaa28f6ac5016efb7c652a00d4d0
--- /dev/null
+++ b/src/main/webapp/xnat-templates/screens/Basic.vm
@@ -0,0 +1,32 @@
+## There's not a Java class file for this template yet.
+###* @vtlvariable name="displayManager" type="org.nrg.xdat.display.DisplayManager" *#
+###* @vtlvariable name="par_count" type="java.lang.Integer" *#
+###* @vtlvariable name="data" type="org.apache.turbine.util.RunData" *#
+###* @vtlvariable name="turbineUtils" type="org.nrg.xdat.turbine.utils.TurbineUtils" *#
+###* @vtlvariable name="siteConfig" type="java.util.Properties" *#
+###* @vtlvariable name="content" type="org.apache.turbine.services.pull.tools.ContentTool" *#
+#set ($template = $data.getTemplateInfo())
+$!template.setLayoutTemplate("Basic.vm")
+<head>
+    <!-- start xnat-templates/screens/Basic.vm -->
+
+    ## base JavaScript libraries
+    #parse("/navigations/BaseJS.vm")
+
+    ## XNAT css and JLAPI scripts
+    #parse("/navigations/AppJS.vm")
+
+</head>
+<body id="basic-page" class="xnat app basic">
+
+    <!-- Bare-bones HTML file. No YUI files and only -->
+    <!-- essential js and css files for new pages. -->
+
+
+    <!-- ================= -->
+    <!-- CONTENT GOES HERE -->
+    <!-- ================= -->
+
+
+    <!-- end xnat-templates/screens/Basic.vm -->
+</body>
\ No newline at end of file
diff --git a/src/main/webapp/xnat-templates/screens/Blank.vm b/src/main/webapp/xnat-templates/screens/Blank.vm
new file mode 100644
index 0000000000000000000000000000000000000000..454822f7fb61a882b025a1a29375262c25208a3c
--- /dev/null
+++ b/src/main/webapp/xnat-templates/screens/Blank.vm
@@ -0,0 +1,4 @@
+#set ($template = $data.getTemplateInfo())
+$!template.setLayoutTemplate("Content.vm")
+
+<p>It's blank.</p>