diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..5e1104b
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,16 @@
+.gradle
+.idea
+**/build/
+**/target/
+
+# Ignore Gradle GUI config
+gradle-app.setting
+
+# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored)
+!gradle-wrapper.jar
+
+*.iml
+
+*.log
+
+*.toDelete
diff --git a/HEADER b/HEADER
new file mode 100644
index 0000000..4b2eadf
--- /dev/null
+++ b/HEADER
@@ -0,0 +1,13 @@
+Copyright ${year} ${name}.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
\ No newline at end of file
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..9c8f3ea
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,201 @@
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "{}"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright {yyyy} {name of copyright owner}
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
\ No newline at end of file
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..4ff96c3
--- /dev/null
+++ b/README.md
@@ -0,0 +1,42 @@
+# Mifos I/O Core data-jpa
+
+[![Join the chat at https://gitter.im/mifos-initiative/mifos.io](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/mifos-initiative/mifos.io?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
+
+Data JPA provides easy access to tenant databases.
+
+## Abstract
+Mifos I/O is an application framework for digital financial services, a system to support nationwide and cross-national financial transactions and help to level and speed the creation of an inclusive, interconnected digital economy for every nation in the world.
+
+## Prerequisites
+### Runtime
+Install Java 8 as described at https://docs.oracle.com/javase/8/docs/technotes/guides/install/install_overview.html.
+
+### Installation
+#### MariaDB
+Install MariaDB as described at https://mariadb.com/kb/en/mariadb/binary-packages/.
+
+After installation you need to create the meta database:
+
+    mysql -u root -pmysql
+    CREATE DATABASE IF NOT EXISTS system_console;
+    
+## Multi-tenancy
+Multi-tenancy is reached by providing separate data storage on a per tenant basis.
+
+For every tenant a new database instance is created internally. A tenant aware component provides transparent access to these resources.
+
+## Versioning
+The version numbers follow the [Semantic Versioning](http://semver.org/) scheme.
+
+In addition to MAJOR.MINOR.PATCH the following postfixes are used to indicate the development state.
+
+* BUILD-SNAPSHOT - A release currently in development. 
+* RELEASE - _General availability_ indicates that this release is the best available version and is recommended for all usage.
+
+The versioning layout is {MAJOR}.{MINOR}.{PATCH}-{INDICATOR}[.{PATCH}]. Only milestones and release candidates can  have patch versions. Some examples:
+
+1.2.3-BUILD-SNAPSHOT  
+1.3.5-RELEASE
+
+## License
+See [LICENSE](LICENSE) file.
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
new file mode 100644
index 0000000..dc661cd
--- /dev/null
+++ b/build.gradle
@@ -0,0 +1,81 @@
+buildscript {
+    repositories {
+        jcenter()
+        maven {
+            url 'http://repo.spring.io/plugins-release'
+        }
+    }
+
+    dependencies {
+        classpath 'org.springframework.boot:spring-boot-gradle-plugin:1.4.1.RELEASE'
+        classpath 'org.springframework.build.gradle:propdeps-plugin:0.0.7'
+    }
+}
+
+plugins {
+    id "com.github.hierynomus.license" version "0.13.1"
+}
+
+group 'io.mifos.core'
+version '0.1.0-BUILD-SNAPSHOT'
+
+apply plugin: 'java'
+apply plugin: 'idea'
+apply plugin: 'maven-publish'
+apply plugin: 'io.spring.dependency-management'
+apply plugin: 'propdeps'
+apply plugin: 'propdeps-idea'
+
+sourceCompatibility = JavaVersion.VERSION_1_8
+targetCompatibility = JavaVersion.VERSION_1_8
+
+repositories {
+    jcenter()
+    mavenLocal()
+}
+
+dependencyManagement {
+    imports {
+        mavenBom 'io.spring.platform:platform-bom:Athens-RELEASE'
+    }
+}
+
+dependencies {
+    compile (
+            [group: 'org.springframework.boot', name: 'spring-boot-starter-data-jpa', version: '1.4.1.RELEASE'],
+            [group: 'org.apache.commons', name: 'commons-dbcp2', version: '2.1.1'],
+            [group: 'org.liquibase', name: 'liquibase-core', version: '3.5.3'],
+            [group: 'io.mifos.core', name: 'lang', version: '0.1.0-BUILD-SNAPSHOT'],
+            [group: 'com.google.code.findbugs', name: 'jsr305']
+    )
+
+    testCompile (
+            [group: 'org.springframework.boot', name: 'spring-boot-starter-test'],
+//            [group: 'io.mifos.', name: 'spring-boot-starter-test'],
+            [group: 'org.hsqldb', name: 'hsqldb', version: '2.3.4']
+    )
+}
+
+publishing {
+    publications {
+        databaseConnector(MavenPublication) {
+            from components.java
+            groupId project.group
+            artifactId project.name
+            version project.version
+        }
+    }
+}
+
+license {
+    header rootProject.file('HEADER')
+    strictCheck true
+    mapping {
+        java = 'SLASHSTAR_STYLE'
+        xml = 'XML_STYLE'
+        yml = 'SCRIPT_STYLE'
+        yaml = 'SCRIPT_STYLE'
+    }
+    ext.year = Calendar.getInstance().get(Calendar.YEAR)
+    ext.name = 'The Mifos Initiative'
+}
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..8f36e29
--- /dev/null
+++ b/gradle/wrapper/gradle-wrapper.jar
Binary files differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..c6253ca
--- /dev/null
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Wed Mar 29 07:04:09 CEST 2017
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-3.4.1-bin.zip
diff --git a/gradlew b/gradlew
new file mode 100644
index 0000000..4453cce
--- /dev/null
+++ b/gradlew
@@ -0,0 +1,172 @@
+#!/usr/bin/env sh
+
+##############################################################################
+##
+##  Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+    ls=`ls -ld "$PRG"`
+    link=`expr "$ls" : '.*-> \(.*\)$'`
+    if expr "$link" : '/.*' > /dev/null; then
+        PRG="$link"
+    else
+        PRG=`dirname "$PRG"`"/$link"
+    fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn ( ) {
+    echo "$*"
+}
+
+die ( ) {
+    echo
+    echo "$*"
+    echo
+    exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+  CYGWIN* )
+    cygwin=true
+    ;;
+  Darwin* )
+    darwin=true
+    ;;
+  MINGW* )
+    msys=true
+    ;;
+  NONSTOP* )
+    nonstop=true
+    ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+        # IBM's JDK on AIX uses strange locations for the executables
+        JAVACMD="$JAVA_HOME/jre/sh/java"
+    else
+        JAVACMD="$JAVA_HOME/bin/java"
+    fi
+    if [ ! -x "$JAVACMD" ] ; then
+        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+    fi
+else
+    JAVACMD="java"
+    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+    MAX_FD_LIMIT=`ulimit -H -n`
+    if [ $? -eq 0 ] ; then
+        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+            MAX_FD="$MAX_FD_LIMIT"
+        fi
+        ulimit -n $MAX_FD
+        if [ $? -ne 0 ] ; then
+            warn "Could not set maximum file descriptor limit: $MAX_FD"
+        fi
+    else
+        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+    fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+    JAVACMD=`cygpath --unix "$JAVACMD"`
+
+    # We build the pattern for arguments to be converted via cygpath
+    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+    SEP=""
+    for dir in $ROOTDIRSRAW ; do
+        ROOTDIRS="$ROOTDIRS$SEP$dir"
+        SEP="|"
+    done
+    OURCYGPATTERN="(^($ROOTDIRS))"
+    # Add a user-defined pattern to the cygpath arguments
+    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+    fi
+    # Now convert the arguments - kludge to limit ourselves to /bin/sh
+    i=0
+    for arg in "$@" ; do
+        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option
+
+        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
+            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+        else
+            eval `echo args$i`="\"$arg\""
+        fi
+        i=$((i+1))
+    done
+    case $i in
+        (0) set -- ;;
+        (1) set -- "$args0" ;;
+        (2) set -- "$args0" "$args1" ;;
+        (3) set -- "$args0" "$args1" "$args2" ;;
+        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+    esac
+fi
+
+# Escape application args
+save ( ) {
+    for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+    echo " "
+}
+APP_ARGS=$(save "$@")
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
+if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
+  cd "$(dirname "$0")"
+fi
+
+exec "$JAVACMD" "$@"
diff --git a/gradlew.bat b/gradlew.bat
new file mode 100644
index 0000000..f955316
--- /dev/null
+++ b/gradlew.bat
@@ -0,0 +1,84 @@
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem  Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windows variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/settings.gradle b/settings.gradle
new file mode 100644
index 0000000..492a9ff
--- /dev/null
+++ b/settings.gradle
@@ -0,0 +1,2 @@
+rootProject.name = 'data-jpa'
+
diff --git a/src/main/java/io/mifos/core/data/jpa/EnableJpa.java b/src/main/java/io/mifos/core/data/jpa/EnableJpa.java
new file mode 100644
index 0000000..f24fbf3
--- /dev/null
+++ b/src/main/java/io/mifos/core/data/jpa/EnableJpa.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2017 The Mifos Initiative.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package io.mifos.core.data.jpa;
+
+import io.mifos.core.data.jpa.core.DatabaseConnectorConfiguration;
+import org.springframework.context.annotation.Import;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Target(ElementType.TYPE)
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+@Inherited
+@Import({
+    DatabaseConnectorConfiguration.class
+})
+public @interface EnableJpa {
+}
diff --git a/src/main/java/io/mifos/core/data/jpa/core/DatabaseConnectorConfiguration.java b/src/main/java/io/mifos/core/data/jpa/core/DatabaseConnectorConfiguration.java
new file mode 100644
index 0000000..e1f3960
--- /dev/null
+++ b/src/main/java/io/mifos/core/data/jpa/core/DatabaseConnectorConfiguration.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2017 The Mifos Initiative.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package io.mifos.core.data.jpa.core;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor;
+import org.springframework.orm.jpa.JpaTransactionManager;
+import org.springframework.orm.jpa.JpaVendorAdapter;
+import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
+import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
+import org.springframework.transaction.PlatformTransactionManager;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+import javax.persistence.EntityManagerFactory;
+import javax.sql.DataSource;
+
+@Configuration
+@EnableTransactionManagement
+@ComponentScan({
+    "**.core.data.jpa",
+})
+public class DatabaseConnectorConfiguration {
+  public DatabaseConnectorConfiguration() {
+    super();
+  }
+
+  @Bean(name = DatabaseConnectorConstants.LOGGER_NAME)
+  public Logger logger() {
+    return LoggerFactory.getLogger(DatabaseConnectorConstants.LOGGER_NAME);
+  }
+
+  @Bean
+  public LocalContainerEntityManagerFactoryBean entityManagerFactory(final DataSource dataSource) {
+    final LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
+    entityManagerFactoryBean.setPersistenceUnitName("dynamicRoutingPU");
+    entityManagerFactoryBean.setPackagesToScan("**.repository");
+    entityManagerFactoryBean.setDataSource(dataSource);
+
+    final JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
+    entityManagerFactoryBean.setJpaVendorAdapter(vendorAdapter);
+
+    return entityManagerFactoryBean;
+  }
+
+  @Bean
+  public PlatformTransactionManager transactionManager(final EntityManagerFactory entityManagerFactory) {
+    final JpaTransactionManager transactionManager = new JpaTransactionManager();
+    transactionManager.setEntityManagerFactory(entityManagerFactory);
+    return transactionManager;
+  }
+
+  @Bean
+  public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
+    return new PersistenceExceptionTranslationPostProcessor();
+  }
+}
diff --git a/src/main/java/io/mifos/core/data/jpa/core/DatabaseConnectorConstants.java b/src/main/java/io/mifos/core/data/jpa/core/DatabaseConnectorConstants.java
new file mode 100644
index 0000000..e573b31
--- /dev/null
+++ b/src/main/java/io/mifos/core/data/jpa/core/DatabaseConnectorConstants.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2017 The Mifos Initiative.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package io.mifos.core.data.jpa.core;
+
+public interface DatabaseConnectorConstants {
+  String LOGGER_NAME = "mifosio-data-jpa-logger";
+}
diff --git a/src/main/java/io/mifos/core/data/jpa/core/MigrationHelper.java b/src/main/java/io/mifos/core/data/jpa/core/MigrationHelper.java
new file mode 100644
index 0000000..0355ae1
--- /dev/null
+++ b/src/main/java/io/mifos/core/data/jpa/core/MigrationHelper.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2017 The Mifos Initiative.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package io.mifos.core.data.jpa.core;
+
+import liquibase.Contexts;
+import liquibase.LabelExpression;
+import liquibase.Liquibase;
+import liquibase.changelog.ChangeSet;
+import liquibase.database.Database;
+import liquibase.database.DatabaseFactory;
+import liquibase.database.jvm.JdbcConnection;
+import liquibase.resource.ClassLoaderResourceAccessor;
+import org.springframework.stereotype.Component;
+
+import javax.sql.DataSource;
+import java.util.Optional;
+
+@Component
+public class MigrationHelper {
+
+  private MigrationHelper() {
+    super();
+  }
+
+  public static String execute(final DataSource dataSource, final String changeLogFile) throws Exception {
+    final JdbcConnection jdbcConnection = new JdbcConnection(dataSource.getConnection());
+    final Database database = DatabaseFactory.getInstance().findCorrectDatabaseImplementation(jdbcConnection);
+    final Liquibase liquibase =
+        new Liquibase(changeLogFile, new ClassLoaderResourceAccessor(), database);
+    liquibase.update(new Contexts(), new LabelExpression());
+
+    final Optional<ChangeSet> optionalMaxChangeSet =
+        liquibase.getDatabaseChangeLog().getChangeSets()
+            .stream()
+            .max(VersionComparator::compare);
+
+    return optionalMaxChangeSet.orElseThrow(() -> new IllegalStateException("No valid version found!")).getId();
+  }
+}
diff --git a/src/main/java/io/mifos/core/data/jpa/core/VersionComparator.java b/src/main/java/io/mifos/core/data/jpa/core/VersionComparator.java
new file mode 100644
index 0000000..f7a4380
--- /dev/null
+++ b/src/main/java/io/mifos/core/data/jpa/core/VersionComparator.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2017 The Mifos Initiative.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package io.mifos.core.data.jpa.core;
+
+import liquibase.changelog.ChangeSet;
+
+public class VersionComparator {
+
+  private VersionComparator() {
+    super();
+  }
+
+  public static int compare(final ChangeSet firstChangeSet, final ChangeSet secondChangeSet) {
+    final String firstId = firstChangeSet.getId();
+    final String secondId = secondChangeSet.getId();
+
+    final String[] splitFirstId = firstId.split("\\.");
+    final String[] splitSecondId = secondId.split("\\.");
+
+    int index = 0;
+
+    while (index < splitFirstId.length
+        && index < splitSecondId.length
+        && splitFirstId[index].equals(splitSecondId[index])) {
+      index++;
+    }
+
+    if (index < splitFirstId.length && index < splitSecondId.length) {
+      return Integer.valueOf(splitFirstId[index]).compareTo(Integer.valueOf(splitSecondId[index]));
+    }
+
+    return Integer.valueOf(splitFirstId.length).compareTo(Integer.valueOf(splitSecondId.length));
+  }
+}
diff --git a/src/main/java/io/mifos/core/data/jpa/local/LocalDatabaseConfiguration.java b/src/main/java/io/mifos/core/data/jpa/local/LocalDatabaseConfiguration.java
new file mode 100644
index 0000000..4f29e1e
--- /dev/null
+++ b/src/main/java/io/mifos/core/data/jpa/local/LocalDatabaseConfiguration.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2017 The Mifos Initiative.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package io.mifos.core.data.jpa.local;
+
+import io.mifos.core.data.jpa.core.DatabaseConnectorConstants;
+import org.slf4j.Logger;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Profile;
+import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
+
+import javax.sql.DataSource;
+import java.util.HashMap;
+
+@Profile("local")
+@Configuration
+@EnableConfigurationProperties({
+    LocalDatabaseProperties.class
+})
+@EnableJpaRepositories(
+    basePackages = {
+        "io.mifos.core.data.jpa.local.repository"
+    }
+)
+public class LocalDatabaseConfiguration {
+
+  public LocalDatabaseConfiguration() {
+    super();
+  }
+
+  @Bean
+  public DataSource dataSource(@Qualifier(DatabaseConnectorConstants.LOGGER_NAME) final Logger logger,
+                               final LocalDatabaseProperties localDatabaseProperties) {
+    final LocalRoutingDataSource localRoutingDataSource =
+        new LocalRoutingDataSource(logger, localDatabaseProperties);
+    localRoutingDataSource.setTargetDataSources(new HashMap<>());
+    localRoutingDataSource.setLenientFallback(false);
+    return localRoutingDataSource;
+  }
+}
diff --git a/src/main/java/io/mifos/core/data/jpa/local/LocalDatabaseProperties.java b/src/main/java/io/mifos/core/data/jpa/local/LocalDatabaseProperties.java
new file mode 100644
index 0000000..48a9427
--- /dev/null
+++ b/src/main/java/io/mifos/core/data/jpa/local/LocalDatabaseProperties.java
@@ -0,0 +1,122 @@
+/*
+ * Copyright 2017 The Mifos Initiative.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package io.mifos.core.data.jpa.local;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+@ConfigurationProperties(prefix = "database", ignoreUnknownFields = false)
+public final class LocalDatabaseProperties {
+
+  private Pool pool;
+  private Management management;
+
+  public LocalDatabaseProperties() {
+    super();
+  }
+
+  public Pool getPool() {
+    return this.pool;
+  }
+
+  public void setPool(final Pool pool) {
+    this.pool = pool;
+  }
+
+  public Management getManagement() {
+    return this.management;
+  }
+
+  public void setManagement(final Management management) {
+    this.management = management;
+  }
+
+  public static class Pool {
+    private int minSize = 5;
+    private int maxSize = 20;
+    private long waitTime = 60000L;
+
+    public Pool() {
+      super();
+    }
+
+    public int getMinSize() {
+      return this.minSize;
+    }
+
+    public void setMinSize(final int minSize) {
+      this.minSize = minSize;
+    }
+
+    public int getMaxSize() {
+      return this.maxSize;
+    }
+
+    public void setMaxSize(final int maxSize) {
+      this.maxSize = maxSize;
+    }
+
+    public long getWaitTime() {
+      return this.waitTime;
+    }
+
+    public void setWaitTime(final long waitTime) {
+      this.waitTime = waitTime;
+    }
+  }
+
+  public static class Management {
+    private String driverClass;
+    private String url;
+    private String username;
+    private String password;
+
+    public Management() {
+      super();
+    }
+
+    public String getDriverClass() {
+      return this.driverClass;
+    }
+
+    public void setDriverClass(final String driverClass) {
+      this.driverClass = driverClass;
+    }
+
+    public String getUrl() {
+      return this.url;
+    }
+
+    public void setUrl(final String url) {
+      this.url = url;
+    }
+
+    public String getUsername() {
+      return this.username;
+    }
+
+    public void setUsername(final String username) {
+      this.username = username;
+    }
+
+    public String getPassword() {
+      return this.password;
+    }
+
+    public void setPassword(final String password) {
+      this.password = password;
+    }
+  }
+}
diff --git a/src/main/java/io/mifos/core/data/jpa/local/LocalRoutingDataSource.java b/src/main/java/io/mifos/core/data/jpa/local/LocalRoutingDataSource.java
new file mode 100644
index 0000000..c2f07a4
--- /dev/null
+++ b/src/main/java/io/mifos/core/data/jpa/local/LocalRoutingDataSource.java
@@ -0,0 +1,135 @@
+/*
+ * Copyright 2017 The Mifos Initiative.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package io.mifos.core.data.jpa.local;
+
+import io.mifos.core.data.jpa.core.MigrationHelper;
+import io.mifos.core.data.jpa.local.repository.DataSourceInstance;
+import io.mifos.core.lang.TenantContextHolder;
+import org.apache.commons.dbcp2.BasicDataSource;
+import org.slf4j.Logger;
+import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
+
+import javax.annotation.PostConstruct;
+import javax.sql.DataSource;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+public class LocalRoutingDataSource extends AbstractRoutingDataSource {
+
+  private final Logger logger;
+  private final LocalDatabaseProperties localDatabaseProperties;
+  private final Map<String, DataSource> cachedDataSources = new ConcurrentHashMap<>();
+  private BasicDataSource managementDataSource;
+
+  LocalRoutingDataSource(final Logger logger,
+                         final LocalDatabaseProperties localDatabaseProperties) {
+    super();
+    this.logger = logger;
+    this.localDatabaseProperties = localDatabaseProperties;
+  }
+
+  private DataSource getManagementDataSource() {
+    if (this.managementDataSource == null) {
+      this.logger.debug("Creating management data source.");
+      this.managementDataSource = new BasicDataSource();
+      this.managementDataSource.setDriverClassName(this.localDatabaseProperties.getManagement().getDriverClass());
+      this.managementDataSource.setUrl(this.localDatabaseProperties.getManagement().getUrl());
+
+      final String username = this.localDatabaseProperties.getManagement().getUsername();
+      if (username != null) {
+        this.managementDataSource.setUsername(username);
+      }
+
+      final String password = this.localDatabaseProperties.getManagement().getPassword();
+      if (password != null) {
+        this.managementDataSource.setPassword(password);
+      }
+
+      this.managementDataSource.setInitialSize(this.localDatabaseProperties.getPool().getMinSize());
+      this.managementDataSource.setMaxTotal(this.localDatabaseProperties.getPool().getMaxSize());
+      this.managementDataSource.setMaxWaitMillis(this.localDatabaseProperties.getPool().getWaitTime());
+    }
+    this.logger.debug("Providing management data source.");
+    return this.managementDataSource;
+  }
+
+  @Override
+  protected Object determineCurrentLookupKey() {
+    return TenantContextHolder.identifier().orElse(null);
+  }
+
+  @Override
+  protected DataSource determineTargetDataSource() {
+    final Object dataSourceIdentifier = this.determineCurrentLookupKey();
+    if (dataSourceIdentifier == null) {
+      return this.getManagementDataSource();
+    }
+
+    final String dataSourceIdentifierAsString = dataSourceIdentifier.toString();
+
+    this.cachedDataSources.computeIfAbsent(dataSourceIdentifierAsString, s -> {
+      this.logger.debug("Creating data source for '{}'.", dataSourceIdentifierAsString);
+      final DataSourceInstance dataSourceInstanceDetails = this.findDataSourceInstanceDetails(s);
+      final BasicDataSource basicDataSource = new BasicDataSource();
+      basicDataSource.setDriverClassName(dataSourceInstanceDetails.getDriverClass());
+      basicDataSource.setUrl(dataSourceInstanceDetails.getJdbcUrl());
+      basicDataSource.setUsername(dataSourceInstanceDetails.getUsername());
+      basicDataSource.setPassword(dataSourceInstanceDetails.getPassword());
+
+      basicDataSource.setInitialSize(this.localDatabaseProperties.getPool().getMinSize());
+      basicDataSource.setMaxTotal(this.localDatabaseProperties.getPool().getMaxSize());
+      basicDataSource.setMaxWaitMillis(this.localDatabaseProperties.getPool().getWaitTime());
+      return basicDataSource;
+    });
+    this.logger.debug("Providing data source for '{}'.", dataSourceIdentifierAsString);
+    return this.cachedDataSources.get(dataSourceIdentifierAsString);
+  }
+
+  private DataSourceInstance findDataSourceInstanceDetails(final String dataSourceIdentifier) {
+    this.logger.debug("Fetching data source details for '{}'.", dataSourceIdentifier);
+    final String query = "SELECT driver_class, jdbc_url, username, password FROM data_source_instances WHERE identifier = ? ";
+    final DataSource managementDataSource = this.getManagementDataSource();
+    try (
+        final Connection conn = managementDataSource.getConnection();
+        final PreparedStatement pstmt = conn.prepareCall(query)) {
+      pstmt.setString(1, dataSourceIdentifier);
+      try (final ResultSet rset = pstmt.executeQuery()) {
+        if (rset.next()) {
+          final DataSourceInstance dataSourceInstance = new DataSourceInstance();
+          dataSourceInstance.setDriverClass(rset.getString(1));
+          dataSourceInstance.setJdbcUrl(rset.getString(2));
+          dataSourceInstance.setUsername(rset.getString(3));
+          dataSourceInstance.setPassword(rset.getString(4));
+          return dataSourceInstance;
+        }
+      } catch (final SQLException sqlex) {
+        throw new IllegalStateException(sqlex.getMessage());
+      }
+    } catch (final SQLException sqlex) {
+      throw new IllegalStateException(sqlex.getMessage());
+    }
+    throw new IllegalStateException("No data source instance found for identifier '" + dataSourceIdentifier + "'.");
+  }
+
+  @PostConstruct
+  public void init() throws Exception {
+    MigrationHelper.execute(this.getManagementDataSource(), "db/changelog/db.changelog-local.yml");
+  }
+}
diff --git a/src/main/java/io/mifos/core/data/jpa/local/repository/DataSourceInstance.java b/src/main/java/io/mifos/core/data/jpa/local/repository/DataSourceInstance.java
new file mode 100644
index 0000000..67d9c5a
--- /dev/null
+++ b/src/main/java/io/mifos/core/data/jpa/local/repository/DataSourceInstance.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright 2017 The Mifos Initiative.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package io.mifos.core.data.jpa.local.repository;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "data_source_instances")
+public class DataSourceInstance {
+
+  @Id
+  @Column(name = "identifier")
+  private String identifier;
+  @Column(name = "driver_class")
+  private String driverClass;
+  @Column(name = "jdbc_url")
+  private String jdbcUrl;
+  @Column(name = "username")
+  private String username;
+  @Column(name = "password")
+  private String password;
+
+  public DataSourceInstance() {
+    super();
+  }
+
+  public String getIdentifier() {
+    return this.identifier;
+  }
+
+  public void setIdentifier(final String identifier) {
+    this.identifier = identifier;
+  }
+
+  public String getDriverClass() {
+    return this.driverClass;
+  }
+
+  public void setDriverClass(final String driverClass) {
+    this.driverClass = driverClass;
+  }
+
+  public String getJdbcUrl() {
+    return this.jdbcUrl;
+  }
+
+  public void setJdbcUrl(final String jdbcUrl) {
+    this.jdbcUrl = jdbcUrl;
+  }
+
+  public String getUsername() {
+    return this.username;
+  }
+
+  public void setUsername(final String username) {
+    this.username = username;
+  }
+
+  public String getPassword() {
+    return this.password;
+  }
+
+  public void setPassword(final String password) {
+    this.password = password;
+  }
+}
diff --git a/src/main/java/io/mifos/core/data/jpa/local/repository/DataSourceInstanceRepository.java b/src/main/java/io/mifos/core/data/jpa/local/repository/DataSourceInstanceRepository.java
new file mode 100644
index 0000000..26934ba
--- /dev/null
+++ b/src/main/java/io/mifos/core/data/jpa/local/repository/DataSourceInstanceRepository.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright 2017 The Mifos Initiative.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package io.mifos.core.data.jpa.local.repository;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface DataSourceInstanceRepository extends JpaRepository<DataSourceInstance, String> {
+}
diff --git a/src/main/resources/db/changelog/db.changelog-local.yml b/src/main/resources/db/changelog/db.changelog-local.yml
new file mode 100644
index 0000000..5927b73
--- /dev/null
+++ b/src/main/resources/db/changelog/db.changelog-local.yml
@@ -0,0 +1,46 @@
+#
+# Copyright 2017 The Mifos Initiative.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#    http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+databaseChangeLog:
+  - changeSet:
+      id: 1.0.0
+      author: mage
+      changes:
+        - createTable:
+            tableName: data_source_instances
+            columns:
+              - column:
+                  name: identifier
+                  type: varchar(32)
+                  constraints:
+                    primaryKey: true
+                    nullable: false
+              - column:
+                  name: driver_class
+                  type: varchar(255)
+                  constraints:
+                    nullable: false
+              - column:
+                  name: jdbc_url
+                  type: varchar(255)
+                  constraints:
+                    nullable: false
+              - column:
+                  name: username
+                  type: varchar(255)
+              - column:
+                  name: password
+                  type: varchar(255)
diff --git a/src/test/java/io/mifos/core/data/jpa/TestDataJpa.java b/src/test/java/io/mifos/core/data/jpa/TestDataJpa.java
new file mode 100644
index 0000000..f336582
--- /dev/null
+++ b/src/test/java/io/mifos/core/data/jpa/TestDataJpa.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2017 The Mifos Initiative.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package io.mifos.core.data.jpa;
+
+import io.mifos.core.data.jpa.local.repository.DataSourceInstance;
+import io.mifos.core.data.jpa.local.repository.DataSourceInstanceRepository;
+import io.mifos.core.lang.AutoTenantContext;
+import io.mifos.core.lang.TenantContextHolder;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.context.ActiveProfiles;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import java.util.UUID;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = {
+    TestDataJpa.TestConfiguration.class
+})
+@ActiveProfiles({"local"})
+public class TestDataJpa {
+
+  @SuppressWarnings("SpringJavaAutowiringInspection")
+  @Autowired
+  private DataSourceInstanceRepository dataSourceInstanceRepository;
+
+  public TestDataJpa() {
+    super();
+  }
+
+  @Test
+  public void testLocalDataBase() {
+    final DataSourceInstance dataSourceInstance = new DataSourceInstance();
+    final String randomIdentifier = UUID.randomUUID().toString().replace("-", "");
+    dataSourceInstance.setIdentifier(randomIdentifier);
+    dataSourceInstance.setDriverClass("org.hsqldb.jdbc.JDBCDriver");
+    dataSourceInstance.setJdbcUrl("jdbc:hsqldb:mem:test");
+    dataSourceInstance.setUsername("SA");
+
+    this.dataSourceInstanceRepository.save(dataSourceInstance);
+    Assert.assertNotNull(this.dataSourceInstanceRepository.findOne(randomIdentifier));
+
+    try (final AutoTenantContext autoTenantContext = new AutoTenantContext(randomIdentifier)) {
+      this.dataSourceInstanceRepository.findOne(randomIdentifier);
+      Assert.fail();
+    } catch (final Exception ex) {
+      // do nothing expected
+    }
+  }
+
+  @Configuration
+  @EnableJpa
+  public static class TestConfiguration {
+    public TestConfiguration() {
+    }
+  }
+}
diff --git a/src/test/java/io/mifos/core/data/jpa/TestVersionComparator.java b/src/test/java/io/mifos/core/data/jpa/TestVersionComparator.java
new file mode 100644
index 0000000..9085772
--- /dev/null
+++ b/src/test/java/io/mifos/core/data/jpa/TestVersionComparator.java
@@ -0,0 +1,125 @@
+/*
+ * Copyright 2017 The Mifos Initiative.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package io.mifos.core.data.jpa;
+
+import io.mifos.core.data.jpa.core.VersionComparator;
+import liquibase.changelog.ChangeSet;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Optional;
+
+public class TestVersionComparator {
+
+  public TestVersionComparator() {
+    super();
+  }
+
+  @Test
+  public void shouldCompareVersionEquals() throws Exception {
+    final ChangeSet firstChangeSet = new ChangeSet("1.2.3", null, false, false, null, null, null, null);
+    final ChangeSet secondChangeSet = new ChangeSet("1.2.3", null, false, false, null, null, null, null);
+
+    Assert.assertEquals(0, VersionComparator.compare(firstChangeSet, secondChangeSet));
+  }
+
+  @Test
+  public void shouldCompareVersionGreaterMajorFirst() throws Exception {
+    final ChangeSet firstChangeSet = new ChangeSet("2.2.3", null, false, false, null, null, null, null);
+    final ChangeSet secondChangeSet = new ChangeSet("1.2.3", null, false, false, null, null, null, null);
+
+    Assert.assertEquals(1, VersionComparator.compare(firstChangeSet, secondChangeSet));
+  }
+
+  @Test
+  public void shouldCompareVersionGreaterMajorSecond() throws Exception {
+    final ChangeSet firstChangeSet = new ChangeSet("1.2.3", null, false, false, null, null, null, null);
+    final ChangeSet secondChangeSet = new ChangeSet("2.2.3", null, false, false, null, null, null, null);
+
+    Assert.assertEquals(-1, VersionComparator.compare(firstChangeSet, secondChangeSet));
+  }
+
+  @Test
+  public void shouldCompareVersionGreaterMinorFirst() throws Exception {
+    final ChangeSet firstChangeSet = new ChangeSet("1.3.3", null, false, false, null, null, null, null);
+    final ChangeSet secondChangeSet = new ChangeSet("1.2.3", null, false, false, null, null, null, null);
+
+    Assert.assertEquals(1, VersionComparator.compare(firstChangeSet, secondChangeSet));
+  }
+
+  @Test
+  public void shouldCompareVersionGreaterMinorSecond() throws Exception {
+    final ChangeSet firstChangeSet = new ChangeSet("1.2.3", null, false, false, null, null, null, null);
+    final ChangeSet secondChangeSet = new ChangeSet("1.3.3", null, false, false, null, null, null, null);
+
+    Assert.assertEquals(-1, VersionComparator.compare(firstChangeSet, secondChangeSet));
+  }
+
+  @Test
+  public void shouldCompareVersionGreaterFixFirst() throws Exception {
+    final ChangeSet firstChangeSet = new ChangeSet("1.2.4", null, false, false, null, null, null, null);
+    final ChangeSet secondChangeSet = new ChangeSet("1.2.3", null, false, false, null, null, null, null);
+
+    Assert.assertEquals(1, VersionComparator.compare(firstChangeSet, secondChangeSet));
+  }
+
+  @Test
+  public void shouldCompareVersionGreaterFixSecond() throws Exception {
+    final ChangeSet firstChangeSet = new ChangeSet("1.2.3", null, false, false, null, null, null, null);
+    final ChangeSet secondChangeSet = new ChangeSet("1.2.4", null, false, false, null, null, null, null);
+
+    Assert.assertEquals(-1, VersionComparator.compare(firstChangeSet, secondChangeSet));
+  }
+
+  @Test
+  public void shouldCompareVersionUnevenLengthFixFirst() throws Exception {
+    final ChangeSet firstChangeSet = new ChangeSet("1.2.1", null, false, false, null, null, null, null);
+    final ChangeSet secondChangeSet = new ChangeSet("1.2", null, false, false, null, null, null, null);
+
+    Assert.assertEquals(1, VersionComparator.compare(firstChangeSet, secondChangeSet));
+  }
+
+  @Test
+  public void shouldCompareVersionUnevenLengthFixSecond() throws Exception {
+    final ChangeSet firstChangeSet = new ChangeSet("1.2", null, false, false, null, null, null, null);
+    final ChangeSet secondChangeSet = new ChangeSet("1.2.1", null, false, false, null, null, null, null);
+
+    Assert.assertEquals(-1, VersionComparator.compare(firstChangeSet, secondChangeSet));
+  }
+
+  @Test
+  public void shouldFindLatestVersion() throws Exception {
+    String latestVersion = "2.5.0";
+    final List<ChangeSet> versions = Arrays.asList(
+        new ChangeSet("1.0.0", null, false, false, null, null, null, null),
+        new ChangeSet("2.3.1", null, false, false, null, null, null, null),
+        new ChangeSet("1.2.4", null, false, false, null, null, null, null),
+        new ChangeSet(latestVersion, null, false, false, null, null, null, null),
+        new ChangeSet("1.7.5", null, false, false, null, null, null, null),
+        new ChangeSet("2.4.7", null, false, false, null, null, null, null),
+        new ChangeSet("1.5.9", null, false, false, null, null, null, null)
+    );
+
+    final Optional<ChangeSet> changeSet = versions.stream().max(VersionComparator::compare);
+    if (changeSet.isPresent()) {
+      Assert.assertEquals(latestVersion, changeSet.get().getId());
+    } else {
+      Assert.fail();
+    }
+  }
+}
diff --git a/src/test/resources/application-local.yml b/src/test/resources/application-local.yml
new file mode 100644
index 0000000..09e8691
--- /dev/null
+++ b/src/test/resources/application-local.yml
@@ -0,0 +1,29 @@
+#
+# Copyright 2017 The Mifos Initiative.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#    http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+database:
+  pool:
+    minSize: 5
+    maxSize: 20
+    waitTime: 60000
+  management:
+    driverClass: org.hsqldb.jdbc.JDBCDriver
+    url: jdbc:hsqldb:mem:seshat
+    username: SA
+    password:
+
+liquibase:
+  enabled: false
