diff --git a/mysql-test/r/ndb_autodiscover.result b/mysql-test/r/ndb_autodiscover.result
index 4a2bc6e9d9080b9d3b3d338905bb224eb9a2d89c..23f089b9bc06ddeda141e062f314a05324b5a134 100644
--- a/mysql-test/r/ndb_autodiscover.result
+++ b/mysql-test/r/ndb_autodiscover.result
@@ -332,7 +332,7 @@ Handler_discover	0
 drop table t6;
 show tables;
 Tables_in_test
-create table t1 (a int) engine=ndb;
+create table t1 (a int,b longblob) engine=ndb;
 show tables;
 Tables_in_test
 t1
@@ -342,10 +342,10 @@ show tables;
 Tables_in_test2
 select * from t1;
 ERROR 42S02: Table 'test2.t1' doesn't exist
-create table t2 (b int) engine=ndb;
+create table t2 (b int,c longblob) engine=ndb;
 use test;
 select * from t1;
-a
+a	b
 show tables;
 Tables_in_test
 t1
diff --git a/mysql-test/t/ndb_autodiscover.test b/mysql-test/t/ndb_autodiscover.test
index f828b009af0367fa220d5a9a6c4a6e014e537193..95b616fc7b231ee7c652d293120f55c320ac436c 100644
--- a/mysql-test/t/ndb_autodiscover.test
+++ b/mysql-test/t/ndb_autodiscover.test
@@ -434,14 +434,14 @@ drop table t6;
 
 show tables;
 
-create table t1 (a int) engine=ndb;
+create table t1 (a int,b longblob) engine=ndb;
 show tables;
 create database test2;
 use test2;
 show tables;
 --error 1146
 select * from t1;
-create table t2 (b int) engine=ndb;
+create table t2 (b int,c longblob) engine=ndb;
 use test;
 select * from t1;
 show tables;
diff --git a/ndb/src/ndbapi/Ndb.cpp b/ndb/src/ndbapi/Ndb.cpp
index dab579488225d91be48f5231cde77e2d918b210d..be8ba86c81794d38a6cee0dafcb92a662471177e 100644
--- a/ndb/src/ndbapi/Ndb.cpp
+++ b/ndb/src/ndbapi/Ndb.cpp
@@ -770,7 +770,8 @@ Ndb::getAutoIncrementValue(const char* aTableName, Uint32 cacheSize)
 {
   DEBUG_TRACE("getAutoIncrementValue");
   const char * internalTableName = internalizeTableName(aTableName);
-  Ndb_local_table_info *info= theDictionary->get_local_table_info(internalTableName);
+  Ndb_local_table_info *info=
+    theDictionary->get_local_table_info(internalTableName, false);
   if (info == 0)
     return ~0;
   const NdbTableImpl *table= info->m_table_impl;
@@ -851,7 +852,8 @@ Ndb::setAutoIncrementValue(const char* aTableName, Uint64 val, bool increase)
 {
   DEBUG_TRACE("setAutoIncrementValue " << val);
   const char * internalTableName= internalizeTableName(aTableName);
-  Ndb_local_table_info *info= theDictionary->get_local_table_info(internalTableName);
+  Ndb_local_table_info *info=
+    theDictionary->get_local_table_info(internalTableName, false);
   if (info == 0) {
     theError= theDictionary->getNdbError();
     return false;
diff --git a/ndb/src/ndbapi/NdbDictionaryImpl.cpp b/ndb/src/ndbapi/NdbDictionaryImpl.cpp
index ef92d07cb0c645a0b55b0657ba2fca4f7da2030d..5e640cdebd535624321d7034a6973473fd3bcb03 100644
--- a/ndb/src/ndbapi/NdbDictionaryImpl.cpp
+++ b/ndb/src/ndbapi/NdbDictionaryImpl.cpp
@@ -653,7 +653,8 @@ NdbDictionaryImpl::fetchGlobalTableImpl(const char * internalTableName)
   m_globalHash->unlock();
 
   if (impl == 0){
-    impl = m_receiver.getTable(internalTableName, m_ndb.usingFullyQualifiedNames());
+    impl = m_receiver.getTable(internalTableName,
+			       m_ndb.usingFullyQualifiedNames());
     m_globalHash->lock();
     m_globalHash->put(internalTableName, impl);
     m_globalHash->unlock();
@@ -663,15 +664,14 @@ NdbDictionaryImpl::fetchGlobalTableImpl(const char * internalTableName)
     }
   }
 
-  Ndb_local_table_info *info= Ndb_local_table_info::create(impl, m_local_table_data_size);
+  Ndb_local_table_info *info=
+    Ndb_local_table_info::create(impl, m_local_table_data_size);
 
   m_localHash.put(internalTableName, info);
 
   m_ndb.theFirstTupleId[impl->getTableId()] = ~0;
   m_ndb.theLastTupleId[impl->getTableId()]  = ~0;
   
-  addBlobTables(*impl);
-
   return info;
 }
 
@@ -1333,12 +1333,13 @@ NdbDictionaryImpl::createTable(NdbTableImpl &t)
   if (t.m_noOfBlobs == 0)
     return 0;
   // update table def from DICT
-  NdbTableImpl * tp = getTable(t.m_externalName.c_str());
-  if (tp == NULL) {
+  Ndb_local_table_info *info=
+    get_local_table_info(t.m_internalName.c_str(),false);
+  if (info == NULL) {
     m_error.code = 709;
     return -1;
   }
-  if (createBlobTables(* tp) != 0) {
+  if (createBlobTables(*(info->m_table_impl)) != 0) {
     int save_code = m_error.code;
     (void)dropTable(t);
     m_error.code = save_code;
@@ -1359,8 +1360,12 @@ NdbDictionaryImpl::createBlobTables(NdbTableImpl &t)
     if (createTable(bt) != 0)
       return -1;
     // Save BLOB table handle
-    NdbTableImpl * cachedBlobTable = getTable(bt.m_externalName.c_str());
-    c.m_blobTable = cachedBlobTable;
+    Ndb_local_table_info *info=
+      get_local_table_info(bt.m_internalName.c_str(),false);
+    if (info == 0) {
+      return -1;
+    }
+    c.m_blobTable = info->m_table_impl;
   }
   
   return 0;
@@ -1369,14 +1374,22 @@ NdbDictionaryImpl::createBlobTables(NdbTableImpl &t)
 int
 NdbDictionaryImpl::addBlobTables(NdbTableImpl &t)
 {
-  for (unsigned i = 0; i < t.m_columns.size(); i++) {
+  unsigned n= t.m_noOfBlobs;
+  // optimized for blob column being the last one
+  // and not looking for more than one if not neccessary
+  for (unsigned i = t.m_columns.size(); i > 0 && n > 0;) {
+    i--;
     NdbColumnImpl & c = *t.m_columns[i];
     if (! c.getBlobType() || c.getPartSize() == 0)
       continue;
+    n--;
     char btname[NdbBlob::BlobTableNameSize];
     NdbBlob::getBlobTableName(btname, &t, &c);
     // Save BLOB table handle
-    NdbTableImpl * cachedBlobTable = getTable(btname);;
+    NdbTableImpl * cachedBlobTable = getTable(btname);
+    if (cachedBlobTable == 0) {
+      return -1;
+    }
     c.m_blobTable = cachedBlobTable;
   }
   
@@ -1587,7 +1600,8 @@ NdbDictInterface::createOrAlterTable(Ndb & ndb,
     : createTable(&tSignal, ptr);
 
   if (!alter && haveAutoIncrement) {
-    if (!ndb.setAutoIncrementValue(impl.m_externalName.c_str(), autoIncrementValue)) {
+    if (!ndb.setAutoIncrementValue(impl.m_externalName.c_str(),
+				   autoIncrementValue)) {
       if (ndb.theError.code == 0) {
 	m_error.code = 4336;
 	ndb.theError = m_error;
@@ -1607,7 +1621,6 @@ NdbDictInterface::createTable(NdbApiSignal* signal, LinearSectionPtr ptr[3])
   SimplePropertiesLinearReader r(ptr[0].p, ptr[0].sz);
   r.printAll(ndbout);
 #endif
-
   const int noErrCodes = 2;
   int errCodes[noErrCodes] = 
      {CreateTableRef::Busy,
@@ -1625,7 +1638,10 @@ void
 NdbDictInterface::execCREATE_TABLE_CONF(NdbApiSignal * signal,
 					LinearSectionPtr ptr[3])
 {
-  //CreateTableConf* const conf = CAST_PTR(CreateTableConf, signal->getDataPtr());
+  const CreateTableConf* const conf=
+    CAST_CONSTPTR(CreateTableConf, signal->getDataPtr());
+  Uint32 tableId= conf->tableId;
+  Uint32 tableVersion= conf->tableVersion;
   
   m_waiter.signal(NO_WAIT);  
 }
@@ -1634,7 +1650,8 @@ void
 NdbDictInterface::execCREATE_TABLE_REF(NdbApiSignal * signal,
 				       LinearSectionPtr ptr[3])
 {
-  const CreateTableRef* const ref = CAST_CONSTPTR(CreateTableRef, signal->getDataPtr());
+  const CreateTableRef* const ref=
+    CAST_CONSTPTR(CreateTableRef, signal->getDataPtr());
   m_error.code = ref->errorCode;
   m_masterNodeId = ref->masterNodeId;
   m_waiter.signal(NO_WAIT);  
@@ -1648,7 +1665,6 @@ NdbDictInterface::alterTable(NdbApiSignal* signal, LinearSectionPtr ptr[3])
   SimplePropertiesLinearReader r(ptr[0].p, ptr[0].sz);
   r.printAll(ndbout);
 #endif
-
   const int noErrCodes = 2;
   int errCodes[noErrCodes] =
     {AlterTableRef::NotMaster,
@@ -1871,7 +1887,8 @@ NdbIndexImpl*
 NdbDictionaryImpl::getIndexImpl(const char * externalName, 
 				const char * internalName)
 {
-  Ndb_local_table_info * info = get_local_table_info(internalName);
+  Ndb_local_table_info * info = get_local_table_info(internalName,
+						     false);
   if(info == 0){
     m_error.code = 4243;
     return 0;
diff --git a/ndb/src/ndbapi/NdbDictionaryImpl.hpp b/ndb/src/ndbapi/NdbDictionaryImpl.hpp
index 1fe92db94ed5ec5c0e69259c4d228921597c95bc..12f0946ab67668773d8fd8fd04452387473a9ca9 100644
--- a/ndb/src/ndbapi/NdbDictionaryImpl.hpp
+++ b/ndb/src/ndbapi/NdbDictionaryImpl.hpp
@@ -393,7 +393,8 @@ public:
   int listIndexes(List& list, Uint32 indexId);
   
   NdbTableImpl * getTable(const char * tableName, void **data= 0);
-  Ndb_local_table_info * get_local_table_info(const char * internalName);
+  Ndb_local_table_info * get_local_table_info(const char * internalName,
+					      bool do_add_blob_tables);
   NdbIndexImpl * getIndex(const char * indexName,
 			  const char * tableName);
   NdbIndexImpl * getIndexImpl(const char * name, const char * internalName);
@@ -613,8 +614,8 @@ inline
 NdbTableImpl * 
 NdbDictionaryImpl::getTable(const char * tableName, void **data)
 {
-  const char * internalTableName = m_ndb.internalizeTableName(tableName);
-  Ndb_local_table_info *info= get_local_table_info(internalTableName);
+  Ndb_local_table_info *info=
+    get_local_table_info(m_ndb.internalizeTableName(tableName), true);
   if (info == 0) {
     return 0;
   }
@@ -626,13 +627,22 @@ NdbDictionaryImpl::getTable(const char * tableName, void **data)
 
 inline
 Ndb_local_table_info * 
-NdbDictionaryImpl::get_local_table_info(const char * internalTableName)
+NdbDictionaryImpl::get_local_table_info(const char * internalTableName,
+					bool do_add_blob_tables)
 {
   Ndb_local_table_info *info= m_localHash.get(internalTableName);
-  if (info != 0) {
-    return info; // autoincrement already initialized
+  if (info == 0) {
+    info= fetchGlobalTableImpl(internalTableName);
+    if (info == 0) {
+      return 0;
+    }
+  }
+  if (do_add_blob_tables &&
+      info->m_table_impl->m_noOfBlobs &&
+      addBlobTables(*(info->m_table_impl))) {
+    return 0;
   }
-  return fetchGlobalTableImpl(internalTableName);
+  return info; // autoincrement already initialized
 }
 
 inline
@@ -647,10 +657,12 @@ NdbDictionaryImpl::getIndex(const char * indexName,
       if (t != 0)
         internalIndexName = m_ndb.internalizeIndexName(t, indexName);
     } else {
-      internalIndexName = m_ndb.internalizeTableName(indexName); // Index is also a table
+      internalIndexName =
+	m_ndb.internalizeTableName(indexName); // Index is also a table
     }
     if (internalIndexName) {
-      Ndb_local_table_info * info = get_local_table_info(internalIndexName);
+      Ndb_local_table_info * info = get_local_table_info(internalIndexName,
+							 false);
       if (info) {
 	NdbTableImpl * tab = info->m_table_impl;
         if (tab->m_index == 0)