diff --git a/mysql-test/r/ndb_autodiscover.result b/mysql-test/r/ndb_autodiscover.result
index b7afb5918a437c335c35ef9bec1c28b87a73c6f8..b278d6eb04804dac565eeacc0e7968b9802993de 100644
--- a/mysql-test/r/ndb_autodiscover.result
+++ b/mysql-test/r/ndb_autodiscover.result
@@ -93,7 +93,7 @@ name char(20), a int, b float, c char(24)
 ERROR 42S01: Table 't3' already exists
 show status like 'handler_discover%';
 Variable_name	Value
-Handler_discover	1
+Handler_discover	0
 create table IF NOT EXISTS t3(
 id int not null primary key,
 id2 int not null,
@@ -101,7 +101,7 @@ name char(20)
 ) engine=ndb;
 show status like 'handler_discover%';
 Variable_name	Value
-Handler_discover	2
+Handler_discover	0
 SHOW CREATE TABLE t3;
 Table	Create Table
 t3	CREATE TABLE `t3` (
@@ -114,7 +114,7 @@ id	name
 1	Explorer
 show status like 'handler_discover%';
 Variable_name	Value
-Handler_discover	2
+Handler_discover	1
 drop table t3;
 flush status;
 create table t7(
@@ -358,6 +358,20 @@ Database
 mysql
 test
 use test;
+CREATE TABLE sys.SYSTAB_0 (a int);
+ERROR 42S01: Table 'SYSTAB_0' already exists
+select * from sys.SYSTAB_0;
+ERROR HY000: Failed to open 'SYSTAB_0', error while unpacking from engine
+CREATE TABLE IF NOT EXISTS sys.SYSTAB_0 (a int);
+show warnings;
+Level	Code	Message
+select * from sys.SYSTAB_0;
+ERROR HY000: Failed to open 'SYSTAB_0', error while unpacking from engine
+drop table sys.SYSTAB_0;
+ERROR 42S02: Unknown table 'SYSTAB_0'
+drop table IF EXISTS sys.SYSTAB_0;
+Warnings:
+Note	1051	Unknown table 'SYSTAB_0'
 CREATE TABLE t9 (
 a int NOT NULL PRIMARY KEY,
 b int
diff --git a/mysql-test/t/ndb_autodiscover.test b/mysql-test/t/ndb_autodiscover.test
index bd73a36fcabf5455b8a24193b7a86207f735d061..49ed8c894febe4e273fdc76fbb0e3b6a07ffd71c 100644
--- a/mysql-test/t/ndb_autodiscover.test
+++ b/mysql-test/t/ndb_autodiscover.test
@@ -453,6 +453,27 @@ drop database test2;
 show databases;
 use test;
 
+#####################################################
+# Test that it's not possible to create tables
+# with same name as NDB internal tables
+# This will also test that it's not possible to create
+# a table with tha same name as a table that can't be
+# discovered( for example a table created via NDBAPI)
+
+--error 1050
+CREATE TABLE sys.SYSTAB_0 (a int);
+--error 1105
+select * from sys.SYSTAB_0;
+
+CREATE TABLE IF NOT EXISTS sys.SYSTAB_0 (a int);
+show warnings;
+--error 1105
+select * from sys.SYSTAB_0;
+
+--error 1051
+drop table sys.SYSTAB_0;
+drop table IF EXISTS sys.SYSTAB_0;
+
 ######################################################
 # Note! This should always be the last step in this 
 # file, the table t9 will be used and dropped 
diff --git a/ndb/test/ndbapi/create_tab.cpp b/ndb/test/ndbapi/create_tab.cpp
index f3f18982ed0c1c1fbfa2e1f48fc36bcfd2ce0cb1..283c83d30e0099fe8fb0c8feea2fc0db14898661 100644
--- a/ndb/test/ndbapi/create_tab.cpp
+++ b/ndb/test/ndbapi/create_tab.cpp
@@ -77,8 +77,8 @@ int main(int argc, const char** argv){
      */
     
     // Connect to Ndb
+    Ndb::setConnectString(_connectstr);
     Ndb MyNdb( "TEST_DB" );
-    MyNdb.setConnectString(_connectstr);
     
     if(MyNdb.init() != 0){
       ERR(MyNdb.getNdbError());
diff --git a/sql/ha_ndbcluster.cc b/sql/ha_ndbcluster.cc
index a0080af1dfb30c5ea846bc2fb5910494e2b0df04..c9217812f5c59822217e29b5fff734d354ec22ce 100644
--- a/sql/ha_ndbcluster.cc
+++ b/sql/ha_ndbcluster.cc
@@ -4300,7 +4300,7 @@ int ndbcluster_discover(THD* thd, const char *db, const char *name,
   {    
     const NdbError err= dict->getNdbError();
     if (err.code == 709)
-      DBUG_RETURN(1);
+      DBUG_RETURN(-1);
     ERR_RETURN(err);
   }
   DBUG_PRINT("info", ("Found table %s", tab->getName()));
@@ -4308,13 +4308,15 @@ int ndbcluster_discover(THD* thd, const char *db, const char *name,
   len= tab->getFrmLength();  
   if (len == 0 || tab->getFrmData() == NULL)
   {
-    DBUG_PRINT("No frm data found",
-               ("Table is probably created via NdbApi")); 
-    DBUG_RETURN(2);
+    DBUG_PRINT("error", ("No frm data found."));
+    DBUG_RETURN(1);
   }
   
   if (unpackfrm(&data, &len, tab->getFrmData()))
-    DBUG_RETURN(3);
+  {
+    DBUG_PRINT("error", ("Could not unpack table"));
+    DBUG_RETURN(1);
+  }
 
   *frmlen= len;
   *frmblob= data;
@@ -4327,13 +4329,13 @@ int ndbcluster_discover(THD* thd, const char *db, const char *name,
    
  */
 
-int ndbcluster_table_exists(THD* thd, const char *db, const char *name)
+int ndbcluster_table_exists_in_engine(THD* thd, const char *db, const char *name)
 {
   uint len;
   const void* data;
   const NDBTAB* tab;
   Ndb* ndb;
-  DBUG_ENTER("ndbcluster_table_exists");
+  DBUG_ENTER("ndbcluster_table_exists_in_engine");
   DBUG_PRINT("enter", ("db: %s, name: %s", db, name)); 
 
   if (!(ndb= check_ndb_in_thd(thd)))
@@ -4512,7 +4514,7 @@ int ndbcluster_find_files(THD *thd,const char *db,const char *path,
     DBUG_PRINT("info", ("%s existed on disk", name));     
     // The .ndb file exists on disk, but it's not in list of tables in ndb
     // Verify that handler agrees table is gone.
-    if (ndbcluster_table_exists(thd, db, file_name) == 0)    
+    if (ndbcluster_table_exists_in_engine(thd, db, file_name) == 0)    
     {
       DBUG_PRINT("info", ("NDB says %s does not exists", file_name));     
       it.remove();
@@ -4563,7 +4565,7 @@ int ndbcluster_find_files(THD *thd,const char *db,const char *path,
   while ((file_name=it2++))
   {  
     DBUG_PRINT("info", ("Table %s need discovery", name));
-    if (ha_create_table_from_engine(thd, db, file_name, TRUE) == 0)
+    if (ha_create_table_from_engine(thd, db, file_name) == 0)
       files->push_back(thd->strdup(file_name)); 
   }
 
@@ -4639,11 +4641,8 @@ bool ndbcluster_init()
   pthread_mutex_init(&ndbcluster_mutex,MY_MUTEX_INIT_FAST);
 
   ndbcluster_inited= 1;
-#ifdef USE_DISCOVER_ON_STARTUP
-  if (ndb_discover_tables() != 0)
-    goto ndbcluster_init_error;    
-#endif
   DBUG_RETURN(FALSE);
+
  ndbcluster_init_error:
   ndbcluster_end();
   DBUG_RETURN(TRUE);
diff --git a/sql/ha_ndbcluster.h b/sql/ha_ndbcluster.h
index 439b485514730509d0763f35c7685cf2d4d61898..5c1d121a157a19af39788db57f678b3f7b80e242 100644
--- a/sql/ha_ndbcluster.h
+++ b/sql/ha_ndbcluster.h
@@ -275,7 +275,8 @@ int ndbcluster_discover(THD* thd, const char* dbname, const char* name,
 			const void** frmblob, uint* frmlen);
 int ndbcluster_find_files(THD *thd,const char *db,const char *path,
 			  const char *wild, bool dir, List<char> *files);
-int ndbcluster_table_exists(THD* thd, const char *db, const char *name);
+int ndbcluster_table_exists_in_engine(THD* thd,
+                                      const char *db, const char *name);
 int ndbcluster_drop_database(const char* path);
 
 void ndbcluster_print_error(int error, const NdbOperation *error_op);
diff --git a/sql/handler.cc b/sql/handler.cc
index f14564b6629faeb158e7b59178ce6ac09bb7f871..dacfc7d9ac5bd5d1f3dbf70c3c92404488aec84e 100644
--- a/sql/handler.cc
+++ b/sql/handler.cc
@@ -1336,21 +1336,19 @@ int ha_create_table(const char *name, HA_CREATE_INFO *create_info,
 }
 
 /*
-  Try to discover table from engine and 
+  Try to discover table from engine and
   if found, write the frm file to disk.
-  
+
   RETURN VALUES:
-   0 : Table existed in engine and created 
-       on disk if so requested
-   1 : Table does not exist
-  >1 : error
+  -1 : Table did not exists
+   0 : Table created ok
+   > 0 : Error, table existed but could not be created
 
 */
 
-int ha_create_table_from_engine(THD* thd, 
-				const char *db, 
-				const char *name,
-				bool create_if_found)
+int ha_create_table_from_engine(THD* thd,
+				const char *db,
+				const char *name)
 {
   int error;
   const void *frmblob;
@@ -1359,45 +1357,47 @@ int ha_create_table_from_engine(THD* thd,
   HA_CREATE_INFO create_info;
   TABLE table;
   DBUG_ENTER("ha_create_table_from_engine");
-  DBUG_PRINT("enter", ("name '%s'.'%s'  create_if_found: %d",
-                       db, name, create_if_found));
+  DBUG_PRINT("enter", ("name '%s'.'%s'",
+                       db, name));
 
   bzero((char*) &create_info,sizeof(create_info));
 
-  if ((error= ha_discover(thd, db, name, &frmblob, &frmlen)))
-    DBUG_RETURN(error); 
+  if(error= ha_discover(thd, db, name, &frmblob, &frmlen))
+  {
+    // Table could not be discovered and thus not created
+    DBUG_RETURN(error);
+  }
+
   /*
-    Table exists in handler
-    frmblob and frmlen are set
+    Table exists in handler and could be discovered
+    frmblob and frmlen are set, write the frm to disk
   */
 
-  if (create_if_found)
+  (void)strxnmov(path,FN_REFLEN,mysql_data_home,"/",db,"/",name,NullS);
+  // Save the frm file
+  if (writefrm(path, frmblob, frmlen))
   {
-    (void)strxnmov(path,FN_REFLEN,mysql_data_home,"/",db,"/",name,NullS);
-    // Save the frm file    
-    if ((error = writefrm(path, frmblob, frmlen)))
-      goto err_end;
+    my_free((char*) frmblob, MYF(MY_ALLOW_ZERO_PTR));
+    DBUG_RETURN(2);
+  }
 
-    if (openfrm(path,"",0,(uint) READ_ALL, 0, &table))
-      DBUG_RETURN(1);
+  if (openfrm(path,"",0,(uint) READ_ALL, 0, &table))
+    DBUG_RETURN(3);
 
-    update_create_info_from_table(&create_info, &table);
-    create_info.table_options|= HA_CREATE_FROM_ENGINE;
+  update_create_info_from_table(&create_info, &table);
+  create_info.table_options|= HA_CREATE_FROM_ENGINE;
 
-    if (lower_case_table_names == 2 &&
-	!(table.file->table_flags() & HA_FILE_BASED))
-    {
-      /* Ensure that handler gets name in lower case */
-      my_casedn_str(files_charset_info, path);
-    }
-    
-    error=table.file->create(path,&table,&create_info);
-    VOID(closefrm(&table));
+  if (lower_case_table_names == 2 &&
+      !(table.file->table_flags() & HA_FILE_BASED))
+  {
+    /* Ensure that handler gets name in lower case */
+    my_casedn_str(files_charset_info, path);
   }
-
-err_end:
+  error=table.file->create(path,&table,&create_info);
+  VOID(closefrm(&table));
   my_free((char*) frmblob, MYF(MY_ALLOW_ZERO_PTR));
-  DBUG_RETURN(error);  
+
+  DBUG_RETURN(error != 0);
 }
 
 static int NEAR_F delete_file(const char *name,const char *ext,int extflag)
@@ -1507,14 +1507,15 @@ int ha_change_key_cache(KEY_CACHE *old_key_cache,
   Try to discover one table from handler(s)
 
   RETURN
-    0  ok. In this case *frmblob and *frmlen are set
-    1  error.  frmblob and frmlen may not be set
+   -1  : Table did not exists
+    0  : OK. In this case *frmblob and *frmlen are set
+    >0 : error.  frmblob and frmlen may not be set
 */
 
 int ha_discover(THD *thd, const char *db, const char *name,
 		const void **frmblob, uint *frmlen)
 {
-  int error= 1; // Table does not exist in any handler
+  int error= -1; // Table does not exist in any handler
   DBUG_ENTER("ha_discover");
   DBUG_PRINT("enter", ("db: %s, name: %s", db, name));
 #ifdef HAVE_NDBCLUSTER_DB
@@ -1546,11 +1547,8 @@ ha_find_files(THD *thd,const char *db,const char *path,
     error= ndbcluster_find_files(thd, db, path, wild, dir, files);
 #endif
   DBUG_RETURN(error);
-  
-  
 }
 
-#ifdef NOT_YET_USED
 
 /*
   Ask handler if the table exists in engine
@@ -1561,20 +1559,19 @@ ha_find_files(THD *thd,const char *db,const char *path,
     #                   Error code
 
  */
-int ha_table_exists(THD* thd, const char* db, const char* name)
+int ha_table_exists_in_engine(THD* thd, const char* db, const char* name)
 {
-  int error= 2;
-  DBUG_ENTER("ha_table_exists");
+  int error= 0;
+  DBUG_ENTER("ha_table_exists_in_engine");
   DBUG_PRINT("enter", ("db: %s, name: %s", db, name));
 #ifdef HAVE_NDBCLUSTER_DB
   if (have_ndbcluster == SHOW_OPTION_YES)
-    error= ndbcluster_table_exists(thd, db, name);
+    error= ndbcluster_table_exists_in_engine(thd, db, name);
 #endif
+  DBUG_PRINT("exit", ("error: %d", error));
   DBUG_RETURN(error);
 }
 
-#endif
-
 
 /*
   Read first row between two ranges.
diff --git a/sql/handler.h b/sql/handler.h
index 75e83082d10eb3cd356b86abccb95e41b471ec6c..efcdee8f56c0df4c8ba925848f1cf2370bd7798d 100644
--- a/sql/handler.h
+++ b/sql/handler.h
@@ -547,8 +547,7 @@ enum db_type ha_checktype(enum db_type database_type);
 my_bool ha_storage_engine_is_enabled(enum db_type database_type);
 int ha_create_table(const char *name, HA_CREATE_INFO *create_info,
 		    bool update_create_info);
-int ha_create_table_from_engine(THD* thd, const char *db, const char *name,
-				bool create_if_found);
+int ha_create_table_from_engine(THD* thd, const char *db, const char *name);
 int ha_delete_table(enum db_type db_type, const char *path);
 void ha_drop_database(char* path);
 int ha_init_key_cache(const char *name, KEY_CACHE *key_cache);
@@ -574,6 +573,6 @@ int ha_discover(THD* thd, const char* dbname, const char* name,
 		const void** frmblob, uint* frmlen);
 int ha_find_files(THD *thd,const char *db,const char *path,
 		  const char *wild, bool dir,List<char>* files);
-int ha_table_exists(THD* thd, const char* db, const char* name);
+int ha_table_exists_in_engine(THD* thd, const char* db, const char* name);
 TYPELIB *ha_known_exts(void);
 int ha_start_consistent_snapshot(THD *thd);
diff --git a/sql/sql_base.cc b/sql/sql_base.cc
index e3c0efb83b87938a3e1e865091011c5e96cad8fb..b4c212afb3fbceefd48918d3b125dbe22195ce1f 100644
--- a/sql/sql_base.cc
+++ b/sql/sql_base.cc
@@ -1375,9 +1375,19 @@ static int open_unireg_entry(THD *thd, TABLE *entry, const char *db,
        trying to discover the table at the same time.
       */
       if (discover_retry_count++ != 0)
-       goto err;
-      if (ha_create_table_from_engine(thd, db, name, TRUE) != 0)
-       goto err;
+        goto err;
+      if (ha_create_table_from_engine(thd, db, name) > 0)
+      {
+        /* Give right error message */
+        thd->clear_error();
+        DBUG_PRINT("error", ("Dicovery of %s/%s failed", db, name));
+        my_printf_error(ER_UNKNOWN_ERROR,
+                        "Failed to open '%-.64s', error while "
+                        "unpacking from engine",
+                        MYF(0), name);
+
+        goto err;
+      }
 
       thd->clear_error(); // Clear error message
       continue;
diff --git a/sql/sql_table.cc b/sql/sql_table.cc
index e2e6ee233232abe7022d3448ac21cde388f8505a..d7a07d17761491503337bea8ad615ed4386a9a51 100644
--- a/sql/sql_table.cc
+++ b/sql/sql_table.cc
@@ -244,15 +244,18 @@ int mysql_rm_table_part2(THD *thd, TABLE_LIST *tables, bool if_exists,
       /* remove form file and isam files */
       build_table_path(path, sizeof(path), db, alias, reg_ext);
     }
-    if (drop_temporary || 
-	(access(path,F_OK) && ha_create_table_from_engine(thd,db,alias,TRUE)))
+    if (drop_temporary ||
+	(access(path,F_OK) &&
+         ha_create_table_from_engine(thd, db, alias)))
     {
+      // Table was not found on disk and table can't be created from engine
       if (if_exists)
 	push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_NOTE,
 			    ER_BAD_TABLE_ERROR, ER(ER_BAD_TABLE_ERROR),
 			    table->real_name);
       else
-	error= 1;
+        error= 1;
+
     }
     else
     {
@@ -1394,15 +1397,14 @@ int mysql_create_table(THD *thd,const char *db, const char *table_name,
   {
     bool create_if_not_exists =
       create_info->options & HA_LEX_CREATE_IF_NOT_EXISTS;
-    if (!ha_create_table_from_engine(thd, db, table_name,
-				     create_if_not_exists))
+    if (ha_table_exists_in_engine(thd, db, table_name))
     {
-      DBUG_PRINT("info", ("Table already existed in handler"));
+      DBUG_PRINT("info", ("Table with same name already existed in handler"));
 
       if (create_if_not_exists)
       {
-       create_info->table_existed= 1;   // Mark that table existed
-       error= 0;
+        create_info->table_existed= 1;   // Mark that table existed
+        error= 0;
       }
       else
        my_error(ER_TABLE_EXISTS_ERROR,MYF(0),table_name);