diff --git a/odbcapi.c b/odbcapi.c
index fc124d5..efcd480 100644
--- a/odbcapi.c
+++ b/odbcapi.c
@@ -455,9 +455,36 @@ SQLFreeStmt(HSTMT StatementHandle,
 			SQLUSMALLINT Option)
 {
 	RETCODE	ret;
+	StatementClass *stmt = (StatementClass *) StatementHandle;
+	ConnectionClass *conn = NULL;
 
 	mylog("[SQLFreeStmt]");
+
+	if (stmt)
+	{
+		if (Option == SQL_DROP)
+		{
+			conn = stmt->hdbc;
+			if (conn)
+				ENTER_CONN_CS(conn);
+		}
+		else
+			ENTER_STMT_CS(stmt);
+	}
+
 	ret = PGAPI_FreeStmt(StatementHandle, Option);
+
+	if (stmt)
+	{
+		if (Option == SQL_DROP)
+		{
+			if (conn)
+				LEAVE_CONN_CS(conn);
+		}
+		else
+			LEAVE_STMT_CS(stmt);
+	}
+
 	return ret;
 }
 
diff --git a/odbcapi30.c b/odbcapi30.c
index 16288bb..4a99a4e 100644
--- a/odbcapi30.c
+++ b/odbcapi30.c
@@ -239,7 +239,11 @@ SQLFreeHandle(SQLSMALLINT HandleType, SQLHANDLE Handle)
 {
 	CSTR	func = "SQLFreeHandle";
 	RETCODE		ret;
+	StatementClass *stmt;
+	ConnectionClass *conn = NULL;
+
 	mylog("[[%s]]", func);
+
 	switch (HandleType)
 	{
 		case SQL_HANDLE_ENV:
@@ -249,7 +253,20 @@ SQLFreeHandle(SQLSMALLINT HandleType, SQLHANDLE Handle)
 			ret = PGAPI_FreeConnect(Handle);
 			break;
 		case SQL_HANDLE_STMT:
+			stmt = (StatementClass *) Handle;
+
+			if (stmt)
+			{
+				conn = stmt->hdbc;
+				if (conn)
+					ENTER_CONN_CS(conn);
+			}
+
 			ret = PGAPI_FreeStmt(Handle, SQL_DROP);
+
+			if (conn)
+				LEAVE_CONN_CS(conn);
+
 			break;
 		case SQL_HANDLE_DESC:
 			ret = PGAPI_FreeDesc(Handle);
