diff --git a/core/conn/jdbc_type4/src/org/trafodion/jdbc/t4/BaseRow.java b/core/conn/jdbc_type4/src/org/trafodion/jdbc/t4/BaseRow.java
deleted file mode 100644
index 3d28248..0000000
--- a/core/conn/jdbc_type4/src/org/trafodion/jdbc/t4/BaseRow.java
+++ /dev/null
@@ -1,65 +0,0 @@
-// @@@ START COPYRIGHT @@@
-//
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-//
-// @@@ END COPYRIGHT @@@
-
-/*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package org.trafodion.jdbc.t4;
-
-import java.io.Serializable;
-import java.sql.SQLException;
-
-abstract class BaseRow implements Serializable, Cloneable {
-
-	protected Object origVals[];
-
-	BaseRow() {
-	}
-
-	protected abstract Object getColumnObject(int i) throws SQLException;
-
-	protected Object[] getOrigRow() {
-		return origVals;
-	}
-
-	protected abstract void setColumnObject(int i, Object obj) throws SQLException;
-}
diff --git a/core/conn/jdbc_type4/src/org/trafodion/jdbc/t4/InsertRow.java b/core/conn/jdbc_type4/src/org/trafodion/jdbc/t4/InsertRow.java
deleted file mode 100644
index e569d20..0000000
--- a/core/conn/jdbc_type4/src/org/trafodion/jdbc/t4/InsertRow.java
+++ /dev/null
@@ -1,82 +0,0 @@
-// @@@ START COPYRIGHT @@@
-//
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-//
-// @@@ END COPYRIGHT @@@
-
-package org.trafodion.jdbc.t4;
-
-import java.io.Serializable;
-import java.sql.PreparedStatement;
-import java.sql.SQLException;
-import java.util.BitSet;
-
-class InsertRow extends BaseRow implements Serializable, Cloneable {
-
-	private BitSet colsInserted;
-	private int cols;
-
-	InsertRow(int i) {
-		origVals = new Object[i];
-		colsInserted = new BitSet(i);
-		cols = i;
-	}
-
-	protected Object getColumnObject(int i) throws SQLException {
-		if (!colsInserted.get(i - 1)) {
-			throw HPT4Messages.createSQLException(null, null, "no_column_value_specified", null);
-		} else {
-			return origVals[i - 1];
-		}
-	}
-
-	protected void initInsertRow() {
-		for (int i = 0; i < cols; i++) {
-			colsInserted.clear(i);
-
-		}
-	}
-
-	/*
-	 * protected boolean isCompleteRow(RowSetMetaData rowsetmetadata) throws
-	 * SQLException { for(int i = 0; i < cols; i++) if(!colsInserted.get(i) &&
-	 * rowsetmetadata.isNullable(i + 1) == 0) return false; return true; }
-	 */
-
-	protected void markColInserted(int i) {
-		colsInserted.set(i);
-	}
-
-	protected void setColumnObject(int i, Object obj) {
-		origVals[i - 1] = obj;
-		markColInserted(i - 1);
-	}
-
-	protected void insertRow(PreparedStatement insertStmt, BitSet paramCols) throws SQLException {
-		int i;
-		int j;
-
-		for (i = 0, j = 1; i < cols; i++) {
-			if (paramCols.get(i)) {
-				insertStmt.setObject(j++, origVals[i]);
-			}
-		}
-		insertStmt.execute();
-		initInsertRow();
-	}
-}
diff --git a/core/conn/jdbc_type4/src/org/trafodion/jdbc/t4/InterfaceResultSet.java b/core/conn/jdbc_type4/src/org/trafodion/jdbc/t4/InterfaceResultSet.java
index 0d7c0b4..8dbbc2f 100644
--- a/core/conn/jdbc_type4/src/org/trafodion/jdbc/t4/InterfaceResultSet.java
+++ b/core/conn/jdbc_type4/src/org/trafodion/jdbc/t4/InterfaceResultSet.java
@@ -583,8 +583,8 @@
 			throws SQLException
 
 	{
-		Row[] rowArray;
-		Object[] objectArray;
+		ObjectArray[] rowArray;
+		Object[] columnArray;
 		Object columnValue;
 
 		int columnCount;
@@ -595,7 +595,7 @@
 		int byteLen = 0;
 		int maxRowLen = rs.connection_.ic_.getTransportBufferSize(); // maxRowLen
 
-		rowArray = new Row[rowsAffected];
+		rowArray = new ObjectArray[rowsAffected];
 
 		// get the number of colums
 		columnCount = rs.getNoOfColumns();
@@ -607,7 +607,7 @@
 				String temp = "Reading row = " + rowIndex;
 				rs.connection_.props_.t4Logger_.logp(Level.FINEST, "InterfaceResultSet", "setFetchOutputs", temp, p);
 			}
-			objectArray = new Object[columnCount];
+			columnArray = new Object[columnCount];
 
 			for (columnIndex = 0; columnIndex < columnCount; columnIndex++) {
 				if (rs.connection_.props_.t4Logger_.isLoggable(Level.FINEST) == true) {
@@ -668,9 +668,9 @@
 					columnValue = null;
 
 				}
-				objectArray[columnIndex] = columnValue;
+				columnArray[columnIndex] = columnValue;
 			}
-			rowArray[rowIndex] = new Row(columnCount, objectArray);
+			rowArray[rowIndex] = new ObjectArray(columnCount, columnArray);
 		}
 		rs.setFetchOutputs(rowArray, rowsAffected, endOfData);
 	}
@@ -682,9 +682,9 @@
 			setFetchOutputs(rs, rowsAffected, endOfData, values);
 			return;
 		}
-		Object[] objectArray;
+		Object[] columnArray;
 		Object columnValue;
-		Row[] rowArray = new Row[rowsAffected];
+		ObjectArray[] rowArray = new ObjectArray[rowsAffected];
 
 		int columnCount = rs.getNoOfColumns();
 		int rowIndex;
@@ -694,7 +694,7 @@
 		int byteLen = 0;
 		int maxRowLen = rs.connection_.ic_.getTransportBufferSize(); // maxRowLen
 
-		objectArray = new Object[columnCount];
+		columnArray = new Object[columnCount];
 
 		int dataLength = 0;
 
@@ -734,10 +734,10 @@
 					}
 				} // end if else
 
-				objectArray[columnIndex] = columnValue;
+				columnArray[columnIndex] = columnValue;
 			} // end for
 
-			rowArray[rowIndex] = new Row(columnCount, objectArray);
+			rowArray[rowIndex] = new ObjectArray(columnCount, columnArray);
 		}
 		rs.setFetchOutputs(rowArray, rowsAffected, endOfData);
 
@@ -888,12 +888,12 @@
 	static Object[] getExecute2Outputs(TrafT4Connection conn, HPT4Desc[] desc, byte[] values, boolean swap) throws SQLException
 
 	{
-		Object[] objectArray;
+		Object[] columnArray;
 		Object columnValue;
 		int columnIndex;
 		int columnCount = (desc == null) ? 0 : desc.length;
 
-		objectArray = new Object[columnCount];
+		columnArray = new Object[columnCount];
 
 		for (columnIndex = 0; columnIndex < columnCount; columnIndex++) {
 			int noNullValueOffset = desc[columnIndex].noNullValue_;
@@ -917,10 +917,10 @@
 				}
 			} // end if else
 
-			objectArray[columnIndex] = columnValue;
+			columnArray[columnIndex] = columnValue;
 		} // end for
 
-		return objectArray;
+		return columnArray;
 
 	} // end getExectue2Outputs
 
diff --git a/core/conn/jdbc_type4/src/org/trafodion/jdbc/t4/ObjectArray.java b/core/conn/jdbc_type4/src/org/trafodion/jdbc/t4/ObjectArray.java
new file mode 100644
index 0000000..fd3f6ee
--- /dev/null
+++ b/core/conn/jdbc_type4/src/org/trafodion/jdbc/t4/ObjectArray.java
@@ -0,0 +1,86 @@
+// @@@ START COPYRIGHT @@@
+//
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+//
+// @@@ END COPYRIGHT @@@
+
+package org.trafodion.jdbc.t4;
+
+import java.io.Serializable;
+import java.util.BitSet;
+
+
+// ****************************************************************************
+//  Class: ObjectArray
+//
+//  This class describes an array of Objects, a corresponding array of
+//  updated objects, and a bitmap containing the updated element positions
+//  It is used by TrafT4ResultSets to handle result set rows.
+// ****************************************************************************
+
+class ObjectArray implements Serializable, Cloneable {
+
+  // Class members
+  private BitSet arrayElements_;
+  private int    arraySize_;
+  private Object objectArray_[];
+  private Object updatedArray_[];
+
+  // Constructors
+  ObjectArray(int arraySize) {
+    arraySize_    = arraySize;
+    objectArray_  = new Object[arraySize];
+    updatedArray_ = new Object[arraySize];
+    
+    // Initializes bit map of elements to false
+    arrayElements_ = new BitSet(arraySize_);
+  }
+
+  ObjectArray(int arraySize, Object objectArray[]) {
+    arraySize_    = arraySize;
+    objectArray_  = new Object[arraySize];
+    updatedArray_ = new Object[arraySize];
+
+    // Initializes bit map of elements to false
+    arrayElements_ = new BitSet(arraySize_);
+
+    // populate object array with passed in object array
+    for (int idx = 0; idx < arraySize_; idx++) {
+      objectArray_[idx] = objectArray[idx];
+    }
+  }
+
+  // Helpers
+  protected int     getSize() { return arraySize_; }
+
+  protected Object getUpdatedArrayElement(int idx) {
+    if (arrayElements_ .get(idx - 1)) {
+      return updatedArray_[idx - 1];
+    } 
+    else {
+      return objectArray_[idx - 1];
+    }
+  }
+
+  protected void updateArrayElement(int idx, Object obj) { 
+    updatedArray_[idx - 1] = obj; 
+    arrayElements_.set(idx - 1);
+  }
+
+}
+
diff --git a/core/conn/jdbc_type4/src/org/trafodion/jdbc/t4/Row.java b/core/conn/jdbc_type4/src/org/trafodion/jdbc/t4/Row.java
deleted file mode 100644
index 21ee6f3..0000000
--- a/core/conn/jdbc_type4/src/org/trafodion/jdbc/t4/Row.java
+++ /dev/null
@@ -1,233 +0,0 @@
-// @@@ START COPYRIGHT @@@
-//
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-//
-// @@@ END COPYRIGHT @@@
-
-package org.trafodion.jdbc.t4;
-
-import java.io.Serializable;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.ResultSetMetaData;
-import java.sql.SQLException;
-import java.util.BitSet;
-import java.util.Locale;
-
-// Referenced classes of package sun.jdbc.rowset:
-//            BaseRow
-
-class Row extends BaseRow implements Serializable, Cloneable {
-
-	private Object currentVals[];
-	private BitSet colsChanged;
-	private boolean deleted;
-	private boolean updated;
-	private boolean inserted;
-	private int numCols;
-
-	Row(int i) {
-		origVals = new Object[i];
-		currentVals = new Object[i];
-		colsChanged = new BitSet(i);
-		numCols = i;
-	}
-
-	Row(int i, Object aobj[]) {
-		origVals = new Object[i];
-		for (int j = 0; j < i; j++) {
-			origVals[j] = aobj[j];
-
-		}
-		currentVals = new Object[i];
-		colsChanged = new BitSet(i);
-		numCols = i;
-	}
-
-	protected void clearDeleted() {
-		deleted = false;
-	}
-
-	protected void clearInserted() {
-		inserted = false;
-	}
-
-	protected void clearUpdated() {
-		updated = false;
-		for (int i = 0; i < numCols; i++) {
-			currentVals[i] = null;
-			colsChanged.clear(i);
-		}
-
-	}
-
-	protected boolean getColUpdated(int i) {
-		return colsChanged.get(i);
-	}
-
-	protected Object getColumnObject(int i) throws SQLException {
-		if (getColUpdated(i - 1)) {
-			return currentVals[i - 1];
-		} else {
-			return origVals[i - 1];
-		}
-	}
-
-	protected boolean getDeleted() {
-		return deleted;
-	}
-
-	protected boolean getInserted() {
-		return inserted;
-	}
-
-	protected boolean getUpdated() {
-		return updated;
-	}
-
-	protected void initColumnObject(int i, Object obj) {
-		origVals[i - 1] = obj;
-	}
-
-	protected void moveCurrentToOrig() {
-		for (int i = 0; i < numCols; i++) {
-			if (getColUpdated(i)) {
-				origVals[i] = currentVals[i];
-				currentVals[i] = null;
-				colsChanged.clear(i);
-			}
-		}
-	}
-
-	private void setColUpdated(int i) {
-		colsChanged.set(i);
-	}
-
-	protected void setColumnObject(int i, Object obj) {
-		currentVals[i - 1] = obj;
-		setColUpdated(i - 1);
-	}
-
-	protected void setLobObject(int i, Object obj) {
-		currentVals[i - 1] = obj;
-		origVals[i - 1] = obj;
-	}
-
-	protected void setDeleted() {
-		deleted = true;
-	}
-
-	protected void setInserted() {
-		inserted = true;
-	}
-
-	protected void setUpdated() {
-		updated = true;
-	}
-
-	protected void deleteRow(Locale locale, PreparedStatement deleteStmt, BitSet paramCols) throws SQLException {
-		int i;
-		int j;
-		int count;
-
-		for (i = 0, j = 1; i < numCols; i++) {
-			if (paramCols.get(i)) {
-				deleteStmt.setObject(j++, origVals[i]);
-			}
-		}
-		count = deleteStmt.executeUpdate();
-		if (count == 0) {
-			throw HPT4Messages.createSQLException(null, locale, "row_modified", null);
-		}
-	}
-
-	protected void updateRow(Locale locale, PreparedStatement updateStmt, BitSet paramCols, BitSet keyCols)
-			throws SQLException {
-		int i;
-		int j;
-		int count;
-
-		for (i = 0, j = 1; i < numCols; i++) {
-			if (keyCols.get(i)) {
-				if (getColUpdated(i)) {
-					throw HPT4Messages.createSQLException(null, locale, "primary_key_not_updateable", null);
-				}
-			} else {
-				if (paramCols.get(i)) { // LOB Support SB 10/8/2004
-					Object obj = getColumnObject((i + 1));
-
-
-					updateStmt.setObject(j++, getColumnObject(i + 1));
-				}
-			}
-		}
-
-		for (i = 0; i < numCols; i++) {
-			// if (paramCols.get(i))
-			if (keyCols.get(i)) {
-				Object obj = origVals[i];
-
-
-				updateStmt.setObject(j++, origVals[i]);
-			}
-		}
-
-		count = updateStmt.executeUpdate();
-		if (count == 0) {
-			throw HPT4Messages.createSQLException(null, locale, "row_modified", null);
-		}
-		moveCurrentToOrig();
-		setUpdated();
-	}
-
-	protected void refreshRow(Locale locale, PreparedStatement selectStmt, BitSet selectCols, BitSet keyCols)
-			throws SQLException {
-		int i;
-		int j;
-		ResultSet rs;
-		ResultSetMetaData rsmd;
-		int columnCount;
-
-		clearUpdated();
-
-		for (i = 0, j = 1; i < numCols; i++) {
-			if (keyCols.get(i)) {
-				selectStmt.setObject(j++, origVals[i]);
-			}
-		}
-		rs = selectStmt.executeQuery();
-		if (rs != null) {
-			try {
-				rsmd = rs.getMetaData();
-				columnCount = rsmd.getColumnCount();
-				rs.next();
-				for (i = 0, j = 1; i < numCols; i++) {
-					if (selectCols.get(i)) {
-						origVals[i] = rs.getObject(j++);
-					}
-				}
-			} catch (SQLException ex) {
-				throw ex;
-			} finally {
-				rs.close();
-			}
-		}
-	}
-
-
-}
diff --git a/core/conn/jdbc_type4/src/org/trafodion/jdbc/t4/T4DatabaseMetaData.java b/core/conn/jdbc_type4/src/org/trafodion/jdbc/t4/T4DatabaseMetaData.java
index d3b916d..d691a82 100644
--- a/core/conn/jdbc_type4/src/org/trafodion/jdbc/t4/T4DatabaseMetaData.java
+++ b/core/conn/jdbc_type4/src/org/trafodion/jdbc/t4/T4DatabaseMetaData.java
@@ -3551,7 +3551,7 @@
 		}
 		TrafT4ResultSet resultSet;
 		HPT4Desc[] outputDesc;
-		Row[] rows;
+		ObjectArray[] rows;
 		String[] rowValue;
 
 		clearWarnings();
@@ -3563,19 +3563,19 @@
 				"TABLE_TYPE", false, Types.VARCHAR, (short) 0, (short) 0, 0, null, null, null, 100, 0, 0);
 
 		resultSet = new TrafT4ResultSet(this, outputDesc, "", true);
-		rows = new Row[3];
+		rows = new ObjectArray[3];
 
 		// Populate the rows
 		rowValue = new String[1];
 
 		rowValue[0] = new String("SYSTEM TABLE");
-		rows[0] = new Row(1, rowValue);
+		rows[0] = new ObjectArray(1, rowValue);
 
 		rowValue[0] = new String("TABLE");
-		rows[1] = new Row(1, rowValue);
+		rows[1] = new ObjectArray(1, rowValue);
 
 		rowValue[0] = new String("VIEW");
-		rows[2] = new Row(1, rowValue);
+		rows[2] = new ObjectArray(1, rowValue);
 
 		resultSet.setFetchOutputs(rows, 3, true);
 		return resultSet;
@@ -4919,7 +4919,7 @@
 		}
 		TrafT4ResultSet resultSet;
 		HPT4Desc[] outputDesc;
-		Row[] rows;
+		ObjectArray[] rows;
 
 		clearWarnings();
 		// connection_.getServerHandle().isConnectionOpen();
@@ -4942,7 +4942,7 @@
 				"BASE_TYPE", false, Types.SMALLINT, (short) 0, (short) 0, 0, null, null, null, 130, 0, 0);
 
 		resultSet = new TrafT4ResultSet(this, outputDesc, "", true);
-		rows = new Row[0];
+		rows = new ObjectArray[0];
 
 		// Populate the rows
 		resultSet.setFetchOutputs(rows, 0, true);
@@ -5273,7 +5273,7 @@
 		}
 		TrafT4ResultSet resultSet;
 		HPT4Desc[] outputDesc;
-		Row[] rows;
+		ObjectArray[] rows;
 
 		clearWarnings();
 		// connection_.getServerHandle().isConnectionOpen();
@@ -5294,7 +5294,7 @@
 				"SUPERTYPE_NAME", false, Types.VARCHAR, (short) 0, (short) 0, 0, null, null, null, 100, 0, 0);
 
 		resultSet = new TrafT4ResultSet(this, outputDesc, "", true);
-		rows = new Row[0];
+		rows = new ObjectArray[0];
 
 		// Populate the rows
 		resultSet.setFetchOutputs(rows, 0, true);
@@ -5318,7 +5318,7 @@
 		}
 		TrafT4ResultSet resultSet;
 		HPT4Desc[] outputDesc;
-		Row[] rows;
+		ObjectArray[] rows;
 
 		clearWarnings();
 		// connection_.getServerHandle().isConnectionOpen();
@@ -5335,7 +5335,7 @@
 				"SUPERTABLE_NAME", false, Types.VARCHAR, (short) 0, (short) 0, 0, null, null, null, 100, 0, 0);
 
 		resultSet = new TrafT4ResultSet(this, outputDesc, "", true);
-		rows = new Row[0];
+		rows = new ObjectArray[0];
 
 		// Populate the rows
 		resultSet.setFetchOutputs(rows, 0, true);
@@ -5363,7 +5363,7 @@
 		}
 		TrafT4ResultSet resultSet;
 		HPT4Desc[] outputDesc;
-		Row[] rows;
+		ObjectArray[] rows;
 
 		clearWarnings();
 		// connection_.getServerHandle().isConnectionOpen();
@@ -5414,7 +5414,7 @@
 				"SOURCE_DATA_TYPE", false, Types.SMALLINT, (short) 0, (short) 0, 0, null, null, null, 130, 0, 0);
 
 		resultSet = new TrafT4ResultSet(this, outputDesc, "", true);
-		rows = new Row[0];
+		rows = new ObjectArray[0];
 
 		// Populate the rows
 		resultSet.setFetchOutputs(rows, 0, true);
diff --git a/core/conn/jdbc_type4/src/org/trafodion/jdbc/t4/TrafT4PreparedStatement.java b/core/conn/jdbc_type4/src/org/trafodion/jdbc/t4/TrafT4PreparedStatement.java
index 489904f..0d4fe28 100644
--- a/core/conn/jdbc_type4/src/org/trafodion/jdbc/t4/TrafT4PreparedStatement.java
+++ b/core/conn/jdbc_type4/src/org/trafodion/jdbc/t4/TrafT4PreparedStatement.java
@@ -1924,7 +1924,7 @@
 	 * rowsAffected) throws SQLException { batchRowCount_ = new int[1];
 	 * batchRowCount_[0] = rowsAffected; if (outputDesc_ != null) { resultSet_ =
 	 * new TrafT4ResultSet(this, outputDesc_); } else { resultSet_ = null; } if
-	 * (rowsAffected == 0) { resultSet_.setFetchOutputs(new Row[0], 0, true, 0); }
+	 * (rowsAffected == 0) { resultSet_.setFetchOutputs(new ObjectRow[0], 0, true, 0); }
 	 * else { resultSet_.irs_.setSingletonFetchOutputs(resultSet_, rowsAffected,
 	 * true, 0, sqlValue_def_array); } }
 	 */
diff --git a/core/conn/jdbc_type4/src/org/trafodion/jdbc/t4/TrafT4ResultSet.java b/core/conn/jdbc_type4/src/org/trafodion/jdbc/t4/TrafT4ResultSet.java
index c181bee..b08d539 100644
--- a/core/conn/jdbc_type4/src/org/trafodion/jdbc/t4/TrafT4ResultSet.java
+++ b/core/conn/jdbc_type4/src/org/trafodion/jdbc/t4/TrafT4ResultSet.java
@@ -56,6 +56,10 @@
 import java.util.logging.Level;
 import java.util.logging.LogRecord;
 
+// ----------------------------------------------------------------------------
+// This class partially implements the result set class as defined in 
+// java.sql.ResultSet.  
+// ----------------------------------------------------------------------------
 public class TrafT4ResultSet extends HPT4Handle implements java.sql.ResultSet {
 
 	// java.sql.ResultSet interface methods
@@ -185,38 +189,10 @@
 		onInsertRow_ = false;
 	}
 
+        // Method not implemented
 	public void cancelRowUpdates() throws SQLException {
-		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
-			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
-			connection_.props_.t4Logger_.logp(Level.FINE, "TrafT4ResultSet", "cancelRowUpdates", "", p);
-		}
-		if (connection_.props_.getLogWriter() != null) {
-			LogRecord lr = new LogRecord(Level.FINE, "");
-			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
-			lr.setParameters(p);
-			lr.setSourceClassName("TrafT4ResultSet");
-			lr.setSourceMethodName("cancelRowUpdates");
-			T4LogFormatter lf = new T4LogFormatter();
-			String temp = lf.format(lr);
-			connection_.props_.getLogWriter().println(temp);
-		}
-		clearWarnings();
-		if (isClosed_) {
-			throw HPT4Messages.createSQLException(connection_.props_, connection_.getLocale(), "invalid_cursor_state",
-					null);
-		}
-		if (getConcurrency() == ResultSet.CONCUR_READ_ONLY) {
-			throw HPT4Messages
-					.createSQLException(connection_.props_, connection_.getLocale(), "read_only_concur", null);
-		}
-		if (onInsertRow_) {
-			throw HPT4Messages.createSQLException(connection_.props_, connection_.getLocale(),
-					"invalid_cursor_position", null);
-		}
-		Row row = (Row) getCurrentRow();
-		if (!row.getUpdated()) {
-			row.clearUpdated();
-		}
+             throw HPT4Messages.createSQLException(connection_.props_, connection_.getLocale(),
+                  "cancelRowUpdates - not supported", null);
 	}
 
 	/**
@@ -257,68 +233,13 @@
 		}
 	}
 
+        // Method not implemented
 	public void deleteRow() throws SQLException {
-		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
-			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
-			connection_.props_.t4Logger_.logp(Level.FINE, "TrafT4ResultSet", "deleteRow", "", p);
-		}
-		if (connection_.props_.getLogWriter() != null) {
-			LogRecord lr = new LogRecord(Level.FINE, "");
-			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
-			lr.setParameters(p);
-			lr.setSourceClassName("TrafT4ResultSet");
-			lr.setSourceMethodName("deleteRow");
-			T4LogFormatter lf = new T4LogFormatter();
-			String temp = lf.format(lr);
-			connection_.props_.getLogWriter().println(temp);
-		}
-		clearWarnings();
-
-		if (isClosed_) {
-			throw HPT4Messages.createSQLException(connection_.props_, connection_.getLocale(), "invalid_cursor_state",
-					null);
-		}
-		if (getConcurrency() == ResultSet.CONCUR_READ_ONLY) {
-			throw HPT4Messages
-					.createSQLException(connection_.props_, connection_.getLocale(), "read_only_concur", null);
-		}
-		if (onInsertRow_) {
-			throw HPT4Messages.createSQLException(connection_.props_, connection_.getLocale(),
-					"invalid_cursor_position", null);
-		}
-
-
-		try {
-			prepareDeleteStmt();
-			Row row = (Row) getCurrentRow();
-			// Remove the row from database
-			row.deleteRow(connection_.getLocale(), deleteStmt_, paramCols_);
-			// Remove the row from the resultSet
-			cachedRows_.remove(--currentRow_);
-			--numRows_;
-
-			if ((getType() == ResultSet.TYPE_FORWARD_ONLY) && (getConcurrency() == ResultSet.CONCUR_UPDATABLE)) {
-				int temp;
-				temp = currentRowCount_;
-
-				if (!next()) {
-					if (temp == 1) {
-						isBeforeFirst_ = true;
-					}
-					currentRowCount_ = 0;
-				} else {
-					--currentRowCount_;
-				}
-			} else {
-				if (currentRow_ == 0) {
-					isBeforeFirst_ = true;
-				}
-			}
-		} catch (SQLException e) {
-			performConnectionErrorChecks(e);
-			throw e;
-		}
-	}
+            throw HPT4Messages.createSQLException(connection_.props_, 
+                                                  connection_.getLocale(),
+                                                  "deleteRow - not supported", 
+                                                  null);
+        }
 
 	public int findColumn(String columnName) throws SQLException {
 		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
@@ -845,7 +766,7 @@
 		case Types.BLOB:
 		case Types.CLOB:
 
-			Object x = getCurrentRow().getColumnObject(columnIndex);
+			Object x = getCurrentRow().getUpdatedArrayElement(columnIndex);
 			if (x == null) {
 				wasNull_ = true;
 				return null;
@@ -1880,11 +1801,11 @@
 		int targetSqlType;
 		int precision;
 		Object x;
-		BaseRow currentRow;
+		ObjectArray currentRow;
 
 		validateGetInvocation(columnIndex);
 		currentRow = getCurrentRow();
-		x = currentRow.getColumnObject(columnIndex);
+		x = currentRow.getUpdatedArrayElement(columnIndex);
 
 		if (x == null) {
 			wasNull_ = true;
@@ -2548,54 +2469,13 @@
 	}
 
 	// ------------------------------------------------------------------
+        // Method not implemented
 	public void insertRow() throws SQLException {
-		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
-			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
-			connection_.props_.t4Logger_.logp(Level.FINE, "TrafT4ResultSet", "insertRow", "", p);
-		}
-		if (connection_.props_.getLogWriter() != null) {
-			LogRecord lr = new LogRecord(Level.FINE, "");
-			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
-			lr.setParameters(p);
-			lr.setSourceClassName("TrafT4ResultSet");
-			lr.setSourceMethodName("insertRow");
-			T4LogFormatter lf = new T4LogFormatter();
-			String temp = lf.format(lr);
-			connection_.props_.getLogWriter().println(temp);
-		}
-		int i;
-
-		clearWarnings();
-		if (isClosed_) {
-			throw HPT4Messages.createSQLException(connection_.props_, connection_.getLocale(), "invalid_cursor_state",
-					null);
-		}
-		if (getConcurrency() == ResultSet.CONCUR_READ_ONLY) {
-			throw HPT4Messages
-					.createSQLException(connection_.props_, connection_.getLocale(), "read_only_concur", null);
-		}
-		if (!onInsertRow_) {
-			throw HPT4Messages.createSQLException(connection_.props_, connection_.getLocale(),
-					"invalid_cursor_position", null);
-		}
-
-		prepareInsertStmt();
-		InsertRow insertRow = (InsertRow) getCurrentRow();
-		// Insert the row into database
-		insertRow.insertRow(insertStmt_, paramCols_);
-		// Add the row to the resultSet
-		Row row = new Row(outputDesc_.length, insertRow.getOrigRow());
-		row.setInserted();
-		if (isBeforeFirst_ || isAfterLast_) {
-			i = currentRow_;
-		} else {
-			i = currentRow_ - 1;
-		}
-		cachedRows_.add(i, row);
-		numRows_++;
-
-
-	}
+           throw HPT4Messages.createSQLException(connection_.props_, 
+                                                 connection_.getLocale(),
+                                                 "insertRow - not supported", 
+                                                 null);
+        }
 
 	public boolean isAfterLast() throws SQLException {
 		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
@@ -2791,43 +2671,12 @@
 		}
 	}
 
+        // Method not implemented
 	public void moveToInsertRow() throws SQLException {
-		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
-			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
-			connection_.props_.t4Logger_.logp(Level.FINE, "TrafT4ResultSet", "moveToInsertRow", "", p);
-		}
-		if (connection_.props_.getLogWriter() != null) {
-			LogRecord lr = new LogRecord(Level.FINE, "");
-			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
-			lr.setParameters(p);
-			lr.setSourceClassName("TrafT4ResultSet");
-			lr.setSourceMethodName("moveToInsertRow");
-			T4LogFormatter lf = new T4LogFormatter();
-			String temp = lf.format(lr);
-			connection_.props_.getLogWriter().println(temp);
-		}
-		clearWarnings();
-		if (isClosed_) {
-			throw HPT4Messages.createSQLException(connection_.props_, connection_.getLocale(), "invalid_cursor_state",
-					null);
-		}
-		if (getConcurrency() == ResultSet.CONCUR_READ_ONLY) {
-			throw HPT4Messages
-					.createSQLException(connection_.props_, connection_.getLocale(), "read_only_concur", null);
-		}
-
-
-		if (insertRow_ == null) {
-			if (outputDesc_.length > 0) {
-				insertRow_ = new InsertRow(outputDesc_.length);
-			}
-		}
-		if (insertRow_ != null) {
-			onInsertRow_ = true;
-			savedCurrentRow_ = currentRow_;
-			insertRow_.initInsertRow();
-		}
-
+           throw HPT4Messages.createSQLException(connection_.props_, 
+                                                 connection_.getLocale(),
+                                                 "moveToInsertRow - not supported", 
+                                                 null);
 	}
 
 	public boolean next() throws SQLException {
@@ -2956,41 +2805,14 @@
 			isAfterLast_ = false;
 		}
 		return validRow;
-	}
+        }
 
+        // Method not implemented
 	public void refreshRow() throws SQLException {
-		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
-			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
-			connection_.props_.t4Logger_.logp(Level.FINE, "TrafT4ResultSet", "refreshRow", "", p);
-		}
-		if (connection_.props_.getLogWriter() != null) {
-			LogRecord lr = new LogRecord(Level.FINE, "");
-			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
-			lr.setParameters(p);
-			lr.setSourceClassName("TrafT4ResultSet");
-			lr.setSourceMethodName("refreshRow");
-			T4LogFormatter lf = new T4LogFormatter();
-			String temp = lf.format(lr);
-			connection_.props_.getLogWriter().println(temp);
-		}
-
-		clearWarnings();
-		if (isClosed_) {
-			throw HPT4Messages.createSQLException(connection_.props_, connection_.getLocale(), "invalid_cursor_state",
-					null);
-		}
-		if (onInsertRow_) {
-			throw HPT4Messages.createSQLException(connection_.props_, connection_.getLocale(), "invalid_operation",
-					null);
-		}
-		prepareSelectStmt();
-		Row row = (Row) getCurrentRow();
-		try {
-			row.refreshRow(connection_.getLocale(), selectStmt_, paramCols_, keyCols_);
-		} catch (SQLException e) {
-			performConnectionErrorChecks(e);
-			throw e;
-		}
+           throw HPT4Messages.createSQLException(connection_.props_, 
+                                                 connection_.getLocale(),
+                                                 "refreshRow - not supported", 
+                                                 null);
 	}
 
 	public boolean relative(int row) throws SQLException {
@@ -3047,103 +2869,28 @@
 		return flag;
 	}
 
+        // Method not implemented
 	public boolean rowDeleted() throws SQLException {
-		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
-			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
-			connection_.props_.t4Logger_.logp(Level.FINE, "TrafT4ResultSet", "rowDeleted", "", p);
-		}
-		if (connection_.props_.getLogWriter() != null) {
-			LogRecord lr = new LogRecord(Level.FINE, "");
-			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
-			lr.setParameters(p);
-			lr.setSourceClassName("TrafT4ResultSet");
-			lr.setSourceMethodName("rowDeleted");
-			T4LogFormatter lf = new T4LogFormatter();
-			String temp = lf.format(lr);
-			connection_.props_.getLogWriter().println(temp);
-		}
-		BaseRow row;
-
-		if (isClosed_) {
-			throw HPT4Messages.createSQLException(connection_.props_, connection_.getLocale(), "invalid_cursor_state",
-					null);
-		}
-		if (onInsertRow_) {
-			throw HPT4Messages.createSQLException(connection_.props_, connection_.getLocale(), "invalid_operation",
-					null);
-		}
-		row = getCurrentRow();
-		if (row instanceof Row) {
-			return ((Row) row).getDeleted();
-		} else {
-			return false;
-		}
+           throw HPT4Messages.createSQLException(connection_.props_, 
+                                                 connection_.getLocale(),
+                                                 "rowDeleted - not supported", 
+                                                  null);
 	}
 
+        // Method not implemented
 	public boolean rowInserted() throws SQLException {
-		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
-			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
-			connection_.props_.t4Logger_.logp(Level.FINE, "TrafT4ResultSet", "rowInserted", "", p);
-		}
-		if (connection_.props_.getLogWriter() != null) {
-			LogRecord lr = new LogRecord(Level.FINE, "");
-			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
-			lr.setParameters(p);
-			lr.setSourceClassName("TrafT4ResultSet");
-			lr.setSourceMethodName("rowInserted");
-			T4LogFormatter lf = new T4LogFormatter();
-			String temp = lf.format(lr);
-			connection_.props_.getLogWriter().println(temp);
-		}
-		BaseRow row;
-
-		if (isClosed_) {
-			throw HPT4Messages.createSQLException(connection_.props_, connection_.getLocale(), "invalid_cursor_state",
-					null);
-		}
-		if (onInsertRow_) {
-			throw HPT4Messages.createSQLException(connection_.props_, connection_.getLocale(), "invalid_operation",
-					null);
-		}
-		row = getCurrentRow();
-		if (row instanceof Row) {
-			return ((Row) row).getInserted();
-		} else {
-			return false;
-		}
+           throw HPT4Messages.createSQLException(connection_.props_, 
+                                                 connection_.getLocale(),
+                                                 "rowInserted - not supported", 
+                                                  null);
 	}
 
+        // Method not implemented
 	public boolean rowUpdated() throws SQLException {
-		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
-			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
-			connection_.props_.t4Logger_.logp(Level.FINE, "TrafT4ResultSet", "rowUpdated", "", p);
-		}
-		if (connection_.props_.getLogWriter() != null) {
-			LogRecord lr = new LogRecord(Level.FINE, "");
-			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
-			lr.setParameters(p);
-			lr.setSourceClassName("TrafT4ResultSet");
-			lr.setSourceMethodName("rowUpdated");
-			T4LogFormatter lf = new T4LogFormatter();
-			String temp = lf.format(lr);
-			connection_.props_.getLogWriter().println(temp);
-		}
-		BaseRow row;
-
-		if (isClosed_) {
-			throw HPT4Messages.createSQLException(connection_.props_, connection_.getLocale(), "invalid_cursor_state",
-					null);
-		}
-		if (onInsertRow_) {
-			throw HPT4Messages.createSQLException(connection_.props_, connection_.getLocale(), "invalid_operation",
-					null);
-		}
-		row = getCurrentRow();
-		if (row instanceof Row) {
-			return ((Row) row).getUpdated();
-		} else {
-			return false;
-		}
+           throw HPT4Messages.createSQLException(connection_.props_, 
+                                                 connection_.getLocale(),
+                                                 "rowUpdated - not supported", 
+                                                  null);
 	}
 
 	public void setFetchDirection(int direction) throws SQLException {
@@ -3279,7 +3026,7 @@
 					messageArguments);
 		}
 		try {
-			getCurrentRow().setColumnObject(columnIndex, new String(value, "ASCII"));
+			getCurrentRow().updateArrayElement(columnIndex, new String(value, "ASCII"));
 		} catch (java.io.UnsupportedEncodingException e) {
 			Object[] messageArguments = new Object[1];
 			messageArguments[0] = e.getMessage();
@@ -3323,7 +3070,7 @@
 			connection_.props_.getLogWriter().println(temp);
 		}
 		validateUpdInvocation(columnIndex);
-		getCurrentRow().setColumnObject(columnIndex, x);
+		getCurrentRow().updateArrayElement(columnIndex, x);
 	}
 
 	public void updateBigDecimal(String columnName, BigDecimal x) throws SQLException {
@@ -3377,7 +3124,7 @@
 			throw HPT4Messages.createSQLException(connection_.props_, connection_.getLocale(), "io_exception",
 					messageArguments);
 		}
-		getCurrentRow().setColumnObject(columnIndex, value);
+		getCurrentRow().updateArrayElement(columnIndex, value);
 	}
 
 	public void updateBinaryStream(String columnName, InputStream x, int length) throws SQLException {
@@ -3416,7 +3163,7 @@
 			connection_.props_.getLogWriter().println(temp);
 		}
 		validateUpdInvocation(columnIndex);
-		getCurrentRow().setColumnObject(columnIndex, new Boolean(x));
+		getCurrentRow().updateArrayElement(columnIndex, new Boolean(x));
 	}
 
 	public void updateBoolean(String columnName, boolean x) throws SQLException {
@@ -3454,7 +3201,7 @@
 			connection_.props_.getLogWriter().println(temp);
 		}
 		validateUpdInvocation(columnIndex);
-		getCurrentRow().setColumnObject(columnIndex, new Byte(x));
+		getCurrentRow().updateArrayElement(columnIndex, new Byte(x));
 	}
 
 	public void updateByte(String columnName, byte x) throws SQLException {
@@ -3492,7 +3239,7 @@
 			connection_.props_.getLogWriter().println(temp);
 		}
 		validateUpdInvocation(columnIndex);
-		getCurrentRow().setColumnObject(columnIndex, x);
+		getCurrentRow().updateArrayElement(columnIndex, x);
 	}
 
 	public void updateBytes(String columnName, byte[] x) throws SQLException {
@@ -3554,7 +3301,7 @@
 			throw HPT4Messages.createSQLException(connection_.props_, connection_.getLocale(), "io_exception",
 					messageArguments);
 		}
-		getCurrentRow().setColumnObject(columnIndex, new String(value));
+		getCurrentRow().updateArrayElement(columnIndex, new String(value));
 	}
 
 	public void updateCharacterStream(String columnName, Reader x, int length) throws SQLException {
@@ -3592,7 +3339,7 @@
 			connection_.props_.getLogWriter().println(temp);
 		}
 		validateUpdInvocation(columnIndex);
-		getCurrentRow().setColumnObject(columnIndex, x);
+		getCurrentRow().updateArrayElement(columnIndex, x);
 	}
 
 	public void updateDate(String columnName, Date x) throws SQLException {
@@ -3630,7 +3377,7 @@
 			connection_.props_.getLogWriter().println(temp);
 		}
 		validateUpdInvocation(columnIndex);
-		getCurrentRow().setColumnObject(columnIndex, new Double(x));
+		getCurrentRow().updateArrayElement(columnIndex, new Double(x));
 	}
 
 	public void updateDouble(String columnName, double x) throws SQLException {
@@ -3668,7 +3415,7 @@
 			connection_.props_.getLogWriter().println(temp);
 		}
 		validateUpdInvocation(columnIndex);
-		getCurrentRow().setColumnObject(columnIndex, new Float(x));
+		getCurrentRow().updateArrayElement(columnIndex, new Float(x));
 	}
 
 	public void updateFloat(String columnName, float x) throws SQLException {
@@ -3706,7 +3453,7 @@
 			connection_.props_.getLogWriter().println(temp);
 		}
 		validateUpdInvocation(columnIndex);
-		getCurrentRow().setColumnObject(columnIndex, new Integer(x));
+		getCurrentRow().updateArrayElement(columnIndex, new Integer(x));
 	}
 
 	public void updateInt(String columnName, int x) throws SQLException {
@@ -3744,7 +3491,7 @@
 			connection_.props_.getLogWriter().println(temp);
 		}
 		validateUpdInvocation(columnIndex);
-		getCurrentRow().setColumnObject(columnIndex, new Long(x));
+		getCurrentRow().updateArrayElement(columnIndex, new Long(x));
 	}
 
 	public void updateLong(String columnName, long x) throws SQLException {
@@ -3782,7 +3529,7 @@
 			connection_.props_.getLogWriter().println(temp);
 		}
 		validateUpdInvocation(columnIndex);
-		getCurrentRow().setColumnObject(columnIndex, null);
+		getCurrentRow().updateArrayElement(columnIndex, null);
 	}
 
 	public void updateNull(String columnName) throws SQLException {
@@ -3838,7 +3585,7 @@
 			connection_.props_.getLogWriter().println(temp);
 		}
 		validateUpdInvocation(columnIndex);
-		getCurrentRow().setColumnObject(columnIndex, x);
+		getCurrentRow().updateArrayElement(columnIndex, x);
 	}
 
 	public void updateObject(String columnName, Object x) throws SQLException {
@@ -3917,41 +3664,11 @@
 		updateRef(columnIndex, x);
 	}
 
+        // Method not implemented
 	public void updateRow() throws SQLException {
-		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
-			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
-			connection_.props_.t4Logger_.logp(Level.FINE, "TrafT4ResultSet", "updateRow", "", p);
-		}
-		if (connection_.props_.getLogWriter() != null) {
-			LogRecord lr = new LogRecord(Level.FINE, "");
-			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
-			lr.setParameters(p);
-			lr.setSourceClassName("TrafT4ResultSet");
-			lr.setSourceMethodName("updateRow");
-			T4LogFormatter lf = new T4LogFormatter();
-			String temp = lf.format(lr);
-			connection_.props_.getLogWriter().println(temp);
-		}
-		clearWarnings();
-		if (getConcurrency() == ResultSet.CONCUR_READ_ONLY) {
-			throw HPT4Messages
-					.createSQLException(connection_.props_, connection_.getLocale(), "read_only_concur", null);
-		}
-		if (onInsertRow_) {
-			throw HPT4Messages.createSQLException(connection_.props_, connection_.getLocale(),
-					"invalid_cursor_position", null);
-		}
-
-		if (connection_.getAutoCommit()) {
-			// should set a warning for the user
-			setSQLWarning(connection_.props_, "resultSet_updateRow_with_autocommit", null);
-		}
-		prepareUpdateStmt();
-		Row row = (Row) getCurrentRow();
-		// Update the row in database
-		row.updateRow(connection_.getLocale(), updateStmt_, paramCols_, keyCols_);
-
-
+           throw HPT4Messages.createSQLException(connection_.props_, 
+                                                 connection_.getLocale(),
+                                                 "updateRow - not supported", null);
 	}
 
 	public void updateShort(int columnIndex, short x) throws SQLException {
@@ -3970,7 +3687,7 @@
 			connection_.props_.getLogWriter().println(temp);
 		}
 		validateUpdInvocation(columnIndex);
-		getCurrentRow().setColumnObject(columnIndex, new Short(x));
+		getCurrentRow().updateArrayElement(columnIndex, new Short(x));
 	}
 
 	public void updateShort(String columnName, short x) throws SQLException {
@@ -4008,7 +3725,7 @@
 			connection_.props_.getLogWriter().println(temp);
 		}
 		validateUpdInvocation(columnIndex);
-		getCurrentRow().setColumnObject(columnIndex, x);
+		getCurrentRow().updateArrayElement(columnIndex, x);
 	}
 
 	public void updateString(String columnName, String x) throws SQLException {
@@ -4046,7 +3763,7 @@
 			connection_.props_.getLogWriter().println(temp);
 		}
 		validateUpdInvocation(columnIndex);
-		getCurrentRow().setColumnObject(columnIndex, x);
+		getCurrentRow().updateArrayElement(columnIndex, x);
 	}
 
 	public void updateTime(String columnName, Time x) throws SQLException {
@@ -4084,7 +3801,7 @@
 			connection_.props_.getLogWriter().println(temp);
 		}
 		validateUpdInvocation(columnIndex);
-		getCurrentRow().setColumnObject(columnIndex, x);
+		getCurrentRow().updateArrayElement(columnIndex, x);
 	}
 
 	public void updateTimestamp(String columnName, Timestamp x) throws SQLException {
@@ -4295,7 +4012,7 @@
 		}
 	}
 
-	private BaseRow getCurrentRow() throws SQLException {
+	private ObjectArray getCurrentRow() throws SQLException {
 		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
 			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
 			connection_.props_.t4Logger_.logp(Level.FINE, "TrafT4ResultSet", "getCurrentRow", "", p);
@@ -4319,7 +4036,7 @@
 			if (isAfterLast_) {
 				throw HPT4Messages.createSQLException(connection_.props_, connection_.getLocale(), "cursor_after_last_row", null);
 			}
-			return (BaseRow) cachedRows_.get(currentRow_ - 1);
+			return (ObjectArray) cachedRows_.get(currentRow_ - 1);
 		}
 	}
 
@@ -4597,7 +4314,7 @@
 	// DatabaseMetaData catalog APIs also call this method to update the rows
 	// fetched
 	//
-	void setFetchOutputs(Row[] row, int rowsFetched, boolean endOfData) throws SQLException {
+	void setFetchOutputs(ObjectArray[] row, int rowsFetched, boolean endOfData) throws SQLException {
 		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
 			Object p[] = T4LoggingUtilities.makeParams(connection_.props_, row, rowsFetched, endOfData, 0);
 			connection_.props_.t4Logger_.logp(Level.FINE, "TrafT4ResultSet", "setFetchOutputs", "", p);
@@ -4828,9 +4545,9 @@
 		int sqlCharset = outputDesc_[columnIndex - 1].sqlCharset_;
 
 		wasNull_ = true;
-		BaseRow row = getCurrentRow();
+		ObjectArray row = getCurrentRow();
 		if (row != null) {
-			obj = row.getColumnObject(columnIndex);
+			obj = row.getUpdatedArrayElement(columnIndex);
 			if (obj != null) {
 				if (obj instanceof byte[]) {
 					try {
@@ -5024,7 +4741,7 @@
 
 	ArrayList cachedRows_;
 	boolean onInsertRow_;
-	InsertRow insertRow_;
+	ObjectArray insertRow_;
 	int savedCurrentRow_;
 	boolean showInserted_;
 	int numRows_;
diff --git a/core/conn/jdbc_type4/src/org/trafodion/jdbc/t4/TrafT4Statement.java b/core/conn/jdbc_type4/src/org/trafodion/jdbc/t4/TrafT4Statement.java
index d0daff1..d28746f 100644
--- a/core/conn/jdbc_type4/src/org/trafodion/jdbc/t4/TrafT4Statement.java
+++ b/core/conn/jdbc_type4/src/org/trafodion/jdbc/t4/TrafT4Statement.java
@@ -1272,7 +1272,7 @@
 
 			if (rowsAffected == 0) {
 				if (endOfData == true) {
-					resultSet_[result_set_offset].setFetchOutputs(new Row[0], 0, true);
+					resultSet_[result_set_offset].setFetchOutputs(new ObjectArray[0], 0, true);
 				}
 			} else {
 				 if(resultSet_[result_set_offset].keepRawBuffer_ == true)
