diff --git a/NOTICE.txt b/NOTICE.txt
index 15413c9..df63679 100644
--- a/NOTICE.txt
+++ b/NOTICE.txt
@@ -1,5 +1,5 @@
 Apache Fineract CN Test
-Copyright [2017-2018] The Apache Software Foundation
+Copyright [2017-2019] The Apache Software Foundation
 
 This product includes software developed at
 The Apache Software Foundation (http://www.apache.org/).
\ No newline at end of file
diff --git a/README.md b/README.md
index ecd0a52..a79ae0b 100644
--- a/README.md
+++ b/README.md
@@ -7,13 +7,14 @@
 ### Runtime
 Install Java 8 as described at https://docs.oracle.com/javase/8/docs/technotes/guides/install/install_overview.html.
 
-### MariaDB
-Install MariaDB as described at https://mariadb.com/kb/en/mariadb/binary-packages/.
+### PostgreSQL
+Install PostgreSQL as described at
+https://www.digitalocean.com/community/tutorials/how-to-install-and-use-postgresql-on-ubuntu-16-04.
 
 After installation you need to create the meta database:
 
-    mysql -u root -pmysql
-    CREATE DATABASE IF NOT EXISTS system_console;
+    sudo -i -u postgres psql
+    CREATE DATABASE system_console;
     
 ### Cassandra
 Install Apache Cassandra as described at https://wiki.apache.org/cassandra/GettingStarted.
@@ -46,4 +47,4 @@
 1.3.5-RELEASE
 
 ## License
-See [LICENSE](LICENSE) file.
+See [LICENSE](LICENSE) file.
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
index faa83ee..fd76c3e 100644
--- a/build.gradle
+++ b/build.gradle
@@ -35,7 +35,6 @@
         gson                      : '2.5',
         findbugs                  : '3.0.1',
         frameworklang             : '0.1.0-BUILD-SNAPSHOT',
-        frameworkmariadb          : '0.1.0-BUILD-SNAPSHOT',
         frameworkcassandra        : '0.1.0-BUILD-SNAPSHOT'
 ]
 
@@ -63,11 +62,11 @@
             [group: 'org.springframework.boot', name: 'spring-boot-starter-test', version: versions.springboot],
             [group: 'com.google.code.gson', name: 'gson', version: versions.gson],
             [group: 'org.apache.fineract.cn', name: 'cassandra', version: versions.frameworkcassandra],
-            [group: 'org.apache.fineract.cn', name: 'mariadb', version: versions.frameworkmariadb],
+            [group: 'org.apache.fineract.cn', name: 'postgresql', version: '0.1.0-BUILD-SNAPSHOT'],
             [group: 'org.apache.fineract.cn', name: 'lang', version: versions.frameworklang],
             [group: 'io.jsonwebtoken', name: 'jjwt', version: '0.6.0'],
             [group: 'org.cassandraunit', name: 'cassandra-unit', version: '3.0.0.1'],
-            [group: 'ch.vorburger.mariaDB4j', name: 'mariaDB4j', version: '2.1.3'],
+            [group: 'com.opentable.components', name: 'otj-pg-embedded', version: '0.7.1']
     )
 }
 
@@ -106,4 +105,4 @@
             "gradlew.bat",
             "README.md"
     ]
-}
+}
\ No newline at end of file
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index ba3a06f..fe81d05 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
-#Tue Mar 14 11:47:51 CET 2017
+#Fri Jan 04 23:49:37 WAT 2019
 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
+distributionUrl=https\://services.gradle.org/distributions/gradle-3.4.1-all.zip
diff --git a/src/main/java/org/apache/fineract/cn/test/env/TestEnvironment.java b/src/main/java/org/apache/fineract/cn/test/env/TestEnvironment.java
index bcd0c35..be0414f 100644
--- a/src/main/java/org/apache/fineract/cn/test/env/TestEnvironment.java
+++ b/src/main/java/org/apache/fineract/cn/test/env/TestEnvironment.java
@@ -59,23 +59,24 @@
   public static final String CASSANDRA_CONSISTENCY_LEVEL_DELETE_PROPERTY = "cassandra.cl.delete";
   public static final String CASSANDRA_CONSISTENCY_LEVEL_DEFAULT = "ONE";
 
-  public static final String MARIADB_DRIVER_CLASS_PROPERTY = "mariadb.driverClass";
-  public static final String MARIADB_DRIVER_CLASS_DEFAULT = "org.mariadb.jdbc.Driver";
+  public static final String POSTGRESQL_DRIVER_CLASS_PROPERTY = "postgresql.driverClass";
+  public static final String POSTGRESQL_DRIVER_CLASS_DEFAULT = "org.postgresql.Driver";
 
-  public static final String MARIADB_DATABASE_NAME_PROPERTY = "mariadb.database";
-  public static final String MARIADB_DATABASE_NAME_DEFAULT = "seshat";
+  public static final String POSTGRESQL_DATABASE_NAME_PROPERTY = "postgresql.database";
+  public static final String POSTGRESQL_DATABASE_NAME_DEFAULT = "seshat";
 
-  public static final String MARIADB_HOST_PROPERTY = "mariadb.host";
-  public static final String MARIADB_HOST_DEFAULT = "localhost";
+  public static final String POSTGRESQL_HOST_PROPERTY = "postgresql.host";
+  public static final String POSTGRESQL_HOST_DEFAULT = "localhost";
 
-  public static final String MARIADB_PORT_PROPERTY = "mariadb.port";
-  public static final String MARIADB_PORT_DEFAULT = "3306";
+  public static final String POSTGRESQL_PORT_PROPERTY = "postgresql.port";
+  public static final String POSTGRESQL_PORT_DEFAULT = "5432";
 
-  public static final String MARIADB_USER_PROPERTY = "mariadb.user";
-  public static final String MARIADB_USER_DEFAULT = "root";
+  public static final String POSTGRESQL_USER_PROPERTY = "postgresql.user";
+  public static final String POSTGRESQL_USER_DEFAULT = "postgres";
 
-  public static final String MARIADB_PASSWORD_PROPERTY = "mariadb.password";
-  public static final String MARIADB_PASSWORD_DEFAULT = "mysql";
+  // PostgreSQL does not require a password for authentication
+  public static final String POSTGRESQL_PASSWORD_PROPERTY = "postgresql.password";
+  public static final String POSTGRESQL_PASSWORD_DEFAULT = "postgres";
 
   public static final String SPRING_CLOUD_DISCOVERY_ENABLED_PROPERTY = "spring.cloud.discovery.enabled";
   public static final String SPRING_CLOUD_DISCOVERY_ENABLED_DEFAULT = "false";
@@ -131,12 +132,12 @@
     return this;
   }
 
-  public String generateUniqueIdentifer(final String prefix) {
-    return generateUniqueIdentifer(prefix, 1);
+  public String generateUniqueIdentifier(final String prefix) {
+    return generateUniqueIdentifier(prefix, 1);
   }
 
   //prefix followed by a positive number.
-  public String generateUniqueIdentifer(final String prefix, final int minimumDigitCount) {
+  public String generateUniqueIdentifier(final String prefix, final int minimumDigitCount) {
     uniquenessSuffix++;
     final String format = String.format("%%0%dd", minimumDigitCount);
     return prefix + String.format(format, uniquenessSuffix);
@@ -211,12 +212,12 @@
     this.properties.setProperty(CASSANDRA_CONSISTENCY_LEVEL_READ_PROPERTY, CASSANDRA_CONSISTENCY_LEVEL_DEFAULT);
     this.properties.setProperty(CASSANDRA_CONSISTENCY_LEVEL_WRITE_PROPERTY, CASSANDRA_CONSISTENCY_LEVEL_DEFAULT);
     this.properties.setProperty(CASSANDRA_CONSISTENCY_LEVEL_DELETE_PROPERTY, CASSANDRA_CONSISTENCY_LEVEL_DEFAULT);
-    this.properties.setProperty(MARIADB_DRIVER_CLASS_PROPERTY, MARIADB_DRIVER_CLASS_DEFAULT);
-    this.properties.setProperty(MARIADB_DATABASE_NAME_PROPERTY, MARIADB_DATABASE_NAME_DEFAULT);
-    this.properties.setProperty(MARIADB_HOST_PROPERTY, MARIADB_HOST_DEFAULT);
-    this.properties.setProperty(MARIADB_PORT_PROPERTY, MARIADB_PORT_DEFAULT);
-    this.properties.setProperty(MARIADB_USER_PROPERTY, MARIADB_USER_DEFAULT);
-    this.properties.setProperty(MARIADB_PASSWORD_PROPERTY, MARIADB_PASSWORD_DEFAULT);
+    this.properties.setProperty(POSTGRESQL_DRIVER_CLASS_PROPERTY, POSTGRESQL_DRIVER_CLASS_DEFAULT);
+    this.properties.setProperty(POSTGRESQL_DATABASE_NAME_PROPERTY, POSTGRESQL_DATABASE_NAME_DEFAULT);
+    this.properties.setProperty(POSTGRESQL_HOST_PROPERTY, POSTGRESQL_HOST_DEFAULT);
+    this.properties.setProperty(POSTGRESQL_PORT_PROPERTY, POSTGRESQL_PORT_DEFAULT);
+    this.properties.setProperty(POSTGRESQL_USER_PROPERTY, POSTGRESQL_USER_DEFAULT);
+    this.properties.setProperty(POSTGRESQL_PASSWORD_PROPERTY, POSTGRESQL_PASSWORD_DEFAULT);
     this.properties.setProperty(SPRING_CLOUD_DISCOVERY_ENABLED_PROPERTY, SPRING_CLOUD_DISCOVERY_ENABLED_DEFAULT);
     this.properties.setProperty(SPRING_CLOUD_CONFIG_ENABLED_PROPERTY, SPRING_CLOUD_CONFIG_ENABLED_DEFAULT);
     this.properties.setProperty(FLYWAY_ENABLED_PROPERTY, FLYWAY_ENABLED_DEFAULT);
diff --git a/src/main/java/org/apache/fineract/cn/test/fixture/mariadb/MariaDBInitializer.java b/src/main/java/org/apache/fineract/cn/test/fixture/mariadb/MariaDBInitializer.java
deleted file mode 100644
index 9b5de8d..0000000
--- a/src/main/java/org/apache/fineract/cn/test/fixture/mariadb/MariaDBInitializer.java
+++ /dev/null
@@ -1,166 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you 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 org.apache.fineract.cn.test.fixture.mariadb;
-
-import ch.vorburger.mariadb4j.DB;
-import org.apache.fineract.cn.test.env.TestEnvironment;
-import org.apache.fineract.cn.test.fixture.DataStoreTenantInitializer;
-
-import java.sql.*;
-import org.apache.fineract.cn.mariadb.util.JdbcUrlBuilder;
-
-@SuppressWarnings({"WeakerAccess", "unused", "SqlNoDataSourceInspection", "SqlDialectInspection"})
-public final class MariaDBInitializer extends DataStoreTenantInitializer {
-
-  private final boolean useExistingDB;
-  private static DB db;
-
-  public MariaDBInitializer() {
-    this(false);
-  }
-
-  public MariaDBInitializer(final boolean useExistingDB) {
-    super();
-    this.useExistingDB = useExistingDB;
-  }
-
-  @Override
-  public void initialize() throws Exception  {
-    MariaDBInitializer.setup(useExistingDB);
-  }
-
-  @Override
-  public void initializeTenant(final String tenantName) {
-    MariaDBInitializer.createDatabaseTenant(tenantName);
-
-  }
-
-  @Override
-  public void finish() {
-    if (!useExistingDB) {
-      try {
-        MariaDBInitializer.tearDown();
-      } catch (final Exception e) {
-        throw new RuntimeException(e);
-      }
-    }
-  }
-
-  public static void setup() throws Exception {
-    setup(false);
-  }
-  public static void setup(final boolean useExistingDB) throws Exception {
-    if (!useExistingDB) {
-      MariaDBInitializer.startEmbeddedMariaDB();
-      MariaDBInitializer.createDatabaseSeshat();
-    }
-  }
-
-  public static void tearDown() throws Exception {
-    if (MariaDBInitializer.db != null) {
-      MariaDBInitializer.db.stop();
-      MariaDBInitializer.db = null;
-    }
-  }
-
-  private static void startEmbeddedMariaDB() throws Exception {
-    if (MariaDBInitializer.db == null) {
-      MariaDBInitializer.db = DB.newEmbeddedDB(3306);
-      MariaDBInitializer.db.start();
-    }
-  }
-
-  private static void createDatabaseSeshat() {
-    try {
-      Class.forName(System.getProperty(TestEnvironment.MARIADB_DRIVER_CLASS_PROPERTY));
-    } catch (ClassNotFoundException ex) {
-      throw new IllegalArgumentException(ex.getMessage(), ex);
-    }
-    final String jdbcUrl = JdbcUrlBuilder
-        .create(JdbcUrlBuilder.DatabaseType.MARIADB)
-        .host(System.getProperty(TestEnvironment.MARIADB_HOST_PROPERTY))
-        .port(System.getProperty(TestEnvironment.MARIADB_PORT_PROPERTY))
-        .build();
-    try (final Connection connection = DriverManager.getConnection(jdbcUrl,
-        System.getProperty(TestEnvironment.MARIADB_USER_PROPERTY),
-        System.getProperty(TestEnvironment.MARIADB_PASSWORD_PROPERTY))) {
-      try (final Statement statement = connection.createStatement()) {
-        // create meta database seshat
-        statement.execute("CREATE DATABASE IF NOT EXISTS " + System.getProperty(TestEnvironment.MARIADB_DATABASE_NAME_PROPERTY));
-        statement.execute("USE " + System.getProperty(TestEnvironment.MARIADB_DATABASE_NAME_PROPERTY));
-        // create needed tenant management table
-        statement.execute("CREATE TABLE IF NOT EXISTS tenants (" +
-            "  identifier    VARCHAR(32) NOT NULL," +
-            "  driver_class  VARCHAR(255) NOT NULL," +
-            "  database_name VARCHAR(32) NOT NULL," +
-            "  host          VARCHAR(32) NOT NULL," +
-            "  port          VARCHAR(5)  NOT NULL," +
-            "  a_user        VARCHAR(32) NOT NULL," +
-            "  pwd           VARCHAR(32) NOT NULL," +
-            "  PRIMARY KEY (identifier)" +
-            ")");
-      }
-      connection.commit();
-    } catch (final SQLException ex) {
-      ex.printStackTrace();
-    }
-  }
-
-  public static void createDatabaseTenant(final String identifier) {
-    try {
-      Class.forName(System.getProperty(TestEnvironment.MARIADB_DRIVER_CLASS_PROPERTY));
-    } catch (ClassNotFoundException ex) {
-      throw new IllegalArgumentException(ex.getMessage(), ex);
-    }
-    final String jdbcUrl = JdbcUrlBuilder
-        .create(JdbcUrlBuilder.DatabaseType.MARIADB)
-        .host(System.getProperty(TestEnvironment.MARIADB_HOST_PROPERTY))
-        .port(System.getProperty(TestEnvironment.MARIADB_PORT_PROPERTY))
-        .build();
-    try (final Connection connection = DriverManager.getConnection(jdbcUrl,
-        System.getProperty(TestEnvironment.MARIADB_USER_PROPERTY),
-        System.getProperty(TestEnvironment.MARIADB_PASSWORD_PROPERTY))) {
-      try (final Statement statement = connection.createStatement()) {
-        // create tenant database
-        statement.execute("CREATE DATABASE IF NOT EXISTS " + identifier);
-        // insert tenant connection info in management table
-        try (final ResultSet resultSet = statement.executeQuery(
-            "SELECT EXISTS (SELECT * FROM " +
-                System.getProperty(TestEnvironment.MARIADB_DATABASE_NAME_PROPERTY) +
-                ".tenants WHERE identifier = '" + identifier + "')")) {
-          if (resultSet.next()
-              && resultSet.getInt(1) == 0) {
-            final MariaDBTenant mariaDBTenant = new MariaDBTenant();
-            mariaDBTenant.setIdentifier(identifier);
-            mariaDBTenant.setDriverClass(System.getProperty(TestEnvironment.MARIADB_DRIVER_CLASS_PROPERTY));
-            mariaDBTenant.setDatabaseName(identifier);
-            mariaDBTenant.setHost(System.getProperty(TestEnvironment.MARIADB_HOST_PROPERTY));
-            mariaDBTenant.setPort(System.getProperty(TestEnvironment.MARIADB_PORT_PROPERTY));
-            mariaDBTenant.setUser(System.getProperty(TestEnvironment.MARIADB_USER_PROPERTY));
-            mariaDBTenant.setPassword(System.getProperty(TestEnvironment.MARIADB_PASSWORD_PROPERTY));
-            mariaDBTenant.insert(connection);
-          }
-        }
-      }
-      connection.commit();
-    } catch (final SQLException ex) {
-      ex.printStackTrace();
-    }
-  }
-}
diff --git a/src/main/java/org/apache/fineract/cn/test/fixture/postgresql/PostgreSQLInitializer.java b/src/main/java/org/apache/fineract/cn/test/fixture/postgresql/PostgreSQLInitializer.java
new file mode 100644
index 0000000..d2e9bce
--- /dev/null
+++ b/src/main/java/org/apache/fineract/cn/test/fixture/postgresql/PostgreSQLInitializer.java
@@ -0,0 +1,161 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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 org.apache.fineract.cn.test.fixture.postgresql;
+
+import com.opentable.db.postgres.embedded.EmbeddedPostgres;
+import org.apache.fineract.cn.test.env.TestEnvironment;
+import org.apache.fineract.cn.test.fixture.DataStoreTenantInitializer;
+
+import java.sql.*;
+import org.apache.fineract.cn.postgresql.util.JdbcUrlBuilder;
+
+@SuppressWarnings({"WeakerAccess", "unused", "SqlNoDataSourceInspection", "SqlDialectInspection"})
+public final class PostgreSQLInitializer extends DataStoreTenantInitializer {
+
+  private final boolean useExistingDB;
+  private static EmbeddedPostgres pg;
+
+  public PostgreSQLInitializer() {
+    this(false);
+  }
+
+  public PostgreSQLInitializer(final boolean useExistingDB) {
+    super();
+    this.useExistingDB = useExistingDB;
+  }
+
+  @Override
+  public void initialize() throws Exception  {
+    PostgreSQLInitializer.setup(useExistingDB);
+  }
+
+  @Override
+  public void initializeTenant(final String tenantName) {
+    PostgreSQLInitializer.createDatabaseTenant(tenantName);
+
+  }
+
+  @Override
+  public void finish() {
+    if (!useExistingDB) {
+      try {
+        PostgreSQLInitializer.tearDown();
+      } catch (final Exception e) {
+        throw new RuntimeException(e);
+      }
+    }
+  }
+
+  public static void setup() throws Exception {
+    setup(false);
+  }
+  public static void setup(final boolean useExistingDB) throws Exception {
+    if (!useExistingDB) {
+      PostgreSQLInitializer.startEmbeddedPostgreSQL();
+      PostgreSQLInitializer.createDatabaseSeshat();
+    }
+  }
+
+  public static void tearDown() throws Exception {
+    if (PostgreSQLInitializer.pg != null) {
+      PostgreSQLInitializer.pg.close();
+      PostgreSQLInitializer.pg = null;
+    }
+  }
+
+  private static void startEmbeddedPostgreSQL() throws Exception {
+      PostgreSQLInitializer.pg = EmbeddedPostgres.start();
+  }
+
+  private static void createDatabaseSeshat() {
+    try {
+      Class.forName(System.getProperty(TestEnvironment.POSTGRESQL_DRIVER_CLASS_PROPERTY));
+    } catch (ClassNotFoundException ex) {
+      throw new IllegalArgumentException(ex.getMessage(), ex);
+    }
+    final String jdbcUrl = JdbcUrlBuilder
+        .create(JdbcUrlBuilder.DatabaseType.POSTGRESQL)
+        .host(System.getProperty(TestEnvironment.POSTGRESQL_HOST_PROPERTY))
+        .port(System.getProperty(TestEnvironment.POSTGRESQL_PORT_PROPERTY))
+        .build();
+    try (final Connection connection = PostgreSQLInitializer.pg.getPostgresDatabase().getConnection()) {
+      try (final Statement statement = connection.createStatement()) {
+        // create meta database seshat
+        statement.execute("CREATE DATABASE IF NOT EXISTS " + System.getProperty(TestEnvironment.POSTGRESQL_DATABASE_NAME_PROPERTY));
+        statement.execute("USE " + System.getProperty(TestEnvironment.POSTGRESQL_DATABASE_NAME_PROPERTY));
+        // create needed tenant management table
+        statement.execute("CREATE TABLE IF NOT EXISTS tenants (" +
+            "  identifier    VARCHAR(32) NOT NULL," +
+            "  driver_class  VARCHAR(255) NOT NULL," +
+            "  database_name VARCHAR(32) NOT NULL," +
+            "  host          VARCHAR(32) NOT NULL," +
+            "  port          VARCHAR(5)  NOT NULL," +
+            "  a_user        VARCHAR(32) NOT NULL," +
+            "  pwd           VARCHAR(32) NOT NULL," +
+            "  PRIMARY KEY (identifier)" +
+            ")");
+      }
+      connection.commit();
+    } catch (final SQLException ex) {
+      ex.printStackTrace();
+    }
+  }
+
+  public static void createDatabaseTenant(final String identifier) {
+    try {
+      Class.forName(System.getProperty(TestEnvironment.POSTGRESQL_DRIVER_CLASS_PROPERTY));
+    } catch (ClassNotFoundException ex) {
+      throw new IllegalArgumentException(ex.getMessage(), ex);
+    }
+    final String jdbcUrl = JdbcUrlBuilder
+        .create(JdbcUrlBuilder.DatabaseType.POSTGRESQL)
+        .host(System.getProperty(TestEnvironment.POSTGRESQL_HOST_PROPERTY))
+        .port(System.getProperty(TestEnvironment.POSTGRESQL_PORT_PROPERTY))
+        .build();
+    try (final Connection connection = DriverManager.getConnection(jdbcUrl,
+        System.getProperty(TestEnvironment.POSTGRESQL_USER_PROPERTY),
+        System.getProperty(TestEnvironment.POSTGRESQL_PASSWORD_PROPERTY))) {
+      try (final Statement statement = connection.createStatement()) {
+        // create tenant database
+        statement.execute("CREATE DATABASE IF NOT EXISTS " + identifier);
+        // insert tenant connection info in management table
+        try (final ResultSet resultSet = statement.executeQuery(
+            "SELECT EXISTS (SELECT * FROM " +
+                System.getProperty(TestEnvironment.POSTGRESQL_DATABASE_NAME_PROPERTY) +
+                ".tenants WHERE identifier = '" + identifier + "')")) {
+          if (resultSet.next()
+              && resultSet.getInt(1) == 0) {
+            final PostgreSQLTenant postgreSQLTenant = new PostgreSQLTenant();
+            postgreSQLTenant.setIdentifier(identifier);
+            postgreSQLTenant.setDriverClass(System.getProperty(TestEnvironment.POSTGRESQL_DRIVER_CLASS_PROPERTY));
+            postgreSQLTenant.setDatabaseName(identifier);
+            postgreSQLTenant.setHost(System.getProperty(TestEnvironment.POSTGRESQL_HOST_PROPERTY));
+            postgreSQLTenant.setPort(System.getProperty(TestEnvironment.POSTGRESQL_PORT_PROPERTY));
+            postgreSQLTenant.setUser(System.getProperty(TestEnvironment.POSTGRESQL_USER_PROPERTY));
+            postgreSQLTenant.setPassword(System.getProperty(TestEnvironment.POSTGRESQL_PASSWORD_PROPERTY));
+            postgreSQLTenant.insert(connection);
+          }
+        }
+      }
+      connection.commit();
+    } catch (final SQLException ex) {
+      ex.printStackTrace();
+    }
+  }
+}
\ No newline at end of file
diff --git a/src/main/java/org/apache/fineract/cn/test/fixture/mariadb/MariaDBTenant.java b/src/main/java/org/apache/fineract/cn/test/fixture/postgresql/PostgreSQLTenant.java
similarity index 91%
rename from src/main/java/org/apache/fineract/cn/test/fixture/mariadb/MariaDBTenant.java
rename to src/main/java/org/apache/fineract/cn/test/fixture/postgresql/PostgreSQLTenant.java
index 6cf8b16..ab5f8d2 100644
--- a/src/main/java/org/apache/fineract/cn/test/fixture/mariadb/MariaDBTenant.java
+++ b/src/main/java/org/apache/fineract/cn/test/fixture/postgresql/PostgreSQLTenant.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.fineract.cn.test.fixture.mariadb;
+package org.apache.fineract.cn.test.fixture.postgresql;
 
 import org.apache.fineract.cn.test.env.TestEnvironment;
 
@@ -25,7 +25,7 @@
 import java.sql.SQLException;
 
 @SuppressWarnings({"SqlNoDataSourceInspection", "SqlDialectInspection", "WeakerAccess"})
-class MariaDBTenant {
+class PostgreSQLTenant {
 
   private static final int INDEX_IDENTIFIER = 1;
   private static final int INDEX_DRIVER_CLASS = 2;
@@ -35,12 +35,12 @@
   private static final int INDEX_USER = 6;
   private static final int INDEX_PASSWORD = 7;
 
-  private static final String TABLE_NAME = System.getProperty(TestEnvironment.MARIADB_DATABASE_NAME_PROPERTY) + ".tenants";
+  private static final String TABLE_NAME = System.getProperty(TestEnvironment.POSTGRESQL_DATABASE_NAME_PROPERTY) + ".tenants";
   private static final String INSERT_STMT = " INSERT INTO " +
-      MariaDBTenant.TABLE_NAME +
-      " (identifier, driver_class, database_name, host, port, a_user, pwd) " +
+      PostgreSQLTenant.TABLE_NAME +
+      " (identifier, driver_class, database_name, host, port, a_user) " +
       " values " +
-      " (?, ?, ?, ?, ?, ?, ?) ";
+      " (?, ?, ?, ?, ?, ?) ";
 
   private String identifier;
   private String driverClass;
@@ -50,12 +50,12 @@
   private String user;
   private String password;
 
-  MariaDBTenant() {
+  PostgreSQLTenant() {
     super();
   }
 
   void insert(final Connection connection) throws SQLException {
-    try (final PreparedStatement insertTenantStatement = connection.prepareStatement(MariaDBTenant.INSERT_STMT)) {
+    try (final PreparedStatement insertTenantStatement = connection.prepareStatement(PostgreSQLTenant.INSERT_STMT)) {
       insertTenantStatement.setString(INDEX_IDENTIFIER, this.getIdentifier());
       insertTenantStatement.setString(INDEX_DRIVER_CLASS, this.getDriverClass());
       insertTenantStatement.setString(INDEX_DATABASE_NAME, this.getDatabaseName());
diff --git a/src/test/java/org/apache/fineract/cn/test/env/TestEnvironmentTest.java b/src/test/java/org/apache/fineract/cn/test/env/TestEnvironmentTest.java
index 78740dd..4448613 100644
--- a/src/test/java/org/apache/fineract/cn/test/env/TestEnvironmentTest.java
+++ b/src/test/java/org/apache/fineract/cn/test/env/TestEnvironmentTest.java
@@ -42,8 +42,8 @@
   @Test
   public void shouldGenerateUniqueId() {
     final TestEnvironment testEnvironment = new TestEnvironment("fineract-cn-core");
-    final String uniqueId = testEnvironment.generateUniqueIdentifer(UNIQUE_ID_PREFIX);
-    final String uniqueId2 = testEnvironment.generateUniqueIdentifer(UNIQUE_ID_PREFIX);
+    final String uniqueId = testEnvironment.generateUniqueIdentifier(UNIQUE_ID_PREFIX);
+    final String uniqueId2 = testEnvironment.generateUniqueIdentifier(UNIQUE_ID_PREFIX);
     Assert.assertNotEquals(uniqueId, uniqueId2);
     Assert.assertTrue(uniqueId.startsWith(UNIQUE_ID_PREFIX));
     Assert.assertTrue(uniqueId2.startsWith(UNIQUE_ID_PREFIX));
@@ -52,7 +52,7 @@
   @Test
   public void shouldGenerateZeroBufferedUniqueId() {
     final TestEnvironment testEnvironment = new TestEnvironment("fineract-cn-core");
-    final String uniqueId = testEnvironment.generateUniqueIdentifer(UNIQUE_ID_PREFIX, 5);
+    final String uniqueId = testEnvironment.generateUniqueIdentifier(UNIQUE_ID_PREFIX, 5);
     Assert.assertTrue(uniqueId.startsWith(UNIQUE_ID_PREFIX));
     Assert.assertEquals(uniqueId.length() - UNIQUE_ID_PREFIX.length(), 5);
   }
