You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@empire-db.apache.org by do...@apache.org on 2022/01/19 19:31:45 UTC

[empire-db] branch version3 updated: DBContext einführung

This is an automated email from the ASF dual-hosted git repository.

doebele pushed a commit to branch version3
in repository https://gitbox.apache.org/repos/asf/empire-db.git


The following commit(s) were added to refs/heads/version3 by this push:
     new c335918  DBContext einführung
c335918 is described below

commit c335918172ff9f048f7396f3ddbaad9cf76ab399
Author: Rainer Döbele <do...@apache.org>
AuthorDate: Wed Jan 19 20:31:42 2022 +0100

    DBContext einführung
---
 .../empire/samples/db/advanced/SampleAdvApp.java   | 105 +++++-----
 .../org/apache/empire/samples/db/SampleApp.java    | 102 ++++-----
 .../org/apache/empire/samples/db/SampleDB.java     |   1 -
 .../websample/db/records/DepartmentRecord.java     |   6 +-
 .../jsf2/websample/db/records/EmployeeRecord.java  |   7 +-
 .../jsf2/websample/db/records/SampleRecord.java    |  11 +-
 .../jsf2/websample/web/SampleApplication.java      |  89 ++++----
 .../empire/jsf2/websample/web/SampleContext.java   |  48 +++++
 .../websample/web/pages/EmployeeDetailPage.java    |  11 +-
 .../jsf2/websample/web/pages/EmployeeListPage.java |   2 +-
 .../jsf2/websample/web/pages/SamplePage.java       |  30 ++-
 .../apache/empire/rest/app/SampleServiceApp.java   |  82 +++++---
 .../empire/rest/service/EmployeeService.java       |  10 +-
 .../org/apache/empire/rest/service/Service.java    |  26 ++-
 .../apache/empire/vue/sample/db/RecordContext.java |   4 +-
 .../vue/sample/db/records/DepartmentRecord.java    |   4 +-
 .../vue/sample/db/records/EmployeeRecord.java      |   8 +-
 .../empire/vue/sample/db/records/SampleRecord.java |  23 +--
 .../org/apache/empire/jsf2/app/FacesUtils.java     |  17 +-
 .../org/apache/empire/jsf2/app/WebApplication.java |   4 +-
 .../jsf2/pageelements/BeanListPageElement.java     |   8 +-
 .../jsf2/pageelements/RecordPageElement.java       |  15 +-
 .../java/org/apache/empire/jsf2/pages/Page.java    |  20 +-
 .../org/apache/empire/jsf2/pages/PageElement.java  |  10 +-
 .../org/apache/empire/data/bean/BeanResult.java    |  11 +-
 .../java/org/apache/empire/db/DBCommandExpr.java   |   6 +-
 .../main/java/org/apache/empire/db/DBContext.java  |   2 +
 .../java/org/apache/empire/db/DBContextAware.java  |   9 +
 .../main/java/org/apache/empire/db/DBDatabase.java |   6 +-
 .../main/java/org/apache/empire/db/DBQuery.java    |  18 +-
 .../main/java/org/apache/empire/db/DBReader.java   |  51 +++--
 .../main/java/org/apache/empire/db/DBRecord.java   | 227 +++++++++++----------
 .../main/java/org/apache/empire/db/DBRecordV3.java |  72 -------
 .../main/java/org/apache/empire/db/DBRelation.java |  19 +-
 .../main/java/org/apache/empire/db/DBRowSet.java   |  30 +--
 .../java/org/apache/empire/db/DBSQLScript.java     |  36 +++-
 .../main/java/org/apache/empire/db/DBTable.java    |   3 +-
 .../src/main/java/org/apache/empire/db/DBView.java |   6 +-
 .../apache/empire/db/context/DBContextBase.java    |  21 ++
 .../apache/empire/db/context/DBContextStatic.java  |  21 +-
 .../empire/db/oracle/DBDatabaseDriverOracle.java   |   7 +-
 .../java/org/apache/empire/db/IntegerTest.java     |  34 +--
 .../apache/empire/db/PreparedStatementTest.java    |  18 +-
 .../java/org/apache/empire/db/SerializeTest.java   |   9 +-
 .../empire/db/hsql/DBDatabaseDriverHSqlTest.java   |  58 +++---
 .../db/mssql/DBDatabaseDriverMSSqlDateTest.java    |  24 ++-
 .../empire/db/mssql/DBDatabaseDriverMSSqlTest.java |  20 +-
 .../postgresql/DBDatabaseDriverPostgreSQLTest.java |  25 ++-
 .../db/sqlite/DBDatabaseDriverSQLiteTest.java      |  61 +++---
 49 files changed, 784 insertions(+), 653 deletions(-)

diff --git a/empire-db-examples/empire-db-example-advanced/src/main/java/org/apache/empire/samples/db/advanced/SampleAdvApp.java b/empire-db-examples/empire-db-example-advanced/src/main/java/org/apache/empire/samples/db/advanced/SampleAdvApp.java
index 723cc3b..169583e 100644
--- a/empire-db-examples/empire-db-example-advanced/src/main/java/org/apache/empire/samples/db/advanced/SampleAdvApp.java
+++ b/empire-db-examples/empire-db-example-advanced/src/main/java/org/apache/empire/samples/db/advanced/SampleAdvApp.java
@@ -31,12 +31,14 @@ import org.apache.empire.db.DBCmdParam;
 import org.apache.empire.db.DBCmdType;
 import org.apache.empire.db.DBColumnExpr;
 import org.apache.empire.db.DBCommand;
+import org.apache.empire.db.DBContext;
 import org.apache.empire.db.DBDatabaseDriver;
 import org.apache.empire.db.DBQuery;
 import org.apache.empire.db.DBReader;
 import org.apache.empire.db.DBRecord;
 import org.apache.empire.db.DBSQLScript;
 import org.apache.empire.db.DBTableColumn;
+import org.apache.empire.db.context.DBContextStatic;
 import org.apache.empire.db.exceptions.ConstraintViolationException;
 import org.apache.empire.db.h2.DBDatabaseDriverH2;
 import org.apache.empire.db.postgresql.DBDatabaseDriverPostgreSQL;
@@ -53,6 +55,8 @@ public class SampleAdvApp
 
     private static SampleAdvConfig config = new SampleAdvConfig();
     
+    private static DBContext context;
+    
     // Shortcuts
     private static SampleAdvDB.Employees T_EMP = db.T_EMPLOYEES;
     private static SampleAdvDB.Departments T_DEP = db.T_DEPARTMENTS;
@@ -82,6 +86,9 @@ public class SampleAdvApp
             // STEP 2: Choose a driver
             System.out.println("*** Step 2: getDatabaseProvider() ***");
             DBDatabaseDriver driver = getDatabaseDriver(config.getDatabaseProvider());
+            
+            // STEP 2.2: Create a Context
+            context = new DBContextStatic(driver, conn); 
 
             // STEP 3: Open Database (and create if not existing)
             System.out.println("*** Step 3: openDatabase() ***");
@@ -103,7 +110,7 @@ public class SampleAdvApp
                 {
                 	conn.setAutoCommit(true);
                 }
-                createDatabase(driver, conn);
+                createDatabase();
                 if(db.getDriver() instanceof DBDatabaseDriverPostgreSQL)
                 {
                 	conn.setAutoCommit(false);
@@ -130,7 +137,7 @@ public class SampleAdvApp
             int idEmp3 = insertEmployee(conn, "Emma", "White", "F");
             
             // Insert History as batch
-            DBSQLScript batch = new DBSQLScript();
+            DBSQLScript batch = new DBSQLScript(context);
             insertEmpDepHistory(batch, idEmp1,  idDevDep,  DateUtils.getDate(2007, 12,  1));            
             insertEmpDepHistory(batch, idEmp1,  idProdDep, DateUtils.getDate(2008,  9,  1));           
             insertEmpDepHistory(batch, idEmp1,  idSalDep,  DateUtils.getDate(2009,  5, 15));           
@@ -141,10 +148,10 @@ public class SampleAdvApp
             insertEmpDepHistory(batch, idEmp3,  idDevDep,  DateUtils.getDate(2006,  9, 15));            
             insertEmpDepHistory(batch, idEmp3,  idSalDep,  DateUtils.getDate(2007,  6,  1));           
             insertEmpDepHistory(batch, idEmp3,  idProdDep, DateUtils.getDate(2008,  7, 31));
-            batch.executeBatch(db.getDriver(), conn);
+            batch.executeBatch();
             
             // commit
-            db.commit(conn);
+            context.commit();
             
             // STEP 7: read from Employee_Info_View
             System.out.println("--------------------------------------------------------");
@@ -165,7 +172,7 @@ public class SampleAdvApp
             HashMap<Integer, DBRecord> employeeMap = bulkReadRecords(conn);
             DBRecord rec = employeeMap.get(idEmp2);
             rec.setValue(db.T_EMPLOYEES.C_SALUTATION, "Mr.");
-            rec.update(conn);
+            rec.update();
 
             // STEP 10: bulkProcessRecords
             System.out.println("--------------------------------------------------------");
@@ -183,17 +190,17 @@ public class SampleAdvApp
             if (db.getDriver() instanceof DBDatabaseDriverH2) {
             	log.info("As H2 does not support changing a table with a view defined we remove the view");
             	System.out.println("*** drop EMPLOYEE_INFO_VIEW ***");
-            	DBSQLScript script = new DBSQLScript();
+            	DBSQLScript script = new DBSQLScript(context);
             	db.getDriver().getDDLScript(DBCmdType.DROP, db.V_EMPLOYEE_INFO, script);
-            	script.executeAll(db.getDriver(), conn);
+            	script.executeAll();
             }
             ddlSample(conn, idEmp2);
             if (db.getDriver() instanceof DBDatabaseDriverH2) {
             	log.info("And put back the view");
             	System.out.println("*** create EMPLOYEE_INFO_VIEW ***");
-            	DBSQLScript script = new DBSQLScript();
+            	DBSQLScript script = new DBSQLScript(context);
             	db.getDriver().getDDLScript(DBCmdType.CREATE, db.V_EMPLOYEE_INFO, script);
-            	script.executeAll(db.getDriver(), conn);
+            	script.executeAll();
             }
 
             // STEP 13: delete records
@@ -297,17 +304,17 @@ public class SampleAdvApp
      * Please make sure you uses the correct DatabaseDriver for your target dbms.
      * </PRE>
      */
-    private static void createDatabase(DBDatabaseDriver driver, Connection conn)
+    private static void createDatabase()
     {
         // create DLL for Database Definition
-        DBSQLScript script = new DBSQLScript();
-        db.getCreateDDLScript(driver, script);
+        DBSQLScript script = new DBSQLScript(context);
+        db.getCreateDDLScript(script);
         // Show DLL Statement
         System.out.println(script.toString());
         // Execute Script
-        script.executeAll(driver, conn);
+        script.executeAll();
         // Commit
-        db.commit(conn);
+        context.commit();
     }
 
     /**
@@ -334,11 +341,11 @@ public class SampleAdvApp
     private static int insertDepartment(Connection conn, String departmentName, String businessUnit)
     {
         // Insert a Department
-        DBRecord rec = new DBRecord();
-        rec.create(T_DEP);
+        DBRecord rec = new DBRecord(context, T_DEP);
+        rec.create();
         rec.setValue(T_DEP.C_NAME, departmentName);
         rec.setValue(T_DEP.C_BUSINESS_UNIT, businessUnit);
-        rec.update(conn);
+        rec.update();
         // Return Department ID
         return rec.getInt(T_DEP.C_DEPARTMENT_ID);
     }
@@ -351,12 +358,12 @@ public class SampleAdvApp
     private static int insertEmployee(Connection conn, String firstName, String lastName, String gender)
     {
         // Insert an Employee
-        DBRecord rec = new DBRecord();
-        rec.create(T_EMP);
+        DBRecord rec = new DBRecord(context, T_EMP);
+        rec.create();
         rec.setValue(T_EMP.C_FIRSTNAME, firstName);
         rec.setValue(T_EMP.C_LASTNAME, lastName);
         rec.setValue(T_EMP.C_GENDER, gender);
-        rec.update(conn);
+        rec.update();
         // Return Employee ID
         return rec.getInt(T_EMP.C_EMPLOYEE_ID);
     }
@@ -370,12 +377,12 @@ public class SampleAdvApp
     {
         // Insert an Employee
     	/*
-        DBRecord rec = new DBRecord();
+        DBRecord rec = new DBRecord(context);
         rec.create(T_EDH);
         rec.setValue(T_EDH.C_EMPLOYEE_ID, employeeId);
         rec.setValue(T_EDH.C_DEPARTMENT_ID, departmentId);
         rec.setValue(T_EDH.C_DATE_FROM, dateFrom);
-        rec.update(conn);
+        rec.update();
         */
         DBCommand cmd = db.createCommand();
     	cmd.set(T_EDH.C_EMPLOYEE_ID.to(employeeId));
@@ -401,7 +408,7 @@ public class SampleAdvApp
 
         System.out.println("Perfoming two queries using a the same command with different parameter values.");
         
-        DBReader r = new DBReader();
+        DBReader r = new DBReader(context);
         try {
             // Query all females currently working in the Production department
             System.out.println("1. Query all females currently working in the production department");
@@ -409,7 +416,7 @@ public class SampleAdvApp
             genderParam.setValue('F'); // set gender to female
             curDepParam.setValue(idProdDep); // set department id to production department
             // Open reader using a prepared statement (due to command parameters!)
-            r.open(cmd, conn);
+            r.open(cmd);
             // print all results
             System.out.println("Females working in the production department are:");
             while (r.moveNext())
@@ -423,7 +430,7 @@ public class SampleAdvApp
             genderParam.setValue('M'); // set gender to female
             curDepParam.setValue(idDevDep); // set department id to production department
             // Open reader using a prepared statement (due to command parameters!)
-            r.open(cmd, conn);
+            r.open(cmd);
             // print all results
             System.out.println("Males currently working in the development department are:");
             while (r.moveNext())
@@ -454,15 +461,15 @@ public class SampleAdvApp
         cmd.where(T_EMP.C_RETIRED.is(false));
 
         // Query Records and print output
-        DBReader reader = new DBReader();
+        DBReader reader = new DBReader(context);
         try
         {
             // Open Reader
             System.out.println("Running Query:");
             System.out.println(cmd.getSelect());
-            reader.open(cmd, conn);
+            reader.open(cmd);
             // Print output
-            DBRecord record = new DBRecord();
+            DBRecord record = new DBRecord(context, EMP);
             while (reader.moveNext())
             {
                 // Calculate sum
@@ -470,13 +477,13 @@ public class SampleAdvApp
                 for (int i=0; i<reader.getFieldCount(); i++)
                     sum += calcCharSum(reader.getString(i));
                 // Init updateable record
-                reader.initRecord(EMP, record);
+                reader.initRecord(record);
                 // reader
                 record.setValue(T_EMP.C_CHECKSUM, sum);
-                record.update(conn);
+                record.update();
             }
             // Done
-            db.commit(conn);
+            context.commit();
 
         } finally
         {
@@ -507,18 +514,18 @@ public class SampleAdvApp
         cmd.where(T_EMP.C_RETIRED.is(false));
 
         // Query Records and print output
-        DBReader reader = new DBReader();
+        DBReader reader = new DBReader(context);
         try
         {   // Open Reader
             System.out.println("Running Query:");
             System.out.println(cmd.getSelect());
-            reader.open(cmd, conn);
+            reader.open(cmd);
             // Print output
             HashMap<Integer, DBRecord> employeeMap = new HashMap<Integer, DBRecord>();
             while (reader.moveNext())
             {
-                DBRecord rec = new DBRecord();
-                reader.initRecord(T_EMP, rec);
+                DBRecord rec = new DBRecord(context, T_EMP);
+                reader.initRecord(rec);
                 employeeMap.put(reader.getInt(T_EMP.C_EMPLOYEE_ID), rec);
             }
             return employeeMap;
@@ -545,34 +552,34 @@ public class SampleAdvApp
 
         // Now create the corresponding DDL statement 
         System.out.println("Creating new column named FOO as varchar(20) for the EMPLOYEES table:");
-        DBSQLScript script = new DBSQLScript();
+        DBSQLScript script = new DBSQLScript(context);
         db.getDriver().getDDLScript(DBCmdType.CREATE, C_FOO, script);
-        script.executeAll(db.getDriver(), conn);
+        script.executeAll();
         
         // Now load a record from that table and set the value for foo
         System.out.println("Changing the value for the FOO field of a particular employee:");
-        DBRecord rec = new DBRecord();
-        rec.read(db.T_EMPLOYEES, idTestPerson, conn);
+        DBRecord rec = new DBRecord(context, db.T_EMPLOYEES);
+        rec.read(idTestPerson);
         rec.setValue(C_FOO, "Hello World");
-        rec.update(conn);
+        rec.update();
         
         // Now extend the size of the field from 20 to 40 characters
         System.out.println("Extending size of column FOO to 40 characters:");
         C_FOO.setSize(40); 
         script.clear();
         db.getDriver().getDDLScript(DBCmdType.ALTER, C_FOO, script);
-        script.executeAll(db.getDriver(), conn);
+        script.executeAll();
 
         // Now set a longer value for the record
         System.out.println("Changing the value for the FOO field for the above employee to a longer string:");
         rec.setValue(C_FOO, "This is a very long field value!");
-        rec.update(conn);
+        rec.update();
 
         // Finally, drop the column again
         System.out.println("Dropping the FOO column from the employee table:");
         script.clear();
         db.getDriver().getDDLScript(DBCmdType.DROP, C_FOO, script);
-        script.executeAll(db.getDriver(), conn);
+        script.executeAll();
     }
 
     /**
@@ -619,12 +626,12 @@ public class SampleAdvApp
         
         // Define an updateable query
         DBQuery Q_EMP_DEP = new DBQuery(cmd, T_EMP.C_EMPLOYEE_ID);
-        DBRecord rec = new DBRecord();
-        rec.read(Q_EMP_DEP, employeeId, conn);
+        DBRecord rec = new DBRecord(context, Q_EMP_DEP);
+        rec.read(employeeId);
         // Modify and Update fields from both Employee and Department
         rec.setValue(T_EMP.C_PHONE_NUMBER, "0815-4711");
         rec.setValue(T_DEP.C_BUSINESS_UNIT, "AUTO");
-        rec.update(conn);
+        rec.update();
         // Successfully updated
         System.out.println("The employee has been sucessfully updated");
     }    
@@ -639,7 +646,7 @@ public class SampleAdvApp
      */
     private static void deleteRecordSample(int idEmployee, int idDepartment, Connection conn)
     {
-        db.commit(conn);
+        context.commit();
         // Delete an employee
         // This statement is designed to succeed since cascaded deletes are enabled for this relation.
         db.T_EMPLOYEES.deleteRecord(idEmployee, conn);
@@ -662,12 +669,12 @@ public class SampleAdvApp
     private static void printQueryResults(DBCommand cmd, Connection conn)
     {
         // Query Records and print output
-        DBReader reader = new DBReader();
+        DBReader reader = new DBReader(context);
         try
         {   // Open Reader
             System.out.println("Running Query:");
             System.out.println(cmd.getSelect());
-            reader.open(cmd, conn);
+            reader.open(cmd);
             // Print column titles 
             System.out.println("---------------------------------");
             int count = reader.getFieldCount();
diff --git a/empire-db-examples/empire-db-example-basic/src/main/java/org/apache/empire/samples/db/SampleApp.java b/empire-db-examples/empire-db-example-basic/src/main/java/org/apache/empire/samples/db/SampleApp.java
index 31ede21..84a4beb 100644
--- a/empire-db-examples/empire-db-example-basic/src/main/java/org/apache/empire/samples/db/SampleApp.java
+++ b/empire-db-examples/empire-db-example-basic/src/main/java/org/apache/empire/samples/db/SampleApp.java
@@ -30,7 +30,6 @@ import org.apache.empire.db.DBContext;
 import org.apache.empire.db.DBDatabaseDriver;
 import org.apache.empire.db.DBReader;
 import org.apache.empire.db.DBRecord;
-import org.apache.empire.db.DBRecordV3;
 import org.apache.empire.db.DBSQLScript;
 import org.apache.empire.db.context.DBContextStatic;
 import org.apache.empire.db.derby.DBDatabaseDriverDerby;
@@ -51,7 +50,9 @@ public class SampleApp
 
 	private static final SampleDB db = new SampleDB();
 
-	private static SampleConfig config = new SampleConfig();
+    private static SampleConfig config = new SampleConfig();
+	
+	private static DBContext context;
 
 	private enum QueryType
     {
@@ -85,7 +86,8 @@ public class SampleApp
 			System.out.println("*** Step 2: getDatabaseProvider() ***");
 			DBDatabaseDriver driver = getDatabaseDriver(config.getDatabaseProvider(), conn);
 			
-			DBContext context = new DBContextStatic(driver, conn); 
+            // STEP 2.2: Create a Context
+			context = new DBContextStatic(driver, conn); 
 
             // STEP 3: Open Database (and create if not existing)
             System.out.println("*** Step 3: openDatabase() ***");
@@ -104,7 +106,7 @@ public class SampleApp
                 {
                 	conn.setAutoCommit(true);
                 }
-                createDatabase(driver, conn);
+                createDatabase();
                 if(db.getDriver() instanceof DBDatabaseDriverPostgreSQL)
                 {
                 	conn.setAutoCommit(false);
@@ -120,40 +122,40 @@ public class SampleApp
 
 			// STEP 6: Insert Departments
 			System.out.println("*** Step 6: insertDepartment() & insertEmployee() ***");
-			int idDevDep = insertDepartment(conn, "Development", "ITTK");
-			int idSalDep = insertDepartment(conn, "Sales", "ITTK");
+			int idDevDep = insertDepartment("Development", "ITTK");
+			int idSalDep = insertDepartment("Sales", "ITTK");
 			// Insert Employees
-			int idPers1 = insertEmployee(conn, "Peter", "Sharp", Gender.M, idDevDep);
-			int idPers2 = insertEmployee(conn, "Fred", "Bloggs", Gender.M, idDevDep);
-			int idPers3 = insertEmployee(conn, "Emma", "White",  Gender.F, idSalDep);
+			int idPers1 = insertEmployee("Peter", "Sharp", Gender.M, idDevDep);
+			int idPers2 = insertEmployee("Fred", "Bloggs", Gender.M, idDevDep);
+			int idPers3 = insertEmployee("Emma", "White",  Gender.F, idSalDep);
 
             // commit
-            db.commit(conn);
+			context.commit();
 			
-            int idEmp = testTransactionCreate(context, idDevDep);
-            testTransactionUpdate(context, idEmp);
-            testTransactionDelete(context, idEmp);
+            int idEmp = testTransactionCreate(idDevDep);
+            testTransactionUpdate(idEmp);
+            testTransactionDelete(idEmp);
 
 			// STEP 7: Update Records (by setting the phone Number)
 			System.out.println("*** Step 7: updateEmployee() ***");
-			updateEmployee(conn, idPers1, "+49-7531-457160");
-			updateEmployee(conn, idPers2, "+49-5555-505050");
-			updateEmployee(conn, idPers3, "+49-040-125486");
+			updateEmployee(idPers1, "+49-7531-457160");
+			updateEmployee(idPers2, "+49-5555-505050");
+			updateEmployee(idPers3, "+49-040-125486");
 
 			// commit
-			db.commit(conn);
+			context.commit();
 
 			// STEP 8: Option 1: Query Records and print tab-separated
 			System.out.println("*** Step 8 Option 1: queryRecords() / Tab-Output ***");
-			queryRecords(conn, QueryType.Reader); // Tab-Output
+			queryRecords(QueryType.Reader); // Tab-Output
 
             // STEP 8: Option 2: Query Records as a list of java beans
             System.out.println("*** Step 8 Option 2: queryRecords() / Bean-List-Output ***");
-            queryRecords(conn, QueryType.BeanList); // Bean-List-Output
+            queryRecords(QueryType.BeanList); // Bean-List-Output
 
 			// STEP 8: Option 3: Query Records as XML
 			System.out.println("*** Step 8 Option 3: queryRecords() / XML-Output ***");
-			queryRecords(conn, QueryType.XmlDocument); // XML-Output
+			queryRecords(QueryType.XmlDocument); // XML-Output
 
 			// STEP 9: Use Bean Result to query beans
 			queryBeans(conn);
@@ -166,8 +168,10 @@ public class SampleApp
 			// Error
 			System.out.println(e.toString());
 			e.printStackTrace();
+			
+		} finally {
+		    context.discard();
 		}
-
 	}
 
 	/**
@@ -259,17 +263,17 @@ public class SampleApp
 	 * Please make sure you uses the correct DatabaseDriver for your target DBMS.
      * </PRE>
 	 */
-	private static void createDatabase(DBDatabaseDriver driver, Connection conn)
+	private static void createDatabase()
     {
 		// create DDL for Database Definition
-	    DBSQLScript script = new DBSQLScript();
-		db.getCreateDDLScript(driver, script);
+	    DBSQLScript script = new DBSQLScript(context);
+		db.getCreateDDLScript(script);
 		// Show DDL Statement
 		System.out.println(script.toString());
 		// Execute Script
-		script.executeAll(driver, conn, false);
+		script.executeAll(false);
 		// Commit
-		db.commit(conn);
+		context.commit();
 	}
 
 	/**
@@ -291,14 +295,14 @@ public class SampleApp
 	 * Insert a Department into the Departments table.
      * </PRE>
 	 */
-	private static int insertDepartment(Connection conn, String departmentName, String businessUnit)
+	private static int insertDepartment(String departmentName, String businessUnit)
     {
 		// Insert a Department
-		DBRecord rec = new DBRecord();
-		rec.create(db.DEPARTMENTS);
+		DBRecord rec = new DBRecord(context, db.DEPARTMENTS);
+		rec.create();
 		rec.setValue(db.DEPARTMENTS.NAME, departmentName);
 		rec.setValue(db.DEPARTMENTS.BUSINESS_UNIT, businessUnit);
-		rec.update(conn);
+		rec.update();
 		// Return Department ID
 		return rec.getInt(db.DEPARTMENTS.DEPARTMENT_ID);
 	}
@@ -308,16 +312,16 @@ public class SampleApp
 	 * Inserts an Employee into the Employees table.
      * </PRE>
 	 */
-	private static int insertEmployee(Connection conn, String firstName, String lastName, Gender gender, int departmentId)
+	private static int insertEmployee(String firstName, String lastName, Gender gender, int departmentId)
     {
 		// Insert an Employee
-		DBRecord rec = new DBRecord();
-		rec.create(db.EMPLOYEES);
+		DBRecord rec = new DBRecord(context, db.EMPLOYEES);
+		rec.create();
 		rec.setValue(db.EMPLOYEES.FIRSTNAME, firstName);
 		rec.setValue(db.EMPLOYEES.LASTNAME, lastName);
 		rec.setValue(db.EMPLOYEES.GENDER, gender);
 		rec.setValue(db.EMPLOYEES.DEPARTMENT_ID, departmentId);
-		rec.update(conn);
+		rec.update();
 		// Return Employee ID
 		return rec.getInt(db.EMPLOYEES.EMPLOYEE_ID);
 	}
@@ -327,24 +331,24 @@ public class SampleApp
 	 * Updates an employee record by setting the phone number.
      * </PRE>
 	 */
-	private static void updateEmployee(Connection conn, int idPers, String phoneNumber)
+	private static void updateEmployee(int idPers, String phoneNumber)
     {
 		// Update an Employee
-		DBRecord rec = new DBRecord();
-		rec.read(db.EMPLOYEES, idPers, conn);
+		DBRecord rec = new DBRecord(context, db.EMPLOYEES);
+		rec.read(idPers);
 		// Set
 		rec.setValue(db.EMPLOYEES.PHONE_NUMBER, phoneNumber);
-		rec.update(conn);
+		rec.update();
 	}
 
 	/**
 	 * @param context
 	 * @param idDep
 	 */
-	private static int testTransactionCreate(DBContext context, int idDep)
+	private static int testTransactionCreate(int idDep)
     {
         SampleDB.Employees T = db.EMPLOYEES;
-        DBRecordV3 rec = new DBRecordV3(context, T);
+        DBRecord rec = new DBRecord(context, T);
         
         rec.create();
         rec.setValue(T.FIRSTNAME, "Foo");
@@ -383,10 +387,10 @@ public class SampleApp
      * @param context
      * @param idDep
      */
-    private static void testTransactionUpdate(DBContext context, int idEmp)
+    private static void testTransactionUpdate(int idEmp)
     {
         SampleDB.Employees T = db.EMPLOYEES;
-        DBRecordV3 rec = new DBRecordV3(context, T);
+        DBRecord rec = new DBRecord(context, T);
         
         rec.read(idEmp);
         rec.setValue(T.PHONE_NUMBER, null);
@@ -415,10 +419,10 @@ public class SampleApp
      * @param context
      * @param idDep
      */
-    private static void testTransactionDelete(DBContext context, int idEmp)
+    private static void testTransactionDelete(int idEmp)
     {
         SampleDB.Employees T = db.EMPLOYEES;
-        DBRecordV3 rec = new DBRecordV3(context, T);
+        DBRecord rec = new DBRecord(context, T);
         
         rec.read(idEmp);
         /*
@@ -471,7 +475,7 @@ public class SampleApp
      *     Please note, that the XML not only contains the data but also the field metadata.
      * </PRE>
 	 */
-	private static void queryRecords(Connection conn, QueryType queryType)
+	private static void queryRecords(QueryType queryType)
     {
 	    // Define the query
 	    DBCommand cmd = db.createCommand();
@@ -515,13 +519,13 @@ public class SampleApp
         */
         
 		// Query Records and print output
-		DBReader reader = new DBReader();
+		DBReader reader = new DBReader(context);
 		try
         {
 			// Open Reader
 			System.out.println("Running Query:");
 			System.out.println(cmd.getSelect());
-			reader.open(cmd, conn);
+			reader.open(cmd);
 			// Print output
 			System.out.println("---------------------------------");
 			switch(queryType)
@@ -566,13 +570,13 @@ public class SampleApp
         // Query all males
 	    BeanResult<SampleBean> result = new BeanResult<SampleBean>(SampleBean.class, db.EMPLOYEES);
         result.getCommand().where(db.EMPLOYEES.GENDER.is(Gender.M));
-	    result.fetch(conn);
+	    result.fetch(context);
 	    
 	    System.out.println("Number of male employees is: "+result.size());
 
 	    // And now, the females
 	    result.getCommand().where(db.EMPLOYEES.GENDER.is(Gender.F));
-	    result.fetch(conn);
+	    result.fetch(context);
 	    
         System.out.println("Number of female employees is: "+result.size());
 	}
diff --git a/empire-db-examples/empire-db-example-basic/src/main/java/org/apache/empire/samples/db/SampleDB.java b/empire-db-examples/empire-db-example-basic/src/main/java/org/apache/empire/samples/db/SampleDB.java
index 93efb64..05a05b2 100644
--- a/empire-db-examples/empire-db-example-basic/src/main/java/org/apache/empire/samples/db/SampleDB.java
+++ b/empire-db-examples/empire-db-example-basic/src/main/java/org/apache/empire/samples/db/SampleDB.java
@@ -18,7 +18,6 @@
  */
 package org.apache.empire.samples.db;
 
-import org.apache.empire.commons.Options;
 import org.apache.empire.data.DataType;
 import org.apache.empire.db.DBColumn;
 import org.apache.empire.db.DBDatabase;
diff --git a/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/db/records/DepartmentRecord.java b/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/db/records/DepartmentRecord.java
index 717eef7..76dd579 100644
--- a/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/db/records/DepartmentRecord.java
+++ b/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/db/records/DepartmentRecord.java
@@ -18,16 +18,16 @@
  */
 package org.apache.empire.jsf2.websample.db.records;
 
-import org.apache.empire.jsf2.websample.db.SampleDB;
 import org.apache.empire.jsf2.websample.db.SampleDB.TDepartments;
+import org.apache.empire.jsf2.websample.web.SampleContext;
 
 public class DepartmentRecord extends SampleRecord<TDepartments>
 {
     private final static long serialVersionUID = 1L;
 
-    public DepartmentRecord(SampleDB db)
+    public DepartmentRecord(SampleContext context)
     {
-        super(db.T_DEPARTMENTS);
+        super(context, context.getDatabase().T_DEPARTMENTS);
     }
   
 }
diff --git a/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/db/records/EmployeeRecord.java b/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/db/records/EmployeeRecord.java
index 6c1789a..076f108 100644
--- a/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/db/records/EmployeeRecord.java
+++ b/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/db/records/EmployeeRecord.java
@@ -24,15 +24,16 @@ import org.apache.empire.db.DBColumn;
 import org.apache.empire.db.DBCommand;
 import org.apache.empire.jsf2.websample.db.SampleDB;
 import org.apache.empire.jsf2.websample.db.SampleDB.TEmployees;
+import org.apache.empire.jsf2.websample.web.SampleContext;
 import org.apache.empire.jsf2.websample.web.SampleUtils;
 
 public class EmployeeRecord extends SampleRecord<TEmployees>
 {
     private final static long serialVersionUID = 1L;
 
-    public EmployeeRecord(SampleDB db)
+    public EmployeeRecord(SampleContext context)
     {
-        super(db.T_EMPLOYEES);
+        super(context, context.getDatabase().T_EMPLOYEES);
     }
     
 	/*
@@ -68,7 +69,7 @@ public class EmployeeRecord extends SampleRecord<TEmployees>
     // Sample Implementation for Department Record
     public DepartmentRecord getDepartmentRecord()
     {
-        DepartmentRecord rec = new DepartmentRecord((SampleDB)this.getDatabase());
+        DepartmentRecord rec = new DepartmentRecord((SampleContext)getContext());
         SampleDB.TDepartments table = SampleUtils.getDatabase().T_DEPARTMENTS;
         rec.read(table, this.getInt(T.DEPARTMENT_ID), SampleUtils.getConnection());
         return rec;
diff --git a/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/db/records/SampleRecord.java b/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/db/records/SampleRecord.java
index f8d8203..1332b2d 100644
--- a/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/db/records/SampleRecord.java
+++ b/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/db/records/SampleRecord.java
@@ -18,8 +18,7 @@
  */
 package org.apache.empire.jsf2.websample.db.records;
 
-import java.sql.Connection;
-
+import org.apache.empire.db.DBContext;
 import org.apache.empire.db.DBRecord;
 import org.apache.empire.jsf2.websample.db.SampleTable;
 
@@ -30,8 +29,8 @@ public abstract class SampleRecord<T extends SampleTable> extends DBRecord {
 	
 	protected T T; // The table
 
-	public SampleRecord(T table) {
-		super(table);
+	public SampleRecord(DBContext context, T table) {
+		super(context, table);
 		this.T = table;
 	}
 
@@ -42,7 +41,8 @@ public abstract class SampleRecord<T extends SampleTable> extends DBRecord {
 	public T getTable() {
 		return T;
 	}
-    
+
+	/*
     public void create(Connection conn)
     {
         super.create(getTable(), conn);
@@ -62,5 +62,6 @@ public abstract class SampleRecord<T extends SampleTable> extends DBRecord {
     {
         super.read(getTable(), id, conn);
     }
+    */
 	
 }
\ No newline at end of file
diff --git a/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/SampleApplication.java b/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/SampleApplication.java
index 7cb3811..02c62e9 100644
--- a/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/SampleApplication.java
+++ b/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/SampleApplication.java
@@ -20,6 +20,7 @@ package org.apache.empire.jsf2.websample.web;
 
 import java.sql.Connection;
 import java.sql.DriverManager;
+import java.sql.SQLException;
 import java.util.Locale;
 
 import javax.servlet.ServletContext;
@@ -27,10 +28,12 @@ import javax.sql.DataSource;
 
 import org.apache.empire.commons.StringUtils;
 import org.apache.empire.db.DBCommand;
+import org.apache.empire.db.DBContext;
 import org.apache.empire.db.DBDatabase;
 import org.apache.empire.db.DBDatabaseDriver;
 import org.apache.empire.db.DBRecord;
 import org.apache.empire.db.DBSQLScript;
+import org.apache.empire.db.context.DBContextStatic;
 import org.apache.empire.db.exceptions.QueryFailedException;
 import org.apache.empire.db.hsql.DBDatabaseDriverHSql;
 import org.apache.empire.db.mysql.DBDatabaseDriverMySQL;
@@ -133,15 +136,18 @@ public class SampleApplication extends WebApplication {
 		DBDatabaseDriver driver = getDatabaseDriver(driverProvider);
         log.info("Opening database '{}' using driver '{}'", sampleDB.getClass().getSimpleName(), driver.getClass().getSimpleName());
 		Connection conn = null;
+		DBContext context = null;
 		try {
 			conn = getConnection(sampleDB);
+			context = new DBContextStatic(driver, conn);
 			sampleDB.open(driver, conn);
 			if (!databaseExists(conn)) {
 				// STEP 4: Create Database
 				log.info("Creating database {}", sampleDB.getClass().getSimpleName());
-				createSampleDatabase(driver, conn);
+				createSampleDatabase(context);
 			}
 		} finally {
+		    context.discard();
 			releaseConnection(sampleDB, conn, true);
 		}
 	}
@@ -199,43 +205,42 @@ public class SampleApplication extends WebApplication {
 	 * the department tables does not exist, the entire dll-script is executed
 	 * line by line
 	 */
-	private void createSampleDatabase(DBDatabaseDriver driver, Connection conn) {
+	private void createSampleDatabase(DBContext context) {
 		// create DLL for Database Definition
-		DBSQLScript script = new DBSQLScript();
-		sampleDB.getCreateDDLScript(driver, script);
+		DBSQLScript script = new DBSQLScript(context);
+		sampleDB.getCreateDDLScript(script);
 		// Show DLL Statements
 		System.out.println(script.toString());
 		// Execute Script
-		script.executeAll(driver, conn, false);
-		sampleDB.commit(conn);
+		script.executeAll(false);
+		context.commit();
 		// Open again
 		if (!sampleDB.isOpen()) {
-			sampleDB.open(driver, conn);
+			sampleDB.open(context.getDriver(), conn);
 		}
 		// Insert Sample Departments
-		insertDepartmentSampleRecord(conn, "Procurement", "ITTK");
-		int idDevDep = insertDepartmentSampleRecord(conn, "Development", "ITTK");
-		int idSalDep = insertDepartmentSampleRecord(conn, "Sales", 		 "ITTK");
+		insertDepartmentSampleRecord(context, "Procurement", "ITTK");
+		int idDevDep = insertDepartmentSampleRecord(context, "Development", "ITTK");
+		int idSalDep = insertDepartmentSampleRecord(context, "Sales", 		 "ITTK");
 		// Insert Sample Employees
-		insertEmployeeSampleRecord(conn, "Mr.", "Eugen", "Miller", "M",		idDevDep);
-		insertEmployeeSampleRecord(conn, "Mr.", "Max", "Mc. Callahan", "M",	idDevDep);
-		insertEmployeeSampleRecord(conn, "Mrs.", "Anna", "Smith", "F", 		idSalDep);
+		insertEmployeeSampleRecord(context, "Mr.", "Eugen", "Miller", "M",		idDevDep);
+		insertEmployeeSampleRecord(context, "Mr.", "Max", "Mc. Callahan", "M",	idDevDep);
+		insertEmployeeSampleRecord(context, "Mrs.", "Anna", "Smith", "F", 		idSalDep);
 		// Commit
-		sampleDB.commit(conn);
+        context.commit();
 	}
 
 	/*
 	 * Insert a department
 	 */
-	private int insertDepartmentSampleRecord(Connection conn,
-			String department_name, String businessUnit) {
+	private int insertDepartmentSampleRecord(DBContext context, String department_name, String businessUnit) {
 		// Insert a Department
-		DBRecord rec = new DBRecord();
-		rec.create(sampleDB.T_DEPARTMENTS);
+		DBRecord rec = new DBRecord(context, sampleDB.T_DEPARTMENTS);
+		rec.create();
 		rec.setValue(sampleDB.T_DEPARTMENTS.NAME, department_name);
 		rec.setValue(sampleDB.T_DEPARTMENTS.BUSINESS_UNIT, businessUnit);
 		try {
-			rec.update(conn);
+			rec.update();
 		} catch (Exception e) {
 			log.error(e.getLocalizedMessage());
 			return 0;
@@ -247,18 +252,17 @@ public class SampleApplication extends WebApplication {
 	/*
 	 * Insert a person
 	 */
-	private int insertEmployeeSampleRecord(Connection conn, String salutation,
-			String firstName, String lastName, String gender, int depID) {
+	private int insertEmployeeSampleRecord(DBContext context, String salutation, String firstName, String lastName, String gender, int depID) {
 		// Insert an Employee
-		DBRecord rec = new DBRecord();
-		rec.create(sampleDB.T_EMPLOYEES);
+		DBRecord rec = new DBRecord(context, sampleDB.T_EMPLOYEES);
+		rec.create();
 		rec.setValue(sampleDB.T_EMPLOYEES.SALUTATION, salutation);
 		rec.setValue(sampleDB.T_EMPLOYEES.FIRST_NAME, firstName);
 		rec.setValue(sampleDB.T_EMPLOYEES.LAST_NAME, lastName);
 		rec.setValue(sampleDB.T_EMPLOYEES.GENDER, gender);
 		rec.setValue(sampleDB.T_EMPLOYEES.DEPARTMENT_ID, depID);
 		try {
-			rec.update(conn);
+			rec.update();
 		} catch (Exception e) {
 			log.error(e.getLocalizedMessage());
 			return 0;
@@ -293,21 +297,30 @@ public class SampleApplication extends WebApplication {
     @Override
     protected void releaseConnection(DBDatabase db, Connection conn, boolean commit)
     {
-        // release connection
-        if (conn == null)
-        {
-            return;
+        try
+        { // release connection
+            if (conn == null)
+            {
+                return;
+            }
+            // Commit or rollback connection depending on the exit code
+            if (commit)
+            { // success: commit all changes
+                conn.commit();
+                log.debug("REQUEST commited.");
+            }
+            else
+            { // failure: rollback all changes
+                conn.rollback();
+                log.debug("REQUEST rolled back.");
+            }
+            // Don't Release Connection
+            // conn.close();
         }
-        // Commit or rollback connection depending on the exit code
-        if (commit)
-        { // success: commit all changes
-            db.commit(conn);
-            log.debug("REQUEST {}: commited.");
-        }
-        else
-        { // failure: rollback all changes
-            db.rollback(conn);
-            log.debug("REQUEST {}: rolled back.");
+        catch (SQLException e)
+        {
+            log.error("Error releasing connection", e);
+            e.printStackTrace();
         }
     }
 	
diff --git a/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/SampleContext.java b/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/SampleContext.java
new file mode 100644
index 0000000..e328ec0
--- /dev/null
+++ b/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/SampleContext.java
@@ -0,0 +1,48 @@
+/*
+ * ESTEAM Software GmbH, 19.01.2022
+ */
+package org.apache.empire.jsf2.websample.web;
+
+import java.sql.Connection;
+
+import javax.faces.context.FacesContext;
+
+import org.apache.empire.db.DBDatabaseDriver;
+import org.apache.empire.db.context.DBContextBase;
+import org.apache.empire.jsf2.websample.db.SampleDB;
+
+public class SampleContext extends DBContextBase
+{
+    private final SampleApplication app;
+    
+    private final SampleDB db;
+    
+    public SampleContext(SampleApplication app)
+    {
+        this.app = app;
+        this.db = app.getDatabase(); 
+    }
+    
+    public SampleDB getDatabase()
+    {
+        return db;
+    }
+
+    public SampleUser getUser()
+    {
+        return SampleUtils.getSampleUser();
+    }
+    
+    @Override
+    public DBDatabaseDriver getDriver()
+    {
+        return getDatabase().getDriver();
+    }
+
+    @Override
+    public Connection getConnection()
+    {
+        FacesContext fc = FacesContext.getCurrentInstance();
+        return app.getConnectionForRequest(fc, db);
+    }
+}
diff --git a/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/pages/EmployeeDetailPage.java b/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/pages/EmployeeDetailPage.java
index 571ed64..7f91052 100644
--- a/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/pages/EmployeeDetailPage.java
+++ b/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/pages/EmployeeDetailPage.java
@@ -43,7 +43,7 @@ public class EmployeeDetailPage extends SamplePage
         log.trace("EmployeeDetailPage created");
 
         SampleDB db = getDatabase();
-        EmployeeRecord emplRec = new EmployeeRecord(db);
+        EmployeeRecord emplRec = new EmployeeRecord(getSampleContext());
         employee = new RecordPageElement<EmployeeRecord>(this, emplRec.getTable(), emplRec);
     }
 
@@ -96,22 +96,19 @@ public class EmployeeDetailPage extends SamplePage
 
     public void doCreate()
     {
-        Connection conn = getConnection();
-        getEmployeeRecord().create(conn);
+        getEmployeeRecord().create();
         doRefresh();
     }
     
     public PageOutcome doSave()
     {
-        Connection conn = getConnection();
-        getEmployeeRecord().update(conn);
+        getEmployeeRecord().update();
         return getParentOutcome(true);
     }
 
     public PageOutcome doDelete()
     {
-        Connection conn = getConnection();
-        getEmployeeRecord().delete(conn);
+        getEmployeeRecord().delete();
         return getParentOutcome(true);
     }
     
diff --git a/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/pages/EmployeeListPage.java b/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/pages/EmployeeListPage.java
index e98a72b..18af8d8 100644
--- a/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/pages/EmployeeListPage.java
+++ b/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/pages/EmployeeListPage.java
@@ -208,7 +208,7 @@ public class EmployeeListPage extends SamplePage
     	queryCmd.select(DEP.DEPARTMENT_ID,DEP.NAME);
     	
     	SampleDB db = getDatabase();
-        return db.queryOptionList(queryCmd, getConnection());
+        return db.queryOptionList(queryCmd, getSampleContext().getConnection());
     }
     
     
diff --git a/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/pages/SamplePage.java b/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/pages/SamplePage.java
index 396341e..84eefca 100644
--- a/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/pages/SamplePage.java
+++ b/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/pages/SamplePage.java
@@ -18,12 +18,13 @@
  */
 package org.apache.empire.jsf2.websample.web.pages;
 
-import java.sql.Connection;
-
 import org.apache.empire.db.DBCommand;
+import org.apache.empire.db.DBContext;
+import org.apache.empire.db.DBDatabase;
 import org.apache.empire.jsf2.pages.Page;
 import org.apache.empire.jsf2.websample.db.SampleDB;
 import org.apache.empire.jsf2.websample.web.SampleApplication;
+import org.apache.empire.jsf2.websample.web.SampleContext;
 import org.apache.empire.jsf2.websample.web.SampleUser;
 import org.apache.empire.jsf2.websample.web.SampleUtils;
 
@@ -31,6 +32,23 @@ public class SamplePage extends Page
 {
     private static final long serialVersionUID = 1L;
 
+    private SampleContext sampleContext = null;
+
+    public SampleContext getSampleContext()
+    {
+        if (this.sampleContext == null)
+        {
+            SampleApplication app = SampleUtils.getSampleApplication();
+            this.sampleContext = new SampleContext(app);
+        }
+        return this.sampleContext;
+    }
+
+    @Override
+    public DBContext getDBContext(DBDatabase db)
+    {
+        return getSampleContext();
+    }
 
     protected SampleApplication getApplication()
     {
@@ -42,12 +60,6 @@ public class SamplePage extends Page
         return SampleUtils.getDatabase();
     }
 
-    public Connection getConnection()
-    {
-        Connection conn = SampleUtils.getConnection();
-        return conn;
-    }
-
     public SampleUser getUser()
     {
         return SampleUtils.getSampleUser();
@@ -58,8 +70,6 @@ public class SamplePage extends Page
 //        return SampleUtils.getSampleSession().getUser().getLanguageIndex();
 //    }
 
-
-
     protected DBCommand createQueryCommand()
     {
         return getDatabase().createCommand();
diff --git a/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/rest/app/SampleServiceApp.java b/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/rest/app/SampleServiceApp.java
index 8a9e1a5..392949d 100644
--- a/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/rest/app/SampleServiceApp.java
+++ b/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/rest/app/SampleServiceApp.java
@@ -19,6 +19,7 @@
 package org.apache.empire.rest.app;
 import java.sql.Connection;
 import java.sql.DriverManager;
+import java.sql.SQLException;
 import java.util.HashMap;
 import java.util.Locale;
 import java.util.Map;
@@ -30,10 +31,12 @@ import javax.servlet.ServletContextListener;
 
 import org.apache.empire.commons.StringUtils;
 import org.apache.empire.db.DBCommand;
+import org.apache.empire.db.DBContext;
 import org.apache.empire.db.DBDatabase;
 import org.apache.empire.db.DBDatabaseDriver;
 import org.apache.empire.db.DBRecord;
 import org.apache.empire.db.DBSQLScript;
+import org.apache.empire.db.context.DBContextStatic;
 import org.apache.empire.db.exceptions.QueryFailedException;
 import org.apache.empire.db.hsql.DBDatabaseDriverHSql;
 import org.apache.empire.rest.service.Service;
@@ -144,16 +147,30 @@ public class SampleServiceApp
 
     protected void releaseConnection(DBDatabase db, Connection conn, boolean commit) {
         // release connection
-        if (conn == null) {
-            return;
+        try
+        { // release connection
+            if (conn == null)
+            {
+                return;
+            }
+            // Commit or rollback connection depending on the exit code
+            if (commit)
+            { // success: commit all changes
+                conn.commit();
+                log.debug("REQUEST commited.");
+            }
+            else
+            { // failure: rollback all changes
+                conn.rollback();
+                log.debug("REQUEST rolled back.");
+            }
+            // Don't Release Connection
+            // conn.close();
         }
-        // Commit or rollback connection depending on the exit code
-        if (commit) { // success: commit all changes
-            db.commit(conn);
-            log.debug("REQUEST {}: commited.");
-        } else { // failure: rollback all changes
-            db.rollback(conn);
-            log.debug("REQUEST {}: rolled back.");
+        catch (SQLException e)
+        {
+            log.error("Error releasing connection", e);
+            e.printStackTrace();
         }
     }
     
@@ -167,15 +184,18 @@ public class SampleServiceApp
         DBDatabaseDriver driver = new DBDatabaseDriverHSql();
         log.info("Opening database '{}' using driver '{}'", db.getClass().getSimpleName(), driver.getClass().getSimpleName());
         Connection conn = null;
+        DBContext context = null;
         try {
             conn = getJDBCConnection(ctx);
+            context = new DBContextStatic(driver, conn);
             db.open(driver, conn);
             if (!databaseExists(db, conn)) {
                 // STEP 4: Create Database
                 log.info("Creating database {}", db.getClass().getSimpleName());
-                createSampleDatabase(db, driver, conn);
+                createSampleDatabase(db, context);
             }
         } finally {
+            context.discard();
             releaseConnection(db, conn, true);
         }
 
@@ -193,39 +213,39 @@ public class SampleServiceApp
         }
     }
 
-    private static void createSampleDatabase(SampleDB db, DBDatabaseDriver driver, Connection conn) {
+    private static void createSampleDatabase(SampleDB db, DBContext context) {
         // create DLL for Database Definition
-        DBSQLScript script = new DBSQLScript();
-        db.getCreateDDLScript(driver, script);
+        DBSQLScript script = new DBSQLScript(context);
+        db.getCreateDDLScript(script);
         // Show DLL Statements
         System.out.println(script.toString());
         // Execute Script
-        script.executeAll(driver, conn, false);
-        db.commit(conn);
+        script.executeAll(false);
+        context.commit();
         // Open again
         if (!db.isOpen()) {
-            db.open(driver, conn);
+            db.open(context.getDriver(), context.getConnection());
         }
         // Insert Sample Departments
-        insertDepartmentSampleRecord(db, conn, "Procurement", "ITTK");
-        int idDevDep = insertDepartmentSampleRecord(db, conn, "Development", "ITTK");
-        int idSalDep = insertDepartmentSampleRecord(db, conn, "Sales", "ITTK");
+        insertDepartmentSampleRecord(db, context, "Procurement", "ITTK");
+        int idDevDep = insertDepartmentSampleRecord(db, context, "Development", "ITTK");
+        int idSalDep = insertDepartmentSampleRecord(db, context, "Sales", "ITTK");
         // Insert Sample Employees
-        insertEmployeeSampleRecord(db, conn, "Mr.", "Eugen", "Miller", "M", idDevDep);
-        insertEmployeeSampleRecord(db, conn, "Mr.", "Max", "Mc. Callahan", "M", idDevDep);
-        insertEmployeeSampleRecord(db, conn, "Mrs.", "Anna", "Smith", "F", idSalDep);
+        insertEmployeeSampleRecord(db, context, "Mr.", "Eugen", "Miller", "M", idDevDep);
+        insertEmployeeSampleRecord(db, context, "Mr.", "Max", "Mc. Callahan", "M", idDevDep);
+        insertEmployeeSampleRecord(db, context, "Mrs.", "Anna", "Smith", "F", idSalDep);
         // Commit
-        db.commit(conn);
+        context.commit();
     }
 
-    private static int insertDepartmentSampleRecord(SampleDB db, Connection conn, String department_name, String businessUnit) {
+    private static int insertDepartmentSampleRecord(SampleDB db, DBContext context, String department_name, String businessUnit) {
         // Insert a Department
-        DBRecord rec = new DBRecord();
-        rec.create(db.T_DEPARTMENTS);
+        DBRecord rec = new DBRecord(context, db.T_DEPARTMENTS);
+        rec.create();
         rec.setValue(db.T_DEPARTMENTS.NAME, department_name);
         rec.setValue(db.T_DEPARTMENTS.BUSINESS_UNIT, businessUnit);
         try {
-            rec.update(conn);
+            rec.update();
         } catch (Exception e) {
             log.error(e.getLocalizedMessage());
             return 0;
@@ -237,17 +257,17 @@ public class SampleServiceApp
     /*
      * Insert a person
      */
-    private static int insertEmployeeSampleRecord(SampleDB db, Connection conn, String salutation, String firstName, String lastName, String gender, int depID) {
+    private static int insertEmployeeSampleRecord(SampleDB db, DBContext context, String salutation, String firstName, String lastName, String gender, int depID) {
         // Insert an Employee
-        DBRecord rec = new DBRecord();
-        rec.create(db.T_EMPLOYEES);
+        DBRecord rec = new DBRecord(context, db.T_EMPLOYEES);
+        rec.create();
         rec.setValue(db.T_EMPLOYEES.SALUTATION, salutation);
         rec.setValue(db.T_EMPLOYEES.FIRST_NAME, firstName);
         rec.setValue(db.T_EMPLOYEES.LAST_NAME, lastName);
         rec.setValue(db.T_EMPLOYEES.GENDER, gender);
         rec.setValue(db.T_EMPLOYEES.DEPARTMENT_ID, depID);
         try {
-            rec.update(conn);
+            rec.update();
         } catch (Exception e) {
             log.error(e.getLocalizedMessage());
             return 0;
diff --git a/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/rest/service/EmployeeService.java b/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/rest/service/EmployeeService.java
index aef35f5..eb1a24c 100644
--- a/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/rest/service/EmployeeService.java
+++ b/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/rest/service/EmployeeService.java
@@ -126,10 +126,10 @@ public class EmployeeService extends Service {
             meta[i] = new JsoColumnMeta(cols[i], txtres);
         }
         
-        DBReader reader = new DBReader();
+        DBReader reader = new DBReader(getRecordContext());
         List<JsoRecordData> list = new ArrayList<>();
         try {
-            reader.open(cmd, getConnection());
+            reader.open(cmd);
             while (reader.moveNext()) {
                 list.add(new JsoRecordData(reader));
             }
@@ -148,7 +148,7 @@ public class EmployeeService extends Service {
         RecordContext ctx = this.getRecordContext(); 
 	    try {
 	        // return a record
-	        EmployeeRecord rec = new EmployeeRecord(getDatabase(), ctx);
+	        EmployeeRecord rec = new EmployeeRecord(ctx);
             rec.read(employeeId);
             JsoRecordData emp = new JsoRecordData(rec);
             return Response.ok(new JsoResultWithMeta(emp, rec.getMeta())).build();
@@ -167,7 +167,7 @@ public class EmployeeService extends Service {
         RecordContext ctx = this.getRecordContext(); 
         try {
             // return a record
-            EmployeeRecord rec = new EmployeeRecord(getDatabase(), ctx);
+            EmployeeRecord rec = new EmployeeRecord(ctx);
             rec.create();
             JsoRecordData emp = new JsoRecordData(rec);
             return Response.ok(new JsoResultWithMeta(emp, rec.getMeta())).build();
@@ -187,7 +187,7 @@ public class EmployeeService extends Service {
         RecordContext ctx = this.getRecordContext(); 
         try {
             // return a record
-            EmployeeRecord rec = new EmployeeRecord(getDatabase(), ctx);
+            EmployeeRecord rec = new EmployeeRecord(ctx);
             rec.init(employeeData, employeeData.isNewRecord());
             rec.update();
             return Response.ok().build();
diff --git a/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/rest/service/Service.java b/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/rest/service/Service.java
index f087e82..2116e71 100644
--- a/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/rest/service/Service.java
+++ b/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/rest/service/Service.java
@@ -29,6 +29,8 @@ import javax.ws.rs.container.ContainerRequestContext;
 import javax.ws.rs.core.Context;
 import javax.ws.rs.core.Response;
 
+import org.apache.empire.db.DBDatabaseDriver;
+import org.apache.empire.db.context.DBContextBase;
 import org.apache.empire.exceptions.EmpireException;
 import org.apache.empire.rest.app.SampleServiceApp;
 import org.apache.empire.rest.app.TextResolver;
@@ -62,18 +64,32 @@ public abstract class Service {
      * Holds a connection and therefore must not live for longer than the request  
      * @author doebele
      */
-    public static class ServiceRecordContext implements RecordContext
+    public static class ServiceRecordContext extends DBContextBase implements RecordContext
     {
+        private final SampleDB db;
         private final Connection conn;
         private final TextResolver textResolver;
         
-        public ServiceRecordContext(Connection conn)
+        public ServiceRecordContext(SampleDB db, Connection conn)
         {
+            this.db = db;
             this.conn = conn;
             this.textResolver = SampleServiceApp.instance().getTextResolver(Locale.ENGLISH);
         }
 
         @Override
+        public SampleDB getDb()
+        {
+            return db;
+        }
+
+        @Override
+        public DBDatabaseDriver getDriver()
+        {
+            return db.getDriver();
+        }
+
+        @Override
         public Connection getConnection()
         {
             return conn;
@@ -87,7 +103,7 @@ public abstract class Service {
     }
     
 	@Context
-	private ServletContext			context;
+	private ServletContext			servletContext;
 
 	@Context
 	private ContainerRequestContext	containerRequestContext;
@@ -96,7 +112,7 @@ public abstract class Service {
 	private HttpServletRequest		req;
 
 	public SampleDB getDatabase() {
-		return (SampleDB) this.context.getAttribute(Service.Consts.ATTRIBUTE_DB);
+		return (SampleDB) this.servletContext.getAttribute(Service.Consts.ATTRIBUTE_DB);
 	}
 
 	public Connection getConnection() {
@@ -105,7 +121,7 @@ public abstract class Service {
 	}
 
     public RecordContext getRecordContext() {
-        return new ServiceRecordContext(getConnection());
+        return new ServiceRecordContext(getDatabase(), getConnection());
     }
 
 	public ServletRequest getServletRequest() {
diff --git a/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/vue/sample/db/RecordContext.java b/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/vue/sample/db/RecordContext.java
index 32d9418..d7a2739 100644
--- a/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/vue/sample/db/RecordContext.java
+++ b/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/vue/sample/db/RecordContext.java
@@ -20,6 +20,7 @@ package org.apache.empire.vue.sample.db;
 
 import java.sql.Connection;
 
+import org.apache.empire.db.DBContext;
 import org.apache.empire.rest.app.TextResolver;
 
 /**
@@ -28,8 +29,9 @@ import org.apache.empire.rest.app.TextResolver;
  * @author doebele
  *
  */
-public interface RecordContext
+public interface RecordContext extends DBContext
 {
+    SampleDB getDb();
     /**
      * provide a JDBC connection for DB operations 
      * @return the JDBC connection
diff --git a/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/vue/sample/db/records/DepartmentRecord.java b/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/vue/sample/db/records/DepartmentRecord.java
index b38e61c..69b9845 100644
--- a/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/vue/sample/db/records/DepartmentRecord.java
+++ b/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/vue/sample/db/records/DepartmentRecord.java
@@ -26,9 +26,9 @@ public class DepartmentRecord extends SampleRecord<TDepartments>
 {
     private final static long serialVersionUID = 1L;
 
-    public DepartmentRecord(SampleDB db, RecordContext recordContext)
+    public DepartmentRecord(RecordContext recordContext)
     {
-        super(db.T_DEPARTMENTS, recordContext);
+        super(recordContext.getDb().T_DEPARTMENTS, recordContext);
     }
   
 }
diff --git a/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/vue/sample/db/records/EmployeeRecord.java b/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/vue/sample/db/records/EmployeeRecord.java
index cffe29a..38656a5 100644
--- a/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/vue/sample/db/records/EmployeeRecord.java
+++ b/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/vue/sample/db/records/EmployeeRecord.java
@@ -30,9 +30,9 @@ public class EmployeeRecord extends SampleRecord<TEmployees>
 {
     private final static long serialVersionUID = 1L;
 
-    public EmployeeRecord(SampleDB db, RecordContext recordContext)
+    public EmployeeRecord(RecordContext recordContext)
     {
-        super(db.T_EMPLOYEES, recordContext);
+        super(recordContext.getDb().T_EMPLOYEES, recordContext);
     }
     
 	/*
@@ -68,9 +68,9 @@ public class EmployeeRecord extends SampleRecord<TEmployees>
     // Sample Implementation for Department Record
     public DepartmentRecord getDepartmentRecord()
     {
-        DepartmentRecord rec = new DepartmentRecord((SampleDB)this.getDatabase(), recordContext);
+        DepartmentRecord rec = new DepartmentRecord(recordContext);
         SampleDB.TDepartments table = ((SampleDB)getDatabase()).T_DEPARTMENTS;
-        rec.read(table, this.getInt(T.DEPARTMENT_ID), recordContext.getConnection());
+        rec.read(this.getInt(T.DEPARTMENT_ID));
         return rec;
     }
 
diff --git a/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/vue/sample/db/records/SampleRecord.java b/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/vue/sample/db/records/SampleRecord.java
index eba7767..73a93f1 100644
--- a/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/vue/sample/db/records/SampleRecord.java
+++ b/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/vue/sample/db/records/SampleRecord.java
@@ -43,7 +43,7 @@ public abstract class SampleRecord<T extends SampleTable> extends DBRecord {
 	protected final RecordContext recordContext;
 
 	public SampleRecord(T table, RecordContext recordContext) {
-		super(table);
+		super(recordContext, table);
 		this.T = table;
 		this.recordContext = recordContext;
 	}
@@ -129,25 +129,4 @@ public abstract class SampleRecord<T extends SampleTable> extends DBRecord {
             throw new RecordInitException(exptns);
         }
     }
-    
-    public void create()
-    {
-        super.create(getTable(), recordContext.getConnection());
-    }
-	
-    public void read(Object[] keys)
-    {
-        super.read(getTable(), keys, recordContext.getConnection());
-    }
-
-    public void read(Object id)
-    {
-        super.read(getTable(), id, recordContext.getConnection());
-    }
-    
-    public void update()
-    {
-        super.update(recordContext.getConnection());
-    }
-	
 }
\ No newline at end of file
diff --git a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/app/FacesUtils.java b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/app/FacesUtils.java
index 19bf909..d20add2 100644
--- a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/app/FacesUtils.java
+++ b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/app/FacesUtils.java
@@ -20,7 +20,6 @@ package org.apache.empire.jsf2.app;
 
 import java.io.File;
 import java.io.IOException;
-import java.sql.Connection;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map;
@@ -38,6 +37,7 @@ import javax.servlet.http.HttpServletRequest;
 import org.apache.empire.commons.ObjectUtils;
 import org.apache.empire.commons.StringUtils;
 import org.apache.empire.data.Column;
+import org.apache.empire.db.DBContext;
 import org.apache.empire.db.DBDatabase;
 import org.apache.empire.exceptions.EmpireException;
 import org.apache.empire.exceptions.InternalException;
@@ -191,22 +191,23 @@ public class FacesUtils
         FacesUtils.redirectDirectly(fc, page.getOutcome());
     }
     
-    /* Connection */
+    /* Connection 
     
-    public Connection getConnection(final FacesContext fc, DBDatabase db) 
+    public DBContext getDBContext(final FacesContext fc, DBDatabase db) 
     {
-        return getWebApplication().getConnectionForRequest(fc, db);
+        return getWebApplication().getDBContextForRequest(fc, db);
     }
     
-    public void releaseAllConnections(final FacesContext fc, boolean commit)
+    public void releaseDBContext(final FacesContext fc, DBDatabase db, boolean commit)
     {
-        getWebApplication().releaseAllConnections(fc, commit);
+        getWebApplication().releaseDBContext(fc, db, commit);
     }
     
-    public void releaseAllConnections(final FacesContext fc, DBDatabase db, boolean commit)
+    public void releaseAllDBContexts(final FacesContext fc, boolean commit)
     {
-        getWebApplication().releaseConnection(fc, db, commit);
+        getWebApplication().releaseAllDBContexts(fc, commit);
     }
+    */
     
     /* Pages */
 
diff --git a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/app/WebApplication.java b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/app/WebApplication.java
index 682298d..4607a4d 100644
--- a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/app/WebApplication.java
+++ b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/app/WebApplication.java
@@ -429,12 +429,12 @@ public abstract class WebApplication
             // Commit or rollback connection depending on the exit code
             if (commit)
             { // success: commit all changes
-                db.commit(conn);
+                conn.commit();
                 log.debug("REQUEST commited.");
             }
             else
             { // failure: rollback all changes
-                db.rollback(conn);
+                conn.rollback();
                 log.debug("REQUEST rolled back.");
             }
             // Release Connection
diff --git a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/pageelements/BeanListPageElement.java b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/pageelements/BeanListPageElement.java
index e248852..cecd9a8 100644
--- a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/pageelements/BeanListPageElement.java
+++ b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/pageelements/BeanListPageElement.java
@@ -18,6 +18,7 @@
  */
 package org.apache.empire.jsf2.pageelements;
 
+import java.sql.Connection;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
@@ -247,6 +248,7 @@ public class BeanListPageElement<T> extends ListPageElement<T> implements ListIt
     public void initItems(DBCommand queryCmd, DBCommand countCmd, int pageSize)
     {
         clearItems();
+        Connection conn = getDBContext(rowset).getConnection();
         // Init List Table Info
         BeanListTableInfo lti = (BeanListTableInfo) getTableInfo();
         lti.setQueryCmd(queryCmd);
@@ -254,7 +256,7 @@ public class BeanListPageElement<T> extends ListPageElement<T> implements ListIt
         { // Negative count means: loadItems should load all items.
             countCmd.clearSelect();
             countCmd.select(rowset.count());
-            int count = rowset.getDatabase().querySingleInt(countCmd.getSelect(), countCmd.getParamValues(), 0, getConnection(rowset));
+            int count = rowset.getDatabase().querySingleInt(countCmd.getSelect(), countCmd.getParamValues(), 0, conn);
             lti.init(count, pageSize);
         }
         else
@@ -319,7 +321,7 @@ public class BeanListPageElement<T> extends ListPageElement<T> implements ListIt
     {
         // DBReader
         BeanListTableInfo lti = (BeanListTableInfo) getTableInfo();
-        DBReader r = new DBReader();
+        DBReader r = new DBReader(getDBContext(rowset));
         try
         { // Check command
             DBCommand queryCmd = lti.getQueryCmd();
@@ -367,7 +369,7 @@ public class BeanListPageElement<T> extends ListPageElement<T> implements ListIt
             }
 
             // DBReader.open must always be surrounded with a try {} finally {} block!
-            r.open(queryCmd, getConnection(queryCmd));
+            r.open(queryCmd);
 
             // get position from the session
             if (skipRows>0)
diff --git a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/pageelements/RecordPageElement.java b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/pageelements/RecordPageElement.java
index c708a81..b3c8e67 100644
--- a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/pageelements/RecordPageElement.java
+++ b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/pageelements/RecordPageElement.java
@@ -132,8 +132,7 @@ public class RecordPageElement<T extends DBRecord> extends PageElement
             throw new ObjectNotValidException(record);
         }
         // Record laden
-        Connection conn = getPage().getConnection(rowset.getDatabase()); 
-        record.read(rowset, recKey, conn);
+        record.read(recKey);
     }
     
     /**
@@ -150,8 +149,7 @@ public class RecordPageElement<T extends DBRecord> extends PageElement
         this.removeSessionObject(DBRecord.class);
         this.setSessionObject(Object[].class, recKey);
         // Record laden
-        Connection conn = getPage().getConnection(rowset.getDatabase()); 
-        record.read(rowset, recKey, conn);
+        record.read(recKey);
     }
 
     /**
@@ -180,8 +178,7 @@ public class RecordPageElement<T extends DBRecord> extends PageElement
      */
     public void createRecord()
     {
-        Connection conn = getPage().getConnection(rowset.getDatabase()); 
-        record.create(rowset, conn);
+        record.create();
         // Put key on Session
         this.removeSessionObject(Object[].class);
         this.setSessionObject(DBRecord.class, record);
@@ -204,8 +201,7 @@ public class RecordPageElement<T extends DBRecord> extends PageElement
             {   // Not Modified
                 return true; 
             }
-            Connection conn = getPage().getConnection(rowset.getDatabase()); 
-            record.update(conn);
+            record.update();
             // Put key on Session
             this.removeSessionObject(DBRecord.class);
             this.setSessionObject(Object[].class, record.getKeyValues());
@@ -232,8 +228,7 @@ public class RecordPageElement<T extends DBRecord> extends PageElement
         if (!record.isValid())
             throw new ObjectNotValidException(record);
         // delete
-        Connection conn = getPage().getConnection(rowset.getDatabase()); 
-        record.delete(conn);
+        record.delete();
         // Put key on Session
         this.removeSessionObject(Object[].class);
         this.removeSessionObject(DBRecord.class);
diff --git a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/pages/Page.java b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/pages/Page.java
index f1c7ace..5483263 100644
--- a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/pages/Page.java
+++ b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/pages/Page.java
@@ -20,7 +20,6 @@ package org.apache.empire.jsf2.pages;
 
 import java.io.Serializable;
 import java.lang.reflect.Method;
-import java.sql.Connection;
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
@@ -32,6 +31,7 @@ import javax.faces.context.ExternalContext;
 import javax.faces.context.FacesContext;
 
 import org.apache.empire.commons.StringUtils;
+import org.apache.empire.db.DBContext;
 import org.apache.empire.db.DBDatabase;
 import org.apache.empire.db.DBRowSet;
 import org.apache.empire.exceptions.EmpireException;
@@ -67,6 +67,13 @@ public abstract class Page implements Serializable
         }
     }
 
+    /**
+     * return a DBContext for a particular database
+     * @param db the database for which to obtain a connection
+     * @return the connection for the given database
+     */
+    public abstract DBContext getDBContext(DBDatabase db);
+
     public String getPageName()
     {
         return (pageDefinition != null ? pageDefinition.getPageBeanName() : "{" + getClass().getSimpleName() + "}");
@@ -395,17 +402,6 @@ public abstract class Page implements Serializable
         return getParentOutcome(null, redirect);
     }
 
-    /**
-     * return a connection for a particular database
-     * @param db the database for which to obtain a connection
-     * @return the connection for the given database
-     */
-    public Connection getConnection(DBDatabase db)
-    {       
-        WebApplication app = FacesUtils.getWebApplication();
-        return app.getConnectionForRequest(FacesUtils.getContext(), db);
-    }
-
     public <T extends ParameterObject> T getObjectFromParam(Class<T> paramType, String idParam)
     {
         FacesContext fc = FacesUtils.getContext();
diff --git a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/pages/PageElement.java b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/pages/PageElement.java
index e5c1147..6fb0675 100644
--- a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/pages/PageElement.java
+++ b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/pages/PageElement.java
@@ -19,12 +19,12 @@
 package org.apache.empire.jsf2.pages;
 
 import java.io.Serializable;
-import java.sql.Connection;
 import java.util.Map;
 
 import javax.faces.context.FacesContext;
 
 import org.apache.empire.commons.StringUtils;
+import org.apache.empire.db.DBContext;
 import org.apache.empire.db.DBDatabase;
 import org.apache.empire.db.DBObject;
 import org.apache.empire.db.DBRowSet;
@@ -101,16 +101,16 @@ public class PageElement implements Serializable
         setSessionObject(type, null);
     }
 
-    public Connection getConnection(DBDatabase db)
+    public DBContext getDBContext(DBDatabase db)
     {
-        return page.getConnection(db);
+        return page.getDBContext(db);
     }
 
-    public Connection getConnection(DBObject dbo)
+    public DBContext getDBContext(DBObject dbo)
     {
         if (dbo==null)
             throw new InvalidArgumentException("dbo", dbo);
-        return page.getConnection(dbo.getDatabase());
+        return getDBContext(dbo.getDatabase());
     }
     
     /**
diff --git a/empire-db/src/main/java/org/apache/empire/data/bean/BeanResult.java b/empire-db/src/main/java/org/apache/empire/data/bean/BeanResult.java
index 1da2aa8..9a179fb 100644
--- a/empire-db/src/main/java/org/apache/empire/data/bean/BeanResult.java
+++ b/empire-db/src/main/java/org/apache/empire/data/bean/BeanResult.java
@@ -24,6 +24,7 @@ import java.util.ArrayList;
 
 import org.apache.empire.db.DBColumn;
 import org.apache.empire.db.DBCommand;
+import org.apache.empire.db.DBContext;
 import org.apache.empire.db.DBDatabase;
 import org.apache.empire.db.DBReader;
 import org.apache.empire.db.DBRowSet;
@@ -115,13 +116,13 @@ public class BeanResult<T> extends ArrayList<T>
         return cmd;
     }
     
-    public int fetch(Connection conn, int maxItems)
+    public int fetch(DBContext context, int maxItems)
     {
         clear();
-        DBReader reader = new DBReader();
+        DBReader reader = new DBReader(context);
         try {
             // Open and Read
-            reader.open(cmd, conn);
+            reader.open(cmd);
             reader.getBeanList(this, clazz, maxItems);
             return size();
             
@@ -130,9 +131,9 @@ public class BeanResult<T> extends ArrayList<T>
         }
     }
 
-    public final int fetch(Connection conn)
+    public final int fetch(DBContext context)
     {
-        return fetch(conn, -1);
+        return fetch(context, -1);
     }
     
 }
diff --git a/empire-db/src/main/java/org/apache/empire/db/DBCommandExpr.java b/empire-db/src/main/java/org/apache/empire/db/DBCommandExpr.java
index e55f4f8..33b86b2 100644
--- a/empire-db/src/main/java/org/apache/empire/db/DBCommandExpr.java
+++ b/empire-db/src/main/java/org/apache/empire/db/DBCommandExpr.java
@@ -143,21 +143,21 @@ public abstract class DBCommandExpr extends DBExpr
 
         /** Returns the error message: ERR_NOTSUPPORTED */
         @Override
-        public void createRecord(DBRecord rec, Connection conn)
+        public void createRecord(DBRecord rec, boolean deferredInit)
         {
             throw new NotSupportedException(this, "addRecord");
         }
 
         /** Returns the error message: ERR_NOTSUPPORTED */
         @Override
-        public void readRecord(DBRecord rec, Object[] keys, Connection conn)
+        public void readRecord(DBRecord rec, Object[] keys)
         {
             throw new NotSupportedException(this, "getRecord");
         }
 
         /** Returns the error message: ERR_NOTSUPPORTED */
         @Override
-        public void updateRecord(DBRecord rec, Connection conn)
+        public void updateRecord(DBRecord rec)
         {
             throw new NotSupportedException(this, "updateRecord");
         }
diff --git a/empire-db/src/main/java/org/apache/empire/db/DBContext.java b/empire-db/src/main/java/org/apache/empire/db/DBContext.java
index 51e7017..9e9adb7 100644
--- a/empire-db/src/main/java/org/apache/empire/db/DBContext.java
+++ b/empire-db/src/main/java/org/apache/empire/db/DBContext.java
@@ -19,4 +19,6 @@ public interface DBContext
     
     void addRollbackHandler(DBRollbackHandler handler);
     
+    void discard();
+    
 }
diff --git a/empire-db/src/main/java/org/apache/empire/db/DBContextAware.java b/empire-db/src/main/java/org/apache/empire/db/DBContextAware.java
new file mode 100644
index 0000000..2360af9
--- /dev/null
+++ b/empire-db/src/main/java/org/apache/empire/db/DBContextAware.java
@@ -0,0 +1,9 @@
+/*
+ * ESTEAM Software GmbH, 19.01.2022
+ */
+package org.apache.empire.db;
+
+public interface DBContextAware
+{
+    <T extends DBContext> T  getContext();
+}
diff --git a/empire-db/src/main/java/org/apache/empire/db/DBDatabase.java b/empire-db/src/main/java/org/apache/empire/db/DBDatabase.java
index 089bf46..264c55f 100644
--- a/empire-db/src/main/java/org/apache/empire/db/DBDatabase.java
+++ b/empire-db/src/main/java/org/apache/empire/db/DBDatabase.java
@@ -364,7 +364,7 @@ public abstract class DBDatabase extends DBObject
      * @param driver The driver for which to create a DDL Script
      * @param script the script object that will be completed
      */
-    public synchronized void getCreateDDLScript(DBDatabaseDriver driver, DBSQLScript script)
+    public synchronized void getCreateDDLScript(DBSQLScript script)
     {
         DBDatabaseDriver prevDriver = this.driver;
         try {
@@ -1571,7 +1571,7 @@ public abstract class DBDatabase extends DBObject
      * 
      * @param conn a valid database connection
      */
-    public void commit(Connection conn)
+    private void commit(Connection conn)
     {
         try
         {   // Check argument
@@ -1595,7 +1595,7 @@ public abstract class DBDatabase extends DBObject
      * <P>
      * @param conn a valid database connection
      */
-    public void rollback(Connection conn)
+    private void rollback(Connection conn)
     {
         try
         {   // Check argument
diff --git a/empire-db/src/main/java/org/apache/empire/db/DBQuery.java b/empire-db/src/main/java/org/apache/empire/db/DBQuery.java
index 4347a89..f6dafb5 100644
--- a/empire-db/src/main/java/org/apache/empire/db/DBQuery.java
+++ b/empire-db/src/main/java/org/apache/empire/db/DBQuery.java
@@ -371,7 +371,7 @@ public class DBQuery extends DBRowSet
      * @throws NotImplementedException because this is not implemented
      */
     @Override
-    public void createRecord(DBRecord rec, Connection conn)
+    public void createRecord(DBRecord rec, boolean deferredInit)
     {
         throw new NotImplementedException(this, "createRecord");
     }
@@ -384,9 +384,9 @@ public class DBQuery extends DBRowSet
      * @param conn a valid connection to the database.
      */
     @Override
-    public void readRecord(DBRecord rec, Object[] key, Connection conn)
+    public void readRecord(DBRecord rec, Object[] key)
     {
-        if (conn == null || rec == null)
+        if (rec == null)
             throw new InvalidArgumentException("conn|rec", null);
         DBColumn[] keyColumns = getKeyColumns();
         if (key == null || keyColumns.length != key.length)
@@ -403,7 +403,7 @@ public class DBQuery extends DBRowSet
         // Read Record
         try {
             // Read Record
-            readRecord(rec, cmd, conn);
+            readRecord(rec, cmd);
             // Set RowSetData
             rec.updateComplete(key.clone());
         } catch (QueryNoResultException e) {
@@ -419,7 +419,7 @@ public class DBQuery extends DBRowSet
      * @param conn a valid connection to the database.
      */
     @Override
-    public void updateRecord(DBRecord rec, Connection conn)
+    public void updateRecord(DBRecord rec)
     {
         // check updateable
         if (isUpdateable()==false)
@@ -427,8 +427,6 @@ public class DBQuery extends DBRowSet
         // check params
         if (rec == null)
             throw new InvalidArgumentException("record", null);
-        if (conn == null)
-            throw new InvalidArgumentException("conn", null);
         // Has record been modified?
         if (rec.isModified() == false)
             return; // Nothing to update
@@ -467,6 +465,8 @@ public class DBQuery extends DBRowSet
                 updCmd.set(col.to(fields[i]));
             }
         }
+        // the connection
+        Connection conn = rec.getContext().getConnection();
         // the commands
         DBCommand cmd = getCommandFromExpression();
         Object[] keys = (Object[]) rec.getRowSetData();
@@ -562,14 +562,14 @@ public class DBQuery extends DBRowSet
             
             // Execute SQL
             int affected = db.executeSQL(upd.getUpdate(), upd.getParamValues(), conn);
-            if (affected <= 0)
+            if (affected<= 0)
             {   // Error
                 if (affected == 0)
                 { // Record not found
                     throw new RecordUpdateFailedException(this, keys);
                 }
                 // Rollback
-                db.rollback(conn);
+                // context.rollback();
                 return;
             } 
             else if (affected > 1)
diff --git a/empire-db/src/main/java/org/apache/empire/db/DBReader.java b/empire-db/src/main/java/org/apache/empire/db/DBReader.java
index 7906382..7f9978a 100644
--- a/empire-db/src/main/java/org/apache/empire/db/DBReader.java
+++ b/empire-db/src/main/java/org/apache/empire/db/DBReader.java
@@ -71,7 +71,7 @@ import org.w3c.dom.Element;
  *
  *
  */
-public class DBReader extends DBRecordData
+public class DBReader extends DBRecordData implements DBContextAware
 {
     private final static long serialVersionUID = 1L;
   
@@ -238,6 +238,8 @@ public class DBReader extends DBRecordData
      */
     private static ThreadLocal<Map<DBReader, Exception>> threadLocalOpenResultSets = new ThreadLocal<Map<DBReader, Exception>>();
     
+    private final DBContext context;
+    
     // Object references
     private DBDatabase     db      = null;
     private DBColumnExpr[] colList = null;
@@ -246,22 +248,34 @@ public class DBReader extends DBRecordData
     private Map<ColumnExpr, Integer> fieldIndexMap = null;
 
     /**
+     * Constructs an empty DBRecordSet object.
+     * @param useFieldIndexMap 
+     */
+    public DBReader(DBContext context, boolean useFieldIndexMap)
+    {
+        this.context = context;
+        if (useFieldIndexMap)
+            fieldIndexMap = new HashMap<ColumnExpr, Integer>();
+    }
+
+    /**
      * Constructs a default DBReader object with the fieldIndexMap enabled.
      */
-    public DBReader()
+    public DBReader(DBContext context)
     {
-        // Default Constructor
-        this(true);
+        // Simple Constructor
+        this(context, true);
     }
 
     /**
-     * Constructs an empty DBRecordSet object.
-     * @param useFieldIndexMap 
+     * Returns the current Context
+     * @return
      */
-    public DBReader(boolean useFieldIndexMap)
+    @Override
+    @SuppressWarnings("unchecked")
+    public <T extends DBContext> T  getContext()
     {
-        if (useFieldIndexMap)
-            fieldIndexMap = new HashMap<ColumnExpr, Integer>();
+        return ((T)context);
     }
 
     /**
@@ -410,7 +424,7 @@ public class DBReader extends DBRecordData
      * @param scrollable true if the reader should be scrollable or false if not
      * @param conn a valid JDBC connection.
      */
-    public void open(DBCommandExpr cmd, boolean scrollable, Connection conn)
+    public void open(DBCommandExpr cmd, boolean scrollable)
     {
         if (isOpen())
             close();
@@ -433,7 +447,7 @@ public class DBReader extends DBRecordData
         }
         // Execute the query
         DBDatabase queryDb   = cmd.getDatabase();
-        ResultSet  queryRset = queryDb.executeQuery(sqlCmd, paramValues, scrollable, conn);
+        ResultSet  queryRset = queryDb.executeQuery(sqlCmd, paramValues, scrollable, context.getConnection());
         if (queryRset==null)
             throw new QueryNoResultException(sqlCmd);
         // init
@@ -448,9 +462,9 @@ public class DBReader extends DBRecordData
      * @param cmd the SQL-Command with cmd.getSelect()
      * @param conn a valid JDBC connection.
      */
-    public final void open(DBCommandExpr cmd, Connection conn)
+    public final void open(DBCommandExpr cmd)
     {
-        open(cmd, false, conn);
+        open(cmd, false);
     }
 
     /**
@@ -466,9 +480,9 @@ public class DBReader extends DBRecordData
      * @param cmd the SQL-Command with cmd.getSelect()
      * @param conn a valid JDBC connection.
      */
-    public void getRecordData(DBCommandExpr cmd, Connection conn)
+    public void getRecordData(DBCommandExpr cmd)
     { // Open the record
-        open(cmd, conn);
+        open(cmd);
         // Get First Record
         if (!moveNext())
         { // Close
@@ -630,11 +644,10 @@ public class DBReader extends DBRecordData
      * @param rowset the rowset to which to attach
      * @param rec the record which to initialize
      */
-    public void initRecord(DBRowSet rowset, DBRecord rec)
+    public void initRecord(DBRecord rec)
     {
-    	if (rowset==null)
-    	    throw new InvalidArgumentException("rowset", rowset);
-    	// init Record
+        // init Record
+        DBRowSet rowset = rec.getRowSet();
     	rowset.initRecord(rec, this);
     }
 
diff --git a/empire-db/src/main/java/org/apache/empire/db/DBRecord.java b/empire-db/src/main/java/org/apache/empire/db/DBRecord.java
index 091db47..6bcb4cf 100644
--- a/empire-db/src/main/java/org/apache/empire/db/DBRecord.java
+++ b/empire-db/src/main/java/org/apache/empire/db/DBRecord.java
@@ -38,6 +38,7 @@ import org.apache.empire.db.exceptions.FieldValueNotFetchedException;
 import org.apache.empire.db.expr.compare.DBCompareExpr;
 import org.apache.empire.exceptions.BeanPropertyGetException;
 import org.apache.empire.exceptions.InvalidArgumentException;
+import org.apache.empire.exceptions.NotSupportedException;
 import org.apache.empire.exceptions.ObjectNotValidException;
 import org.apache.empire.xml.XMLUtil;
 import org.slf4j.Logger;
@@ -51,7 +52,7 @@ import org.w3c.dom.Element;
  * This class handles one record from a database table. 
  *
  */
-public class DBRecord extends DBRecordData implements Record, Cloneable
+public class DBRecord extends DBRecordData implements DBContextAware, Record, Cloneable
 {
     private final static long serialVersionUID = 1L;
     
@@ -199,9 +200,11 @@ public class DBRecord extends DBRecordData implements Record, Cloneable
     
     protected static final Logger log    = LoggerFactory.getLogger(DBRecord.class);
 
+    private final DBContext context;
+    private final DBRowSet  rowset;
+    
     // This is the record data
     private State           state;
-    private DBRowSet        rowset;
     private Object[]        fields;
     private boolean[]       modified;
     private boolean         validateFieldValues;
@@ -213,8 +216,7 @@ public class DBRecord extends DBRecordData implements Record, Cloneable
      * The record is not attached to a RowSet and the record's state is initially set to REC_INVALID.
      * 
      * Please derive your own Objects from this class.   
-     */
-    public DBRecord()
+    protected DBRecord()
     {
         state = State.Invalid;
         rowset = null;
@@ -224,12 +226,28 @@ public class DBRecord extends DBRecordData implements Record, Cloneable
         validateFieldValues = true;
     }
 
-    public DBRecord(DBRowSet initialRowset)
+    protected DBRecord(DBRowSet initialRowset)
     {
     	this();
     	// allow initial rowset
     	rowset = initialRowset;
     }
+     */
+    
+    public DBRecord(DBContext context, DBRowSet rowset)
+    {
+        // Check params
+        if (context==null || rowset==null)
+            throw new InvalidArgumentException("context|rowset", context);
+        // init
+        this.context = context;
+        this.rowset = rowset;
+        this.state = State.Invalid;
+        this.fields = null;
+        this.modified = null;
+        this.rowsetData = null;
+        this.validateFieldValues = true;
+    }
     
     /**
      * This method is used internally by the RowSet to initialize the record's properties
@@ -237,33 +255,22 @@ public class DBRecord extends DBRecordData implements Record, Cloneable
      * @param rowSetData any further RowSet specific data
      * @param newRecord
      */
-    protected void initData(DBRowSet rowset, Object rowSetData, boolean newRecord)
+    void initData(Object rowSetData, boolean newRecord)
     {
         // Init rowset
-        boolean rowsetChanged = (this.rowset != rowset);
-        if (rowsetChanged)
-            fields = null;
-        this.rowset = rowset;
-        // Init fields
-        if (rowset!=null)
-        {   // Set Rowset
-            int colCount = rowset.getColumns().size();
-            if (fields==null || fields.length!=colCount)
-                fields = new Object[colCount];
-            else
-            {   // clear fields
-                for (int i=0; i<fields.length; i++)
-                    if (fields[i]!=ObjectUtils.NO_VALUE)
-                        fields[i]=null;
-            }
+        int colCount = rowset.getColumns().size();
+        if (fields==null || fields.length!=colCount)
+            fields = new Object[colCount];
+        else
+        {   // clear fields
+            for (int i=0; i<fields.length; i++)
+                if (fields[i]!=ObjectUtils.NO_VALUE)
+                    fields[i]=null;
         }
         // Set State
         this.rowsetData = rowSetData;
         this.modified = null;
         changeState((rowset==null ? State.Invalid : (newRecord ? State.New : State.Valid)));
-        // notify
-        if (rowsetChanged)
-            onRowSetChanged();
     }
     
     /**
@@ -307,7 +314,8 @@ public class DBRecord extends DBRecordData implements Record, Cloneable
         try 
         {
             DBRecord rec = (DBRecord)super.clone();
-            rec.rowset = this.rowset;
+            if (rec.rowset!= this.rowset)
+                throw new NotSupportedException(this, "clone");
             rec.state = this.state;
             if (rec.fields == fields && fields!=null)
                 rec.fields = fields.clone();
@@ -336,13 +344,25 @@ public class DBRecord extends DBRecordData implements Record, Cloneable
     }
 
     /**
+     * Returns the current Context
+     * @return
+     */
+    @Override
+    @SuppressWarnings("unchecked")
+    public <T extends DBContext> T  getContext()
+    {
+        return ((T)context);
+    }
+
+    /**
      * Returns the DBRowSet object.
      * 
      * @return the DBRowSet object
      */
-    public DBRowSet getRowSet()
+    @SuppressWarnings("unchecked")
+    public <T extends DBRowSet> T getRowSet()
     {
-        return rowset;
+        return (T)this.rowset;
     }
 
     /**
@@ -933,92 +953,65 @@ public class DBRecord extends DBRecordData implements Record, Cloneable
      * @param keyValues a Object array, the primary key(s)
      * @param insert if true change the state of this object to REC_NEW
      */
-    public void init(DBRowSet table, Object[] keyValues, boolean insert)
+    protected void init(DBRowSet table, Object[] keyValues, boolean insert)
     { 	// Init with keys
         if (table!=null)
             table.initRecord(this, keyValues, insert);
         else
-            initData(null, null, false);
+            initData(null, false);
     }
-    
+
     /**
-     * Creates a new record for the given table.<BR>
-     * All record fields will be filled with their default values.
-     * The record's state is set to NEW
-     * <P>
-     * If a connection is supplied sequence generated values will be obtained<BR>
-     * Otherwise the sequence will be generated later. 
-     * <P>
-     * @param table the table for which to create a record
-     * @param conn a valid JDBC connection
+     * Initializes this record object 
+     * @param table
+     * @param keyValues
+     * @param insert
      */
-    public void create(DBRowSet table, Connection conn)
-    {
-        if (table==null)
-            throw new InvalidArgumentException("table", table);
-        // create
-        table.createRecord(this, conn);
+    public void init(boolean statusNew, Object... key)
+    {   // Init with keys
+        rowset.initRecord(this, key, statusNew);
     }
-    
+
     /**
-     * Creates a new record for the given table.<BR>
-     * All record fields will be filled with their default values.<BR>
-     * The record's state is set to NEW
-     * <P>
-     * @param table the table for which to create a record
+     * Creates a new record
      */
-    public final void create(DBRowSet table)
+    public void create(boolean deferredInit)
     {
-        create(table, null);
+        rowset.createRecord(this, deferredInit);
+        // remove rollback
+        context.removeRollbackHandler(this);
     }
 
     /**
-     * Reads a record from the database identified by it's primary key. 
-     * After successful reading the record will be valid and all values will be accessible.
-     * @see org.apache.empire.db.DBTable#readRecord(DBRecord, Object[], Connection)
-     * 
-     * @param table the rowset from which to read the record
-     * @param keys an array of the primary key values
-     * @param conn a valid connection to the database.
+     * Creates a new record
      */
-    public void read(DBRowSet table, Object[] key, Connection conn)
+    public void create()
     {
-        if (table==null)
-            throw new InvalidArgumentException("table", table);
-        // read
-        table.readRecord(this, key, conn);
+        create(false);
     }
-
+    
     /**
-     * Reads a record from the database identified by it's primary key. 
-     * After successful reading the record will be valid and all values will be accessible.
-     * @see org.apache.empire.db.DBTable#readRecord(DBRecord, Object[], Connection)
-     * 
-     * @param table the rowset from which to read the record
-     * @param id the primary key of the record to load.
-     * @param conn a valid connection to the database.
+     * Reads a record from the database
+     * @param key an array of the primary key values
      */
-    public final void read(DBRowSet table, Object id, Connection conn)
+    public void read(Object... key)
     {
-        if (id instanceof Collection<?>)
-        {   // If it's a collection then convert it to an array
-            read(table, ((Collection<?>)id).toArray(), conn);
-        }
-        // Simple One-Column key
-        read(table, new Object[] { id }, conn);
+        // temporarily check for connection
+        // invalid due to conversion from old Api where Connection was the last param
+        for (int i=0; i<key.length; i++)
+            if (key[i] instanceof Connection)
+                throw new InvalidArgumentException("key", key);
+        // read
+        rowset.readRecord(this, key);
+        // remove rollback
+        context.removeRollbackHandler(this);
     }
-
+    
     /**
-     * Reads a record from the database identified by one or more constraints. 
-     * 
-     * In oder to concatenate constraints use the and() operator from the first constraint
-     * e.g. FIRSTNAME.is("Joe").and(LASTNAME.is("Doe"))
-     * 
-     * @param table the rowset from which to read the record
-     * @param whereConstraints the constraint(s) (which must all be on the table)
-     * @param conn a valid connection to the database.
+     * Reads a record from the database
+     * @param key an array of the primary key values
      */
-    public void read(DBRowSet table, DBCompareExpr whereConstraints, Connection conn)
+    public void read(DBCompareExpr whereConstraints)
     {
         if (whereConstraints==null)
             throw new InvalidArgumentException("whereConstraints", null);
@@ -1026,29 +1019,30 @@ public class DBRecord extends DBRecordData implements Record, Cloneable
         Set<DBColumn> columns = new HashSet<DBColumn>();
         whereConstraints.addReferencedColumns(columns);
         for (DBColumn c : columns)
-            if (!table.equals(c.getRowSet()))
+            if (!rowset.equals(c.getRowSet()))
                 throw new InvalidArgumentException("whereConstraints", c.getFullName());
         // read now
-        DBCommand cmd = table.getDatabase().createCommand();
-        cmd.select(table.getColumns());
+        DBCommand cmd = getDatabase().createCommand();
+        cmd.select(rowset.getColumns());
         cmd.where(whereConstraints);
-        table.readRecord(this, cmd, conn);
+        rowset.readRecord(this, cmd);
+        // remove rollback
+        context.removeRollbackHandler(this);
     }
 
     /**
      * Updates the record and saves all changes in the database.
-     * 
-     * @see org.apache.empire.db.DBTable#updateRecord(DBRecord, Connection)
-     * @param conn a valid connection to the database.
      */
-    public void update(Connection conn)
+    public void update()
     {
         if (!isValid())
             throw new ObjectNotValidException(this);
         if (!isModified())
-        	return; /* Not modified. Nothing to do! */
+            return; /* Not modified. Nothing to do! */
+        // allow rollback
+        context.addRollbackHandler(createRollbackHandler());
         // update
-        rowset.updateRecord(this, conn);
+        rowset.updateRecord(this);
     }
     
     /**
@@ -1056,7 +1050,7 @@ public class DBRecord extends DBRecordData implements Record, Cloneable
      * This will set change the record's state to Valid
      * @param rowSetData additional data held by the rowset for this record (optional)
      */
-    protected void updateComplete(Object rowSetData)
+    void updateComplete(Object rowSetData)
     {
         this.rowsetData = rowSetData;
         this.modified = null;
@@ -1073,7 +1067,7 @@ public class DBRecord extends DBRecordData implements Record, Cloneable
      * @see org.apache.empire.db.DBTable#deleteRecord(Object[], Connection)
      * @param conn a valid connection to the database.
      */
-    public void delete(Connection conn)
+    protected void delete(Connection conn)
     {
         if (isValid()==false)
             throw new ObjectNotValidException(this);
@@ -1085,6 +1079,30 @@ public class DBRecord extends DBRecordData implements Record, Cloneable
         }
         close();
     }
+    
+    public void delete()
+    {
+        if (isValid()==false)
+            throw new ObjectNotValidException(this);
+        // allow rollback
+        context.addRollbackHandler(createRollbackHandler());
+        // Delete only if record is not new
+        if (!isNew())
+        {
+            Object[] keys = rowset.getRecordKey(this);
+            rowset.deleteRecord(keys, context.getConnection());
+        }
+        close();
+    }
+    
+    /**
+     * Factory function to create  createRollbackHandler();
+     * @return the DBRollbackHandler
+     */
+    protected DBRollbackHandler createRollbackHandler()
+    {
+        return new DBRecordRollbackHandler(this);
+    }
 
     /**
      * This function set the field descriptions to the the XML tag.
@@ -1295,12 +1313,13 @@ public class DBRecord extends DBRecordData implements Record, Cloneable
     
     /**
      * Override this to do extra handling when the rowset for this record changes
-     */
+     
     protected void onRowSetChanged()
     {
         if (log.isTraceEnabled() && rowset!=null)
             log.trace("Record has been attached to rowset " + rowset.getName());
     }
+    */
     
     /**
      * Override this to do extra handling when the record changes
diff --git a/empire-db/src/main/java/org/apache/empire/db/DBRecordV3.java b/empire-db/src/main/java/org/apache/empire/db/DBRecordV3.java
deleted file mode 100644
index ba13ca0..0000000
--- a/empire-db/src/main/java/org/apache/empire/db/DBRecordV3.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * ESTEAM Software GmbH, 19.01.2022
- */
-package org.apache.empire.db;
-
-import org.apache.empire.exceptions.ObjectNotValidException;
-
-public class DBRecordV3 extends DBRecord
-{
-    
-    private static final long serialVersionUID = 1L;
-    
-    private final DBContext context;
-    
-    public DBRecordV3(DBContext context, DBRowSet rowset)
-    {
-        super(rowset);
-        this.context = context;
-    }
-
-    @SuppressWarnings("unchecked")
-    public <T extends DBContext> T  getContext()
-    {
-        return ((T)context);
-    }
-    
-    @SuppressWarnings("unchecked")
-    public <T extends DBRowSet> T getTable()
-    {
-        return (T)super.getRowSet();
-    }
-    
-    public void create()
-    {
-        super.create(getRowSet());
-        // remove rollback
-        context.removeRollbackHandler(this);
-    }
-    
-    public void read(Object... key)
-    {
-        super.read(getRowSet(), key, context.getConnection());
-        // remove rollback
-        context.removeRollbackHandler(this);
-    }
-    
-    public void update()
-    {
-        if (!isValid())
-            throw new ObjectNotValidException(this);
-        if (!isModified())
-            return; /* Not modified. Nothing to do! */
-        // allow rollback
-        context.addRollbackHandler(createRollbackHandler());
-        // update
-        super.update(context.getConnection());
-    }
-    
-    public void delete()
-    {
-        // allow rollback
-        context.addRollbackHandler(createRollbackHandler());
-        // delete
-        super.delete(context.getConnection());
-    }
-    
-    protected DBRollbackHandler createRollbackHandler()
-    {
-        return new DBRecordRollbackHandler(this);
-    }
-    
-}
diff --git a/empire-db/src/main/java/org/apache/empire/db/DBRelation.java b/empire-db/src/main/java/org/apache/empire/db/DBRelation.java
index be5a3cc..884281f 100644
--- a/empire-db/src/main/java/org/apache/empire/db/DBRelation.java
+++ b/empire-db/src/main/java/org/apache/empire/db/DBRelation.java
@@ -220,26 +220,17 @@ public class DBRelation extends DBObject
      * @param enable true if the constraint should be enabled or false to disable the constraint
      * @param driver the driver for which to enable or disable the relation
      */
-    public String getEnableDisableStmt(boolean enable, DBDatabaseDriver driver)
+    public String getEnableDisableStmt(boolean enable, DBContext context)
     {
-        if (driver==null)
-            throw new InvalidArgumentException("driver", driver);
+        if (context==null)
+            throw new InvalidArgumentException("context", context);
         // get Statement
-        DBSQLScript script = new DBSQLScript();
-        driver.addEnableRelationStmt(this, enable, script);
+        DBSQLScript script = new DBSQLScript(context);
+        context.getDriver().addEnableRelationStmt(this, enable, script);
         if (script.getCount()!=1)
             throw new UnexpectedReturnValueException(script.getCount(), "driver.addEnableRelationStatement");
         return script.getStmt(0);
     }
-
-    /**
-     * Appends the required DLL command to enable or disable a foreign key constraint to the supplied DBDQLScript.
-     * @param enable true if the constraint should be enabled or false to disable the constraint
-     */
-    public final String getEnableDisableStatement(boolean enable)
-    {
-        return getEnableDisableStmt(enable, getDatabase().getDriver());
-    }
     
     @Override
     public String toString()
diff --git a/empire-db/src/main/java/org/apache/empire/db/DBRowSet.java b/empire-db/src/main/java/org/apache/empire/db/DBRowSet.java
index b733393..379eac4 100644
--- a/empire-db/src/main/java/org/apache/empire/db/DBRowSet.java
+++ b/empire-db/src/main/java/org/apache/empire/db/DBRowSet.java
@@ -224,7 +224,7 @@ public abstract class DBRowSet extends DBExpr
     
     public abstract boolean isUpdateable();
 
-    public abstract void createRecord(DBRecord rec, Connection conn);
+    public abstract void createRecord(DBRecord rec, boolean deferredInit);
 
     public abstract void deleteRecord(Object[] keys, Connection conn);
     
@@ -508,12 +508,12 @@ public abstract class DBRowSet extends DBExpr
      */
     protected void prepareInitRecord(DBRecord rec, Object rowSetData, boolean insert)
     {
-        if (rec==null)
+        if (rec==null || rec.getRowSet()!=this)
             throw new InvalidArgumentException("rec", rec);
         if (columns.size() < 1)
             throw new ObjectNotValidException(this);
         // Init
-        rec.initData(this, rowSetData, insert);
+        rec.initData(rowSetData, insert);
     }
 
     /**
@@ -634,13 +634,13 @@ public abstract class DBRowSet extends DBExpr
      * @param cmd the SQL-Command used to query the record
      * @param conn a valid JDBC connection.
      */
-    protected void readRecord(DBRecord rec, DBCommand cmd, Connection conn)
+    protected void readRecord(DBRecord rec, DBCommand cmd)
     {
         DBReader reader = null;
         try
         {   // read record using a DBReader
-            reader = new DBReader(false);
-            reader.getRecordData(cmd, conn);
+            reader = new DBReader(rec.getContext(), false);
+            reader.getRecordData(cmd);
             initRecord(rec, reader);
             
         } finally {
@@ -656,10 +656,10 @@ public abstract class DBRowSet extends DBExpr
      * @param key the primary key values
      * @param conn a valid JDBC connection.
      */
-    public void readRecord(DBRecord rec, Object[] key, Connection conn)
+    public void readRecord(DBRecord rec, Object[] key)
     {
         // Check Arguments
-        if (conn == null || rec == null)
+        if (rec == null)
             throw new InvalidArgumentException("conn|rec", null);
         // Select
         DBCommand cmd = db.createCommand();
@@ -668,7 +668,7 @@ public abstract class DBRowSet extends DBExpr
         setKeyConstraints(cmd, key);
         try {
             // Read Record
-            readRecord(rec, cmd, conn);
+            readRecord(rec, cmd);
         } catch (QueryNoResultException e) {
             // Translate exception
             throw new RecordNotFoundException(this, key);
@@ -683,10 +683,10 @@ public abstract class DBRowSet extends DBExpr
      * @param mode flag whether to include only the given columns or whether to add all but the given columns
      * @param columns the columns to include or exclude (depending on mode)
      */
-    public void readRecord(DBRecord rec, Object[] key, Connection conn, PartialMode mode, DBColumn... columns)
+    public void readRecord(DBRecord rec, Object[] key, PartialMode mode, DBColumn... columns)
     {
         // Check Arguments
-        if (conn == null || rec == null)
+        if (rec == null)
             throw new InvalidArgumentException("conn|rec", null);
         // create command
         DBCommand cmd = db.createCommand();        
@@ -715,7 +715,7 @@ public abstract class DBRowSet extends DBExpr
         setKeyConstraints(cmd, key);
         try {
             // Read Record
-            readRecord(rec, cmd, conn);
+            readRecord(rec, cmd);
         } catch (QueryNoResultException e) {
             // Translate exception
             throw new RecordNotFoundException(this, key);
@@ -768,7 +768,7 @@ public abstract class DBRowSet extends DBExpr
      * @param rec the DBRecord object. contains all fields and the field properties
      * @param conn a valid JDBC connection.
      */
-    public void updateRecord(DBRecord rec, Connection conn)
+    public void updateRecord(DBRecord rec)
     {
         // check updateable
         if (isUpdateable()==false)
@@ -778,8 +778,8 @@ public abstract class DBRowSet extends DBExpr
             throw new InvalidArgumentException("record", rec);
         if (rec.isValid()==false)
             throw new ObjectNotValidException(rec);
-        if (conn == null)
-            throw new InvalidArgumentException("conn", conn);
+        // the connection
+        Connection conn = rec.getContext().getConnection();
         // Get the new Timestamp
         String name = getName();
         Timestamp timestamp = (timestampColumn!=null) ? db.getUpdateTimestamp(conn) : null;
diff --git a/empire-db/src/main/java/org/apache/empire/db/DBSQLScript.java b/empire-db/src/main/java/org/apache/empire/db/DBSQLScript.java
index 248f1bc..e2bbfd0 100644
--- a/empire-db/src/main/java/org/apache/empire/db/DBSQLScript.java
+++ b/empire-db/src/main/java/org/apache/empire/db/DBSQLScript.java
@@ -18,7 +18,6 @@
  */
 package org.apache.empire.db;
 
-import java.sql.Connection;
 import java.sql.SQLException;
 import java.util.ArrayList;
 import java.util.Iterator;
@@ -34,7 +33,7 @@ import org.slf4j.LoggerFactory;
  * The class is used for obtaining and executing DDL commands supplied by the
  * database driver (@see {@link DBDatabaseDriver#getDDLScript(DBCmdType, DBObject, DBSQLScript)})
  */
-public class DBSQLScript implements Iterable<String>
+public class DBSQLScript implements DBContextAware, Iterable<String>
 {
     // Logger
     private static final Logger log = LoggerFactory.getLogger(DBSQLScript.class);
@@ -112,18 +111,33 @@ public class DBSQLScript implements Iterable<String>
     protected String commandSeparator = DEFAULT_COMMAND_SEPARATOR;
 
     protected ArrayList<SQLStmt> sqlStmtList      = new ArrayList<SQLStmt>();
+    
+    private final DBContext context;
 
-    public DBSQLScript()
+    public DBSQLScript(DBContext context)
     {
         // nothing
+        this.context = context;
     }
 
-    public DBSQLScript(String commandSeparator)
+    public DBSQLScript(DBContext context, String commandSeparator)
     {
+        this(context);
         this.commandSeparator = commandSeparator;
     }
 
     /**
+     * Returns the current Context
+     * @return
+     */
+    @Override
+    @SuppressWarnings("unchecked")
+    public <T extends DBContext> T  getContext()
+    {
+        return ((T)context);
+    }
+
+    /**
      * Adds a statement to the script.
      * 
      * @param sql the statement
@@ -314,17 +328,18 @@ public class DBSQLScript implements Iterable<String>
      * @param ignoreErrors true if errors should be ignored
      * @return number of records affected
      */
-    public int executeAll(DBDatabaseDriver driver, Connection conn, boolean ignoreErrors)
+    public int executeAll(boolean ignoreErrors)
     {
         log.debug("Running script containing " + String.valueOf(getCount()) + " statements.");
         int result = 0;
+        DBDatabaseDriver driver = context.getDriver(); 
         for (SQLStmt stmt : sqlStmtList)
         {
             try
             {
                 // Execute Statement
                 log.debug("Executing: {}", stmt.getCmd());
-                int count = driver.executeSQL(stmt.getCmd(), stmt.getParams(), conn, null);
+                int count = driver.executeSQL(stmt.getCmd(), stmt.getParams(), context.getConnection(), null);
                 result += (count >= 0 ? count : 0);
             }
             catch (SQLException e)
@@ -350,9 +365,9 @@ public class DBSQLScript implements Iterable<String>
      * @param conn the connection
      * @return number of records affected
      */
-    public final int executeAll(DBDatabaseDriver driver, Connection conn)
+    public final int executeAll()
     {
-        return executeAll(driver, conn, false);
+        return executeAll(false);
     }
 
     /**
@@ -362,9 +377,10 @@ public class DBSQLScript implements Iterable<String>
      * @param conn the connection
      * @param ignoreErrors true if errors should be ignored
      */
-    public int executeBatch(DBDatabaseDriver driver, Connection conn)
+    public int executeBatch()
     {
         log.debug("Running batch containing " + String.valueOf(getCount()) + " statements.");
+        DBDatabaseDriver driver = context.getDriver();
         try
         {
             // Execute Statement
@@ -385,7 +401,7 @@ public class DBSQLScript implements Iterable<String>
                 i++;
             }
             // Execute batch
-            int[] res = driver.executeBatch(cmdList, paramList, conn);
+            int[] res = driver.executeBatch(cmdList, paramList, context.getConnection());
             for (count = 0, i = 0; i < (res != null ? res.length : 0); i++)
                 count += (res[i] >= 0 ? res[i] : 0);
             log.debug("Script completed. {} records affected.", count);
diff --git a/empire-db/src/main/java/org/apache/empire/db/DBTable.java b/empire-db/src/main/java/org/apache/empire/db/DBTable.java
index d31cc64..507ffae 100644
--- a/empire-db/src/main/java/org/apache/empire/db/DBTable.java
+++ b/empire-db/src/main/java/org/apache/empire/db/DBTable.java
@@ -593,11 +593,12 @@ public class DBTable extends DBRowSet implements Cloneable
      * @param conn a valid connection to the database.
      */
     @Override
-    public void createRecord(DBRecord rec, Connection conn)
+    public void createRecord(DBRecord rec, boolean deferredInit)
     {
         // Prepare
         prepareInitRecord(rec, null, true);
         // Set Defaults
+        Connection conn = (deferredInit ? null : rec.getContext().getConnection());
         int count = columns.size();
         for (int i = 0; i < count; i++)
         {
diff --git a/empire-db/src/main/java/org/apache/empire/db/DBView.java b/empire-db/src/main/java/org/apache/empire/db/DBView.java
index 535a9fc..97d1b9f 100644
--- a/empire-db/src/main/java/org/apache/empire/db/DBView.java
+++ b/empire-db/src/main/java/org/apache/empire/db/DBView.java
@@ -395,12 +395,12 @@ public abstract class DBView extends DBRowSet
     }
 
     @Override
-    public void updateRecord(DBRecord rec, Connection conn)
+    public void updateRecord(DBRecord rec)
     {
         if (updateable==false)
             throw new NotSupportedException(this, "updateRecord");
         // Update the record
-        super.updateRecord(rec, conn);
+        super.updateRecord(rec);
     }
     
     /*
@@ -409,7 +409,7 @@ public abstract class DBView extends DBRowSet
      * @see org.apache.empire.db.DBRowSet#addRecord(org.apache.empire.db.DBRecord, java.sql.Connection)
      */
     @Override
-    public void createRecord(DBRecord rec, Connection conn)
+    public void createRecord(DBRecord rec, boolean deferredInit)
     {
         throw new NotSupportedException(this, "createRecord");
     }
diff --git a/empire-db/src/main/java/org/apache/empire/db/context/DBContextBase.java b/empire-db/src/main/java/org/apache/empire/db/context/DBContextBase.java
index 5f4c6af..f7a0a81 100644
--- a/empire-db/src/main/java/org/apache/empire/db/context/DBContextBase.java
+++ b/empire-db/src/main/java/org/apache/empire/db/context/DBContextBase.java
@@ -105,4 +105,25 @@ public abstract class DBContextBase implements DBContext
             log.info("Rollback handler for object {} was removed", object.getClass().getSimpleName());
     }
 
+    @Override
+    public void discard()
+    {
+        /* don't close connection! */
+    }
+    
+    /**
+     * helper to close a connection on discard
+     */
+    protected void closeConnection()
+    {
+        try
+        {   // close connection
+            Connection conn = getConnection();
+            conn.close();
+        } catch (SQLException sqle) { 
+            // Commit failed!
+            throw new EmpireSQLException(getDriver(), sqle);
+        }
+    }
+    
 }
diff --git a/empire-db/src/main/java/org/apache/empire/db/context/DBContextStatic.java b/empire-db/src/main/java/org/apache/empire/db/context/DBContextStatic.java
index 2102af4..8f23b8d 100644
--- a/empire-db/src/main/java/org/apache/empire/db/context/DBContextStatic.java
+++ b/empire-db/src/main/java/org/apache/empire/db/context/DBContextStatic.java
@@ -4,18 +4,27 @@
 package org.apache.empire.db.context;
 
 import java.sql.Connection;
+import java.sql.SQLException;
 
 import org.apache.empire.db.DBDatabaseDriver;
+import org.apache.empire.db.exceptions.EmpireSQLException;
 
 public class DBContextStatic extends DBContextBase
 {
     private final DBDatabaseDriver driver;
     private final Connection conn;
+    private final boolean closeOnDiscard;
     
-    public DBContextStatic(DBDatabaseDriver driver, Connection conn)
+    public DBContextStatic(DBDatabaseDriver driver, Connection conn, boolean closeOnDiscard)
     {
         this.driver = driver;
         this.conn = conn;
+        this.closeOnDiscard = closeOnDiscard;
+    }
+
+    public DBContextStatic(DBDatabaseDriver driver, Connection conn)
+    {
+        this(driver, conn, false);
     }
 
     @Override
@@ -29,5 +38,13 @@ public class DBContextStatic extends DBContextBase
     {
         return conn;
     }
-
+    
+    @Override
+    public void discard()
+    {
+        super.discard();
+        // close
+        if (closeOnDiscard)
+            closeConnection();
+    }
 }
diff --git a/empire-db/src/main/java/org/apache/empire/db/oracle/DBDatabaseDriverOracle.java b/empire-db/src/main/java/org/apache/empire/db/oracle/DBDatabaseDriverOracle.java
index 5e32c1d..ba1ac06 100644
--- a/empire-db/src/main/java/org/apache/empire/db/oracle/DBDatabaseDriverOracle.java
+++ b/empire-db/src/main/java/org/apache/empire/db/oracle/DBDatabaseDriverOracle.java
@@ -29,6 +29,7 @@ import org.apache.empire.db.DBCmdType;
 import org.apache.empire.db.DBColumn;
 import org.apache.empire.db.DBColumnExpr;
 import org.apache.empire.db.DBCommand;
+import org.apache.empire.db.DBContext;
 import org.apache.empire.db.DBDDLGenerator;
 import org.apache.empire.db.DBDatabase;
 import org.apache.empire.db.DBDatabaseDriver;
@@ -41,6 +42,7 @@ import org.apache.empire.db.DBSQLScript;
 import org.apache.empire.db.DBTable;
 import org.apache.empire.db.DBTableColumn;
 import org.apache.empire.db.DBView;
+import org.apache.empire.db.context.DBContextStatic;
 import org.apache.empire.db.exceptions.EmpireSQLException;
 import org.apache.empire.db.expr.column.DBValueExpr;
 import org.apache.empire.exceptions.InvalidArgumentException;
@@ -416,6 +418,7 @@ public class DBDatabaseDriverOracle extends DBDatabaseDriver
     @Override
     public void checkDatabase(DBDatabase db, String owner, Connection conn)
     {
+        DBContext context = new DBContextStatic(this, conn);
         // Check Params
         if (owner==null || owner.length()==0)
             throw new InvalidArgumentException("owner", owner);
@@ -427,10 +430,10 @@ public class DBDatabaseDriverOracle extends DBDatabaseDriver
         sysDBCommand.where (sysDB.CI.C_OWNER.is(owner));
         
         OracleDataDictionnary dataDictionnary = new OracleDataDictionnary();
-        DBReader rd = new DBReader();
+        DBReader rd = new DBReader(context);
         try
         {
-            rd.open(sysDBCommand, conn);
+            rd.open(sysDBCommand);
             // read all
             log.info("---------------------------------------------------------------------------------");
             log.info("checkDatabase start: " + db.getClass().getName());
diff --git a/empire-db/src/test/java/org/apache/empire/db/IntegerTest.java b/empire-db/src/test/java/org/apache/empire/db/IntegerTest.java
index b29432c..77895dd 100644
--- a/empire-db/src/test/java/org/apache/empire/db/IntegerTest.java
+++ b/empire-db/src/test/java/org/apache/empire/db/IntegerTest.java
@@ -27,6 +27,7 @@ import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.empire.data.DataType;
+import org.apache.empire.db.context.DBContextStatic;
 import org.apache.empire.db.derby.DBDatabaseDriverDerby;
 import org.apache.empire.db.h2.DBDatabaseDriverH2;
 import org.apache.empire.db.hsql.DBDatabaseDriverHSql;
@@ -105,24 +106,25 @@ public class IntegerTest {
         Connection connection = getJDBCConnection(config);
 
         DBDatabaseDriver driver = getDatabaseDriver(config, connection);
+        DBContext context = new DBContextStatic(driver, connection); 
 
         database.open(driver, connection);
 
-        createDatabase(database, driver, connection);
+        createDatabase(database, driver, context);
 
-        DBRecord maxRec = new DBRecord();
-        maxRec.create(database.SAMPLE);
+        DBRecord maxRec = new DBRecord(context, database.SAMPLE);
+        maxRec.create();
         maxRec.setValue(database.SAMPLE.MY_INTEGER, Integer.MAX_VALUE);
         maxRec.setValue(database.SAMPLE.MY_LONG, Long.MAX_VALUE);
         maxRec.setValue(database.SAMPLE.MY_SHORT, Short.MAX_VALUE);
-        maxRec.update(connection);
+        maxRec.update();
         
-        DBRecord minRec = new DBRecord();
-        minRec.create(database.SAMPLE);
+        DBRecord minRec = new DBRecord(context, database.SAMPLE);
+        minRec.create();
         minRec.setValue(database.SAMPLE.MY_INTEGER, Integer.MIN_VALUE);
         minRec.setValue(database.SAMPLE.MY_LONG, Long.MIN_VALUE);
         minRec.setValue(database.SAMPLE.MY_SHORT, Short.MIN_VALUE);
-        minRec.update(connection);
+        minRec.update();
     }
 
     private static Connection getJDBCConnection(SampleConfig config) {
@@ -186,29 +188,29 @@ public class IntegerTest {
         throw new RuntimeException("Unknown Database Provider " + config.databaseProvider);
     }
 
-    private void createDatabase(DBDatabase db, DBDatabaseDriver driver, Connection conn) {
+    private void createDatabase(DBDatabase db, DBDatabaseDriver driver, DBContext context) {
         // try to remove previously existing tables
-        List<String> tables = getTableNames(db, conn);
-        DBSQLScript script2 = new DBSQLScript();
+        List<String> tables = getTableNames(db, context.getConnection());
+        DBSQLScript script2 = new DBSQLScript(context);
         for(DBTable table:db.getTables()){
             if(tables.contains(table.getName())){
                 db.getDriver().getDDLScript(DBCmdType.DROP, table, script2);
             }
         }
-        script2.executeAll(driver, conn, false);
+        script2.executeAll(false);
         // Commit
-        db.commit(conn);
+        context.commit();
         
         // create DDL for Database Definition
-        DBSQLScript script = new DBSQLScript();
-        db.getCreateDDLScript(driver, script);
+        DBSQLScript script = new DBSQLScript(context);
+        db.getCreateDDLScript(script);
         
         // Show DDL Statement
         LOGGER.info(script.toString());
         // Execute Script
-        script.executeAll(driver, conn, false);
+        script.executeAll(false);
         // Commit
-        db.commit(conn);
+        context.commit();
     }
 
     private List<String> getTableNames(DBDatabase db, Connection conn)
diff --git a/empire-db/src/test/java/org/apache/empire/db/PreparedStatementTest.java b/empire-db/src/test/java/org/apache/empire/db/PreparedStatementTest.java
index 606a8c4..1b80164 100644
--- a/empire-db/src/test/java/org/apache/empire/db/PreparedStatementTest.java
+++ b/empire-db/src/test/java/org/apache/empire/db/PreparedStatementTest.java
@@ -27,6 +27,7 @@ import java.sql.Connection;
 import org.apache.empire.DBResource;
 import org.apache.empire.DBResource.DB;
 import org.apache.empire.db.DBCmdParam;
+import org.apache.empire.db.context.DBContextStatic;
 import org.junit.Rule;
 import org.junit.Test;
 
@@ -42,17 +43,18 @@ public class PreparedStatementTest{
         Connection conn = dbResource.getConnection();
         
         DBDatabaseDriver driver = dbResource.newDriver();
+        DBContext context = new DBContextStatic(driver, conn); 
+        
         CompanyDB db = new CompanyDB();
         db.open(driver, conn);
-        DBSQLScript script = new DBSQLScript();
-        db.getCreateDDLScript(db.getDriver(), script);
-        script.executeAll(db.getDriver(), conn, false);
+        DBSQLScript script = new DBSQLScript(context);
+        db.getCreateDDLScript(script);
+        script.executeAll(false);
         
-        DBRecord department = new DBRecord();
-        department.create(db.DEPARTMENT);
+        DBRecord department = new DBRecord(context, db.DEPARTMENT);
         department.setValue(db.DEPARTMENT.NAME, "junit");
         department.setValue(db.DEPARTMENT.BUSINESS_UNIT, "test");
-        department.update(conn);
+        department.update();
 
         int id = department.getInt(db.DEPARTMENT.ID);
         assertTrue("Department add failed", id > 0);
@@ -75,9 +77,9 @@ public class PreparedStatementTest{
         assertNotNull(cmd.getParamValues());
         assertTrue(cmd.getSelect().indexOf('?') > 0);
 
-        DBReader r = new DBReader();
+        DBReader r = new DBReader(context);
         try {
-            r.open(cmd, conn);
+            r.open(cmd);
             // must have one record
             assertEquals(true, r.moveNext());
             // Department Id must be correct
diff --git a/empire-db/src/test/java/org/apache/empire/db/SerializeTest.java b/empire-db/src/test/java/org/apache/empire/db/SerializeTest.java
index 7567100..b8edcb6 100644
--- a/empire-db/src/test/java/org/apache/empire/db/SerializeTest.java
+++ b/empire-db/src/test/java/org/apache/empire/db/SerializeTest.java
@@ -20,6 +20,7 @@
 package org.apache.empire.db;
 
 import org.apache.empire.data.DataType;
+import org.apache.empire.db.context.DBContextStatic;
 import org.apache.empire.db.expr.order.DBOrderByExpr;
 import org.junit.Assert;
 import org.junit.Test;
@@ -53,12 +54,12 @@ public class SerializeTest {
     }
   }
 
-
   public DBObject[] getObjectsToSerialize() {
     final TestDatabase db = new TestDatabase();
-    DBRecord rec = new DBRecord();
-    rec.init(db.T_TEST, null, true);
-    db.open(new MockDriver(), null);
+    DBContext context = new DBContextStatic(new MockDriver(), null); 
+    DBRecord rec = new DBRecord(context, db.T_TEST);
+    rec.init(true);
+    db.open(context.getDriver(), null);
     return new DBObject[] {
             db,
             db.T_TEST,
diff --git a/empire-db/src/test/java/org/apache/empire/db/hsql/DBDatabaseDriverHSqlTest.java b/empire-db/src/test/java/org/apache/empire/db/hsql/DBDatabaseDriverHSqlTest.java
index 09f4c32..d5128a2 100644
--- a/empire-db/src/test/java/org/apache/empire/db/hsql/DBDatabaseDriverHSqlTest.java
+++ b/empire-db/src/test/java/org/apache/empire/db/hsql/DBDatabaseDriverHSqlTest.java
@@ -30,12 +30,14 @@ import org.apache.empire.DBResource.DB;
 import org.apache.empire.data.DataType;
 import org.apache.empire.db.CompanyDB;
 import org.apache.empire.db.DBCmdType;
+import org.apache.empire.db.DBContext;
 import org.apache.empire.db.DBDatabase;
 import org.apache.empire.db.DBDatabaseDriver;
 import org.apache.empire.db.DBRecord;
 import org.apache.empire.db.DBSQLScript;
 import org.apache.empire.db.DBTable;
 import org.apache.empire.db.DBTableColumn;
+import org.apache.empire.db.context.DBContextStatic;
 import org.junit.Rule;
 import org.junit.Test;
 
@@ -51,30 +53,30 @@ public class DBDatabaseDriverHSqlTest{
         Connection conn = dbResource.getConnection();
      
         DBDatabaseDriver driver = dbResource.newDriver();
+        DBContext context = new DBContextStatic(driver, conn); 
+        
         CompanyDB db = new CompanyDB();
         db.open(driver, dbResource.getConnection());
-        DBSQLScript script = new DBSQLScript();
-        db.getCreateDDLScript(db.getDriver(), script);
-        script.executeAll(db.getDriver(), dbResource.getConnection(), false);
+        DBSQLScript script = new DBSQLScript(context);
+        db.getCreateDDLScript(script);
+        script.executeAll(false);
         
-        DBRecord dep = new DBRecord();
-        dep.create(db.DEPARTMENT);
+        DBRecord dep = new DBRecord(context, db.DEPARTMENT);
+        dep.create();
         dep.setValue(db.DEPARTMENT.NAME, "junit");
         dep.setValue(db.DEPARTMENT.BUSINESS_UNIT, "test");
-        dep.update(conn);
+        dep.update();
         
         Date date = dep.getDateTime(db.DEPARTMENT.UPDATE_TIMESTAMP);
         assertNotNull("Date is null", date);
         assertTrue("No departments", dep.getInt(db.DEPARTMENT.ID) > 0);
         
-        
-        DBRecord emp = new DBRecord();
-        emp.create(db.EMPLOYEE);
+        DBRecord emp = new DBRecord(context, db.EMPLOYEE);
         emp.setValue(db.EMPLOYEE.FIRSTNAME, "junit");
         emp.setValue(db.EMPLOYEE.LASTNAME, "test");
         emp.setValue(db.EMPLOYEE.GENDER, "m");
         emp.setValue(db.EMPLOYEE.DEPARTMENT_ID, dep.getInt(db.DEPARTMENT.ID));
-        emp.update(conn);
+        emp.update();
         
         date = emp.getDateTime(db.EMPLOYEE.UPDATE_TIMESTAMP);
         assertNotNull("Date is null", date);
@@ -83,54 +85,54 @@ public class DBDatabaseDriverHSqlTest{
         int id = emp.getInt(db.EMPLOYEE.ID);
         
         // Update an Employee
-        emp = new DBRecord();
-        emp.read(db.EMPLOYEE, id, conn);
+        emp = new DBRecord(context, db.EMPLOYEE);
+        emp.read(id);
         // Set
         emp.setValue(db.EMPLOYEE.PHONE_NUMBER, "123456");
-        emp.update(conn);
+        emp.update();
         
-        emp = new DBRecord();
+        emp = new DBRecord(context, db.EMPLOYEE);
         emp.read(db.EMPLOYEE, id, conn);
         
         assertEquals("123456", emp.getString(db.EMPLOYEE.PHONE_NUMBER));
         
         
-        script = new DBSQLScript();
+        script = new DBSQLScript(context);
         db.getDriver().getDDLScript(DBCmdType.DROP, db.EMPLOYEE, script);
         db.getDriver().getDDLScript(DBCmdType.DROP, db.DEPARTMENT, script);
-        script.executeAll(db.getDriver(), conn, true);
+        script.executeAll(true);
     }
     
-    
     /**
      * See https://issues.apache.org/jira/browse/EMPIREDB-151
      */
     @Test
     public void testSequence(){
     	Connection conn = dbResource.getConnection();
-        
         DBDatabaseDriver driver = dbResource.newDriver();
+        DBContext context = new DBContextStatic(driver, conn); 
+        
         SeqDB db = new SeqDB();
         db.open(driver, dbResource.getConnection());
-        DBSQLScript script = new DBSQLScript();
-        db.getCreateDDLScript(db.getDriver(), script);
-        script.executeAll(db.getDriver(), dbResource.getConnection(), false);
+        DBSQLScript script = new DBSQLScript(context);
+        db.getCreateDDLScript(script);
+        script.executeAll(false);
         
-        DBRecord data = new DBRecord();
-        data.create(db.DATA);
+        DBRecord data = new DBRecord(context, db.DATA);
+        data.create();
         data.setValue(db.DATA.VALUE, "test");
-        data.update(conn);
+        data.update();
         
         final Object id = data.getLong(db.DATA.ID);
         
-        DBRecord read = new DBRecord();
-        read.read(db.DATA, id, conn);
+        DBRecord read = new DBRecord(context, db.DATA);
+        read.read(id);
         
         assertEquals("test", read.getString(db.DATA.VALUE));
         
-        script = new DBSQLScript();
+        script = new DBSQLScript(context);
         db.getDriver().getDDLScript(DBCmdType.DROP, db.DATA, script);
-        script.executeAll(db.getDriver(), conn, true);
+        script.executeAll(true);
     }
     
     /**
diff --git a/empire-db/src/test/java/org/apache/empire/db/mssql/DBDatabaseDriverMSSqlDateTest.java b/empire-db/src/test/java/org/apache/empire/db/mssql/DBDatabaseDriverMSSqlDateTest.java
index c288126..11e2a56 100644
--- a/empire-db/src/test/java/org/apache/empire/db/mssql/DBDatabaseDriverMSSqlDateTest.java
+++ b/empire-db/src/test/java/org/apache/empire/db/mssql/DBDatabaseDriverMSSqlDateTest.java
@@ -30,12 +30,14 @@ import org.apache.empire.DBResource;
 import org.apache.empire.DBResource.DB;
 import org.apache.empire.data.DataType;
 import org.apache.empire.db.DBCommand;
+import org.apache.empire.db.DBContext;
 import org.apache.empire.db.DBDatabase;
 import org.apache.empire.db.DBDatabaseDriver;
 import org.apache.empire.db.DBRecord;
 import org.apache.empire.db.DBSQLScript;
 import org.apache.empire.db.DBTable;
 import org.apache.empire.db.DBTableColumn;
+import org.apache.empire.db.context.DBContextStatic;
 import org.junit.Ignore;
 import org.junit.Rule;
 import org.junit.Test;
@@ -58,8 +60,9 @@ public class DBDatabaseDriverMSSqlDateTest {
 
 	public void runTestWithDateFormat(String dbDateFormat) throws Exception {
 		Connection conn = dbResource.getConnection();
-
 		DBDatabaseDriver driver = dbResource.newDriver();
+        DBContext context = new DBContextStatic(driver, conn); 
+		
 		DateTimeTestDB db = new DateTimeTestDB();
 
 		// Encoding issue occur when prepared statement is disabled
@@ -68,10 +71,10 @@ public class DBDatabaseDriverMSSqlDateTest {
 		db.open(driver, dbResource.getConnection());
 
 		if (!databaseExists(conn, db)) {
-			DBSQLScript script = new DBSQLScript();
-			db.getCreateDDLScript(db.getDriver(), script);
+			DBSQLScript script = new DBSQLScript(context);
+			db.getCreateDDLScript(script);
 			System.out.println(script.toString());
-			script.executeAll(db.getDriver(), dbResource.getConnection(), false);
+			script.executeAll(false);
 		}
 
 		// STEP 5: Clear Database (Delete all records)
@@ -88,19 +91,18 @@ public class DBDatabaseDriverMSSqlDateTest {
 
 		{
 
-			driver.executeSQL("SET DATEFORMAT " + dbDateFormat, null, conn,
-					null);
-			DBRecord rec = new DBRecord();
-			rec.create(db.USER_INFO);
+			driver.executeSQL("SET DATEFORMAT " + dbDateFormat, null, conn, null);
+			DBRecord rec = new DBRecord(context, db.USER_INFO);
+			rec.create();
 			rec.setValue(db.USER_INFO.USER, "john.doe");
 			rec.setValue(db.USER_INFO.REG_DATE, regDate);
 			rec.setValue(db.USER_INFO.LAST_LOGIN, lastLoginTs);
-			rec.update(conn);
+			rec.update();
 
 			int id = rec.getInt(db.USER_INFO.ID);
 
-			DBRecord recRead = new DBRecord();
-			recRead.read(db.USER_INFO, id, conn);
+			DBRecord recRead = new DBRecord(context, db.USER_INFO);
+			recRead.read(id);
 
 			assertEquals(truncDateFmt.format(lastLoginTs),
 					truncDateFmt.format(recRead
diff --git a/empire-db/src/test/java/org/apache/empire/db/mssql/DBDatabaseDriverMSSqlTest.java b/empire-db/src/test/java/org/apache/empire/db/mssql/DBDatabaseDriverMSSqlTest.java
index a20fa35..fe2e036 100644
--- a/empire-db/src/test/java/org/apache/empire/db/mssql/DBDatabaseDriverMSSqlTest.java
+++ b/empire-db/src/test/java/org/apache/empire/db/mssql/DBDatabaseDriverMSSqlTest.java
@@ -26,9 +26,11 @@ import org.apache.empire.DBResource;
 import org.apache.empire.DBResource.DB;
 import org.apache.empire.db.CompanyDB;
 import org.apache.empire.db.DBCommand;
+import org.apache.empire.db.DBContext;
 import org.apache.empire.db.DBDatabaseDriver;
 import org.apache.empire.db.DBRecord;
 import org.apache.empire.db.DBSQLScript;
+import org.apache.empire.db.context.DBContextStatic;
 import org.junit.Ignore;
 import org.junit.Rule;
 import org.junit.Test;
@@ -44,8 +46,9 @@ public class DBDatabaseDriverMSSqlTest
 	public void testChineseCharacters() 
 	{
 		Connection conn = dbResource.getConnection();
-
 		DBDatabaseDriver driver = dbResource.newDriver();
+        DBContext context = new DBContextStatic(driver, conn); 
+		
 		CompanyDB db = new CompanyDB();
 
 		// Encoding issue occur when prepared statement is disabled
@@ -54,27 +57,26 @@ public class DBDatabaseDriverMSSqlTest
 		db.open(driver, dbResource.getConnection());
 
 		if(!databaseExists(conn, db)){
-			DBSQLScript script = new DBSQLScript();
-			db.getCreateDDLScript(db.getDriver(), script);
+			DBSQLScript script = new DBSQLScript(context);
+			db.getCreateDDLScript(script);
 			System.out.println(script.toString());
-			script.executeAll(db.getDriver(), dbResource.getConnection(), false);
+			script.executeAll(false);
 		}
 		
 		// STEP 5: Clear Database (Delete all records)
 		System.out.println("*** Step 5: clearDatabase() ***");
 		clearDatabase(conn, db);
 
-		DBRecord dep = new DBRecord();
-		dep.create(db.DEPARTMENT);
+		DBRecord dep = new DBRecord(context, db.DEPARTMENT);
 		dep.setValue(db.DEPARTMENT.NAME, "junit");
 		dep.setValue(db.DEPARTMENT.BUSINESS_UNIT, "中文");
-		dep.update(conn);
+		dep.update();
 
 		int id = dep.getInt(db.DEPARTMENT.ID);
 
 		// Update an Employee
-		DBRecord depRead = new DBRecord();
-		depRead.read(db.DEPARTMENT, id, conn);
+		DBRecord depRead = new DBRecord(context, db.DEPARTMENT);
+		depRead.read(id);
 
 		// You may see ?? in the DB record
 		assertEquals("中文", depRead.getString(db.DEPARTMENT.BUSINESS_UNIT));
diff --git a/empire-db/src/test/java/org/apache/empire/db/postgresql/DBDatabaseDriverPostgreSQLTest.java b/empire-db/src/test/java/org/apache/empire/db/postgresql/DBDatabaseDriverPostgreSQLTest.java
index 8b78340..c35c131 100644
--- a/empire-db/src/test/java/org/apache/empire/db/postgresql/DBDatabaseDriverPostgreSQLTest.java
+++ b/empire-db/src/test/java/org/apache/empire/db/postgresql/DBDatabaseDriverPostgreSQLTest.java
@@ -29,10 +29,12 @@ import org.apache.empire.DBResource;
 import org.apache.empire.DBResource.DB;
 import org.apache.empire.db.CompanyDB;
 import org.apache.empire.db.DBCommand;
+import org.apache.empire.db.DBContext;
 import org.apache.empire.db.DBDatabaseDriver;
 import org.apache.empire.db.DBReader;
 import org.apache.empire.db.DBRecord;
 import org.apache.empire.db.DBSQLScript;
+import org.apache.empire.db.context.DBContextStatic;
 import org.apache.empire.db.exceptions.QueryFailedException;
 import org.junit.Assert;
 import org.junit.Ignore;
@@ -69,8 +71,9 @@ public class DBDatabaseDriverPostgreSQLTest
 	public void testBlobDDL() throws SQLException 
 	{
 		Connection conn = dbResource.getConnection();
-
 		DBDatabaseDriver driver = dbResource.newDriver();
+        DBContext context = new DBContextStatic(driver, conn); 
+		
 		CompanyDB db = new CompanyDB();
 
 		// Encoding issue occurs when prepared statement is disabled
@@ -79,10 +82,10 @@ public class DBDatabaseDriverPostgreSQLTest
 		db.open(driver, dbResource.getConnection());
 
 		if(!databaseExists(conn, db)){
-			DBSQLScript script = new DBSQLScript();
-			db.getCreateDDLScript(db.getDriver(), script);
+			DBSQLScript script = new DBSQLScript(context);
+			db.getCreateDDLScript(script);
 			System.out.println(script.toString());
-			script.executeAll(db.getDriver(), dbResource.getConnection(), false);
+			script.executeAll(false);
 		}
 		
 		conn.close();
@@ -94,23 +97,25 @@ public class DBDatabaseDriverPostgreSQLTest
 		Connection conn = dbResource.getConnection();
 
 		DBDatabaseDriver driver = dbResource.newDriver();
-		CompanyDB db = new CompanyDB();
+        DBContext context = new DBContextStatic(driver, conn); 
+
+        CompanyDB db = new CompanyDB();
 
 		// Encoding issue occurs when prepared statement is disabled
 		//db.setPreparedStatementsEnabled(true);
 
 		db.open(driver, dbResource.getConnection());
 		
-		DBRecord emp = new DBRecord();
-        emp.create(db.DATA);
+		DBRecord emp = new DBRecord(context, db.DATA);
+        emp.create();
         emp.setValue(db.DATA.DATA, new byte[]{1,2,3});
-        emp.update(conn);
+        emp.update();
 		
 		// read a value
 		DBCommand cmd = db.createCommand();
 		cmd.select(db.DATA.DATA);
-		DBReader reader = new DBReader();
-		reader.open(cmd, conn);
+		DBReader reader = new DBReader(context);
+		reader.open(cmd);
 		while(reader.moveNext()){
 			byte[] value = (byte[]) reader.getValue(db.DATA.DATA);
 			Assert.assertArrayEquals(new byte[]{1,2,3}, value);
diff --git a/empire-db/src/test/java/org/apache/empire/db/sqlite/DBDatabaseDriverSQLiteTest.java b/empire-db/src/test/java/org/apache/empire/db/sqlite/DBDatabaseDriverSQLiteTest.java
index b33a6d9..92603d5 100644
--- a/empire-db/src/test/java/org/apache/empire/db/sqlite/DBDatabaseDriverSQLiteTest.java
+++ b/empire-db/src/test/java/org/apache/empire/db/sqlite/DBDatabaseDriverSQLiteTest.java
@@ -27,16 +27,17 @@ import java.util.Date;
 
 import org.apache.empire.DBResource;
 import org.apache.empire.DBResource.DB;
-import org.apache.empire.data.DataMode;
 import org.apache.empire.data.DataType;
 import org.apache.empire.db.CompanyDB;
 import org.apache.empire.db.DBCmdType;
+import org.apache.empire.db.DBContext;
 import org.apache.empire.db.DBDatabase;
 import org.apache.empire.db.DBDatabaseDriver;
 import org.apache.empire.db.DBRecord;
 import org.apache.empire.db.DBSQLScript;
 import org.apache.empire.db.DBTable;
 import org.apache.empire.db.DBTableColumn;
+import org.apache.empire.db.context.DBContextStatic;
 import org.junit.Rule;
 import org.junit.Test;
 
@@ -50,31 +51,32 @@ public class DBDatabaseDriverSQLiteTest{
     public void test()
     {
         Connection conn = dbResource.getConnection();
-     
         DBDatabaseDriver driver = dbResource.newDriver();
+        DBContext context = new DBContextStatic(driver, conn); 
+        
         CompanyDB db = new CompanyDB();
         db.open(driver, dbResource.getConnection());
-        DBSQLScript script = new DBSQLScript();
-        db.getCreateDDLScript(db.getDriver(), script);
-        script.executeAll(db.getDriver(), dbResource.getConnection(), false);
+        DBSQLScript script = new DBSQLScript(context);
+        db.getCreateDDLScript(script);
+        script.executeAll(false);
         
-        DBRecord dep = new DBRecord();
-        dep.create(db.DEPARTMENT);
+        DBRecord dep = new DBRecord(context, db.DEPARTMENT);
+        dep.create();
         dep.setValue(db.DEPARTMENT.NAME, "junit");
         dep.setValue(db.DEPARTMENT.BUSINESS_UNIT, "test");
-        dep.update(conn);
+        dep.update();
         
         Date date = dep.getDateTime(db.DEPARTMENT.UPDATE_TIMESTAMP);
         assertNotNull("Date is null", date);
         assertTrue("No departments", dep.getInt(db.DEPARTMENT.ID) > 0);
         
-        DBRecord emp = new DBRecord();
-        emp.create(db.EMPLOYEE);
+        DBRecord emp = new DBRecord(context, db.EMPLOYEE);
+        emp.create();
         emp.setValue(db.EMPLOYEE.FIRSTNAME, "junit");
         emp.setValue(db.EMPLOYEE.LASTNAME, "test");
         emp.setValue(db.EMPLOYEE.GENDER, "m");
         emp.setValue(db.EMPLOYEE.DEPARTMENT_ID, dep.getInt(db.DEPARTMENT.ID));
-        emp.update(conn);
+        emp.update();
         
         date = emp.getDateTime(db.EMPLOYEE.UPDATE_TIMESTAMP);
         assertNotNull("Date is null", date);
@@ -83,21 +85,21 @@ public class DBDatabaseDriverSQLiteTest{
         int id = emp.getInt(db.EMPLOYEE.ID);
         
         // Update an Employee
-        emp = new DBRecord();
-        emp.read(db.EMPLOYEE, id, conn);
+        emp = new DBRecord(context, db.EMPLOYEE);
+        emp.read(id);
         // Set
         emp.setValue(db.EMPLOYEE.PHONE_NUMBER, "123456");
-        emp.update(conn);
+        emp.update();
         
-        emp = new DBRecord();
-        emp.read(db.EMPLOYEE, id, conn);
+        emp = new DBRecord(context, db.EMPLOYEE);
+        emp.read(id);
         
         assertEquals("123456", emp.getString(db.EMPLOYEE.PHONE_NUMBER));
         
-        script = new DBSQLScript();
+        script = new DBSQLScript(context);
         db.getDriver().getDDLScript(DBCmdType.DROP, db.EMPLOYEE, script);
         db.getDriver().getDDLScript(DBCmdType.DROP, db.DEPARTMENT, script);
-        script.executeAll(db.getDriver(), conn, true);
+        script.executeAll(true);
     }
     
     
@@ -108,29 +110,30 @@ public class DBDatabaseDriverSQLiteTest{
     @Test
     public void testSequence(){
     	Connection conn = dbResource.getConnection();
-        
         DBDatabaseDriver driver = dbResource.newDriver();
+        DBContext context = new DBContextStatic(driver, conn); 
+        
         SeqDB db = new SeqDB();
         db.open(driver, dbResource.getConnection());
-        DBSQLScript script = new DBSQLScript();
-        db.getCreateDDLScript(db.getDriver(), script);
-        script.executeAll(db.getDriver(), dbResource.getConnection(), false);
+        DBSQLScript script = new DBSQLScript(context);
+        db.getCreateDDLScript(script);
+        script.executeAll(false);
         
-        DBRecord data = new DBRecord();
-        data.create(db.DATA);
+        DBRecord data = new DBRecord(context, db.DATA);
+        data.create();
         data.setValue(db.DATA.VALUE, "test");
-        data.update(conn);
+        data.update();
         
         final Object id = data.getLong(db.DATA.ID);
         
-        DBRecord read = new DBRecord();
-        read.read(db.DATA, id, conn);
+        DBRecord read = new DBRecord(context, db.DATA);
+        read.read(id);
         
         assertEquals("test", read.getString(db.DATA.VALUE));
         
-        script = new DBSQLScript();
+        script = new DBSQLScript(context);
         db.getDriver().getDDLScript(DBCmdType.DROP, db.DATA, script);
-        script.executeAll(db.getDriver(), conn, true);
+        script.executeAll(true);
     }
     
     /**