diff --git a/BitKeeper/etc/logging_ok b/BitKeeper/etc/logging_ok
index a0fb630c348e02945c3156c9abd3876f486de041..70631b16de4e1ebf6a36c7b05c95496adce32230 100644
--- a/BitKeeper/etc/logging_ok
+++ b/BitKeeper/etc/logging_ok
@@ -54,3 +54,4 @@ venu@work.mysql.com
 zak@balfor.local
 zak@linux.local
 ram@gw.udmsearch.izhnet.ru
+hf@bison.(none)
diff --git a/include/mysql.h b/include/mysql.h
index 7a16cbbe1d2a59448ffded8c5b956eb8142ed073..2e9bfbf8823cde35feabd5090c437c65e40aba8c 100644
--- a/include/mysql.h
+++ b/include/mysql.h
@@ -123,6 +123,9 @@ typedef struct st_mysql_data {
   unsigned int fields;
   MYSQL_ROWS *data;
   MEM_ROOT alloc;
+#ifdef EMBEDDED_LIBRARY
+  MYSQL_ROWS **prev_ptr;
+#endif
 } MYSQL_DATA;
 
 struct st_mysql_options {
@@ -152,13 +155,20 @@ struct st_mysql_options {
    a read that is replication-aware
  */
   my_bool no_master_reads;
+#ifdef EMBEDDED_LIBRARY
+  my_bool separate_thread;
+#endif
 };
 
 enum mysql_option { MYSQL_OPT_CONNECT_TIMEOUT, MYSQL_OPT_COMPRESS,
 		    MYSQL_OPT_NAMED_PIPE, MYSQL_INIT_COMMAND,
 		    MYSQL_READ_DEFAULT_FILE, MYSQL_READ_DEFAULT_GROUP,
 		    MYSQL_SET_CHARSET_DIR, MYSQL_SET_CHARSET_NAME,
-		    MYSQL_OPT_LOCAL_INFILE};
+		    MYSQL_OPT_LOCAL_INFILE,
+#ifdef EMBEDDED_LIBRARY
+                    MYSQL_OPT_USE_RESULT
+#endif
+};
 
 enum mysql_status { MYSQL_STATUS_READY,MYSQL_STATUS_GET_RESULT,
 		    MYSQL_STATUS_USE_RESULT};
@@ -171,12 +181,18 @@ enum mysql_status { MYSQL_STATUS_READY,MYSQL_STATUS_GET_RESULT,
 enum mysql_rpl_type { MYSQL_RPL_MASTER, MYSQL_RPL_SLAVE,
 		      MYSQL_RPL_ADMIN };
 
+struct st_mysql_res;
 
 typedef struct st_mysql {
   NET		net;			/* Communication parameters */
   gptr		connector_fd;		/* ConnectorFd for SSL */
-  char		*host,*user,*passwd,*unix_socket,*server_version,*host_info,
-		*info,*db;
+#ifndef _0EMBEDDED_LIBRARY
+  char		*host,*user,*passwd,*unix_socket,*server_version,*host_info,*info;
+#endif
+#ifdef EMBEDDED_LIBRARY
+  struct st_mysql_res *result;
+#endif
+  char          *db;
   struct charset_info_st *charset;
   MYSQL_FIELD	*fields;
   MEM_ROOT	field_alloc;
@@ -212,6 +228,9 @@ typedef struct st_mysql {
 
 
 typedef struct st_mysql_res {
+#ifdef EMBEDDED_LIBRARY
+  const char    *query_str;
+#endif
   my_ulonglong row_count;
   MYSQL_FIELD	*fields;
   MYSQL_DATA	*data;
diff --git a/include/violite.h b/include/violite.h
index 0f36e493b571f52b5a47b0028e329a6564e53ef5..1a938d48fea305bd0ea8b68f28d01792680b5636 100644
--- a/include/violite.h
+++ b/include/violite.h
@@ -31,8 +31,13 @@
 extern "C" {
 #endif /* __cplusplus */
 
-enum enum_vio_type { VIO_CLOSED, VIO_TYPE_TCPIP, VIO_TYPE_SOCKET,
-		     VIO_TYPE_NAMEDPIPE, VIO_TYPE_SSL};
+enum enum_vio_type { 
+  VIO_CLOSED, VIO_TYPE_TCPIP, VIO_TYPE_SOCKET,
+		     VIO_TYPE_NAMEDPIPE, VIO_TYPE_SSL
+#ifdef EMBEDDED_LIBRARY
+  ,VIO_SHARED_MEMORY, VIO_BUFFER
+#endif
+};
 
 #ifndef __WIN__
 #define HANDLE void *
diff --git a/libmysqld/embedded_priv.h b/libmysqld/embedded_priv.h
index 96d2c96ed0b24c6fadde55ec8e088191971fe934..253e3db372495086cdaec6dd2d25a6c720dfb72c 100644
--- a/libmysqld/embedded_priv.h
+++ b/libmysqld/embedded_priv.h
@@ -29,4 +29,7 @@ extern void end_embedded_connection(NET * net);
 extern void lib_connection_phase(NET *net, int phase);
 extern bool lib_dispatch_command(enum enum_server_command command, NET *net,
 				 const char *arg, ulong length);
+extern void init_embedded_mysql(MYSQL *mysql, int client_flag, char *db);
+extern void *create_embedded_thd(Vio *vio, unsigned char *buff, int client_flag, char *db);
+extern NET *get_mysql_net(MYSQL *mysql);
 C_MODE_END
diff --git a/libmysqld/lib_sql.cc b/libmysqld/lib_sql.cc
index 2a9a369e6451aa846ec969d3a2fd80de1bb13955..a23abce76c0a626c8bd12aabc38f31cb8a53222d 100644
--- a/libmysqld/lib_sql.cc
+++ b/libmysqld/lib_sql.cc
@@ -72,7 +72,7 @@ bool lib_dispatch_command(enum enum_server_command command, NET *net,
   return dispatch_command(command, thd, (char *) arg, length + 1);
 }
 
-
+#ifdef _DUMMY
 void lib_connection_phase(NET * net, int phase)
 {
   THD * thd;
@@ -101,7 +101,7 @@ void start_embedded_conn1(NET * net)
   Vio * v  = net->vio;
   if (!v)
   {
-    v = vio_new(0,VIO_CLOSED,0);
+    v = vio_new(0,VIO_BUFFER,0);
     net->vio = v;
   }
   if (v)
@@ -131,9 +131,6 @@ void start_embedded_conn1(NET * net)
   check_connections1(thd);
 }
 
-
-
-
 static int
 check_connections1(THD *thd)
 {
@@ -231,6 +228,9 @@ check_connections2(THD * thd)
   thd->password=test(passwd[0]);
   return 0;
 }
+#else
+C_MODE_END
+#endif /* _DUMMY */
 
 static bool check_user(THD *thd,enum_server_command command, const char *user,
 		       const char *passwd, const char *db, bool check_count)
@@ -588,7 +588,7 @@ void STDCALL mysql_thread_end()
 
 void start_embedded_connection(NET * net)
 {
-  start_embedded_conn1(net);
+//  start_embedded_conn1(net);
 }
 
 void end_embedded_connection(NET * net)
@@ -598,3 +598,374 @@ void end_embedded_connection(NET * net)
 }
 
 } /* extern "C" */
+
+NET *get_mysql_net(MYSQL *mysql)
+{
+  return &((THD *)mysql->net.vio->dest_thd)->net;
+}
+
+void init_embedded_mysql(MYSQL *mysql, int client_flag, char *db)
+{
+  THD *thd = (THD *)mysql->net.vio->dest_thd;
+  mysql->reconnect= 1;			/* Reconnect as default */
+  mysql->server_status= SERVER_STATUS_AUTOCOMMIT;
+
+  mysql->protocol_version= ::protocol_version;
+  mysql->thread_id= thd->thread_id;
+  strmake(mysql->scramble_buff, thd->scramble, 8);
+  mysql->server_capabilities= CLIENT_LONG_FLAG | CLIENT_CONNECT_WITH_DB |
+	               CLIENT_TRANSACTIONS;
+  mysql->server_language= MY_CHARSET_CURRENT;
+  mysql->server_status= thd->server_status;
+  mysql->client_flag= client_flag | mysql->options.client_flag;
+  mysql->db= db;
+  thd->mysql= mysql;
+}
+
+static int embedded_thd_net_init(NET *net, unsigned char *buff)
+{
+  net->buff = buff;
+  if (net_buffer_length > max_allowed_packet)
+    max_allowed_packet= net_buffer_length;
+  net->buff_end= net->buff+(net->max_packet=net_buffer_length);
+  net->vio= NULL;
+  net->no_send_ok= 0;
+  net->error=0; net->return_errno=0; net->return_status=0;
+  net->timeout=(uint) net_read_timeout;		/* Timeout for read */
+  net->pkt_nr= net->compress_pkt_nr=0;
+  net->write_pos= net->read_pos = net->buff;
+  net->last_error[0]= 0;
+  net->compress= 0; 
+  net->reading_or_writing= 0;
+  net->where_b = net->remain_in_buf= 0;
+  net->last_errno= 0;
+  net->query_cache_query= 0;
+  return 0;
+}
+
+void *create_embedded_thd(Vio *vio, unsigned char *buff, int client_flag, char *db)
+{
+  THD * thd= new THD;
+  embedded_thd_net_init(&thd->net, buff);
+
+  /* if (protocol_version>9) */
+  thd->net.return_errno=1;
+  thd->thread_id= thread_id++;
+
+  if (thd->store_globals())
+  {
+    fprintf(stderr,"store_globals failed.\n");
+    return NULL;
+  }
+
+  thd->mysys_var= my_thread_var;
+  thd->dbug_thread_id= my_thread_id();
+  thd->thread_stack= (char*) &thd;
+
+  if (thd->max_join_size == HA_POS_ERROR)
+    thd->options |= OPTION_BIG_SELECTS;
+
+  thd->proc_info=0;				// Remove 'login'
+  thd->command=COM_SLEEP;
+  thd->version=refresh_version;
+  thd->set_time();
+  init_sql_alloc(&thd->mem_root,8192,8192);
+  thd->client_capabilities= client_flag;
+  thd->max_packet_length= max_allowed_packet;
+  thd->net.vio = vio;
+
+  if (thd->client_capabilities & CLIENT_INTERACTIVE)
+    thd->inactive_timeout= net_interactive_timeout;
+  if (thd->client_capabilities & CLIENT_TRANSACTIONS)
+    thd->net.return_status= &thd->server_status;
+
+  thd->db= db;
+  thd->db_length= db ? stripp_sp(db) : 0;
+  thd->db_access= DB_ACLS;
+  thd->master_access= ~NO_ACCESS;
+
+  return thd;
+}
+
+bool send_fields(THD *thd, List<Item> &list, uint flag)
+{
+  List_iterator_fast<Item> it(list);
+  Item                     *item;
+  MEM_ROOT                 *alloc;
+  MYSQL_FIELD              *field, *client_field;
+  unsigned int             field_count= list.elements;
+  MYSQL                    *mysql= thd->mysql;
+  
+  if (!(mysql->result=(MYSQL_RES*) my_malloc(sizeof(MYSQL_RES)+
+				      sizeof(ulong) * field_count,
+				      MYF(MY_WME | MY_ZEROFILL))))
+    goto err;
+
+  mysql->field_count=field_count;
+  alloc= &mysql->field_alloc;
+  field= (MYSQL_FIELD *)alloc_root(alloc, sizeof(MYSQL_FIELD)*list.elements);
+  if (!field)
+    goto err;
+
+  client_field= field;
+  while ((item= it++))
+  {
+    Send_field server_field;
+    item->make_field(&server_field);
+
+    client_field->table=  strdup_root(alloc, server_field.table_name);
+    client_field->name=   strdup_root(alloc,server_field.col_name);
+    client_field->length= server_field.length;
+    client_field->type=   server_field.type;
+    client_field->flags= server_field.flags;
+    client_field->decimals= server_field.decimals;
+
+    if (INTERNAL_NUM_FIELD(client_field))
+      client_field->flags|= NUM_FLAG;
+
+    if (flag & 2)
+    {
+      char buff[80];
+      String tmp(buff, sizeof(buff), default_charset_info), *res;
+
+      if (!(res=item->val_str(&tmp)))
+	client_field->def= strdup_root(alloc, "");
+      else
+	client_field->def= strdup_root(alloc, tmp.ptr());
+    }
+    else
+      client_field->def=0;
+    client_field->max_length= 0;
+    ++client_field;
+  }
+  mysql->result->fields = field;
+
+  if (!(mysql->result->data= (MYSQL_DATA*) my_malloc(sizeof(MYSQL_DATA),
+				       MYF(MY_WME | MY_ZEROFILL))))
+    goto err;
+
+  init_alloc_root(&mysql->result->data->alloc,8192,0);	/* Assume rowlength < 8192 */
+  mysql->result->data->alloc.min_malloc=sizeof(MYSQL_ROWS);
+  mysql->result->data->rows=0;
+  mysql->result->data->fields=field_count;
+  mysql->result->field_count=field_count;
+  mysql->result->data->prev_ptr= &mysql->result->data->data;
+
+  mysql->result->field_alloc=	mysql->field_alloc;
+  mysql->result->current_field=0;
+  mysql->result->current_row=0;
+
+  return 0;
+ err:
+  send_error(&thd->net,ER_OUT_OF_RESOURCES);	/* purecov: inspected */
+  return 1;					/* purecov: inspected */
+}
+
+/* Get the length of next field. Change parameter to point at fieldstart */
+static ulong
+net_field_length(uchar **packet)
+{
+  reg1 uchar *pos= *packet;
+  if (*pos < 251)
+  {
+    (*packet)++;
+    return (ulong) *pos;
+  }
+  if (*pos == 251)
+  {
+    (*packet)++;
+    return NULL_LENGTH;
+  }
+  if (*pos == 252)
+  {
+    (*packet)+=3;
+    return (ulong) uint2korr(pos+1);
+  }
+  if (*pos == 253)
+  {
+    (*packet)+=4;
+    return (ulong) uint3korr(pos+1);
+  }
+  (*packet)+=9;					/* Must be 254 when here */
+  return (ulong) uint4korr(pos+1);
+}
+
+bool select_send::send_data(List<Item> &items)
+{
+  List_iterator_fast<Item> li(items);
+  Item                     *item;
+  String                   *packet= &thd->packet;
+  MYSQL                    *mysql= thd->mysql;
+  MYSQL_DATA               *result= mysql->result->data;
+  MYSQL_ROWS               **prev_ptr= &mysql->result->data->data;
+  MYSQL_ROWS               *cur;
+  MEM_ROOT                 *alloc= &mysql->result->data->alloc;
+  char                     *to;
+  int                      n_fields= items.elements;
+  uchar                    *cp;
+  MYSQL_FIELD              *mysql_fields= mysql->result->fields;
+  MYSQL_ROW                cur_field, end_field;
+  ulong                    len;
+
+
+  DBUG_ENTER("send_data");
+
+  thd->packet.length(0);
+  while ((item=li++))
+  {
+    if (item->send(thd, packet))
+    {
+      packet->free();
+      my_error(ER_OUT_OF_RESOURCES, MYF(0));
+      DBUG_RETURN(1);
+    }
+  }
+
+  result->rows++;
+  if (!(cur= (MYSQL_ROWS *)alloc_root(alloc, sizeof(MYSQL_ROWS))) ||
+      !(cur->data= (MYSQL_ROW)alloc_root(alloc, 
+					 (n_fields + 1) * sizeof(char *) + packet->length())))
+  {
+    my_error(ER_OUT_OF_RESOURCES,MYF(0));
+    DBUG_RETURN(1);
+  }
+
+  *result->prev_ptr= cur;
+  result->prev_ptr= &cur->next;
+  to= (char*) (cur->data+n_fields+1);
+  cp= (uchar *)packet->ptr();
+  end_field= cur->data + n_fields;
+
+  for (cur_field=cur->data; cur_field<end_field; ++cur_field, ++mysql_fields)
+  {
+    if ((len= (ulong) net_field_length(&cp)) == NULL_LENGTH)
+    {
+      *cur_field = 0;
+    }
+    else
+    {
+      *cur_field= to;
+      memcpy(to,(char*) cp,len);
+      to[len]=0;
+      to+=len+1;
+      cp+=len;
+      if (mysql_fields->max_length < len)
+	mysql_fields->max_length=len;
+    }
+  }
+
+  *cur_field= to;
+
+  DBUG_RETURN(0);
+}
+
+bool do_command(THD *thd)
+{
+  MYSQL *mysql= thd->mysql;
+
+  char *packet;
+  uint old_timeout;
+  ulong packet_length;
+  NET *net;
+  enum enum_server_command command;
+  DBUG_ENTER("do_command");
+
+  net= &thd->net;
+  thd->current_tablenr=0;
+
+  packet=0;
+  old_timeout=net->timeout;
+  net->timeout=(uint) thd->inactive_timeout;	// Wait max for 8 hours
+  net->last_error[0]=0;				// Clear error message
+  net->last_errno=0;
+
+  net_new_transaction(net);
+  if ((packet_length=my_net_read(net)) == packet_error)
+  {
+     DBUG_PRINT("info",("Got error reading command from socket %s",
+			vio_description(net->vio) ));
+    return TRUE;
+  }
+  else
+  {
+    packet=(char*) net->read_pos;
+    command = (enum enum_server_command) (uchar) packet[0];
+    DBUG_PRINT("info",("Command on %s = %d (%s)",
+		       vio_description(net->vio), command,
+		       command_name[command]));
+  }
+  net->timeout=old_timeout;			// Timeout for writing
+  DBUG_RETURN(dispatch_command(command,thd, packet+1, (uint) packet_length));
+}
+
+void
+send_ok(NET *net,ha_rows affected_rows,ulonglong id,const char *message)
+{
+  if (net->no_send_ok)				// hack for re-parsing queries
+    return;
+
+  DBUG_ENTER("send_ok");
+  MYSQL *mysql= current_thd->mysql;
+  mysql->affected_rows= affected_rows;
+  mysql->insert_id= id;
+  if (net->return_status)
+    mysql->server_status= *net->return_status;
+  if (message)
+  {
+    strmake(net->last_error, message, sizeof(net->last_error));
+    mysql->info= net->last_error;
+  }
+  DBUG_VOID_RETURN;
+}
+
+int embedded_send_row(THD *thd, int n_fields, char *data, int data_len)
+{
+  MYSQL                    *mysql= thd->mysql;
+  MYSQL_DATA               *result= mysql->result->data;
+  MYSQL_ROWS               **prev_ptr= &mysql->result->data->data;
+  MYSQL_ROWS               *cur;
+  MEM_ROOT                 *alloc= &mysql->result->data->alloc;
+  char                     *to;
+  uchar                    *cp;
+  MYSQL_FIELD              *mysql_fields= mysql->result->fields;
+  MYSQL_ROW                cur_field, end_field;
+  ulong                    len;
+
+  DBUG_ENTER("embedded_send_row");
+
+  result->rows++;
+  if (!(cur= (MYSQL_ROWS *)alloc_root(alloc, sizeof(MYSQL_ROWS))) ||
+      !(cur->data= 
+	(MYSQL_ROW)alloc_root(alloc, 
+			      (n_fields + 1) * sizeof(char *) + data_len)))
+  {
+    my_error(ER_OUT_OF_RESOURCES,MYF(0));
+    DBUG_RETURN(1);
+  }
+
+  *result->prev_ptr= cur;
+  result->prev_ptr= &cur->next;
+  to= (char*) (cur->data+n_fields+1);
+  cp= (uchar *)data;
+  end_field= cur->data + n_fields + 1;
+  
+  for (cur_field=cur->data; cur_field<end_field; ++cur_field, ++mysql_fields)
+  {
+    if ((len= (ulong) net_field_length(&cp)) == NULL_LENGTH)
+    {
+      *cur_field = 0;
+    }
+    else
+    {
+      *cur_field= to;
+      memcpy(to,(char*) cp,len);
+      to[len]=0;
+      to+=len+1;
+      cp+=len;
+      if (mysql_fields->max_length < len)
+	mysql_fields->max_length=len;
+    }
+  }
+  DBUG_RETURN(0);
+}
+
diff --git a/libmysqld/lib_vio.c b/libmysqld/lib_vio.c
index 9bf492ed5eaef53ca59e64bdf692aad4edb02b51..a4388ba099576eaf3e8503cb9565087fb8b372f8 100644
--- a/libmysqld/lib_vio.c
+++ b/libmysqld/lib_vio.c
@@ -42,14 +42,7 @@
 
 struct st_vio
 {
-  my_socket		sd;		/* my_socket - real or imaginary */
-  HANDLE hPipe;
-  my_bool		localhost;	/* Are we from localhost? */
-  int			fcntl_mode;	/* Buffered fcntl(sd,F_GETFL) */
-  struct sockaddr_in	local;		/* Local internet address */
-  struct sockaddr_in	remote;		/* Remote internet address */
   enum enum_vio_type	type;		/* Type of connection */
-  char			desc[30];	/* String description */
   void *dest_thd;
   char *packets, **last_packet;
   char *where_in_packet, *end_of_packet;
@@ -57,6 +50,7 @@ struct st_vio
   MEM_ROOT root;
 };
 
+
 /* Initialize the communication buffer */
 
 Vio *vio_new(my_socket sd, enum enum_vio_type type, my_bool localhost)
@@ -68,6 +62,7 @@ Vio *vio_new(my_socket sd, enum enum_vio_type type, my_bool localhost)
     init_alloc_root(&vio->root, 8192, 8192);
     vio->root.min_malloc = sizeof(char *) + 4;
     vio->last_packet = &vio->packets;
+    vio->type = type;
   }
   return (vio);
 }
@@ -212,4 +207,22 @@ my_bool vio_poll_read(Vio *vio,uint timeout)
   return 0;
 }
 
+int create_vio(NET *net, int separate_thread)
+{
+  Vio * v  = net->vio;
+  if (!v)
+  {
+    v = vio_new(0, separate_thread ? VIO_SHARED_MEMORY : VIO_BUFFER, 0);
+    net->vio = v;
+  }
+  return !v;
+}
+
+void set_thd(Vio *v, void *thd)
+{
+  if (v)
+  {
+    v -> dest_thd = thd;
+  } 
+}
 #endif /* HAVE_VIO */
diff --git a/libmysqld/libmysqld.c b/libmysqld/libmysqld.c
index 59e6239c1e7062a7cf0836e6cb43913c96b7caf7..e387edadeb296166327ff056b420431263af86a3 100644
--- a/libmysqld/libmysqld.c
+++ b/libmysqld/libmysqld.c
@@ -68,7 +68,8 @@ static MYSQL_DATA *read_rows (MYSQL *mysql,MYSQL_FIELD *fields,
 static int read_one_row(MYSQL *mysql,uint fields,MYSQL_ROW row,
 			ulong *lengths);
 static void end_server(MYSQL *mysql);
-static void read_user_name(char *name);
+/*static void read_user_name(char *name);
+*/
 static void append_wild(char *to,char *end,const char *wild);
 static int send_file_to_server(MYSQL *mysql,const char *filename);
 static ulong mysql_sub_escape_string(CHARSET_INFO *charset_info, char *to,
@@ -238,8 +239,7 @@ simple_command(MYSQL *mysql,enum enum_server_command command, const char *arg,
 
   result = lib_dispatch_command(command, net, arg,length);
   if (!skipp_check)
-    result= ((mysql->packet_length=net_safe_read(mysql)) == packet_error ?
-	     -1 : 0);
+    result= mysql->net.last_errno ? -1 : 0;
  end:
   return result;
 }
@@ -261,6 +261,8 @@ struct passwd *getpwuid(uid_t);
 char* getlogin(void);
 #endif
 
+#ifdef _DUMMY
+
 #if !defined(MSDOS) && ! defined(VMS) && !defined(__WIN__)
 static void read_user_name(char *name)
 {
@@ -307,6 +309,7 @@ static void read_user_name(char *name)
 }
 
 #endif
+#endif /*_DUMMY */
 
 #ifdef __WIN__
 static my_bool is_NT(void)
@@ -391,7 +394,7 @@ end_server(MYSQL *mysql)
     end_embedded_connection(&mysql->net);
     mysql->net.vio= 0;          /* Marker */
   }
-  net_end(&mysql->net);
+  mysql->net.buff = NULL;
   free_old_query(mysql);
   DBUG_VOID_RETURN;
 }
@@ -782,6 +785,53 @@ mysql_connect(MYSQL *mysql,const char *host,
 }
 
 
+int create_vio(NET *net, int separate_thread);
+void set_thd(Vio *vio, void *thd);
+
+/************/
+
+static inline int mysql_init_charset(MYSQL *mysql)
+{
+  char charset_name_buff[16], *charset_name;
+
+  if ((charset_name=mysql->options.charset_name))
+  {
+    const char *save=charsets_dir;
+    if (mysql->options.charset_dir)
+      charsets_dir=mysql->options.charset_dir;
+    mysql->charset=get_charset_by_name(mysql->options.charset_name,
+                                       MYF(MY_WME));
+    charsets_dir=save;
+  }
+  else if (mysql->server_language)
+  {
+    charset_name=charset_name_buff;
+    sprintf(charset_name,"%d",mysql->server_language);	/* In case of errors */
+    mysql->charset=get_charset((uint8) mysql->server_language, MYF(MY_WME));
+  }
+  else
+    mysql->charset=default_charset_info;
+
+  if (!mysql->charset)
+  {
+    mysql->net.last_errno=CR_CANT_READ_CHARSET;
+    if (mysql->options.charset_dir)
+      sprintf(mysql->net.last_error,ER(mysql->net.last_errno),
+              charset_name ? charset_name : "unknown",
+              mysql->options.charset_dir);
+    else
+    {
+      char cs_dir_name[FN_REFLEN];
+      get_charsets_dir(cs_dir_name);
+      sprintf(mysql->net.last_error,ER(mysql->net.last_errno),
+              charset_name ? charset_name : "unknown",
+              cs_dir_name);
+    }
+    return mysql->net.last_errno;
+  }
+  return 0;
+}
+
 /*
 ** Note that the mysql argument must be initialized with mysql_init()
 ** before calling mysql_real_connect !
@@ -789,19 +839,17 @@ mysql_connect(MYSQL *mysql,const char *host,
 
 MYSQL * STDCALL
 mysql_real_connect(MYSQL *mysql,const char *host, const char *user,
-		   const char *passwd, const char *db,
+		   const char *passwd __attribute__((unused)), const char *db,
 		   uint port, const char *unix_socket,uint client_flag)
 {
-  char		buff[100],charset_name_buff[16],*end,*host_info, *charset_name;
-  uint		pkt_length;
   NET		*net= &mysql->net;
+  char          *db_name;
   DBUG_ENTER("mysql_real_connect");
   DBUG_PRINT("enter",("host: %s  db: %s  user: %s",
 		      host ? host : "(Null)",
 		      db ? db : "(Null)",
 		      user ? user : "(Null)"));
 
-  net->vio = 0;				/* If something goes wrong */
   /* use default options */
   if (mysql->options.my_cnf_file || mysql->options.my_cnf_group)
   {
@@ -814,22 +862,14 @@ mysql_real_connect(MYSQL *mysql,const char *host, const char *user,
     mysql->options.my_cnf_file=mysql->options.my_cnf_group=0;
   }
 
-  /* Some empty-string-tests are done because of ODBC */
-  if (!host || !host[0])
-    host=mysql->options.host;
-  if (!user || !user[0])
-    user=mysql->options.user;
-  if (!passwd)
-  {
-    passwd=mysql->options.password;
-  }
   if (!db || !db[0])
     db=mysql->options.db;
+
   port=0;
   unix_socket=0;
-  mysql->reconnect=1;			/* Reconnect as default */
-  mysql->server_status=SERVER_STATUS_AUTOCOMMIT;
-  host_info=(char*) ER(CR_EMBEDDED_CONNECTION);
+  db_name = db ? my_strdup(db,MYF(MY_WME)) : NULL;
+
+  create_vio(net, mysql->options.separate_thread);
   if (my_net_init(net, net->vio))
   {
     vio_delete(net->vio);
@@ -838,145 +878,28 @@ mysql_real_connect(MYSQL *mysql,const char *host, const char *user,
     goto error;
   }
 
-  /* Get version info */
-  mysql->protocol_version= PROTOCOL_VERSION;	/* Assume this */
-  start_embedded_connection(net);
+  set_thd(net->vio, create_embedded_thd(net->vio, net->buff, client_flag, db_name));
+  
+  init_embedded_mysql(mysql, client_flag, db_name);
 
-  if ((pkt_length=net_safe_read(mysql)) == packet_error)
+  if (mysql_init_charset(mysql))
     goto error;
 
-  /* Check if version of protocoll matches current one */
-
-  mysql->protocol_version= net->read_pos[0];
-  DBUG_DUMP("packet",(char*) net->read_pos,10);
-  DBUG_PRINT("info",("mysql protocol version %d, server=%d",
-		     PROTOCOL_VERSION, mysql->protocol_version));
-  if (mysql->protocol_version != PROTOCOL_VERSION &&
-      mysql->protocol_version != PROTOCOL_VERSION-1)
-  {
-    net->last_errno= CR_VERSION_ERROR;
-    sprintf(net->last_error, ER(CR_VERSION_ERROR), mysql->protocol_version,
-	    PROTOCOL_VERSION);
-    goto error;
-  }
-  end=strend((char*) net->read_pos+1);
-  mysql->thread_id=uint4korr(end+1);
-  end+=5;
-  strmake(mysql->scramble_buff,end,8);
-  end+=9;
-  if (pkt_length >= (uint) (end+1 - (char*) net->read_pos))
-    mysql->server_capabilities=uint2korr(end);
-  if (pkt_length >= (uint) (end+18 - (char*) net->read_pos))
-  {
-    /* New protocol with 16 bytes to describe server characteristics */
-    mysql->server_language=end[2];
-    mysql->server_status=uint2korr(end+3);
-  }
-
-  /* Set character set */
-  if ((charset_name=mysql->options.charset_name))
-  {
-    const char *save=charsets_dir;
-    if (mysql->options.charset_dir)
-      charsets_dir=mysql->options.charset_dir;
-    mysql->charset=get_charset_by_name(mysql->options.charset_name,
-                                       MYF(MY_WME));
-    charsets_dir=save;
-  }
-  else if (mysql->server_language)
-  {
-    charset_name=charset_name_buff;
-    sprintf(charset_name,"%d",mysql->server_language);	/* In case of errors */
-    mysql->charset=get_charset((uint8) mysql->server_language, MYF(MY_WME));
-  }
-  else
-    mysql->charset=default_charset_info;
-
-  if (!mysql->charset)
-  {
-    net->last_errno=CR_CANT_READ_CHARSET;
-    if (mysql->options.charset_dir)
-      sprintf(net->last_error,ER(net->last_errno),
-              charset_name ? charset_name : "unknown",
-              mysql->options.charset_dir);
-    else
-    {
-      char cs_dir_name[FN_REFLEN];
-      get_charsets_dir(cs_dir_name);
-      sprintf(net->last_error,ER(net->last_errno),
-              charset_name ? charset_name : "unknown",
-              cs_dir_name);
-    }
-    goto error;
-  }
-
-  /* Save connection information */
-  if (!user) user="";
-  if (!passwd) passwd="";
-  host=LOCAL_HOST;
-  if (!my_multi_malloc(MYF(0),
-		       &mysql->host_info, (uint) strlen(host_info)+1,
-		       &mysql->host,      (uint) strlen(host)+1,
-		       &mysql->unix_socket,unix_socket ?
-		       (uint) strlen(unix_socket)+1 : (uint) 1,
-		       &mysql->server_version,
-		       (uint) (end - (char*) net->read_pos),
-		       NullS) ||
-      !(mysql->user=my_strdup(user,MYF(0))) ||
-      !(mysql->passwd=my_strdup(passwd,MYF(0))))
-  {
-    strmov(net->last_error, ER(net->last_errno=CR_OUT_OF_MEMORY));
-    goto error;
-  }
-  strmov(mysql->host_info,host_info);
-  strmov(mysql->host,host);
-  if (unix_socket)
-    strmov(mysql->unix_socket,unix_socket);
-  else
-    mysql->unix_socket=0;
-  strmov(mysql->server_version,(char*) net->read_pos+1);
-  mysql->port=port;
-  mysql->client_flag=client_flag | mysql->options.client_flag;
-  DBUG_PRINT("info",("Server version = '%s'  capabilites: %ld  status: %d",
-		     mysql->server_version,mysql->server_capabilities,
-		     mysql->server_status));
-
   /* Send client information for access check */
   client_flag|=CLIENT_CAPABILITIES;
   client_flag&= ~CLIENT_COMPRESS;
   if (db)
     client_flag|=CLIENT_CONNECT_WITH_DB;
-  int2store(buff,client_flag);
-  mysql->client_flag=client_flag;
-
-
-  int3store(buff+2,max_allowed_packet);
-  if (user && user[0])
-    strmake(buff+5,user,32);
-  else
-    read_user_name((char*) buff+5);
-#ifdef _CUSTOMCONFIG_
-#include "_cust_libmysql.h";
-#endif
-  DBUG_PRINT("info",("user: %s",buff+5));
-  end=scramble(strend(buff+5)+1, mysql->scramble_buff, passwd,
-	       (my_bool) (mysql->protocol_version == 9));
 
   if (db)
   {
-    end=strmov(end+1,db);
     mysql->db=my_strdup(db,MYF(MY_WME));
     db=0;
   }
-  if (my_net_write(net,buff,(ulong) (end-buff)) || net_flush(net))
-    goto error;
-
-  lib_connection_phase(net,2);
 
-  if( net_safe_read(mysql) == packet_error)
-    goto error;
-  if (db && mysql_select_db(mysql,db))
-    goto error;
+/****
+  net->timeout=net_read_timeout;
+*/
   if (mysql->options.init_command)
   {
     my_bool reconnect=mysql->reconnect;
@@ -1119,6 +1042,15 @@ mysql_query(MYSQL *mysql, const char *query)
 int STDCALL
 mysql_send_query(MYSQL* mysql, const char* query, ulong length)
 {
+  if (mysql->options.separate_thread)
+  {
+    return -1;
+  }
+
+  mysql->result= NULL;
+
+  free_old_query(mysql);			/* Free old result */
+
   return simple_command(mysql, COM_QUERY, query, length, 1);
 }
 
@@ -1126,50 +1058,19 @@ mysql_send_query(MYSQL* mysql, const char* query, ulong length)
 int STDCALL
 mysql_read_query_result(MYSQL *mysql)
 {
-  uchar *pos;
-  ulong field_count;
-  MYSQL_DATA *fields;
-  uint length;
-  DBUG_ENTER("mysql_read_query_result");
+  NET *net= get_mysql_net(mysql);
 
-  if ((length=net_safe_read(mysql)) == packet_error)
-    DBUG_RETURN(-1);
-  free_old_query(mysql);			/* Free old result */
-get_info:
-  pos=(uchar*) mysql->net.read_pos;
-  if ((field_count= net_field_length(&pos)) == 0)
+  if (net->last_errno)
+    return -1;
+
+  if (mysql->field_count)
   {
-    mysql->affected_rows= net_field_length_ll(&pos);
-    mysql->insert_id=	  net_field_length_ll(&pos);
-    if (mysql->server_capabilities & CLIENT_TRANSACTIONS)
-    {
-      mysql->server_status=uint2korr(pos); pos+=2;
-    }
-    if (pos < mysql->net.read_pos+length && net_field_length(&pos))
-      mysql->info=(char*) pos;
-    DBUG_RETURN(0);
+    mysql->status=MYSQL_STATUS_GET_RESULT;
+    mysql->affected_rows= mysql->result->row_count= mysql->result->data->rows;
+    mysql->result->data_cursor= mysql->result->data->data;
   }
-  if (field_count == NULL_LENGTH)		/* LOAD DATA LOCAL INFILE */
-  {
-    int error=send_file_to_server(mysql,(char*) pos);
-    if ((length=net_safe_read(mysql)) == packet_error || error)
-      DBUG_RETURN(-1);
-    goto get_info;				/* Get info packet */
-  }
-  if (!(mysql->server_status & SERVER_STATUS_AUTOCOMMIT))
-    mysql->server_status|= SERVER_STATUS_IN_TRANS;
 
-  mysql->extra_info= net_field_length_ll(&pos); /* Maybe number of rec */
-  if (!(fields=read_rows(mysql,(MYSQL_FIELD*) 0,5)))
-    DBUG_RETURN(-1);
-  if (!(mysql->fields=unpack_fields(fields,&mysql->field_alloc,
-				    (uint) field_count,0,
-				    (my_bool) test(mysql->server_capabilities &
-						   CLIENT_LONG_FLAG))))
-    DBUG_RETURN(-1);
-  mysql->status=MYSQL_STATUS_GET_RESULT;
-  mysql->field_count=field_count;
-  DBUG_RETURN(0);
+  return 0;
 }
 
 /****************************************************************************
@@ -1279,8 +1180,18 @@ mysql_real_query(MYSQL *mysql, const char *query, ulong length)
   DBUG_ENTER("mysql_real_query");
   DBUG_PRINT("enter",("handle: %lx",mysql));
   DBUG_PRINT("query",("Query = \"%s\"",query));
+/*  if (mysql->options.separate_thread)
+  {
+    DBUG_RETURN(0);
+  }
+
+  mysql->result= NULL;
+
+  free_old_query(mysql);
+*/
   if (mysql_send_query(mysql, query, length))
     DBUG_RETURN(-1);
+
   DBUG_RETURN(mysql_read_query_result(mysql));
 }
 
@@ -1345,48 +1256,29 @@ send_file_to_server(MYSQL *mysql, const char *filename)
 ** Alloc result struct for buffered results. All rows are read to buffer.
 ** mysql_data_seek may be used.
 **************************************************************************/
-
 MYSQL_RES * STDCALL
 mysql_store_result(MYSQL *mysql)
 {
-  MYSQL_RES *result;
-  DBUG_ENTER("mysql_store_result");
+  MYSQL_RES *result= mysql->result;
+  if (!result)
+    return 0;
 
-  if (!mysql->fields)
-    DBUG_RETURN(0);
-  if (mysql->status != MYSQL_STATUS_GET_RESULT)
-  {
-    strmov(mysql->net.last_error,
-	   ER(mysql->net.last_errno=CR_COMMANDS_OUT_OF_SYNC));
-    DBUG_RETURN(0);
-  }
-  mysql->status=MYSQL_STATUS_READY;		/* server is ready */
-  if (!(result=(MYSQL_RES*) my_malloc(sizeof(MYSQL_RES)+
-				      sizeof(ulong)*mysql->field_count,
-				      MYF(MY_WME | MY_ZEROFILL))))
-  {
-    mysql->net.last_errno=CR_OUT_OF_MEMORY;
-    strmov(mysql->net.last_error, ER(mysql->net.last_errno));
-    DBUG_RETURN(0);
-  }
-  result->eof=1;				/* Marker for buffered */
-  result->lengths=(ulong*) (result+1);
-  if (!(result->data=read_rows(mysql,mysql->fields,mysql->field_count)))
-  {
-    my_free((gptr) result,MYF(0));
-    DBUG_RETURN(0);
-  }
+  mysql->result= NULL;
+  *result->data->prev_ptr= 0;
+  result->eof= 1;
+  result->lengths= (ulong*)(result + 1);
   mysql->affected_rows= result->row_count= result->data->rows;
-  result->data_cursor=	result->data->data;
-  result->fields=	mysql->fields;
-  result->field_alloc=	mysql->field_alloc;
-  result->field_count=	mysql->field_count;
-  result->current_field=0;
-  result->current_row=0;			/* Must do a fetch first */
-  mysql->fields=0;				/* fields is now in result */
-  DBUG_RETURN(result);				/* Data fetched */
+  result->data_cursor=  result->data->data;
+
+  mysql->status=MYSQL_STATUS_READY;		/* server is ready */
+  return result;
 }
 
+void _0dummy()
+{
+  send_file_to_server(NULL, NULL);
+  net_field_length_ll(NULL);
+}
 
 /**************************************************************************
 ** Alloc struct for use with unbuffered reads. Data is fetched by domand
@@ -1401,40 +1293,12 @@ mysql_store_result(MYSQL *mysql)
 MYSQL_RES * STDCALL
 mysql_use_result(MYSQL *mysql)
 {
-  MYSQL_RES *result;
   DBUG_ENTER("mysql_use_result");
-
-  if (!mysql->fields)
-    DBUG_RETURN(0);
-  if (mysql->status != MYSQL_STATUS_GET_RESULT)
-  {
-    strmov(mysql->net.last_error,
-	   ER(mysql->net.last_errno=CR_COMMANDS_OUT_OF_SYNC));
+  if (mysql->options.separate_thread)
     DBUG_RETURN(0);
-  }
-  if (!(result=(MYSQL_RES*) my_malloc(sizeof(*result)+
-				      sizeof(ulong)*mysql->field_count,
-				      MYF(MY_WME | MY_ZEROFILL))))
-    DBUG_RETURN(0);
-  result->lengths=(ulong*) (result+1);
-  if (!(result->row=(MYSQL_ROW)
-	my_malloc(sizeof(result->row[0])*(mysql->field_count+1), MYF(MY_WME))))
-  {					/* Ptrs: to one row */
-    my_free((gptr) result,MYF(0));
-    DBUG_RETURN(0);
-  }
-  result->fields=	mysql->fields;
-  result->field_alloc=	mysql->field_alloc;
-  result->field_count=	mysql->field_count;
-  result->current_field=0;
-  result->handle=	mysql;
-  result->current_row=	0;
-  mysql->fields=0;			/* fields is now in result */
-  mysql->status=MYSQL_STATUS_USE_RESULT;
-  DBUG_RETURN(result);			/* Data is read to be fetched */
-}
-
 
+  DBUG_RETURN(mysql_store_result(mysql));
+}
 
 /**************************************************************************
 ** Return next field of the query results
@@ -1783,6 +1647,9 @@ mysql_options(MYSQL *mysql,enum mysql_option option, const char *arg)
   case MYSQL_OPT_COMPRESS:
     mysql->options.compress=1;			/* Remember for connect */
     break;
+  case MYSQL_OPT_USE_RESULT:
+    mysql->options.separate_thread=1;		/* Use separate thread for query execution*/
+    break;
   case MYSQL_OPT_NAMED_PIPE:
     mysql->options.named_pipe=1;		/* Force named pipe */
     break;
@@ -1872,12 +1739,12 @@ my_ulonglong STDCALL mysql_insert_id(MYSQL *mysql)
 
 uint STDCALL mysql_errno(MYSQL *mysql)
 {
-  return (mysql)->net.last_errno;
+  return get_mysql_net(mysql)->last_errno;
 }
 
 const char * STDCALL mysql_error(MYSQL *mysql)
 {
-  return (mysql)->net.last_error;
+  return get_mysql_net(mysql)->last_error;
 }
 
 const char *STDCALL mysql_info(MYSQL *mysql)
diff --git a/sql/ha_myisam.cc b/sql/ha_myisam.cc
index a8bbc03aa915237624422e41a10387cb44190fd3..39549bae43cc63bd7a24c9b6b08cdf6285af1312 100644
--- a/sql/ha_myisam.cc
+++ b/sql/ha_myisam.cc
@@ -80,7 +80,7 @@ static void mi_check_print_msg(MI_CHECK *param,	const char* msg_type,
   net_store_data(packet, msg_type);
 
   net_store_data(packet, msgbuf);
-  if (my_net_write(&thd->net, (char*)thd->packet.ptr(), thd->packet.length()))
+  if (SEND_ROW(thd, &thd->net, 4, (char*)thd->packet.ptr(), thd->packet.length()))
     sql_print_error("Failed on my_net_write, writing to stderr instead: %s\n",
 		    msgbuf);
   return;
diff --git a/sql/net_pkg.cc b/sql/net_pkg.cc
index a201651fc2ff51c73caeec195976b946d9471e13..165caa219c13d22be2d2620ab04757310c17f988 100644
--- a/sql/net_pkg.cc
+++ b/sql/net_pkg.cc
@@ -48,6 +48,11 @@ void send_error(NET *net, uint sql_errno, const char *err)
       }
     }
   }
+
+#ifdef EMBEDDED_LIBRARY
+  net->last_errno= sql_errno;
+  strmake(net->last_error, err, sizeof(net->last_error)-1);
+#else
   if (net->vio == 0)
   {
     if (thd && thd->bootstrap)
@@ -70,6 +75,7 @@ void send_error(NET *net, uint sql_errno, const char *err)
     set_if_smaller(length,MYSQL_ERRMSG_SIZE);
   }
   VOID(net_write_command(net,(uchar) 255,(char*) err,length));
+#endif  /* EMBEDDED_LIBRARY*/
   if (thd)
     thd->fatal_error=0;			// Error message is given
   DBUG_VOID_RETURN;
@@ -123,6 +129,7 @@ net_printf(NET *net, uint errcode, ...)
     length=sizeof(net->last_error)-1;		/* purecov: inspected */
   va_end(args);
 
+#ifndef EMBEDDED_LIBRARY
   if (net->vio == 0)
   {
     if (thd && thd->bootstrap)
@@ -140,11 +147,16 @@ net_printf(NET *net, uint errcode, ...)
   if (offset)
     int2store(text_pos-2, errcode);
   VOID(net_real_write(net,(char*) net->buff,length+head_length+1+offset));
+#else
+  net->last_errno= errcode;
+  strmake(net->last_error, text_pos, length);
+#endif
   if (thd)
     thd->fatal_error=0;			// Error message is given
   DBUG_VOID_RETURN;
 }
 
+#ifndef EMBEDDED_LIBRARY
 
 void
 send_ok(NET *net,ha_rows affected_rows,ulonglong id,const char *message)
@@ -172,6 +184,8 @@ send_ok(NET *net,ha_rows affected_rows,ulonglong id,const char *message)
   DBUG_VOID_RETURN;
 }
 
+#endif /* EMBEDDED_LIBRARY */
+
 void
 send_eof(NET *net,bool no_flush)
 {
diff --git a/sql/sql_acl.cc b/sql/sql_acl.cc
index f8f13c35e350f6d46feffa1a42ac9cfe62e0c1bb..b7e2ecd31ae3955bfe48c661cb855beef45a812d 100644
--- a/sql/sql_acl.cc
+++ b/sql/sql_acl.cc
@@ -2512,8 +2512,12 @@ uint get_table_grant(THD *thd, TABLE_LIST *table)
   GRANT_TABLE *grant_table;
 
   pthread_mutex_lock(&LOCK_grant);
+#ifdef EMBEDDED_LIBRARY
+  grant_table= NULL;
+#else
   grant_table = table_hash_search(thd->host,thd->ip,db,user,
 				       table->real_name,0);
+#endif
   table->grant.grant_table=grant_table; // Remember for column test
   table->grant.version=grant_version;
   if (grant_table)
diff --git a/sql/sql_base.cc b/sql/sql_base.cc
index 5e3bf90c4a58462dae790f32dd579082e28b5491..164b2dbdc8148825ea0641122fc482ef5afdb37f 100644
--- a/sql/sql_base.cc
+++ b/sql/sql_base.cc
@@ -180,6 +180,8 @@ OPEN_TABLE_LIST *list_open_tables(THD *thd, const char *wild)
 }
 
 
+#ifndef EMBEDDED_LIBRARY
+
 /******************************************************************************
 ** Send name and type of result to client.
 ** Sum fields has table name empty and field_name.
@@ -264,6 +266,7 @@ send_fields(THD *thd,List<Item> &list,uint flag)
   return 1;					/* purecov: inspected */
 }
 
+#endif /* EMBEDDED_LIBRARY */
 
 /*****************************************************************************
  *	 Functions to free open table cache
diff --git a/sql/sql_class.cc b/sql/sql_class.cc
index d5d5c8fa6f9b28884643a96bb1f57ffe3a33b163..ea925a8c96d129aa9b1fe2f075ec38d9ca6d5e4d 100644
--- a/sql/sql_class.cc
+++ b/sql/sql_class.cc
@@ -383,6 +383,8 @@ bool select_send::send_fields(List<Item> &list,uint flag)
 }
 
 
+#ifndef EMBEDDED_LIBRARY
+
 /* Send data to client. Returns 0 if ok */
 
 bool select_send::send_data(List<Item> &items)
@@ -411,6 +413,7 @@ bool select_send::send_data(List<Item> &items)
   bool error=my_net_write(&thd->net,(char*) packet->ptr(),packet->length());
   DBUG_RETURN(error);
 }
+#endif /* EMBEDDED_LIBRARY */
 
 bool select_send::send_eof()
 {
diff --git a/sql/sql_class.h b/sql/sql_class.h
index 5dc761ff81112bc8d1893a5a49fc0cb4cbee48d5..5b88d5afc23e7e15dee188397a0f66602c0fce35 100644
--- a/sql/sql_class.h
+++ b/sql/sql_class.h
@@ -273,6 +273,10 @@ class delayed_insert;
 #define THD_SENTRY_MAGIC 0xfeedd1ff
 #define THD_SENTRY_GONE  0xdeadbeef
 
+#ifdef EMBEDDED_LIBRARY
+typedef struct st_mysql;
+#endif
+
 #define THD_CHECK_SENTRY(thd) DBUG_ASSERT(thd->dbug_sentry == THD_SENTRY_MAGIC)
 
 /* For each client connection we create a separate thread with THD serving as
@@ -287,6 +291,9 @@ public:
   String  packet; // dynamic string buffer used for network I/O		
   struct  sockaddr_in remote; // client socket address
   struct  rand_struct rand; // used for authentication
+#ifdef EMBEDDED_LIBRARY
+  struct st_mysql  *mysql;
+#endif
   
   /* query points to the current query,
      thread_stack is a pointer to the stack frame of handle_one_connection(),
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc
index 469de136fbb6ff80816f9279e19131cd94620653..f13acee5c53e8c176454be1ed2453bab77b9ec70 100644
--- a/sql/sql_parse.cc
+++ b/sql/sql_parse.cc
@@ -791,8 +791,9 @@ err:
 }
 
 
-	/* Execute one command from socket (query or simple command) */
+#ifndef EMBEDDED_LIBRARY
 
+	/* Execute one command from socket (query or simple command) */
 bool do_command(THD *thd)
 {
   char *packet;
@@ -830,6 +831,7 @@ bool do_command(THD *thd)
   DBUG_RETURN(dispatch_command(command,thd, packet+1, (uint) packet_length));
 }
 
+#endif  /* EMBEDDED_LIBRARY */
 
 bool dispatch_command(enum enum_server_command command, THD *thd,
 		      char* packet, uint packet_length)
diff --git a/sql/sql_show.cc b/sql/sql_show.cc
index 849a803a6223bc4bbfd7b9e61407a9c71bfc2d17..d9c21b75ed9932b7ca0f6f111f708174972f6ba7 100644
--- a/sql/sql_show.cc
+++ b/sql/sql_show.cc
@@ -52,8 +52,6 @@ extern struct st_VioSSLAcceptorFd * ssl_acceptor_fd;
 ** Send list of databases
 ** A database is a directory in the mysql_data_home directory
 ****************************************************************************/
-
-
 int
 mysqld_show_dbs(THD *thd,const char *wild)
 {
@@ -85,8 +83,8 @@ mysqld_show_dbs(THD *thd,const char *wild)
       {
       thd->packet.length(0);
       net_store_data(&thd->packet, thd->convert_set, file_name);
-      if (my_net_write(&thd->net, (char*) thd->packet.ptr(),
-		       thd->packet.length()))
+      if (SEND_ROW(thd, &thd->net, field_list.elements, 
+			    (char *)thd->packet.ptr(), thd->packet.length()))
 	DBUG_RETURN(-1);
     }
   }
@@ -123,8 +121,9 @@ int mysqld_show_open_tables(THD *thd,const char *wild)
     net_store_data(&thd->packet,convert, open_list->table);
     net_store_data(&thd->packet,open_list->in_use);
     net_store_data(&thd->packet,open_list->locked);
-    if (my_net_write(&thd->net,(char*) thd->packet.ptr(),thd->packet.length()))
-      DBUG_RETURN(-1);
+    if (SEND_ROW(thd, &thd->net, field_list.elements, 
+			  (char *)thd->packet.ptr(), thd->packet.length()))
+	DBUG_RETURN(-1);
   }
 
   send_eof(&thd->net);
@@ -162,8 +161,9 @@ int mysqld_show_tables(THD *thd,const char *db,const char *wild)
   {
     thd->packet.length(0);
     net_store_data(&thd->packet, thd->convert_set, file_name);
-    if (my_net_write(&thd->net,(char*) thd->packet.ptr(),thd->packet.length()))
-      DBUG_RETURN(-1);
+    if (SEND_ROW(thd, &thd->net, field_list.elements, 
+			  (char *)thd->packet.ptr(), thd->packet.length()))
+	DBUG_RETURN(-1);
   }
   send_eof(&thd->net);
   DBUG_RETURN(0);
@@ -411,9 +411,9 @@ int mysqld_extend_show_tables(THD *thd,const char *db,const char *wild)
       }
       close_thread_tables(thd,0);
     }
-    if (my_net_write(&thd->net,(char*) packet->ptr(),
-                     packet->length()))
-      DBUG_RETURN(-1);
+    if (SEND_ROW(thd, &thd->net, field_list.elements, 
+		 (char *)thd->packet.ptr(), thd->packet.length()))
+	DBUG_RETURN(-1);
   }
   send_eof(&thd->net);
   DBUG_RETURN(0);
@@ -424,7 +424,6 @@ int mysqld_extend_show_tables(THD *thd,const char *db,const char *wild)
 /***************************************************************************
 ** List all columns in a table
 ***************************************************************************/
-
 int
 mysqld_show_fields(THD *thd, TABLE_LIST *table_list,const char *wild,
 		   bool verbose)
@@ -523,8 +522,8 @@ mysqld_show_fields(THD *thd, TABLE_LIST *table_list,const char *wild,
 	if (verbose)
 	{
 	  /* Add grant options */
-	  col_access= get_column_grant(thd,table_list,field) & COL_ACLS;
 	  end=tmp;
+	  col_access= get_column_grant(thd,table_list,field) & COL_ACLS;
 	  for (uint bitnr=0; col_access ; col_access>>=1,bitnr++)
 	  {
 	    if (col_access & 1)
@@ -535,8 +534,9 @@ mysqld_show_fields(THD *thd, TABLE_LIST *table_list,const char *wild,
 	  }
 	  net_store_data(packet,convert, tmp+1,end == tmp ? 0 : (uint) (end-tmp-1));
 	}
-        if (my_net_write(&thd->net,(char*) packet->ptr(),packet->length()))
-          DBUG_RETURN(1);
+	if (SEND_ROW(thd, &thd->net, field_list.elements, 
+		     (char *)thd->packet.ptr(), thd->packet.length()))
+	  DBUG_RETURN(-1);
       }
     }
   }
@@ -591,8 +591,9 @@ mysqld_show_create(THD *thd, TABLE_LIST *table_list)
     int3store(p, create_len);
 
     // now we are in business :-)
-    if (my_net_write(&thd->net, (char*)packet->ptr(), packet->length()))
-      DBUG_RETURN(1);
+    if (SEND_ROW(thd, &thd->net, field_list.elements, 
+			  (char *)thd->packet.ptr(), thd->packet.length()))
+      DBUG_RETURN(-1);
   }
   send_eof(&thd->net);
   DBUG_RETURN(0);
@@ -714,8 +715,9 @@ mysqld_show_keys(THD *thd, TABLE_LIST *table_list)
       net_store_data(packet,convert,table->file->index_type(i));
       /* Comment */
       net_store_data(packet,convert,"");
-      if (my_net_write(&thd->net,(char*) packet->ptr(),packet->length()))
-        DBUG_RETURN(1); /* purecov: inspected */
+      if (SEND_ROW(thd, &thd->net, field_list.elements, 
+			    (char *)thd->packet.ptr(), thd->packet.length()))
+	DBUG_RETURN(-1);
     }
   }
   send_eof(&thd->net);
@@ -1126,8 +1128,9 @@ void mysqld_list_processes(THD *thd,const char *user, bool verbose)
       net_store_data(packet,convert,thd_info->query);
     else
       net_store_null(packet);
-    if (my_net_write(&thd->net,(char*) packet->ptr(),packet->length()))
-      break; /* purecov: inspected */
+    if (SEND_ROW(thd, &thd->net, field_list.elements, 
+			  (char *)thd->packet.ptr(), thd->packet.length()))
+      break;
   }
   send_eof(&thd->net);
   DBUG_VOID_RETURN;
@@ -1372,8 +1375,9 @@ int mysqld_show(THD *thd, const char *wild, show_var_st *variables)
 
 #endif /* HAVE_OPENSSL */
       }
-      if (my_net_write(&thd->net, (char*) packet2.ptr(),packet2.length()))
-        goto err;                               /* purecov: inspected */
+      if (SEND_ROW(thd, &thd->net, field_list.elements, 
+		   (char *)packet2.ptr(), packet2.length()))
+	goto err;
     }
   }
   pthread_mutex_unlock(&LOCK_status);
diff --git a/sql/sql_table.cc b/sql/sql_table.cc
index bdcb325774babfe36958b947946dfb5989ce5c6a..9c2078acad4a548bcc47f7b33cbc58dda77938e1 100644
--- a/sql/sql_table.cc
+++ b/sql/sql_table.cc
@@ -1060,6 +1060,9 @@ static int mysql_admin_table(THD* thd, TABLE_LIST* tables,
 
     thd->open_options|= extra_open_options;
     table->table = open_ltable(thd, table, lock_type);
+#ifdef EMBEDDED_LIBRARY
+    thd->net.last_errno= 0;  // these errors shouldn't get client
+#endif
     thd->open_options&= ~extra_open_options;
     packet->length(0);
     if (prepare_func)
@@ -1174,8 +1177,8 @@ static int mysql_admin_table(THD* thd, TABLE_LIST* tables,
 			      table->table->real_name);
     close_thread_tables(thd);
     table->table=0;				// For query cache
-    if (my_net_write(&thd->net, (char*) packet->ptr(),
-		     packet->length()))
+    if (SEND_ROW(thd, &thd->net, field_list.elements, 
+			  (char *)thd->packet.ptr(), thd->packet.length()))
       goto err;
   }