diff --git a/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/InputOutput.java b/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/InputOutput.java
index e041e61..0e02ebf 100644
--- a/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/InputOutput.java
+++ b/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/InputOutput.java
@@ -25,6 +25,8 @@
 import java.io.File;
 import java.io.InputStream;
 import java.io.OutputStream;
+import java.io.IOException;
+import java.net.InetSocketAddress;
 import java.net.Socket;
 import java.net.SocketTimeoutException;
 import java.nio.ByteBuffer;
@@ -49,7 +51,7 @@
 	private OutputStream m_os;
 	private InputStream m_is;
 	private WritableByteChannel m_wbc;
-	private T4Connection m_t4conn; // trace_connection
+	private InterfaceConnection ic;
 	//private int m_sendBufSize;
 	
 	private char compress = Header.NO;			//Header.NO means no compression is used. 
@@ -62,7 +64,7 @@
 
         // This is minimum time the socket read and write will wait
         // All other timeouts will be multiple of this timeout
-        private int m_networkTimeout;
+        private int m_networkTimeoutInMillis;
 
 	static {
 		try {
@@ -95,7 +97,7 @@
 		m_dialogueId = 0;
 		m_timeout = 0;
 		m_connectionIdleTimeout = 0;
-		
+		m_networkTimeoutInMillis = m_addr.m_t4props.getNetworkTimeoutInMillis();
 		if(m_addr.m_t4props.getCompression()) {
 			compress = Header.YES;
 		}
@@ -105,11 +107,10 @@
 
 	} // end InputOutput
 
-	// trace_connection - AM
-	void setT4Connection(T4Connection t4conn) {
-		m_t4conn = t4conn;
+	void setInterfaceConnection(InterfaceConnection ic) {
+		this.ic = ic;
 	}
-	
+
 	void setDialogueId(int dialogueId) {
 		m_dialogueId = dialogueId;
 	}
@@ -122,9 +123,20 @@
 		m_connectionIdleTimeout = timeout;
 	}
 	
-        void setNetworkTimeout(int timeout) {
-           m_networkTimeout = timeout; 
-        }
+	void setNetworkTimeoutInMillis(int timeout) throws SQLException {
+		int oldTimeout = m_networkTimeoutInMillis;
+		if (timeout == 0)
+			m_networkTimeoutInMillis = T4Properties.DEFAULT_NETWORK_TIMEOUT_IN_MILLIS;
+		else
+           		m_networkTimeoutInMillis = timeout; 
+		if (m_socket != null && m_networkTimeoutInMillis != oldTimeout) { 
+			try {
+				m_socket.setSoTimeout(m_networkTimeoutInMillis);
+			} catch (java.net.SocketException e) {
+				throw new SQLException(e);
+			}
+		}
+	}
 
 	String getRemoteHost() {
 		return this.m_addr.getIPorName();
@@ -133,10 +145,10 @@
 	// ----------------------------------------------------------
 	synchronized void openIO() throws SQLException {
 		// trace_connection - AM
-		if (m_t4conn != null && m_t4conn.m_ic.t4props_.t4Logger_.isLoggable(Level.FINEST) == true) {
-			Object p[] = T4LoggingUtilities.makeParams(m_t4conn.m_ic.t4props_);
+		if (ic != null && ic.t4props_.t4Logger_.isLoggable(Level.FINEST) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(ic.t4props_);
 			String temp = "m_socket=" + m_socket;
-			m_t4conn.m_ic.t4props_.t4Logger_.logp(Level.FINEST, "InputOutput", "openIO", temp, p);
+			ic.t4props_.t4Logger_.logp(Level.FINEST, "InputOutput", "openIO", temp, p);
 		}
 		if (m_socket == null) {
 			int numTry = 0;
@@ -160,53 +172,19 @@
 				i = 0;
 				while (found == false && i < m_addr.m_inetAddrs.length) {
 					try {
-						//System.out.println(m_addr.m_inetAddrs[i] + ":" + m_addr.m_portNumber.intValue());
-						m_socket = m_factory.createSocket(m_addr.m_inetAddrs[i], m_addr.m_portNumber.intValue());
-//						m_socket = new Socket(InetAddress.getByName("a.b.c.d"),5358);
-						m_socket.setKeepAlive(this.m_addr.m_t4props.getKeepAlive());
-						m_socket.setSoLinger(false, 0); // Make sure the socket
+						m_socket = m_factory.createSocket();
+						int connectTimeout;
+						if (m_timeout == 0)	
+							connectTimeout = T4Properties.DEFAULT_CONNECT_TIMEOUT_IN_SECS * 1000; 
+						else
+							connectTimeout = m_timeout * 1000;
+						m_socket.connect(new InetSocketAddress(m_addr.m_inetAddrs[i], m_addr.m_portNumber.intValue()), connectTimeout);
 						m_socket.setKeepAlive(true);
-						// can immediately
-						// reused if connection
-						// is lost.
-						//Set the network timeout to be at least 10 seconds
-						if (m_networkTimeout == 0)
-                                                    m_networkTimeout = 10;
-						m_socket.setSoTimeout(m_networkTimeout * 1000);
-                        // disable/enable Nagle's algorithm
-                        m_socket.setTcpNoDelay(this.m_addr.m_t4props.getTcpNoDelay());
-						//
-						// Note, I have not set a timeout here for either the
-						// conneciton or for
-						// read operations on the socket. I need to figure out
-						// what the
-						// semantics should be, and add this logic.
-						//
-						// Although the user can set a
-						// connection timeout, we
-						// do not set the timeout on the open/connect of the
-						// socket. Instead
-						// we use the default system TCP/IP timeout. In theory,
-						// this may be
-						// longer than the user login timeout. Also, we keep
-						// trying to create/connect
-						// the socket a minimun of 3 times. In theory, this
-						// could really mess up the
-						// user's use of login timeout. For example, if the user
-						// login timeout is
-						// small (e.g. 5 sec.), and the TCP/IP default socket
-						// create/connect timeout
-						// is large (e.g. 10 sec.), and the number of inetAddrs
-						// is large (e.g. 5),
-						// and the correct inetAddr is the last one on the list,
-						// and the AS server
-						// isn't ready until the last try, we could end up
-						// taking way more than
-						// the user specified login time to connect (3 * 10 * 5
-						// = 150 seconds vs.
-						// 5 sec. the user specified!).
-						//
-						//
+						m_socket.setSoLinger(false, 0); // Make sure the socket can immediately reused if connection is lost.
+						m_socket.setSoTimeout(m_networkTimeoutInMillis);
+						// disable/enable Nagle's algorithm
+						m_socket.setTcpNoDelay(this.m_addr.m_t4props.getTcpNoDelay());
+
 						m_os = m_socket.getOutputStream();
 						m_wbc = Channels.newChannel(m_os);
 						m_is = m_socket.getInputStream();
@@ -215,11 +193,11 @@
 						// Swastik: added code to start connection idle timers
 						startConnectionIdleTimeout();
 						// trace_connection - AM
-						if (m_t4conn != null && m_t4conn.m_ic.t4props_.t4Logger_.isLoggable(Level.FINEST) == true) {
-							Object p[] = T4LoggingUtilities.makeParams(m_t4conn.m_ic.t4props_);
+						if (ic != null && ic.t4props_.t4Logger_.isLoggable(Level.FINEST) == true) {
+							Object p[] = T4LoggingUtilities.makeParams(ic.t4props_);
 							String temp = "found=" + found + ",numTry=" + numTry + ",i=" + i
 									+ ",m_addr.m_inetAddrs.length=" + m_addr.m_inetAddrs.length;
-							m_t4conn.m_ic.t4props_.t4Logger_.logp(Level.FINEST, "InputOutput", "openIO", temp, p);
+							ic.t4props_.t4Logger_.logp(Level.FINEST, "InputOutput", "openIO", temp, p);
 						}
 					} catch (Exception e) {
 						//
@@ -247,11 +225,11 @@
 			} // end while
 			if (found == false) {
 				// trace_connection - AM
-				if (m_t4conn != null && m_t4conn.m_ic.t4props_.t4Logger_.isLoggable(Level.FINEST) == true) {
-					Object p[] = T4LoggingUtilities.makeParams(m_t4conn.m_ic.t4props_);
+				if (ic != null && ic.t4props_.t4Logger_.isLoggable(Level.FINEST) == true) {
+					Object p[] = T4LoggingUtilities.makeParams(ic.t4props_);
 					String temp = "found=" + found + ",numTry=" + numTry + ",i=" + i + ",m_addr.m_inetAddrs.length="
 							+ m_addr.m_inetAddrs.length;
-					m_t4conn.m_ic.t4props_.t4Logger_.logp(Level.FINEST, "InputOutput", "openIO", temp, p);
+					ic.t4props_.t4Logger_.logp(Level.FINEST, "InputOutput", "openIO", temp, p);
 				}
 				//
 				// Couldn't open the socket
@@ -310,10 +288,10 @@
 		}
 		
 		// trace_connection - AM
-		if (m_t4conn != null && m_t4conn.m_ic.t4props_.t4Logger_.isLoggable(Level.FINEST) == true) {
-			Object p[] = T4LoggingUtilities.makeParams(m_t4conn.m_ic.t4props_);
+		if (ic != null && ic.t4props_.t4Logger_.isLoggable(Level.FINEST) == true) {
+			Object p[] = T4LoggingUtilities.makeParams(ic.t4props_);
 			String temp = "MessageBuffer";
-			m_t4conn.m_ic.t4props_.t4Logger_.logp(Level.FINEST, "InputOutput", "doIO", temp, p);
+			ic.t4props_.t4Logger_.logp(Level.FINEST, "InputOutput", "doIO", temp, p);
 		}
 		Header wheader = new Header(odbcAPI, m_dialogueId, totalLength - readHdrLength// minus
 																					// the
@@ -368,11 +346,11 @@
 			totalNumRead = totalNumRead + numRead;
 			whileCount1 = whileCount1 + 1;
 			// trace_connection - AM
-			if (m_t4conn != null && m_t4conn.m_ic.t4props_.t4Logger_.isLoggable(Level.FINEST) == true) {
-				Object p[] = T4LoggingUtilities.makeParams(m_t4conn.m_ic.t4props_);
+			if (ic != null && ic.t4props_.t4Logger_.isLoggable(Level.FINEST) == true) {
+				Object p[] = T4LoggingUtilities.makeParams(ic.t4props_);
 				String temp = "MessageBuffer whileCount1=" + whileCount1 + ",numRead=" + numRead + ",totalNumRead="
 						+ totalNumRead;
-				m_t4conn.m_ic.t4props_.t4Logger_.logp(Level.FINEST, "InputOutput", "doIO", temp, p);
+				ic.t4props_.t4Logger_.logp(Level.FINEST, "InputOutput", "doIO", temp, p);
 			}
 		} // end while
 
@@ -451,12 +429,11 @@
 	} // end doIO
 
 	// ----------------------------------------------------------
-	synchronized void CloseIO(LogicalByteArray buffer) throws SQLException {
-		/*Header hdr = new Header(Header.CLOSE_TCPIP_SESSION, m_dialogueId, 0, 0, Header.NO, Header.COMP_0,
-				Header.CLOSE_TCPIP_SESSION, Header.SIGNATURE, Header.VERSION, Header.PC, Header.TCPIP, Header.NO);
+	synchronized void closeIO() throws SQLException {
 
-		TCPIPDoWrite(hdr, buffer, 0, hdr.sizeOf());*/
 		try {
+			//m_socket.shutdownInput();
+			//m_socket.shutdownOutput();
 			m_socket.close();
 			m_socket = null;
 		} catch (Exception e) {
@@ -466,7 +443,7 @@
 		} finally {
 			closeTimers();
 		}
-	} // end CloseIO
+	} // end closeIO
 
 	void TCPIPWriteByteBuffer(ByteBuffer buffer) throws SQLException {
 
@@ -545,7 +522,7 @@
 		switch (hdr.hdr_type_) {
 		case Header.READ_RESPONSE_FIRST:
 		case Header.READ_RESPONSE_NEXT:
-			numRead = recv_nblk(buffer.getBuffer(), buffer_index);	
+			numRead = recv_nblk((int)hdr.operation_id_, buffer.getBuffer(), buffer_index);	
 //			buffer.setLocation(numRead);
 			break;
 		default:
@@ -578,61 +555,80 @@
 	} // end send_nblk
 
 	// ----------------------------------------------------------
-	int recv_nblk(byte[] buf, int offset) throws SQLException {
+	int recv_nblk(int srvrApi, byte[] buf, int offset) throws SQLException {
 		int num_read = 0;
-		boolean retry = false;
+		int activeTime = 0;
+		boolean cancelQueryAllowed = ! (ic.getIgnoreCancel() || ic.t4props_.getIgnoreCancel());
+		int activeTimeBeforeCancel = ic.getActiveTimeBeforeCancel();
+		boolean outerRetry = true;
 		do {
-			try {
-				boolean innerRetry = true;
-                        	int pendingTimeout = m_timeout;
-                                if (pendingTimeout == 0)
-                                   pendingTimeout = Integer.MAX_VALUE;
-				do {
-					try {
-						num_read = m_is.read(buf, offset, buf.length - offset);
-						// if the socket.read returns -1 then return 0 instead of -1
-						if (num_read < 0) 
-							num_read = 0;
-						innerRetry = false;
-						retry = false;
-                        		}
-	                		catch (SocketTimeoutException ste) {
-						pendingTimeout -= m_networkTimeout;
-						if (pendingTimeout < 0) {
-							innerRetry = false;
-							throw ste;
-						}
-                        		}
-				} while (innerRetry);
-			} catch (SocketTimeoutException ste) {
-				// the first exception should try to cancel and wait for the cancel message from the server
-				if (retry == false) {
-					this.m_t4conn.m_ic.cancel();
-					retry = true;
-					continue;
-                		}
-				
-				// if cancel didnt work the first time, clean everything up
+			boolean innerRetry = true;
+			int innerRetryCnt = 0;
+			int pendingTimeout = m_timeout * 1000;
+			if (pendingTimeout == 0)
+				pendingTimeout = Integer.MAX_VALUE;
+			do {
 				try {
-					m_socket.close();
-					this.m_t4conn.m_ic.setIsClosed(true);
-					this.m_t4conn.m_ic.cancel();
-					throw ste;
-				} catch (Exception e) {
-					SQLException se = TrafT4Messages
-							.createSQLException(null, m_locale, "session_close_error", e.getMessage());
-					se.initCause(e);
-					throw se;
+					num_read = m_is.read(buf, offset, buf.length - offset);
+					// if the socket.read returns -1 then return 0 instead of -1
+					if (num_read < 0) 
+						num_read = 0;
+					innerRetry = false;
+					outerRetry = false;
 				}
-			} catch (Exception e) {
-				SQLException se = TrafT4Messages.createSQLException(null, m_locale, "socket_read_error", e.getMessage());
-				se.initCause(e);
+				catch (SocketTimeoutException ste) {
+					pendingTimeout -= m_networkTimeoutInMillis;
+					if (pendingTimeout <= 0) {
+						innerRetry = false;
+						break;
+					}
+				}
+				catch (IOException ioe) {
+					if (innerRetryCnt <= 3) {
+						try {
+							innerRetryCnt++;
+							Thread.sleep(10);
+						} catch(InterruptedException ie) {
+						}
+					} else {
+						SQLException se = TrafT4Messages.createSQLException(null, m_locale, "problem_with_server_read", null);
+						se.setNextException(new SQLException(ioe));
+						if (ic.t4props_.t4Logger_.isLoggable(Level.FINER)) {
+							Object p[] = T4LoggingUtilities.makeParams(ic.t4props_);
+							String temp = "Socket.read returned an exception " + se.toString(); 
+							ic.t4props_.t4Logger_.logp(Level.FINER, "InputOutput", "recv_nblk", temp, p);
+						}
+						throw se; 
+					}
+				}
+			} while (innerRetry);
+			if (! outerRetry)
+				break;
+			// Connection or connection related requests timed out
+			if (srvrApi == TRANSPORT.SRVR_API_SQLCONNECT  || srvrApi == TRANSPORT.AS_API_GETOBJREF) {
+				closeIO();
+				SQLException se = TrafT4Messages.createSQLException(null, m_locale, 
+					"connection timed out in [" + m_timeout + "] seconds", null);
+				if (ic.t4props_.t4Logger_.isLoggable(Level.FINER)) {
+					Object p[] = T4LoggingUtilities.makeParams(ic.t4props_);
+					String temp = "Socket.read timed out in [" + m_timeout + "] seconds, networkTimeoutInMillis " 
+ 						+ m_networkTimeoutInMillis; 
+					ic.t4props_.t4Logger_.logp(Level.FINER, "InputOutput", "recv_nblk", temp, p);
+				}
 				throw se;
-			} finally {
-				resetTimedOutConnection();
 			}
-		} while(retry);
-
+			// Rest of the requests are treated as related to query timeout
+			if (cancelQueryAllowed)
+				ic.cancel(-1);	
+			else if (activeTimeBeforeCancel != -1) {
+				if (m_timeout != 0)
+					activeTime += m_timeout;
+				else
+					activeTime += (m_networkTimeoutInMillis /1000);	
+				if (activeTime >= activeTimeBeforeCancel)
+					ic.cancel(-1);
+			}	
+		} while (outerRetry);
 		return num_read;
 	} // recv_nblk
 
diff --git a/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/InterfaceConnection.java b/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/InterfaceConnection.java
index d23d973..0990a65 100644
--- a/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/InterfaceConnection.java
+++ b/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/InterfaceConnection.java
@@ -55,6 +55,7 @@
 	
 	static final short SQL_COMMIT = 0;
 	static final short SQL_ROLLBACK = 1;
+	private int activeTimeBeforeCancel = -1;
 	private int txnIsolationLevel = Connection.TRANSACTION_READ_COMMITTED;
 	private boolean autoCommit = true;
 	private boolean isReadOnly = false;
@@ -131,6 +132,7 @@
 	private String _remoteProcess;
 	private String _connStringHost = "";
 
+        int getActiveTimeBeforeCancel() { return activeTimeBeforeCancel; }
 	InterfaceConnection(TrafT4Connection conn, T4Properties t4props) throws SQLException {
 		_t4Conn = conn;
 		t4props_ = t4props;
@@ -166,7 +168,7 @@
 		// Connection context details
 		inContext = getInContext(t4props);
 		m_ncsSrvr_ref = t4props.getUrl();
-		_ignoreCancel = false;
+		_ignoreCancel = t4props.getIgnoreCancel();
 
 		if (t4props_.t4Logger_.isLoggable(Level.FINEST) == true) {
 			Object p[] = T4LoggingUtilities.makeParams(t4props_, t4props);
@@ -217,6 +219,10 @@
 		return this._roleName;
 	}
 
+	boolean getIgnoreCancel() {
+		return this._ignoreCancel;
+	}
+
 	CONNECTION_CONTEXT_def getInContext() {
 		return inContext;
 	}
@@ -477,56 +483,44 @@
 		endTransaction(SQL_ROLLBACK);
 	}
 
-	void cancel() throws SQLException {
-		if(!this._ignoreCancel) {
-			String srvrObjRef = "" + ncsAddr_.getPort();
-			// String srvrObjRef = t4props_.getServerID();
-			int srvrType = 2; // AS server
-			CancelReply cr_ = null;
+	void cancel(long startTime) throws SQLException 
+	{
+		String errorText = null;
+		long currentTime;
+		if (startTime != -1) {
+			if (activeTimeBeforeCancel != -1) {
+				currentTime = System.currentTimeMillis();
+				if ((activeTimeBeforeCancel * 1000) < (currentTime - startTime))
+					return; 
+			}
+		}
+
+		String srvrObjRef = "" + ncsAddr_.getPort();
+		// String srvrObjRef = t4props_.getServerID();
+		int srvrType = 2; // AS server
+		CancelReply cr_ = null;
 	
 			if (t4props_.t4Logger_.isLoggable(Level.FINEST) == true) {
 				Object p[] = T4LoggingUtilities.makeParams(t4props_);
-				String temp = "cancel request received for " + srvrObjRef;
+			String temp = "cancel request received for " + srvrObjRef;
 				t4props_.t4Logger_.logp(Level.FINEST, "InterfaceConnection", "connect", temp, p);
-			}
+		}
 	
-			//
-			// Send the cancel to the ODBC association server.
-			//
-			String errorText = null;
-			int tryNum = 0;
-			String errorMsg = null;
-			String errorMsg_detail = null;
-			long currentTime = (new java.util.Date()).getTime();
-			long endTime;
+		cr_ = T4_Dcs_Cancel.cancel(t4props_, this, dialogueId_, srvrType, srvrObjRef, 0);
 	
-			if (inContext.loginTimeoutSec > 0) {
-				endTime = currentTime + inContext.loginTimeoutSec * 1000;
-			} else {
-	
-				// less than or equal to 0 implies infinit time out
-				endTime = Long.MAX_VALUE;
-	
-				//
-				// Keep trying to contact the Association Server until we run out of
-				// time, or make a connection or we exceed the retry count.
-				//
-			}
-			cr_ = T4_Dcs_Cancel.cancel(t4props_, this, dialogueId_, srvrType, srvrObjRef, 0);
-	
-			switch (cr_.m_p1_exception.exception_nr) {
-			case TRANSPORT.CEE_SUCCESS:
+		switch (cr_.m_p1_exception.exception_nr) {
+		case TRANSPORT.CEE_SUCCESS:
 				if (t4props_.t4Logger_.isLoggable(Level.FINEST) == true) {
 					Object p[] = T4LoggingUtilities.makeParams(t4props_);
 					String temp = "Cancel successful";
 					t4props_.t4Logger_.logp(Level.FINEST, "InterfaceConnection", "connect", temp, p);
 				}
-				break;
-			default:
+			break;
+		default:
 	
-				//
-				// Some unknown error
-				//
+			//
+			// Some unknown error
+			//
 				if (cr_.m_p1_exception.clientErrorText != null) {
 					errorText = "Client Error text = " + cr_.m_p1_exception.clientErrorText;
 				}
@@ -540,10 +534,7 @@
 					t4props_.t4Logger_.logp(Level.FINEST, "InterfaceConnection", "cancel", temp, p);
 				}
 				throw TrafT4Messages.createSQLException(t4props_, locale, "as_cancel_message_error", errorText);
-			} // end switch
-	
-			currentTime = (new java.util.Date()).getTime();
-		}
+		} // end switch
 	}
 	
 	private void initDiag(boolean setTimestamp, boolean downloadCert) throws SQLException {
@@ -591,7 +582,7 @@
 					}
 
 					try {
-						t4connection_.getInputOutput().CloseIO(new LogicalByteArray(1, 0, false));
+						t4connection_.getInputOutput().closeIO();
 					} catch (Exception e) {
 						// ignore error
 					}
diff --git a/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/InterfaceStatement.java b/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/InterfaceStatement.java
index 1233148..d1fddf1 100644
--- a/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/InterfaceStatement.java
+++ b/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/InterfaceStatement.java
@@ -1082,8 +1082,10 @@
 	} // end close
 
 	// --------------------------------------------------------------------------
-	void cancel() throws SQLException {
-		ic_.cancel();
+	void cancel(long startTime) throws SQLException {
+		// currently there are no callers to this statement
+		// It is important that callers specify the startTime correctly for cancel work as expected.
+		ic_.cancel(startTime);
 	}
 
 	// --------------------------------------------------------------------------
@@ -1396,14 +1398,18 @@
 	    }
 	}
 
-    private String extractSchema(String sqlString) {
-        String schemaRegex = "(SET)\\s+(SCHEMA)\\s+([a-zA-Z0-9]+\\s*\\.)\\s*([a-zA-Z0-9]+)\\s*";
-        Pattern pattern = Pattern.compile(schemaRegex);
-        Matcher m = pattern.matcher(sqlString.toUpperCase());
-        while (m.find()) {
-            return m.group(m.groupCount());
-        }
-        return "";
-    }
+	private String extractSchema(String sqlString) {
+		String schemaRegex = "(SET)\\s+(SCHEMA)\\s+([a-zA-Z0-9]+\\s*\\.)\\s*([a-zA-Z0-9]+)\\s*";
+		Pattern pattern = Pattern.compile(schemaRegex);
+		Matcher m = pattern.matcher(sqlString.toUpperCase());
+		while (m.find()) {
+			return m.group(m.groupCount());
+		}
+		return "";
+    	}
 
+	protected T4Statement getT4statement() 
+	{
+		return t4statement_;
+    	}
 } // end class InterfaceStatement
diff --git a/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/T4Connection.java b/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/T4Connection.java
index fed6084..5653735 100644
--- a/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/T4Connection.java
+++ b/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/T4Connection.java
@@ -66,8 +66,8 @@
 		m_io.setDialogueId(m_dialogueId);
 		m_io.setConnectionIdleTimeout(ic.getConnectionTimeout());
 		// trace_connection - AM
-		m_io.setT4Connection(this);
-                m_io.setNetworkTimeout(ic.t4props_.getNetworkTimeout());
+		m_io.setInterfaceConnection(ic);
+		m_io.setNetworkTimeoutInMillis(ic.t4props_.getNetworkTimeoutInMillis());
 		m_io.openIO();
 		getInputOutput().setTimeout(ic.getLoginTimeout());
 		checkConnectionIdleTimeout();
@@ -293,8 +293,7 @@
 			// what to do.
 			//
 			if (tdr1.m_p1.exception_nr == TRANSPORT.CEE_SUCCESS) {
-				m_io.CloseIO(wbuffer); // note, I'm re-using wbuffer
-
+				m_io.closeIO();
 			}
 
 			closeTimers();
diff --git a/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/T4DSProperties.java b/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/T4DSProperties.java
index 700dfb1..eb1f5b5 100644
--- a/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/T4DSProperties.java
+++ b/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/T4DSProperties.java
@@ -735,99 +735,6 @@
 	}
 
 	/**
-	 * Sets the table name to store and retrieve the CLOB data for all CLOB
-	 * columns accessed in the connection using the data source.
-	 * 
-	 * @param clobTableName
-	 *            The clob table name, which is in the format
-	 *            <code><var>catalog_name.schema_name.clob_table_name</code></var>
-	 * 
-	 * @since 1.1
-	 */
-	public void setClobTableName(String clobTableName) throws SQLException {
-		super.setClobTableName(clobTableName);
-	}
-
-	/**
-	 * Retrieves the table name used to store CBLOB data for all CLOB columns
-	 * accessed in the connection using the data source.
-	 * 
-	 * @return the clob table name, which is in the format
-	 *         <code><var>catalog_name.schema_name.clob_table_name</code></var>
-	 * 
-	 * @since 1.1
-	 */
-	public String getClobTableName() {
-		return super.getClobTableName();
-	}
-
-	/**
-	 * Sets the table name to store and retrieve the BLOB data for all BLOB
-	 * columns accessed in the connection using the data source.
-	 * 
-	 * @param blobTableName
-	 *            the blob table name, which is in the format
-	 *            <code><var>catalog_name.schema_name.blob_table_name</code></var>
-	 * 
-	 * @since 1.1
-	 */
-	public void setBlobTableName(String blobTableName) throws SQLException {
-		super.setBlobTableName(blobTableName);
-	}
-
-	/**
-	 * Retrieves the table name used to store BLOB data for all BLOB columns
-	 * accessed in the connection using the data source.
-	 * 
-	 * @return the blob table name which is of the format
-	 *         <code><var>catalog_name.schema_name.blob_table_name</code></var>
-	 * 
-	 * @since 1.1
-	 */
-	public String getBlobTableName() {
-		return super.getBlobTableName();
-	}
-
-	/**
-	 * Configures the number of data locators to be reserved by the Type 4
-	 * connection. Default value is 100.
-	 * 
-	 * @param reserveDataLocator
-	 *            Sets the value of the reserve data locator length for the
-	 *            binding) feature.
-	 * 
-	 * @since 1.1
-	 */
-	public void setReserveDataLocator(String reserveDataLocator) {
-		super.setReserveDataLocator(reserveDataLocator);
-	}
-
-	/**
-	 * Configures the number of data locators to be reserved by the Type 4
-	 * connection. Default value is 100.
-	 * 
-	 * @param reserveDataLocatorLen
-	 *            Sets the value of the reserve data locator length for the Type
-	 *            4 connection.
-	 * 
-	 * @since 1.1
-	 */
-	public void setReserveDataLocator(long reserveDataLocatorLen) {
-		super.setReserveDataLocator(reserveDataLocatorLen);
-	}
-
-	/**
-	 * Returns the value of the reserve data locator length.
-	 * 
-	 * @return The value of the reserved data locator length.
-	 * 
-	 * @since 1.1
-	 */
-	public long getReserveDataLocator() {
-		return super.getReserveDataLocator();
-	}
-
-	/**
 	 * @return Returns the rounding mode set for the driver as an Integer value
 	 *         with one of the values:
 	 * 
diff --git a/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/T4Driver.java b/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/T4Driver.java
index 2808f16..b14ac27 100644
--- a/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/T4Driver.java
+++ b/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/T4Driver.java
@@ -169,8 +169,7 @@
 					}
 				}
 				if (getMaxPoolSize() != -1) {
-					key = getUrl() + getCatalog() + getSchema() + getUser() + getPassword() + getServerDataSource()
-							+ getBlobTableName() + getClobTableName();
+					key = getUrl() + getCatalog() + getSchema() + getUser() + getPassword() + getServerDataSource();
 	
 					ds = (TrafT4DataSource) dsCache_.get(key);
 	
diff --git a/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/T4Properties.java b/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/T4Properties.java
index fd68e59..3f7640b 100644
--- a/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/T4Properties.java
+++ b/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/T4Properties.java
@@ -77,6 +77,8 @@
  * </p>
  */
 public class T4Properties {
+    final static int DEFAULT_NETWORK_TIMEOUT_IN_MILLIS = 1000;
+    final static int DEFAULT_CONNECT_TIMEOUT_IN_SECS = 10;
 	private String description_;
 	private String dataSourceName_;
 	private String serverDataSource_;
@@ -92,7 +94,7 @@
 	private int maxStatements_;
 	private int loginTimeout_;
 	// private int closeConnectionTimeout_;
-	private int networkTimeout_;
+	private int networkTimeoutInMillis_ = DEFAULT_NETWORK_TIMEOUT_IN_MILLIS;
 	private int connectionTimeout_;
 	private int maxIdleTime_;
 	private Level t4LogLevel;
@@ -101,7 +103,6 @@
 	private Properties inprops_;
 	private PrintWriter logWriter_;
 	// For LOB Support - SB 9/28/04
-	static long reserveDataLocator_;
 	private int roundMode_;
 	private String language_;
 
@@ -115,10 +116,6 @@
 	private short sqlmxMajorVersion_;
 	private short sqlmxMinorVersion_;
 
-	// LOB Support 
-	String clobTableName_;
-	String blobTableName_;
-
     private int lobChunkSize_ = 10; // default 10M
     private boolean useLobHandle_ = false;
 
@@ -133,6 +130,8 @@
 
 	// propertiy queryTimeout_ for future use.
 	private short queryTimeout_;
+ 	private boolean ignoreCancel_ = true;
+	private int activeTimeBeforeCancel_; 
 	private T4Address t4addr_;
 
 	// Error handling while setting Type 4 properties.
@@ -399,22 +398,8 @@
 		setConnectionTimeout(getProperty("connectionTimeout"));
 		setClipVarchar(getProperty("clipVarchar"));
 		setFetchBufferSize(getProperty("fetchBufferSize")); 
-
-		// For LOB Support - SB 9/28/04
-		try {
-			setClobTableName(getProperty("clobTableName"));
-		} catch (SQLException se) {
-			sqlExceptionMessage_ = "Error while reading the clobTableName property: " + se.getMessage();
-		}
-
-		try {
-			setBlobTableName(getProperty("blobTableName"));
-		} catch (SQLException se2) {
-			sqlExceptionMessage_ = "Error while reading the blobTableName property: " + se2.getMessage();
-		}
-
-		setReserveDataLocator(getProperty("reserveDataLocator"));
 		setQueryTimeout(getProperty("queryTimeout"));
+		setActiveTimeBeforeCancel(getProperty("activeTimeBeforeCancelInSecs"));
 		setRoundingMode(getProperty("roundingMode"));
 		setSPJEnv(getProperty("SPJEnv"));
 		setKeepRawFetchBuffer(getProperty("keepRawFetchBuffer"));
@@ -484,7 +469,7 @@
 		props.setProperty("loginTimeout", String.valueOf(loginTimeout_));
 		// props.setProperty("closeConnectionTimeout",
 		// String.valueOf(closeConnectionTimeout_));
-		props.setProperty("networkTimeout", String.valueOf(networkTimeout_));
+		props.setProperty("networkTimeout", String.valueOf(getNetworkTimeout()));
 		props.setProperty("connectionTimeout", String.valueOf(connectionTimeout_));
 		props.setProperty("description", description_);
 		props.setProperty("dataSourceName", dataSourceName_);
@@ -496,16 +481,10 @@
 		props.setProperty("maxIdleTime", String.valueOf(maxIdleTime_));
 		props.setProperty("language", language_);
 
-		if (getBlobTableName() != null) {
-			props.setProperty("blobTableName", blobTableName_);
-		}
-		if (getClobTableName() != null) {
-			props.setProperty("clobTableName", clobTableName_);
-
-		}
-
 		// properties queryTimeout_ for future use.
 		props.setProperty("queryTimeout", String.valueOf(queryTimeout_));
+		props.setProperty("ignoreCancel", String.valueOf(ignoreCancel_));
+		props.setProperty("activeTimeBeforeCancelInSecs", String.valueOf(activeTimeBeforeCancel_));
 		props.setProperty("roundingMode", String.valueOf(roundMode_));
 		props.setProperty("SPJEnv", String.valueOf(SPJEnv_));
 		props.setProperty("keepRawFetchBuffer", String.valueOf(keepRawFetchBuffer_));
@@ -1257,28 +1236,37 @@
 	 * @param networkTimeout
 	 *            The network timeout value in seconds.
 	 * @see #setNetworkTimeout(int)
-	 * @see #getNetworkTimeout()
+	 * @see #setNetworkTimeout()
 	 */
 	void setNetworkTimeout(int networkTimeout) {
 		if (networkTimeout < 0) {
 			sqlExceptionMessage_ = "Incorrect value for networkTimeout set: " + networkTimeout + ".";
-			networkTimeout_ = 0;
+			networkTimeoutInMillis_ = DEFAULT_NETWORK_TIMEOUT_IN_MILLIS;
 		} else {
-			networkTimeout_ = networkTimeout;
+			networkTimeoutInMillis_ = networkTimeout * 1000;
 		}
 	}
 
+	void setNetworkTimeoutInMillis(int networkTimeoutInMillis) {
+		networkTimeoutInMillis_ = networkTimeoutInMillis;
+	}
+
 	/**
 	 * Returns the network timeout value set for the current Type 4 connection.
 	 * 
 	 * @return the network timeout value in seconds.
-	 * @see #setNetworkTimeout(int)
-	 * @see #setNetworkTimeout(String)
+	 * @see #getNetworkTimeout(int)
+	 * @see #getNetworkTimeout(String)
 	 */
 	int getNetworkTimeout() {
-		return networkTimeout_;
+		return networkTimeoutInMillis_ / 1000;
 	}
 
+        int getNetworkTimeoutInMillis() {
+            return networkTimeoutInMillis_;
+        }
+ 
+
 	// -----------------------------------------------------------------
 
 	/*
@@ -1606,6 +1594,8 @@
 	 *            this property is not supported in the current release.
 	 */
 	void setQueryTimeout(short queryTimeout) {
+		if ((queryTimeout *1000) > networkTimeoutInMillis_)
+			queryTimeout = (short)(networkTimeoutInMillis_ % 1000);
 		queryTimeout_ = queryTimeout;
 	}
 
@@ -1617,6 +1607,50 @@
 		return queryTimeout_;
 	}
 
+	void setIgnoreCancel(String ignoreCancel)
+	{
+		if (ignoreCancel != null)
+			ignoreCancel_ = Boolean.parseBoolean(ignoreCancel);
+		else
+			ignoreCancel_ = true;
+	}
+
+        void setIgnoreCancel(boolean ignoreCancel)
+	{
+		ignoreCancel_ = ignoreCancel;
+	}
+
+	boolean getIgnoreCancel()
+	{
+		return ignoreCancel_;
+	}
+
+	void setActiveTimeBeforeCancel(String activeTimeBeforeCancel) {
+		int tmpActiveTimeBeforeCancel = 0;
+		if (activeTimeBeforeCancel != null) {
+			try {
+				tmpActiveTimeBeforeCancel = Integer.parseInt(activeTimeBeforeCancel);
+			} catch (NumberFormatException ex) {
+				sqlExceptionMessage_ = "Incorrect value for activeTimeBeforeCancel set: " + activeTimeBeforeCancel + ex.getMessage();
+				tmpActiveTimeBeforeCancel = -1;
+			}
+		}
+		setActiveTimeBeforeCancel(tmpActiveTimeBeforeCancel);
+	}
+
+	void setActiveTimeBeforeCancel(int activeTimeBeforeCancel) 
+	{
+		if (activeTimeBeforeCancel < networkTimeoutInMillis_)
+			activeTimeBeforeCancel = networkTimeoutInMillis_;
+		activeTimeBeforeCancel_ = activeTimeBeforeCancel;
+	}
+
+	int getActiveTimeBeforeCancel() 
+	{
+		return activeTimeBeforeCancel_;
+	}
+
+	
 	/**
 	 * Sets the value (in KB) for the size of the fetch buffer. This is used
 	 * when rows are fetched are performed from a ResultSet object after a
@@ -1784,49 +1818,6 @@
 	 */
 
 	/**
-	 * Sets the table name to store and retrieve the CLOB data for all CLOB
-	 * columns accessed in the connection using the data source.
-	 * 
-	 * @param clobTableName
-	 *            The clob table name which is of the format
-	 *            <code><var>catalog_name.schema_name.clob_table_name</code></var>
-	 * 
-	 * @since 1.1
-	 */
-	void setClobTableName(String clobTableName) throws SQLException {
-		int fromIndex = -1;
-		int count = 0;
-
-		if (clobTableName != null) {
-			while (((fromIndex = clobTableName.indexOf('.', fromIndex + 1)) != -1) && count < 2) {
-				count++;
-			}
-			if (count < 2) {
-				SQLException se = TrafT4Messages.createSQLException(null, null, "no_clobTableName", null);
-				sqlExceptionMessage_ = se.getMessage();
-			}
-			clobTableName_ = clobTableName;
-		} else { // If the name is null, let it be null
-			clobTableName_ = null;
-			// throw TrafT4Messages.createSQLException(null,
-			// null,"no_clobTableName",null);
-		}
-	}
-
-	/**
-	 * Retrieves the table name used to store CBLOB data for all CLOB columns
-	 * accessed in the connection using the data source.
-	 * 
-	 * @return the clob table name which is of the format
-	 *         <code><var>catalog_name.schema_name.clob_table_name</code></var>
-	 * 
-	 * @since 1.1
-	 */
-	String getClobTableName() {
-		return clobTableName_;
-	}
-
-	/**
 	 * @return any sql exception associated while setting the properties on this
 	 *         Type 4 connection. This mthod is accessed by InterfaceConnection
 	 *         to check if there is any SQL error setting the Type 4 properties.
@@ -1836,106 +1827,6 @@
 		return sqlExceptionMessage_;
 	}
 
-	/**
-	 * Sets the table name to store and retrieve the BLOB data for all BLOB
-	 * columns accessed in the connection using the data source.
-	 * 
-	 * @param blobTableName
-	 *            the blob table name which is of the format
-	 *            <code><var>catalog_name.schema_name.blob_table_name</code></var>
-	 * 
-	 * @since 1.1
-	 */
-	void setBlobTableName(String blobTableName) throws SQLException {
-		int fromIndex = -1;
-		int count = 0;
-
-		if (blobTableName != null) {
-			while (((fromIndex = blobTableName.indexOf('.', fromIndex + 1)) != -1) && count < 2) {
-				count++;
-			}
-			if (count < 2) {
-				SQLException se = TrafT4Messages.createSQLException(null, null, "no_blobTableName", null);
-				sqlExceptionMessage_ = se.getMessage();
-			}
-			blobTableName_ = blobTableName;
-		}
-		// If the name is null, then let it be null
-		else {
-			blobTableName_ = null;
-			// throw TrafT4Messages.createSQLException(null, null,
-			// "no_blobTableName", null);
-		}
-	}
-
-	/**
-	 * Retrieves the table name used to store BLOB data for all BLOB columns
-	 * accessed in the connection using the data source.
-	 * 
-	 * @return the blob table name which is of the format
-	 *         <code><var>catalog_name.schema_name.blob_table_name</code></var>
-	 * 
-	 * @since 1.1
-	 */
-	String getBlobTableName() {
-		return blobTableName_;
-	}
-
-	/**
-	 * Configure to set the number of data locators to be reserved by the Type 4
-	 * connection. Default value is 100.
-	 * 
-	 * @param reserveDataLocator
-	 *            Set the value of the reserve data locator length for the
-	 *            binding) feature.
-	 * 
-	 * @since 1.1
-	 */
-	void setReserveDataLocator(String reserveDataLocator) {
-		long reserveDataLocatorLen = 100;
-		if (reserveDataLocator != null) {
-			try {
-				reserveDataLocatorLen = Long.parseLong(reserveDataLocator);
-			} catch (NumberFormatException ex) {
-				sqlExceptionMessage_ = "Incorrect value for setReserveDataLocator set: " + reserveDataLocator
-						+ ex.getMessage();
-				reserveDataLocatorLen = 100;
-			}
-		}
-		setReserveDataLocator(reserveDataLocatorLen);
-	}
-
-	/**
-	 * Configure to set the number of data locators to be reserved by the Type 4
-	 * connection. Default value is 100.
-	 * 
-	 * @param reserveDataLocatorLen
-	 *            Set the value of the reserve data locator length for the Type
-	 *            4 connection.
-	 * 
-	 * @since 1.1
-	 */
-	void setReserveDataLocator(long reserveDataLocatorLen) {
-		if (reserveDataLocatorLen < 0) {
-			sqlExceptionMessage_ = "Incorrect value for reserveDataLocator set: " + reserveDataLocatorLen + ".";
-			reserveDataLocator_ = 100;
-		} else {
-			reserveDataLocator_ = reserveDataLocatorLen;
-		}
-	}
-
-	/**
-	 * Return the value of the reserve data locator length.
-	 * 
-	 * @return reserveDataLocatorLength int indicates the value of the reserved
-	 *         data locator length.
-	 * 
-	 * @since 1.1
-	 */
-	long getReserveDataLocator() {
-		return reserveDataLocator_;
-	}
-
     public int getLobChunkSize() {
         return lobChunkSize_;
     }
@@ -2486,21 +2377,12 @@
 		 * Boolean.toString(getUseArrayBinding())));
 		 */
 
-		// LOB Support - SB 9/28/04
-		val = getClobTableName();
-		if (val != null) {
-			ref.add(new StringRefAddr("clobTableName", val));
-		}
-		val = getBlobTableName();
-		if (val != null) {
-			ref.add(new StringRefAddr("blobTableName", val));
-
-		}
-		ref.add(new StringRefAddr("reserveDataLocator", Long.toString(reserveDataLocator_)));
 		ref.add(new StringRefAddr("roundingMode", Integer.toString(getRoundingMode())));
 
 		// propertiy queryTimeout_ for future use.
 		ref.add(new StringRefAddr("queryTimeout", Integer.toString(getQueryTimeout())));
+		ref.add(new StringRefAddr("ignoreCancel", Boolean.toString(getIgnoreCancel())));
+		ref.add(new StringRefAddr("activeTimeBeforeCancelInSecs", Integer.toString(getActiveTimeBeforeCancel())));
 		ref.add(new StringRefAddr("fetchBufferSize", Short.toString(this.getFetchBufferSize())));
 		ref.add(new StringRefAddr("batchRecovery", Boolean.toString(this.getBatchRecovery())));
 		return ref;
@@ -2541,12 +2423,6 @@
 				setPropertyInfo("language", props, false, "Locale language to use", null),
 				setPropertyInfo("serverDataSource", props, false, "NDCS data source name", null),
 				setPropertyInfo("roundingMode", props, false, "Data rounding mode", roundingMode),
-				setPropertyInfo("blobTableName", props, false, "Table name to store and retrieve BLOB column data",
-						null),
-				setPropertyInfo("clobTableName", props, false, "Table name to store and retrieve CLOB column data",
-						null),
-				setPropertyInfo("reserveDataLocator", props, false,
-						"Number of data locators (for LOB) to be reserved by the connection", null),
 				setPropertyInfo("fetchBufferSize", props, false,
 						"Value (in KB) for the size of the fetch buffer to be used when rows are fetched", null),
 				setPropertyInfo("batchRecovery", props, false,
diff --git a/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/T4Statement.java b/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/T4Statement.java
index 89a39a2..738f31b 100644
--- a/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/T4Statement.java
+++ b/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/T4Statement.java
@@ -204,4 +204,10 @@
 		}
 		return buf;
 	}
+
+	public boolean isProcessing() 
+	{
+		 return m_processing;
+	}
+
 }
diff --git a/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/T4_Dcs_Cancel.java b/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/T4_Dcs_Cancel.java
index ecf50aa..99d3279 100644
--- a/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/T4_Dcs_Cancel.java
+++ b/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/T4_Dcs_Cancel.java
@@ -78,7 +78,7 @@
 			// Send message to the ODBC Association server.
 			//
 			InputOutput io1 = address1.getInputOutput();
-
+			io1.setInterfaceConnection(ic_);
 			io1.openIO();
 			io1.setTimeout(ic_.t4props_.getNetworkTimeout());
 			io1.setConnectionIdleTimeout(ic_.getConnectionTimeout());
@@ -96,8 +96,7 @@
 			//
 			// io1.setTimeout(ic_.t4props_.getCloseConnectionTimeout());
 			io1.setTimeout(ic_.t4props_.getNetworkTimeout());
-			io1.CloseIO(wbuffer); // Note, we are re-using the wbuffer
-
+			io1.closeIO();
 			return cr1;
 		} // end try
 		catch (SQLException se) {
diff --git a/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/T4_Dcs_Connect.java b/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/T4_Dcs_Connect.java
index 60f3497..2ecf56c 100644
--- a/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/T4_Dcs_Connect.java
+++ b/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/T4_Dcs_Connect.java
@@ -61,6 +61,7 @@
 			se.setNextException(se2);
 			throw se;
 		}
+		InputOutput io1 = null;
 		try {
 			LogicalByteArray rbuffer;
 			LogicalByteArray wbuffer;
@@ -72,10 +73,10 @@
 			T4Address address1 = new T4Address(t4props, locale, ic_.getUrl());
 
 			// Open the connection
-			InputOutput io1 = address1.getInputOutput();
-
-			io1.openIO();
+			io1 = address1.getInputOutput();
+                        io1.setInterfaceConnection(ic_);
 			io1.setTimeout(ic_.getLoginTimeout());
+			io1.openIO();
 			io1.setConnectionIdleTimeout(ic_.getConnectionTimeout());
 
 			// Send message to the ODBC Association server.
@@ -86,7 +87,8 @@
 
 			// Close IO
 			io1.setTimeout(ic_.t4props_.getLoginTimeout());
-			io1.CloseIO(wbuffer); // Note, we are re-using the wbuffer
+			io1.closeIO(); // Note, we are re-using the wbuffer
+                        io1 = null;
 
 			String name1 = null;
 			if (address1.m_ipAddress != null) {
@@ -118,6 +120,9 @@
 
 			se.initCause(e);
 			throw se;
+		} finally {
+			if (io1 != null)
+			    io1.closeIO();
 		}
 	}
 }
diff --git a/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/TrafT4Connection.java b/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/TrafT4Connection.java
index 450ee65..21a6923 100644
--- a/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/TrafT4Connection.java
+++ b/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/TrafT4Connection.java
@@ -1774,38 +1774,8 @@
 
 	boolean erroredConnection = false;
 
-	PreparedStatement[] LobPreparedStatements = new PreparedStatement[14];
-
-	// boolean reserveEmptyDataLocator_ = false;
-	// public static final int EMPTY_DATA_LOCATOR_UPDATE = 0;
-
-	String clobTableName_;
-	String blobTableName_;
-	// String preparedClobTableName_;
-	// String preparedBlobTableName_;
-
-	static final int CLOB_INS_LOB_DATA_STMT = 0;
-	static final int CLOB_GET_LOB_DATA_STMT = 1;
-	static final int CLOB_GET_LOB_LEN_STMT = 2;
-	static final int CLOB_DEL_LOB_DATA_STMT = 3;
-	static final int CLOB_TRUN_LOB_DATA_STMT = 4;
-	static final int CLOB_UPD_LOB_DATA_STMT = 5;
-	static final int CLOB_GET_STRT_DATA_LOC_STMT = 6;
-	static final int BLOB_INS_LOB_DATA_STMT = 7;
-	static final int BLOB_GET_LOB_DATA_STMT = 8;
-	static final int BLOB_GET_LOB_LEN_STMT = 9;
-	static final int BLOB_DEL_LOB_DATA_STMT = 10;
-	static final int BLOB_TRUN_LOB_DATA_STMT = 11;
-	static final int BLOB_UPD_LOB_DATA_STMT = 12;
-	static final int BLOB_GET_STRT_DATA_LOC_STMT = 13;
-
 	static Logger dummyLogger_ = null;
 
-	boolean[] bLobStatementPrepared = new boolean[14]; // initialized to false,
-	// one each for the
-	// BLOB/CLOB statements
-	// listed above
-
 	// Fields
 	InterfaceConnection ic_;
 
@@ -1923,22 +1893,21 @@
 
 	public void abort(Executor executor) throws SQLException {
 		if (ic_.getT4Connection().getInputOutput() != null) {
-			ic_.getT4Connection().getInputOutput().CloseIO(null);
+			ic_.getT4Connection().getInputOutput().closeIO();
 		}
 		ic_.setIsClosed(true);
-		
 	}
 
 	public void setNetworkTimeout(Executor executor, int milliseconds)
 			throws SQLException {
             validateConnection();
-            props_.setNetworkTimeout(milliseconds);
+            props_.setNetworkTimeoutInMillis(milliseconds);
 	}
 	
 
 	public int getNetworkTimeout() throws SQLException {
 		validateConnection();
-		return props_.getNetworkTimeout();
+		return props_.getNetworkTimeoutInMillis();
 	}
 
 	/*
diff --git a/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/TrafT4PreparedStatement.java b/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/TrafT4PreparedStatement.java
index 4c2b311..683bb04 100644
--- a/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/TrafT4PreparedStatement.java
+++ b/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/TrafT4PreparedStatement.java
@@ -500,7 +500,6 @@
 			connection_.props_.getLogWriter().println(temp);
 		}
 		int dataType;
-		long dataLocator;
 
 		validateSetInvocation(parameterIndex);
 
@@ -591,7 +590,6 @@
 			connection_.props_.getLogWriter().println(temp);
 		}
 		int dataType;
-		long dataLocator;
 
 		validateSetInvocation(parameterIndex);
 
@@ -675,7 +673,6 @@
 			connection_.props_.getLogWriter().println(temp);
 		}
 		int dataType;
-		long dataLocator;
 
 		validateSetInvocation(parameterIndex);
 		dataType = inputDesc_[parameterIndex - 1].dataType_;
@@ -809,7 +806,6 @@
 		}
 		char[] value;
 		int dataType;
-		long dataLocator;
 
 		validateSetInvocation(parameterIndex);
 		dataType = inputDesc_[parameterIndex - 1].dataType_;
diff --git a/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/TrafT4Statement.java b/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/TrafT4Statement.java
index d408799..4d1f57e 100644
--- a/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/TrafT4Statement.java
+++ b/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/TrafT4Statement.java
@@ -83,7 +83,8 @@
 		batchCommands_.add(sql);
 	}
 
-	public void cancel() throws SQLException {
+	public void cancel() throws SQLException 
+        {
 		if (connection_.props_.t4Logger_.isLoggable(Level.FINE) == true) {
 			Object p[] = T4LoggingUtilities.makeParams(connection_.props_);
 			connection_.props_.t4Logger_.logp(Level.FINE, "TrafT4Statement", "cancel", "", p);
@@ -97,18 +98,27 @@
 			T4LogFormatter lf = new T4LogFormatter();
 			String temp = lf.format(lr);
 			connection_.props_.getLogWriter().println(temp);
-		}
+        	}
 		// Donot clear warning, since the warning may pertain to
 		// previous opertation and it is not yet seen by the application
 		//
-		// We must decide if this statement is currently being processed or
-		// if it has a result set associated with it, and if that
-		// result set is currently active (i.e. we are fetching rows).
-		if ((ist_.t4statement_ != null && ist_.t4statement_.m_processing == true)
+
+		// if the statement is already closed
+		// No need to cancel the statement
+		
+		if (isClosed_) 
+			return;
+
+		// Check if the statement is stuck in reading from socket connection to mxosrvr
+		// If not, just do the internal close to free up the statement resources on the server side
+		// else let the query time mechanism in the socket connection read take care of 
+		// cancelling the query
+		if ((ist_.getT4statement() != null && (! ist_.getT4statement().isProcessing()))
 				|| (resultSet_ != null && resultSet_[result_set_offset] != null
 						&& resultSet_[result_set_offset].irs_ != null
-						&& resultSet_[result_set_offset].irs_.t4resultSet_ != null && resultSet_[result_set_offset].irs_.t4resultSet_.m_processing == true))
-			ist_.cancel();
+						&& resultSet_[result_set_offset].irs_.t4resultSet_ != null && 
+						( ! resultSet_[result_set_offset].irs_.t4resultSet_.m_processing)))
+			internalClose();
 	}
 
 	public void clearBatch() throws SQLException {
diff --git a/core/conn/jdbc_type2/native/org_apache_trafodion_jdbc_t2_SQLMXClobReader.h b/core/conn/jdbc_type2/native/org_apache_trafodion_jdbc_t2_SQLMXClobReader.h
deleted file mode 100644
index 9afe0e8..0000000
--- a/core/conn/jdbc_type2/native/org_apache_trafodion_jdbc_t2_SQLMXClobReader.h
+++ /dev/null
@@ -1,23 +0,0 @@
-/* DO NOT EDIT THIS FILE - it is machine generated */
-#include <jni.h>
-/* Header for class org_apache_trafodion_jdbc_t2_SQLMXClobReader */
-
-#ifndef _Included_org_apache_trafodion_jdbc_t2_SQLMXClobReader
-#define _Included_org_apache_trafodion_jdbc_t2_SQLMXClobReader
-#ifdef __cplusplus
-extern "C" {
-#endif
-#undef org_apache_trafodion_jdbc_t2_SQLMXClobReader_maxSkipBufferSize
-#define org_apache_trafodion_jdbc_t2_SQLMXClobReader_maxSkipBufferSize 8192L
-/*
- * Class:     org_apache_trafodion_jdbc_t2_SQLMXClobReader
- * Method:    readChunk
- * Signature: (Ljava/lang/String;JJILjava/lang/String;Ljava/nio/CharBuffer;)I
- */
-JNIEXPORT jint JNICALL Java_org_apache_trafodion_jdbc_t2_SQLMXClobReader_readChunk
-  (JNIEnv *, jobject, jstring, jlong, jlong, jint, jstring, jobject);
-
-#ifdef __cplusplus
-}
-#endif
-#endif
diff --git a/core/conn/jdbc_type2/native/org_apache_trafodion_jdbc_t2_SQLMXClobWriter.h b/core/conn/jdbc_type2/native/org_apache_trafodion_jdbc_t2_SQLMXClobWriter.h
deleted file mode 100644
index 9cdc0f6..0000000
--- a/core/conn/jdbc_type2/native/org_apache_trafodion_jdbc_t2_SQLMXClobWriter.h
+++ /dev/null
@@ -1,21 +0,0 @@
-/* DO NOT EDIT THIS FILE - it is machine generated */
-#include <jni.h>
-/* Header for class org_apache_trafodion_jdbc_t2_SQLMXClobWriter */
-
-#ifndef _Included_org_apache_trafodion_jdbc_t2_SQLMXClobWriter
-#define _Included_org_apache_trafodion_jdbc_t2_SQLMXClobWriter
-#ifdef __cplusplus
-extern "C" {
-#endif
-/*
- * Class:     org_apache_trafodion_jdbc_t2_SQLMXClobWriter
- * Method:    writeChunk
- * Signature: (Ljava/lang/String;JJLjava/lang/String;Ljava/lang/String;J)V
- */
-JNIEXPORT void JNICALL Java_org_apache_trafodion_jdbc_t2_SQLMXClobWriter_writeChunk
-  (JNIEnv *, jobject, jstring, jlong, jlong, jstring, jstring, jlong);
-
-#ifdef __cplusplus
-}
-#endif
-#endif
diff --git a/core/conn/jdbc_type2/native/org_apache_trafodion_jdbc_t2_SQLMXLobInputStream.h b/core/conn/jdbc_type2/native/org_apache_trafodion_jdbc_t2_SQLMXLobInputStream.h
deleted file mode 100644
index 2f113cf..0000000
--- a/core/conn/jdbc_type2/native/org_apache_trafodion_jdbc_t2_SQLMXLobInputStream.h
+++ /dev/null
@@ -1,23 +0,0 @@
-/* DO NOT EDIT THIS FILE - it is machine generated */
-#include <jni.h>
-/* Header for class org_apache_trafodion_jdbc_t2_SQLMXLobInputStream */
-
-#ifndef _Included_org_apache_trafodion_jdbc_t2_SQLMXLobInputStream
-#define _Included_org_apache_trafodion_jdbc_t2_SQLMXLobInputStream
-#ifdef __cplusplus
-extern "C" {
-#endif
-#undef org_apache_trafodion_jdbc_t2_SQLMXLobInputStream_MAX_SKIP_BUFFER_SIZE
-#define org_apache_trafodion_jdbc_t2_SQLMXLobInputStream_MAX_SKIP_BUFFER_SIZE 2048L
-/*
- * Class:     org_apache_trafodion_jdbc_t2_SQLMXLobInputStream
- * Method:    readChunk
- * Signature: (Ljava/lang/String;JJILjava/lang/String;Ljava/nio/ByteBuffer;)I
- */
-JNIEXPORT jint JNICALL Java_org_apache_trafodion_jdbc_t2_SQLMXLobInputStream_readChunk
-  (JNIEnv *, jobject, jstring, jlong, jlong, jint, jstring, jobject);
-
-#ifdef __cplusplus
-}
-#endif
-#endif
diff --git a/core/conn/jdbc_type2/native/org_apache_trafodion_jdbc_t2_SQLMXLobOutputStream.h b/core/conn/jdbc_type2/native/org_apache_trafodion_jdbc_t2_SQLMXLobOutputStream.h
deleted file mode 100644
index 9de819e..0000000
--- a/core/conn/jdbc_type2/native/org_apache_trafodion_jdbc_t2_SQLMXLobOutputStream.h
+++ /dev/null
@@ -1,21 +0,0 @@
-/* DO NOT EDIT THIS FILE - it is machine generated */
-#include <jni.h>
-/* Header for class org_apache_trafodion_jdbc_t2_SQLMXLobOutputStream */
-
-#ifndef _Included_org_apache_trafodion_jdbc_t2_SQLMXLobOutputStream
-#define _Included_org_apache_trafodion_jdbc_t2_SQLMXLobOutputStream
-#ifdef __cplusplus
-extern "C" {
-#endif
-/*
- * Class:     org_apache_trafodion_jdbc_t2_SQLMXLobOutputStream
- * Method:    writeChunk
- * Signature: (Ljava/lang/String;JJLjava/lang/String;[BIIJ)V
- */
-JNIEXPORT void JNICALL Java_org_apache_trafodion_jdbc_t2_SQLMXLobOutputStream_writeChunk
-  (JNIEnv *, jobject, jstring, jlong, jlong, jstring, jbyteArray, jint, jint, jlong);
-
-#ifdef __cplusplus
-}
-#endif
-#endif
diff --git a/core/conn/odbc/src/odbc/nsksrvr/SrvrConnect.cpp b/core/conn/odbc/src/odbc/nsksrvr/SrvrConnect.cpp
index 6c18e40..01efdf2 100644
--- a/core/conn/odbc/src/odbc/nsksrvr/SrvrConnect.cpp
+++ b/core/conn/odbc/src/odbc/nsksrvr/SrvrConnect.cpp
@@ -6308,6 +6308,7 @@
 									stmtLabel,
 									sqlString,
 									holdableCursor,
+									queryTimeout,			
 									&returnCode,
 									&sqlWarningOrErrorLength,
 									sqlWarningOrError,
@@ -6350,6 +6351,7 @@
 									stmtLabel,
 									sqlString,
 									holdableCursor,
+									queryTimeout,
 									&returnCode,
 									&sqlWarningOrErrorLength,
 									sqlWarningOrError,
@@ -6897,6 +6899,7 @@
 											stmtLabel,
 											sqlString,
 											holdableCursor,
+											queryTimeout,
 											&returnCode,
 											&sqlWarningOrErrorLength,
 											sqlWarningOrError,
@@ -6981,6 +6984,7 @@
 					stmtLabel,
 					sqlString,
 					holdableCursor,
+					queryTimeout,
 					&returnCode,
 					&sqlWarningOrErrorLength,
 					sqlWarningOrError,
diff --git a/core/conn/odbc/src/odbc/nsksrvrcore/srvrcommon.h b/core/conn/odbc/src/odbc/nsksrvrcore/srvrcommon.h
index ab344df..ed5650a 100644
--- a/core/conn/odbc/src/odbc/nsksrvrcore/srvrcommon.h
+++ b/core/conn/odbc/src/odbc/nsksrvrcore/srvrcommon.h
@@ -202,6 +202,7 @@
   , /* In    */ const IDL_char *stmtLabel
   , /* In    */ IDL_string sqlString
   , /* In    */ IDL_long holdableCursor
+  , /* In    */ Int32 queryTimeout
   , /* Out   */ IDL_long *returnCode
   , /* Out   */ IDL_long *sqlWarningOrErrorLength
   , /* Out   */ BYTE *&sqlWarningOrError
@@ -371,10 +372,11 @@
 extern "C" void 
 rePrepare2( SRVR_STMT_HDL *pSrvrStmt
           , Int32           sqlStmtType
-	      , Int32           inputRowCnt
-       	  , Int32			holdableCursor
-	      , SQLRETURN     	*rc 
-	      , Int32          	*returnCode
+	  , Int32           inputRowCnt
+       	  , Int32    	    holdableCursor
+          , Int32 	    queryTimeout
+	  , SQLRETURN     	*rc 
+	  , Int32          	*returnCode
           , Int32      		*sqlWarningOrErrorLength
           , BYTE          	*&sqlWarningOrError );
 
diff --git a/core/conn/odbc/src/odbc/nsksrvrcore/srvrothers.cpp b/core/conn/odbc/src/odbc/nsksrvrcore/srvrothers.cpp
index a1edb85..d1aa821 100644
--- a/core/conn/odbc/src/odbc/nsksrvrcore/srvrothers.cpp
+++ b/core/conn/odbc/src/odbc/nsksrvrcore/srvrothers.cpp
@@ -832,6 +832,7 @@
   , /* In    */ const IDL_char *stmtLabel
   , /* In    */ IDL_string sqlString
   , /* In    */ Int32 holdableCursor
+  , /* In    */ Int32 queryTimeout
   , /* Out   */ Int32 *returnCode
   , /* Out   */ Int32 *sqlWarningOrErrorLength
   , /* Out   */ BYTE *&sqlWarningOrError
@@ -1410,6 +1411,7 @@
 				  , sqlStmtType
 				  , inputRowCnt
 				  , holdableCursor
+                                  , queryTimeout
 				  , &rc
 				  , returnCode
 				  , sqlWarningOrErrorLength
@@ -1746,6 +1748,7 @@
 				  , sqlStmtType
 				  , inputRowCnt
 				  , holdableCursor
+				  , queryTimeout
 				  ,&rc
 				  , returnCode
 				  , sqlWarningOrErrorLength
@@ -2075,6 +2078,7 @@
 			, Int32			sqlStmtType
 			, Int32			inputRowCnt
 			, Int32		holdableCursor
+			, Int32 queryTimeout
 			, SQLRETURN     *rc
 			, Int32          *returnCode
 			, Int32      *sqlWarningOrErrorLength
diff --git a/core/sqf/conf/log4cxx.trafodion.sql.config b/core/sqf/conf/log4cxx.trafodion.sql.config
index a6f9e11..b8079b4 100644
--- a/core/sqf/conf/log4cxx.trafodion.sql.config
+++ b/core/sqf/conf/log4cxx.trafodion.sql.config
@@ -40,7 +40,7 @@
 log4j.appender.sqlAppender.immediateFlush=true
 log4j.additive.sqlAppender=false 
 
-log4j.logger.MXOSRVR=ERROR,sqlAppender
+log4j.logger.MXOSRVR=WARN,sqlAppender
 
 # SQL
 log4j.logger.SQL=INFO,sqlAppender
diff --git a/core/sql/bin/SqlciErrors.txt b/core/sql/bin/SqlciErrors.txt
index e66074a..113abc4 100644
--- a/core/sql/bin/SqlciErrors.txt
+++ b/core/sql/bin/SqlciErrors.txt
@@ -1476,6 +1476,7 @@
 7003 42000 99999 BEGINNER MAJOR DBADMIN A plan using cluster sampling could not be produced for this query.
 7004 ZZZZZ 99999 BEGINNER MAJOR DBADMIN A parallel extract plan could not be produced. Possible causes include an incompatible Control Query Shape (CQS) specification, use of rowset expressions, or use of SQL features that cannot be parallelized such as [FIRST/LAST N], table-valued functions, stream access to tables, and embedded updates or deletes.
 7005 ZZZZZ 99999 BEGINNER MAJOR DBADMIN Use of selection predicates in parallel extract consumer queries is not allowed.
+7008 ZZZZZ 99999 BEGINNER MINOR DBADMIN IUD not supported with hbase replication enabled table $0~TableName when HBASE_READ_REPLICA is enabled. 
 7350 ZZZZZ 99999 BEGINNER MAJOR DBADMIN Incompatible consistency level of $0~Int0 for Halloween protection
 7351 ZZZZZ 99999 BEGINNER MAJOR DBADMIN Incompatible lock size of $0~Int0 for Halloween protection.
 7352 ZZZZZ 99999 BEGINNER MAJOR DBADMIN A Hash-Join that may overflow its memory to disk can not accept input rows longer than $0~Int0 bytes.
diff --git a/core/sql/runtimestats/ssmpipc.cpp b/core/sql/runtimestats/ssmpipc.cpp
index 64b23dd..6cfa784 100755
--- a/core/sql/runtimestats/ssmpipc.cpp
+++ b/core/sql/runtimestats/ssmpipc.cpp
@@ -782,45 +782,78 @@
   int error;
   char tempQid[ComSqlId::MAX_QUERY_ID_LEN+1];
 
-
+  static int stopProcessAfterInSecs = 
+             (getenv("MIN_QUERY_ACTIVE_TIME_IN_SECS_BEFORE_CANCEL") != NULL ? atoi(getenv("MIN_QUERY_ACTIVE_TIME_IN_SECS_BEFORE_CANCEL")) : -1);
   ActiveQueryEntry * aq = (queryId ? getActiveQueryMgr().getActiveQuery(
                        queryId, queryIdLen) : NULL);
+  ExMasterStats * cMasterStats = NULL;
+  StmtStats *cqStmtStats = NULL;
 
   if (aq == NULL)
   {
      error = statsGlobals->getStatsSemaphore(getSemId(), myPin());
-     StmtStats *cqStmtStats = statsGlobals->getMasterStmtStats(
+     cqStmtStats = statsGlobals->getMasterStmtStats(
                 queryId, queryIdLen,
                 RtsQueryId::ANY_QUERY_);
-     if (cqStmtStats == NULL)
+     if (cqStmtStats == NULL) {
         sqlErrorCode = -EXE_CANCEL_QID_NOT_FOUND;
-     else
-     {
-        ExMasterStats * cMasterStats = cqStmtStats->getMasterStats();
-        if (cMasterStats)
-        {
+        statsGlobals->releaseStatsSemaphore(getSemId(), myPin());
+     } else {
+        cMasterStats = cqStmtStats->getMasterStats();
+        if (cMasterStats == NULL) {
+            sqlErrorCode = -EXE_CANCEL_NOT_POSSIBLE;
+            sqlErrorDesc = "The query is not registered with cancel broker";
+            statsGlobals->releaseStatsSemaphore(getSemId(), myPin());
+        } else {
            Statement::State stmtState = (Statement::State)cMasterStats->getState();
            if (stmtState != Statement::OPEN_ &&
                    stmtState  != Statement::FETCH_ &&
-                   stmtState != Statement::STMT_EXECUTE_)
-           {
+                   stmtState != Statement::STMT_EXECUTE_) {
               sqlErrorCode = -EXE_CANCEL_NOT_POSSIBLE;
               sqlErrorDesc = "The query is not in OPEN or FETCH or EXECUTE state";
-           }
-           else
-           {
-              sqlErrorCode = -EXE_CANCEL_NOT_POSSIBLE;
-              sqlErrorDesc = "The query is not registered with the cancel broker";
-           }
-        }
-        else
-        {
-           sqlErrorCode = -EXE_CANCEL_NOT_POSSIBLE;
-           sqlErrorDesc = "The query state is not known";
-        }
-     }
-     statsGlobals->releaseStatsSemaphore(getSemId(), myPin());
-  }
+              statsGlobals->releaseStatsSemaphore(getSemId(), myPin());
+           } else {
+              if ((stopProcessAfterInSecs <= 0) || (cMasterStats->getExeEndTime() != -1)) {
+                 sqlErrorCode = -EXE_CANCEL_NOT_POSSIBLE;
+                 sqlErrorDesc = "The query can't be canceled because it finished processing";
+                 statsGlobals->releaseStatsSemaphore(getSemId(), myPin());
+              } else {
+                 Int64 exeStartTime = cMasterStats->getExeStartTime();
+                 int exeElapsedTimeInSecs = 0;
+                 if (exeStartTime != -1) {
+                    Int64 exeElapsedTime = NA_JulianTimestamp() - cMasterStats->getExeStartTime();
+                    exeElapsedTimeInSecs = exeElapsedTime / 1000000;
+                 }
+                 statsGlobals->releaseStatsSemaphore(getSemId(), myPin());
+                 if (exeElapsedTimeInSecs > 0 && exeElapsedTimeInSecs > (stopProcessAfterInSecs)) {
+                    sqlErrorCode = stopMasterProcess(queryId, queryIdLen); 
+                    if (sqlErrorCode != 0) {
+                       switch (sqlErrorCode) {
+                          case -1:
+                             sqlErrorDesc = "Unable to get node number";
+                             break;
+                          case -2:
+                             sqlErrorDesc = "Unable to get pid";
+                             break;
+                          case -3:
+                             sqlErrorDesc = "Unable to get process name";
+                             break;
+                          default:
+                             sqlErrorDesc = "Unable to stop the process";
+                             break; 
+                       } // switch
+                       sqlErrorCode = -EXE_CANCEL_NOT_POSSIBLE;
+                    } else 
+                      didAttemptCancel = true;
+                 } else {
+                     sqlErrorDesc = "The query can't be canceled because cancel was requested earlier than required minimum query active time";
+                     sqlErrorCode = -EXE_CANCEL_NOT_POSSIBLE;
+                 } // stopAfterNSecs
+              } // ExeEndTime
+          } //StmtState
+       } // cMasterStats 
+    } // cqStmtStats
+  } // aq
   else
   if (aq && (aq->getQueryStartTime() <= cancelStartTime))
   {
@@ -1009,6 +1042,23 @@
   return doAttemptActivate;
 }
 
+Lng32 SsmpGlobals::stopMasterProcess(char *queryId, Lng32 queryIdLen)
+{
+   Lng32 retcode;
+   Int64 node;
+   Int64 pin;
+   char processName[MS_MON_MAX_PROCESS_NAME+1];
+
+   if ((retcode = ComSqlId::getSqlSessionIdAttr(ComSqlId::SQLQUERYID_CPUNUM, queryId, queryIdLen, node, NULL)) != 0)
+      return -1;
+   if ((retcode = ComSqlId::getSqlSessionIdAttr(ComSqlId::SQLQUERYID_PIN, queryId, queryIdLen, pin, NULL)) != 0)
+      return -2;
+   if ((retcode = msg_mon_get_process_name((int)node, (int)pin, processName)) != XZFIL_ERR_OK)
+      return -3; 
+   if ((retcode = msg_mon_stop_process_name(processName)) != XZFIL_ERR_OK)
+      return retcode;   
+   return 0;    
+}
 
 void SsmpGuaReceiveControlConnection::actOnSystemMessage(
        short                  messageNum,
diff --git a/core/sql/runtimestats/ssmpipc.h b/core/sql/runtimestats/ssmpipc.h
index 7171e9b..3a9c0bd 100644
--- a/core/sql/runtimestats/ssmpipc.h
+++ b/core/sql/runtimestats/ssmpipc.h
@@ -140,6 +140,7 @@
                        bool suspendLogging);
   void suspendOrActivate(char *queryId, Lng32 qidLen, 
                          SuspendOrActivate sOrA, bool suspendLogging);
+  Lng32 stopMasterProcess(char *queryId, Lng32 queryIdLen);
 
 private:
 
diff --git a/core/sql/src/main/java/org/trafodion/sql/HTableClient.java b/core/sql/src/main/java/org/trafodion/sql/HTableClient.java
index c228c36..f363b3c 100644
--- a/core/sql/src/main/java/org/trafodion/sql/HTableClient.java
+++ b/core/sql/src/main/java/org/trafodion/sql/HTableClient.java
@@ -136,6 +136,7 @@
 	int fetchType = 0;
 	long jniObject = 0;
 	SnapshotScanHelper snapHelper = null;
+        static boolean enableHbaseScanForSkipReadConflict;
 
 	 class SnapshotScanHelper
 	 {
@@ -1152,7 +1153,7 @@
 			numColsInScan = 0;
 		if (useTRex && (transID != 0)) {
 			getResultSet = batchGet(transID, listOfGets);
-                        fetchType = GET_ROW; 
+     			fetchType = GET_ROW; 
 		} else {
 			getResultSet = table.get(listOfGets);
 			fetchType = BATCH_GET;
