diff --git a/ndb/include/mgmapi/mgmapi.h b/ndb/include/mgmapi/mgmapi.h
index f667c6d3a67c53f59c299ba71a0a2556f42d60bf..726552d63d1924fa1c070e525fb87879013a0c04 100644
--- a/ndb/include/mgmapi/mgmapi.h
+++ b/ndb/include/mgmapi/mgmapi.h
@@ -994,7 +994,7 @@ extern "C" {
    *
    * @note the socket is now able to be used as a transporter connection
    */
-  NDB_SOCKET_TYPE ndb_mgm_convert_to_transporter(NdbMgmHandle handle);
+  NDB_SOCKET_TYPE ndb_mgm_convert_to_transporter(NdbMgmHandle *handle);
 
   /**
    * Get the node id of the mgm server we're connected to
diff --git a/ndb/include/mgmcommon/ConfigRetriever.hpp b/ndb/include/mgmcommon/ConfigRetriever.hpp
index b91bb36283742689b6ef5e7bce90315b9be24520..95d257dea230117ff92bd32972356b7966c9b091 100644
--- a/ndb/include/mgmcommon/ConfigRetriever.hpp
+++ b/ndb/include/mgmcommon/ConfigRetriever.hpp
@@ -76,6 +76,7 @@ public:
   const char *get_mgmd_host() const;
   const char *get_connectstring(char *buf, int buf_sz) const;
   NdbMgmHandle get_mgmHandle() { return m_handle; };
+  NdbMgmHandle* get_mgmHandlePtr() { return &m_handle; };
 
   Uint32 get_configuration_nodeid() const;
 private:
diff --git a/ndb/include/transporter/TransporterRegistry.hpp b/ndb/include/transporter/TransporterRegistry.hpp
index f69cd058c6561407fb5f2e8098f334e9feaa88a1..363cdabe10ad619b14e04003641749278f04b250 100644
--- a/ndb/include/transporter/TransporterRegistry.hpp
+++ b/ndb/include/transporter/TransporterRegistry.hpp
@@ -116,7 +116,7 @@ public:
    */
   bool connect_server(NDB_SOCKET_TYPE sockfd);
 
-  int TransporterRegistry::connect_client(NdbMgmHandle h);
+  bool connect_client(NdbMgmHandle *h);
 
   /**
    * Given a SocketClient, creates a NdbMgmHandle, turns it into a transporter
@@ -128,7 +128,7 @@ public:
    * Given a connected NdbMgmHandle, turns it into a transporter
    * and returns the socket.
    */
-  NDB_SOCKET_TYPE connect_ndb_mgmd(NdbMgmHandle h);
+  NDB_SOCKET_TYPE connect_ndb_mgmd(NdbMgmHandle *h);
 
   /**
    * Remove all transporters
diff --git a/ndb/src/common/transporter/TransporterRegistry.cpp b/ndb/src/common/transporter/TransporterRegistry.cpp
index 6d5f9457a24dfa17fcb9bfdd40c85670512eb388..34d5a77001850a8cd0883f33eb85e510bb40f343 100644
--- a/ndb/src/common/transporter/TransporterRegistry.cpp
+++ b/ndb/src/common/transporter/TransporterRegistry.cpp
@@ -1365,6 +1365,8 @@ TransporterRegistry::add_transporter_interface(NodeId remoteNodeId,
 bool
 TransporterRegistry::start_service(SocketServer& socket_server)
 {
+  struct ndb_mgm_reply mgm_reply;
+
   DBUG_ENTER("TransporterRegistry::start_service");
   if (m_transporter_interface.size() > 0 && !nodeIdSpecified)
   {
@@ -1372,6 +1374,11 @@ TransporterRegistry::start_service(SocketServer& socket_server)
     DBUG_RETURN(false);
   }
 
+  if(!ndb_mgm_is_connected(m_mgm_handle))
+    ndb_mgm_connect(m_mgm_handle, 0, 0, 0);
+  if(!ndb_mgm_is_connected(m_mgm_handle))
+    DBUG_RETURN(false);
+
   for (unsigned i= 0; i < m_transporter_interface.size(); i++)
   {
     Transporter_interface &t= m_transporter_interface[i];
@@ -1404,6 +1411,18 @@ TransporterRegistry::start_service(SocketServer& socket_server)
     }
     t.m_s_service_port= (t.m_s_service_port<=0)?-port:port; // -`ve if dynamic
     DBUG_PRINT("info", ("t.m_s_service_port = %d",t.m_s_service_port));
+
+    if(t.m_s_service_port < 0
+       && ndb_mgm_set_connection_int_parameter(m_mgm_handle,
+					     get_localNodeId(),
+					     t.m_remote_nodeId,
+					     CFG_CONNECTION_SERVER_PORT,
+					     t.m_s_service_port,
+					     &mgm_reply) < 0)
+    {
+      delete transporter_service;
+      DBUG_RETURN(false);
+    }
     transporter_service->setTransporterRegistry(this);
   }
   DBUG_RETURN(true);
@@ -1521,15 +1540,18 @@ TransporterRegistry::get_transporter(NodeId nodeId) {
   return theTransporters[nodeId];
 }
 
-int TransporterRegistry::connect_client(NdbMgmHandle h)
+bool TransporterRegistry::connect_client(NdbMgmHandle *h)
 {
   DBUG_ENTER("TransporterRegistry::connect_client(NdbMgmHandle)");
 
-  Uint32 mgm_nodeid= ndb_mgm_get_mgmd_nodeid(h);
+  Uint32 mgm_nodeid= ndb_mgm_get_mgmd_nodeid(*h);
+
+  if(!mgm_nodeid)
+    return false;
 
   Transporter * t = theTransporters[mgm_nodeid];
   if (!t)
-    return -1;
+    return false;
 
   DBUG_RETURN(t->connect_client(connect_ndb_mgmd(h)));
 }
@@ -1538,24 +1560,25 @@ int TransporterRegistry::connect_client(NdbMgmHandle h)
  * Given a connected NdbMgmHandle, turns it into a transporter
  * and returns the socket.
  */
-NDB_SOCKET_TYPE TransporterRegistry::connect_ndb_mgmd(NdbMgmHandle h)
+NDB_SOCKET_TYPE TransporterRegistry::connect_ndb_mgmd(NdbMgmHandle *h)
 {
   struct ndb_mgm_reply mgm_reply;
 
-  if ( h == NULL )
+  if ( h==NULL || *h == NULL )
   {
     return NDB_INVALID_SOCKET;
   }
 
   for(unsigned int i=0;i < m_transporter_interface.size();i++)
-    if (ndb_mgm_set_connection_int_parameter(h,
+    if (m_transporter_interface[i].m_s_service_port < 0
+	&& ndb_mgm_set_connection_int_parameter(*h,
 				   get_localNodeId(),
 				   m_transporter_interface[i].m_remote_nodeId,
 				   CFG_CONNECTION_SERVER_PORT,
 				   m_transporter_interface[i].m_s_service_port,
 				   &mgm_reply) < 0)
     {
-      ndb_mgm_destroy_handle(&h);
+      ndb_mgm_destroy_handle(h);
       return NDB_INVALID_SOCKET;
     }
 
@@ -1565,7 +1588,7 @@ NDB_SOCKET_TYPE TransporterRegistry::connect_ndb_mgmd(NdbMgmHandle h)
    */
   NDB_SOCKET_TYPE sockfd= ndb_mgm_convert_to_transporter(h);
   if ( sockfd == NDB_INVALID_SOCKET)
-    ndb_mgm_destroy_handle(&h);
+    ndb_mgm_destroy_handle(h);
   return sockfd;
 }
 
@@ -1613,7 +1636,7 @@ NDB_SOCKET_TYPE TransporterRegistry::connect_ndb_mgmd(SocketClient *sc)
     return NDB_INVALID_SOCKET;
   }
 
-  return connect_ndb_mgmd(h);
+  return connect_ndb_mgmd(&h);
 }
 
 template class Vector<TransporterRegistry::Transporter_interface>;
diff --git a/ndb/src/kernel/vm/Configuration.cpp b/ndb/src/kernel/vm/Configuration.cpp
index 02f4f2a9b9885d892b7014f9df819cb353a7f42b..29455e5b1154b2570fa5381cfde4fbc75e77f7ab 100644
--- a/ndb/src/kernel/vm/Configuration.cpp
+++ b/ndb/src/kernel/vm/Configuration.cpp
@@ -154,6 +154,7 @@ Configuration::Configuration()
   m_config_retriever= 0;
   m_clusterConfig= 0;
   m_clusterConfigIter= 0;
+  m_mgmd_host= NULL;
 }
 
 Configuration::~Configuration(){
@@ -166,6 +167,9 @@ Configuration::~Configuration(){
   if(_backupPath != NULL)
     free(_backupPath);
 
+  if(m_mgmd_host)
+    free(m_mgmd_host);
+
   if (m_config_retriever) {
     delete m_config_retriever;
   }
@@ -210,8 +214,16 @@ Configuration::fetch_configuration(){
     ERROR_SET(fatal, ERR_INVALID_CONFIG, "Could not connect to ndb_mgmd", s);
   }
   
-  m_mgmd_port= m_config_retriever->get_mgmd_port();
-  m_mgmd_host= m_config_retriever->get_mgmd_host();
+  {
+    m_mgmd_port= m_config_retriever->get_mgmd_port();
+    /**
+     * We copy the mgmd host as the handle is later
+     * destroyed, so a pointer won't work
+     */
+    int len= strlen(m_config_retriever->get_mgmd_host());
+    m_mgmd_host= (char*)malloc(sizeof(char)*len);
+    strcpy(m_mgmd_host,m_config_retriever->get_mgmd_host());
+  }
 
   ConfigRetriever &cr= *m_config_retriever;
   
@@ -313,7 +325,8 @@ Configuration::setupConfiguration(){
       ERROR_SET(fatal, ERR_INVALID_CONFIG, "Invalid configuration fetched", 
 		"No transporters configured");
     }
-    if(!globalTransporterRegistry.connect_client(m_config_retriever->get_mgmHandle()))
+    if(!globalTransporterRegistry.connect_client(
+				  m_config_retriever->get_mgmHandlePtr()))
       ERROR_SET(fatal, ERR_INVALID_CONFIG, "Connection to mgmd terminated before setup was complete", 
 		"StopOnError missing");
   }
diff --git a/ndb/src/kernel/vm/Configuration.hpp b/ndb/src/kernel/vm/Configuration.hpp
index a257881e35338f1306628ed82d24f1fd1423723b..dd690665413a0c48020b1ca40ffbea420664201d 100644
--- a/ndb/src/kernel/vm/Configuration.hpp
+++ b/ndb/src/kernel/vm/Configuration.hpp
@@ -67,7 +67,7 @@ public:
   const ndb_mgm_configuration_iterator * getOwnConfigIterator() const;
 
   Uint32 get_mgmd_port() const {return m_mgmd_port;};
-  const char *get_mgmd_host() const {return m_mgmd_host;};
+  char *get_mgmd_host() const {return m_mgmd_host;};
   ConfigRetriever* get_config_retriever() { return m_config_retriever; };
 
   class LogLevel * m_logLevel;
@@ -99,7 +99,7 @@ private:
   bool _initialStart;
   char * _connectString;
   Uint32 m_mgmd_port;
-  const char *m_mgmd_host;
+  char *m_mgmd_host;
   bool _daemonMode;
 
   void calcSizeAlt(class ConfigValues * );
diff --git a/ndb/src/mgmapi/mgmapi.cpp b/ndb/src/mgmapi/mgmapi.cpp
index f326a77a8af80a0aa32a86192b543020877af342..99b6efe320b8adee347cab15355c9588236beae7 100644
--- a/ndb/src/mgmapi/mgmapi.cpp
+++ b/ndb/src/mgmapi/mgmapi.cpp
@@ -2189,21 +2189,21 @@ ndb_mgm_get_connection_int_parameter(NdbMgmHandle handle,
 
 extern "C"
 NDB_SOCKET_TYPE
-ndb_mgm_convert_to_transporter(NdbMgmHandle handle)
+ndb_mgm_convert_to_transporter(NdbMgmHandle *handle)
 {
   NDB_SOCKET_TYPE s;
 
-  CHECK_HANDLE(handle, NDB_INVALID_SOCKET);
-  CHECK_CONNECTED(handle, NDB_INVALID_SOCKET);
+  CHECK_HANDLE((*handle), NDB_INVALID_SOCKET);
+  CHECK_CONNECTED((*handle), NDB_INVALID_SOCKET);
 
-  handle->connected= 0;   // we pretend we're disconnected
-  s= handle->socket;
+  (*handle)->connected= 0;   // we pretend we're disconnected
+  s= (*handle)->socket;
 
   SocketOutputStream s_output(s);
   s_output.println("transporter connect");
   s_output.println("");
 
-  ndb_mgm_destroy_handle(&handle); // set connected=0, so won't disconnect
+  ndb_mgm_destroy_handle(handle); // set connected=0, so won't disconnect
 
   return s;
 }