diff --git a/dbmigration/source/java/ch/systemsx/cisd/dbmigration/DBMigrationEngine.java b/dbmigration/source/java/ch/systemsx/cisd/dbmigration/DBMigrationEngine.java
index 381f9e93d7f33126244469b33b9d9998b1b97816..8467b489cbbddb20dbec7ec2eb28f76cd77de7ba 100644
--- a/dbmigration/source/java/ch/systemsx/cisd/dbmigration/DBMigrationEngine.java
+++ b/dbmigration/source/java/ch/systemsx/cisd/dbmigration/DBMigrationEngine.java
@@ -264,6 +264,8 @@ public final class DBMigrationEngine
         do
         {
             final String nextVersion = increment(version);
+            final Script functionMigrationScriptOrNull =
+                    scriptProvider.tryGetFunctionMigrationScript(version, nextVersion);
             final Script migrationScript =
                     scriptProvider.tryGetMigrationScript(version, nextVersion);
             if (migrationScript == null)
@@ -281,6 +283,10 @@ public final class DBMigrationEngine
             migrationStepExecutorAdmin.performPreMigration();
             migrationStepExecutor.performPreMigration();
             scriptExecutor.execute(migrationScript, true, logDAO);
+            if (functionMigrationScriptOrNull != null)
+            {
+                scriptExecutor.execute(functionMigrationScriptOrNull, false, logDAO);
+            }
             migrationStepExecutor.performPostMigration();
             migrationStepExecutorAdmin.performPostMigration();
             migrationStepExecutor.finish();
diff --git a/dbmigration/source/java/ch/systemsx/cisd/dbmigration/ISqlScriptProvider.java b/dbmigration/source/java/ch/systemsx/cisd/dbmigration/ISqlScriptProvider.java
index 44b071ee8d922abd2858cd122977162f4bfdce3f..f5f57a9f20bad3bd538b4752edef896fa317465f 100644
--- a/dbmigration/source/java/ch/systemsx/cisd/dbmigration/ISqlScriptProvider.java
+++ b/dbmigration/source/java/ch/systemsx/cisd/dbmigration/ISqlScriptProvider.java
@@ -28,9 +28,9 @@ import ch.systemsx.cisd.common.Script;
 public interface ISqlScriptProvider
 {
     /**
-     * Returns <code>true</code> if this script provider is suitable for a dump restore of the
-     * given <var>version</var> of the database, and <code>false</code>, if it is suitable for a
-     * regular setup.
+     * Returns <code>true</code> if this script provider is suitable for a dump restore of the given
+     * <var>version</var> of the database, and <code>false</code>, if it is suitable for a regular
+     * setup.
      */
     public boolean isDumpRestore(String version);
 
@@ -77,7 +77,7 @@ public interface ISqlScriptProvider
      * </pre>
      */
     public Script tryGetGrantsScript(final String version);
-    
+
     /**
      * Returns the script to create initial data.
      * 
@@ -95,4 +95,14 @@ public interface ISqlScriptProvider
      */
     public Script tryGetMigrationScript(String fromVersion, String toVersion);
 
+    /**
+     * Returns the function migration script for migrating a database. The function migration will
+     * always be called <i>after</i> the regular migration script.
+     * 
+     * @param fromVersion The version of the current database.
+     * @param toVersion The version of the database after migration.
+     * @return <code>null</code> if there isn't such a migration script.
+     */
+    public Script tryGetFunctionMigrationScript(String fromVersion, String toVersion);
+
 }
diff --git a/dbmigration/source/java/ch/systemsx/cisd/dbmigration/SqlScriptProvider.java b/dbmigration/source/java/ch/systemsx/cisd/dbmigration/SqlScriptProvider.java
index 363dae5510a118ccf309a5045df31a70548247af..353535bbcdd016b37b20be2a0827ac5c066597c3 100644
--- a/dbmigration/source/java/ch/systemsx/cisd/dbmigration/SqlScriptProvider.java
+++ b/dbmigration/source/java/ch/systemsx/cisd/dbmigration/SqlScriptProvider.java
@@ -172,6 +172,23 @@ public class SqlScriptProvider implements ISqlScriptProvider
         return tryLoadScript(scriptName, toVersion, "migration");
     }
 
+    /**
+     * Returns the function migration script for the specified versions. The name of the script is
+     * expected to be
+     * 
+     * <pre>
+     * &lt;schema script folder&gt;/migration/function_migration-&lt;fromVersion&gt;-&lt;toVersion&gt;.sql
+     * </pre>
+     * 
+     * The function migration will always be called <i>after</i> the regular migration script.
+     */
+    public Script tryGetFunctionMigrationScript(final String fromVersion, final String toVersion)
+    {
+        final String scriptName =
+                "function_migration-" + fromVersion + "-" + toVersion + SQL_FILE_TYPE;
+        return tryLoadScript(scriptName, toVersion, "migration");
+    }
+
     private Script tryLoadScript(final String scriptName, final String scriptVersion)
     {
         return tryLoadScript(scriptName, scriptVersion, scriptVersion);
diff --git a/dbmigration/sourceTest/java/ch/systemsx/cisd/dbmigration/DBMigrationEngineTest.java b/dbmigration/sourceTest/java/ch/systemsx/cisd/dbmigration/DBMigrationEngineTest.java
index 19c1aad3fb52f49fcc6ab447036846b8779c14df..758fa208adb258f08ecaafe14c098da4407005b6 100644
--- a/dbmigration/sourceTest/java/ch/systemsx/cisd/dbmigration/DBMigrationEngineTest.java
+++ b/dbmigration/sourceTest/java/ch/systemsx/cisd/dbmigration/DBMigrationEngineTest.java
@@ -521,10 +521,12 @@ public class DBMigrationEngineTest
                     one(scriptProvider).tryGetMigrationScript(fromVersion, "100");
                     final Script script = new Script("m-099-100", "code 099 100", toVersion);
                     expectSuccessfulScriptExecutionWithMigrationSteps(script, true);
+                    one(scriptProvider).tryGetFunctionMigrationScript(fromVersion, "100");
 
                     one(scriptProvider).tryGetMigrationScript("100", toVersion);
                     expectSuccessfulScriptExecutionWithMigrationSteps(new Script("m-100-101",
                             "code 100 101", toVersion), true);
+                    one(scriptProvider).tryGetFunctionMigrationScript("100", toVersion);
                     one(adminDAO).getDatabaseName();
                     will(returnValue("my 2. database"));
 
@@ -582,8 +584,8 @@ public class DBMigrationEngineTest
                     will(returnValue("my 1. database"));
                     one(scriptProvider).tryGetMigrationScript(fromVersion, "100");
                     final Script script = new Script("m-099-100", "code 099 100", toVersion);
-
                     will(returnValue(script));
+                    one(scriptProvider).tryGetFunctionMigrationScript(fromVersion, "100");
 
                     one(migrationStepExecutorAdmin).init(script);
                     one(migrationStepExecutorAdmin).performPreMigration();
@@ -645,6 +647,7 @@ public class DBMigrationEngineTest
                     one(scriptProvider).tryGetMigrationScript(fromVersion, "100");
                     final Script script = new Script("m-099-100", "code 099 100", toVersion);
                     will(returnValue(script));
+                    one(scriptProvider).tryGetFunctionMigrationScript(fromVersion, "100");
 
                     one(migrationStepExecutorAdmin).init(script);
                     one(migrationStepExecutorAdmin).performPreMigration();
@@ -703,6 +706,7 @@ public class DBMigrationEngineTest
                     one(adminDAO).getDatabaseName();
                     will(returnValue("my 1. database"));
                     one(scriptProvider).tryGetMigrationScript(fromVersion, "100");
+                    one(scriptProvider).tryGetFunctionMigrationScript(fromVersion, "100");
                     one(adminDAO).getDatabaseName();
                     will(returnValue("my 2. database"));
                 }
@@ -955,6 +959,7 @@ public class DBMigrationEngineTest
                     one(scriptProvider).tryGetMigrationScript(fromVersion, toVersion);
                     final Script script = new Script("m-1-2", "code", toVersion);
                     will(returnValue(script));
+                    one(scriptProvider).tryGetFunctionMigrationScript(fromVersion, toVersion);
 
                     one(migrationStepExecutor).init(script);
                     one(migrationStepExecutor).performPreMigration();