diff --git a/modules/commons/src/main/java/org/apache/airavata/common/utils/JPAUtils.java b/modules/commons/src/main/java/org/apache/airavata/common/utils/JPAUtils.java
index 64395ff..03b5583 100644
--- a/modules/commons/src/main/java/org/apache/airavata/common/utils/JPAUtils.java
+++ b/modules/commons/src/main/java/org/apache/airavata/common/utils/JPAUtils.java
@@ -3,12 +3,24 @@
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.function.Supplier;
 
+import javax.persistence.Cache;
+// import javax.persistence.EntityGraph;
+import javax.persistence.EntityManager;
 import javax.persistence.EntityManagerFactory;
 import javax.persistence.Persistence;
+import javax.persistence.PersistenceUnitUtil;
+// import javax.persistence.Query;
+// import javax.persistence.SynchronizationType;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.metamodel.Metamodel;
 
 import org.apache.openjpa.jdbc.conf.JDBCConfiguration;
 import org.apache.openjpa.jdbc.conf.JDBCConfigurationImpl;
+import org.apache.openjpa.jdbc.meta.MappingTool;
+import org.apache.openjpa.lib.util.Options;
+import org.apache.openjpa.persistence.ArgumentException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -17,6 +29,122 @@
  */
 public class JPAUtils {
 
+    private static class EntityManagerFactoryWrapper implements EntityManagerFactory {
+
+        private final EntityManagerFactory factory;
+        private final JDBCConfig jdbcConfig;
+
+        EntityManagerFactoryWrapper(EntityManagerFactory factory, JDBCConfig jdbcConfig) {
+            this.factory = factory;
+            this.jdbcConfig = jdbcConfig;
+        }
+
+        @Override
+        public EntityManager createEntityManager() {
+            return wrapCreateEntityManager(() -> this.factory.createEntityManager());
+        }
+
+        @Override
+        public EntityManager createEntityManager(Map map) {
+            return wrapCreateEntityManager(() -> this.factory.createEntityManager(map));
+        }
+
+        // @Override
+        // public EntityManager createEntityManager(SynchronizationType synchronizationType) {
+        //     return wrapCreateEntityManager(() -> this.factory.createEntityManager(synchronizationType));
+        // }
+
+        // @Override
+        // public EntityManager createEntityManager(SynchronizationType synchronizationType, Map map) {
+        //     return wrapCreateEntityManager(() -> this.factory.createEntityManager(synchronizationType, map));
+        // }
+
+        private EntityManager wrapCreateEntityManager(Supplier<EntityManager> entityManagerSupplier) {
+
+            try {
+                return entityManagerSupplier.get();
+            } catch (ArgumentException e) {
+
+                Map<String, String> finalProperties = new HashMap<>(JPAUtils.DEFAULT_ENTITY_MANAGER_FACTORY_PROPERTIES);
+                finalProperties.putAll(JPAUtils.createConnectionProperties(this.jdbcConfig));
+                JDBCConfiguration jdbcConfiguration = new JDBCConfigurationImpl();
+                jdbcConfiguration.fromProperties(finalProperties);
+
+                Options options = new Options();
+                options.put("sqlFile", "migration.sql");
+                // If you want to generate the entire schema instead of just what is
+                // needed to bring the database up to date, use schemaAction=build
+                // options.put("schemaAction", "build");
+                options.put("foreignKeys", "true");
+                options.put("indexes", "true");
+                options.put("primaryKeys", "true");
+                try {
+                    MappingTool.run(jdbcConfiguration, new String[] {}, options, null);
+                } catch (Exception mappingToolEx) {
+                    logger.error("Failed to run MappingTool", mappingToolEx);
+                    throw new RuntimeException(
+                            "Failed to get EntityManager, then failed to run MappingTool to generate migration script",
+                            e);
+                }
+                throw new RuntimeException("Failed to get EntityManager, but successfully executed "
+                        + "MappingTool to generate migration script (to file named "
+                        + "migration.sql) in case the error was caused by the database "
+                        + "schema being out of date with the mappings", e);
+            }
+        }
+
+        @Override
+        public CriteriaBuilder getCriteriaBuilder() {
+            return this.factory.getCriteriaBuilder();
+        }
+
+        @Override
+        public Metamodel getMetamodel() {
+            return this.factory.getMetamodel();
+        }
+
+        @Override
+        public boolean isOpen() {
+            return this.factory.isOpen();
+        }
+
+        @Override
+        public void close() {
+            this.factory.close();
+        }
+
+        @Override
+        public Map<String, Object> getProperties() {
+            return this.factory.getProperties();
+        }
+
+        @Override
+        public Cache getCache() {
+            return this.factory.getCache();
+        }
+
+        @Override
+        public PersistenceUnitUtil getPersistenceUnitUtil() {
+            return this.factory.getPersistenceUnitUtil();
+        }
+
+        // @Override
+        // public void addNamedQuery(String name, Query query) {
+        //     this.factory.addNamedQuery(name, query);
+        // }
+
+        // @Override
+        // public <T> T unwrap(Class<T> cls) {
+        //     return this.factory.unwrap(cls);
+        // }
+
+        // @Override
+        // public <T> void addNamedEntityGraph(String graphName, EntityGraph<T> entityGraph) {
+        //     this.factory.addNamedEntityGraph(graphName, entityGraph);
+        // }
+
+    }
+
     private final static Logger logger = LoggerFactory.getLogger(JPAUtils.class);
     private final static Map<String, String> DEFAULT_ENTITY_MANAGER_FACTORY_PROPERTIES;
     static {
@@ -27,7 +155,8 @@
         properties.put("openjpa.RemoteCommitProvider", "sjvm");
         properties.put("openjpa.Log", "DefaultLevel=INFO, Runtime=INFO, Tool=INFO, SQL=INFO");
         // use the following to enable logging of all SQL statements
-        // properties.put("openjpa.Log", "DefaultLevel=INFO, Runtime=INFO, Tool=INFO, SQL=TRACE");
+        // properties.put("openjpa.Log", "DefaultLevel=INFO, Runtime=INFO, Tool=INFO,
+        // SQL=TRACE");
         properties.put("openjpa.jdbc.SynchronizeMappings", "validate");
         properties.put("openjpa.jdbc.QuerySQLCache", "false");
         properties.put("openjpa.DetachState", "all");
@@ -38,37 +167,33 @@
 
     /**
      * Create an {@link EntityManagerFactory} with the default settings.
+     * 
      * @param persistenceUnitName
      * @param jdbcConfig
      * @return {@link EntityManagerFactory}
      */
-    public static EntityManagerFactory getEntityManagerFactory(String persistenceUnitName, JDBCConfig jdbcConfig){
+    public static EntityManagerFactory getEntityManagerFactory(String persistenceUnitName, JDBCConfig jdbcConfig) {
 
         return getEntityManagerFactory(persistenceUnitName, jdbcConfig, Collections.emptyMap());
     }
 
     /**
-     * Create an {@link EntityManagerFactory}. The given properties will override the default properties.
+     * Create an {@link EntityManagerFactory}. The given properties will override
+     * the default properties.
+     * 
      * @param persistenceUnitName
      * @param jdbcConfig
      * @param properties
      * @return {@link EntityManagerFactory}
      */
-    public static EntityManagerFactory getEntityManagerFactory(String persistenceUnitName, JDBCConfig jdbcConfig, Map<String, String> properties) {
+    public static EntityManagerFactory getEntityManagerFactory(String persistenceUnitName, JDBCConfig jdbcConfig,
+            Map<String, String> properties) {
 
         Map<String, String> finalProperties = new HashMap<>(DEFAULT_ENTITY_MANAGER_FACTORY_PROPERTIES);
         finalProperties.putAll(createConnectionProperties(jdbcConfig));
         finalProperties.putAll(properties);
-        return Persistence.createEntityManagerFactory(persistenceUnitName, finalProperties);
-    }
-
-    public static JDBCConfiguration getJDBCConfiguration(JDBCConfig jdbcConfig) {
-
-        Map<String, String> finalProperties = new HashMap<>(DEFAULT_ENTITY_MANAGER_FACTORY_PROPERTIES);
-        finalProperties.putAll(createConnectionProperties(jdbcConfig));
-        JDBCConfiguration jdbcConfiguration = new JDBCConfigurationImpl();
-        jdbcConfiguration.fromProperties(finalProperties);
-        return jdbcConfiguration;
+        return new EntityManagerFactoryWrapper(
+                Persistence.createEntityManagerFactory(persistenceUnitName, finalProperties), jdbcConfig);
     }
 
     private static Map<String, String> createConnectionProperties(JDBCConfig jdbcConfig) {
diff --git a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/utils/JPAUtil/AppCatalogJPAUtils.java b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/utils/JPAUtil/AppCatalogJPAUtils.java
index 77ea71f..236b095 100644
--- a/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/utils/JPAUtil/AppCatalogJPAUtils.java
+++ b/modules/registry/registry-core/src/main/java/org/apache/airavata/registry/core/utils/JPAUtil/AppCatalogJPAUtils.java
@@ -25,12 +25,6 @@
 import org.apache.airavata.common.utils.JDBCConfig;
 import org.apache.airavata.common.utils.JPAUtils;
 import org.apache.airavata.registry.core.utils.AppCatalogJDBCConfig;
-import org.apache.openjpa.jdbc.conf.JDBCConfiguration;
-import org.apache.openjpa.jdbc.meta.MappingTool;
-import org.apache.openjpa.lib.util.Options;
-import org.apache.openjpa.persistence.ArgumentException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 public class AppCatalogJPAUtils {
 
@@ -40,29 +34,8 @@
     private static final JDBCConfig JDBC_CONFIG = new AppCatalogJDBCConfig();
     private static final EntityManagerFactory factory = JPAUtils.getEntityManagerFactory(PERSISTENCE_UNIT_NAME,
             JDBC_CONFIG);
-    private static final Logger logger = LoggerFactory.getLogger(AppCatalogJPAUtils.class);
 
     public static EntityManager getEntityManager() {
-        try {
-            return factory.createEntityManager();
-        } catch (ArgumentException e) {
-            // TODO: refactor this
-            JDBCConfiguration jdbcConfiguration = JPAUtils.getJDBCConfiguration(JDBC_CONFIG);
-            Options options = new Options();
-            options.put("sqlFile", "migration.sql");
-            // If you want to generate the entire schema instead of just what is
-            // needed to bring the database up to date, use schemaAction=build
-            // options.put("schemaAction", "build");
-            options.put("foreignKeys", "true");
-            options.put("indexes", "true");
-            options.put("primaryKeys", "true");
-            try {
-                MappingTool.run(jdbcConfiguration, new String[] {}, options, null);
-            } catch (Exception mappingToolEx) {
-                logger.error("Failed to run MappingTool", mappingToolEx);
-                throw new RuntimeException("Failed to get EntityManager, then failed to run MappingTool to generate migration script", e);
-            }
-            throw new RuntimeException("Failed to get EntityManager, but successfully executed MappingTool to generate migration script (to file named migration.sql) in case the error was caused by the database schema being out of date with the mappings", e);
-        }
+        return factory.createEntityManager();
     }
 }
