diff --git a/build.gradle b/build.gradle
index 73dade74c8031bc8a68fbb3d8072b19d7b3bd761..78832236939b32124502cb5dd2c27a64600aa4b7 100644
--- a/build.gradle
+++ b/build.gradle
@@ -7,7 +7,7 @@ def vSwagger = '2.4.0'
 def vHibernate = '4.3.11.Final'
 def vEhcache = '2.6.11'
 def vJackson = '2.6.5'
-def vPostgreSQL = '9.4.1207'
+def vPostgreSQL = '9.4.1209.jre7'
 def vServletApi = '3.1.0'
 def vTomcat = '7.0.68'
 def vCargo = '1.4.18'
diff --git a/src/main/java/org/nrg/xnat/configuration/OrmConfig.java b/src/main/java/org/nrg/xnat/configuration/OrmConfig.java
index fd4aa23e9eb2c13b47bf0aa0be2c7f24294165ff..519d95074b11158c87eafa4d996ffe50849107bc 100644
--- a/src/main/java/org/nrg/xnat/configuration/OrmConfig.java
+++ b/src/main/java/org/nrg/xnat/configuration/OrmConfig.java
@@ -18,6 +18,7 @@ import org.springframework.orm.hibernate4.HibernateTransactionManager;
 import org.springframework.orm.hibernate4.LocalSessionFactoryBean;
 import org.springframework.transaction.PlatformTransactionManager;
 import org.springframework.transaction.annotation.EnableTransactionManagement;
+import org.springframework.transaction.support.TransactionTemplate;
 
 import javax.sql.DataSource;
 import java.io.IOException;
@@ -26,9 +27,6 @@ import java.util.Properties;
 @Configuration
 @EnableTransactionManagement(proxyTargetClass = true)
 public class OrmConfig {
-
-    public static final String XNAT_ENTITIES_PACKAGES = "META-INF/xnat/entities/**/*-entity-packages.txt";
-
     @Bean
     public ImprovedNamingStrategy namingStrategy() {
         return new PrefixedTableNamingStrategy("xhbm");
@@ -80,6 +78,12 @@ public class OrmConfig {
         return new HibernateTransactionManager(sessionFactory(environment, dataSource).getObject());
     }
 
+    @Bean
+    public TransactionTemplate transactionTemplate(final PlatformTransactionManager transactionManager) {
+        return new TransactionTemplate(transactionManager);
+    }
+
+    private static final String     XNAT_ENTITIES_PACKAGES       = "META-INF/xnat/entities/**/*-entity-packages.txt";
     private static final Properties DEFAULT_HIBERNATE_PROPERTIES = new Properties() {{
         setProperty("hibernate.dialect", "org.hibernate.dialect.PostgreSQL9Dialect");
         setProperty("hibernate.hbm2ddl.auto", "update");
diff --git a/src/main/java/org/nrg/xnat/initialization/DatabaseConfig.java b/src/main/java/org/nrg/xnat/initialization/DatabaseConfig.java
index d4f2e81074eb65019a470b0ea81a4f75c669d0d6..4b717f6b528f5865e35ac65c0f831b7fe071bc6e 100644
--- a/src/main/java/org/nrg/xnat/initialization/DatabaseConfig.java
+++ b/src/main/java/org/nrg/xnat/initialization/DatabaseConfig.java
@@ -22,16 +22,6 @@ import java.util.Properties;
  */
 @Configuration
 public class DatabaseConfig {
-
-    public static final String DEFAULT_DATASOURCE_URL          = "jdbc:postgresql://localhost/xnat";
-    public static final String DEFAULT_DATASOURCE_USERNAME     = "xnat";
-    public static final String DEFAULT_DATASOURCE_PASSWORD     = "xnat";
-    public static final String DEFAULT_DATASOURCE_CLASS        = BasicDataSource.class.getName();
-    public static final String DEFAULT_DATASOURCE_DRIVER       = Driver.class.getName();
-    public static final String DEFAULT_DATASOURCE_INITIAL_SIZE = "20";
-    public static final String DEFAULT_DATASOURCE_MAX_TOTAL    = "40";
-    public static final String DEFAULT_DATASOURCE_MAX_IDLE     = "10";
-
     @Bean
     public DataSource dataSource(final Environment environment) throws NrgServiceException {
         final Properties properties = Beans.getNamespacedProperties(environment, "datasource", true);
@@ -117,4 +107,13 @@ public class DatabaseConfig {
     }
 
     private static final Logger _log = LoggerFactory.getLogger(DatabaseConfig.class);
+
+    private static final String DEFAULT_DATASOURCE_URL          = "jdbc:postgresql://localhost/xnat";
+    private static final String DEFAULT_DATASOURCE_USERNAME     = "xnat";
+    private static final String DEFAULT_DATASOURCE_PASSWORD     = "xnat";
+    private static final String DEFAULT_DATASOURCE_CLASS        = BasicDataSource.class.getName();
+    private static final String DEFAULT_DATASOURCE_DRIVER       = Driver.class.getName();
+    private static final String DEFAULT_DATASOURCE_INITIAL_SIZE = "20";
+    private static final String DEFAULT_DATASOURCE_MAX_TOTAL    = "40";
+    private static final String DEFAULT_DATASOURCE_MAX_IDLE     = "10";
 }
diff --git a/src/main/java/org/nrg/xnat/initialization/tasks/EncryptXnatPasswords.java b/src/main/java/org/nrg/xnat/initialization/tasks/EncryptXnatPasswords.java
index fbc9f06307285389fe59adca04a19ef67beb7b47..da4903621481ce2efee196b11f80c4999093201c 100644
--- a/src/main/java/org/nrg/xnat/initialization/tasks/EncryptXnatPasswords.java
+++ b/src/main/java/org/nrg/xnat/initialization/tasks/EncryptXnatPasswords.java
@@ -83,10 +83,11 @@ public class EncryptXnatPasswords extends AbstractInitializingTask {
             }
             return passwords;
         }
+
         final ShaPasswordEncoder encoder = new ShaPasswordEncoder(256);
     }
 
-    private static Logger logger = LoggerFactory.getLogger(EncryptXnatPasswords.class);
+    private static final Logger logger = LoggerFactory.getLogger(EncryptXnatPasswords.class);
 
     private final JdbcTemplate _template;
 }
diff --git a/src/main/java/org/nrg/xnat/initialization/tasks/MigrateDatabaseTables.java b/src/main/java/org/nrg/xnat/initialization/tasks/MigrateDatabaseTables.java
new file mode 100644
index 0000000000000000000000000000000000000000..c950f6ce928b1588b8b82ce38d89241478dbe3e0
--- /dev/null
+++ b/src/main/java/org/nrg/xnat/initialization/tasks/MigrateDatabaseTables.java
@@ -0,0 +1,101 @@
+/*
+ * org.nrg.xnat.initialization.tasks.XnatPasswordEncrypter
+ * XNAT http://www.xnat.org
+ * Copyright (c) 2016, Washington University School of Medicine
+ * All Rights Reserved
+ *
+ * Released under the Simplified BSD.
+ */
+package org.nrg.xnat.initialization.tasks;
+
+import com.google.common.base.Joiner;
+import org.nrg.framework.orm.DatabaseHelper;
+import org.nrg.framework.utilities.BasicXnatResourceLocator;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.io.Resource;
+import org.springframework.core.io.support.PropertiesLoaderUtils;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.support.TransactionTemplate;
+
+import java.io.IOException;
+import java.sql.SQLException;
+import java.sql.SQLWarning;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+
+@Component
+public class MigrateDatabaseTables extends AbstractInitializingTask {
+    @Autowired
+    public MigrateDatabaseTables(final JdbcTemplate template, final TransactionTemplate transactionTemplate) {
+        super();
+        _db = new DatabaseHelper(template, transactionTemplate);
+    }
+
+    @Override
+    public String getTaskName() {
+        return "Migrate XNAT database tables";
+    }
+
+    @Override
+    public void run() {
+        try {
+            final Map<String, Map<String, String>> tables = new HashMap<>();
+            for (final Resource resource : BasicXnatResourceLocator.getResources("classpath*:META-INF/xnat/migration/**/*-tables.properties")) {
+                final Properties properties = PropertiesLoaderUtils.loadProperties(resource);
+                for (final String property : properties.stringPropertyNames()) {
+                    final String[] atoms = property.split("\\.", 2);
+                    if (atoms.length < 2) {
+                        _log.error("The properties file {} contains a malformed key: {}. Keys in table migration properties files should take the form: \"table.column=column_type\".", resource.getFilename(), property);
+                        continue;
+                    }
+
+                    final String table  = atoms[0];
+                    final String column = atoms[1];
+
+                    final Map<String, String> columns;
+                    if (tables.containsKey(table)) {
+                        columns = tables.get(table);
+                    } else {
+                        columns = new HashMap<>();
+                        tables.put(table, columns);
+                    }
+                    if (columns.containsKey(column)) {
+                        _log.error("The properties for table {} defines the column {} as column type {}. This column has already been defined elsewhere as type: {}.", table, column, columns.get(column));
+                        continue;
+                    }
+                    columns.put(column, properties.getProperty(property));
+                }
+            }
+            for (final String table : tables.keySet()) {
+                final Map<String, String> columns = tables.get(table);
+                for (final String column : columns.keySet()) {
+                    final String value = columns.get(column);
+                    try {
+                        _db.setColumnDatatype(table, column, value);
+                    } catch (SQLWarning e) {
+                        final String message = e.getMessage();
+                        if (message.startsWith(SQL_WARNING_TABLE)) {
+                            _log.error("The table {} was defined, but that table doesn't appear to exist in the database. The following columns were to be checked: {}", table, Joiner.on(", ").join(columns.keySet()));
+                        } else {
+                            _log.error("The column {}.{} was defined, but that column doesn't appear to exist. Note that the table migration does not create new columns. The column was defined as: {}", table, column, value);
+                        }
+                    }
+                }
+            }
+            complete();
+        } catch (IOException e) {
+            _log.error("An error occurred attempting to read table migration properties files", e);
+        } catch (SQLException e) {
+            _log.error("An error occurred accessing the database", e);
+        }
+    }
+
+    private static final Logger _log              = LoggerFactory.getLogger(MigrateDatabaseTables.class);
+    private static final String SQL_WARNING_TABLE = "The requested table";
+
+    private final DatabaseHelper _db;
+}
diff --git a/src/main/resources/META-INF/xnat/migration/xnat-1.6-tables.properties b/src/main/resources/META-INF/xnat/migration/xnat-1.6-tables.properties
new file mode 100644
index 0000000000000000000000000000000000000000..d7e0df9a0e3c9396d806467133b24728b38eb7c5
--- /dev/null
+++ b/src/main/resources/META-INF/xnat/migration/xnat-1.6-tables.properties
@@ -0,0 +1 @@
+xhbm_alias_token.secret=varchar(255)
\ No newline at end of file