diff --git a/src/plugins/debugger/debuggerstartparameters.h b/src/plugins/debugger/debuggerstartparameters.h
index 2b5b25332a7086705e8d5b14a2997299db8cf703..859f24db861d74350071f6fed15739cc76df37ca 100644
--- a/src/plugins/debugger/debuggerstartparameters.h
+++ b/src/plugins/debugger/debuggerstartparameters.h
@@ -110,6 +110,7 @@ public:
     bool useServerStartScript;
     QString serverStartScript;
     QString sysroot;
+    QString searchPath; // Gdb "set solib-search-path"
     QString debugInfoLocation; // Gdb "set-debug-file-directory".
     QStringList debugSourceLocation; // Gdb "directory"
     QByteArray remoteDumperLib;
diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp
index 2d8321c37c226bd97083ca4f8f78027e95e878ad..92ba0f5795335b5d3b81994b27c15682426a56f4 100644
--- a/src/plugins/debugger/gdb/gdbengine.cpp
+++ b/src/plugins/debugger/gdb/gdbengine.cpp
@@ -196,6 +196,7 @@ GdbEngine::GdbEngine(const DebuggerStartParameters &startParameters,
     m_gdbVersion = 100;
     m_gdbBuildVersion = -1;
     m_isMacGdb = false;
+    m_isQnxGdb = false;
     m_hasBreakpointNotifications = false;
     m_hasPython = false;
     m_registerNamesListed = false;
@@ -1689,9 +1690,10 @@ void GdbEngine::handleShowVersion(const GdbResponse &response)
         m_gdbVersion = 100;
         m_gdbBuildVersion = -1;
         m_isMacGdb = false;
+        m_isQnxGdb = false;
         QString msg = QString::fromLocal8Bit(response.consoleStreamOutput);
         extractGdbVersion(msg,
-              &m_gdbVersion, &m_gdbBuildVersion, &m_isMacGdb);
+              &m_gdbVersion, &m_gdbBuildVersion, &m_isMacGdb, &m_isQnxGdb);
 
         // On Mac, fsf gdb does not work sufficiently well,
         // and on Linux and Windows we require at least 7.2.
diff --git a/src/plugins/debugger/gdb/gdbengine.h b/src/plugins/debugger/gdb/gdbengine.h
index e42f12dc839793d9f8b14ecbe69da6dd219316db..f4de4e1f70cfd17ec8a100620f885a6fd47e2a70 100644
--- a/src/plugins/debugger/gdb/gdbengine.h
+++ b/src/plugins/debugger/gdb/gdbengine.h
@@ -438,6 +438,7 @@ private: ////////// Gdb Output, State & Capability Handling //////////
     int m_gdbVersion; // 6.8.0 is 60800
     int m_gdbBuildVersion; // MAC only?
     bool m_isMacGdb;
+    bool m_isQnxGdb;
     bool m_hasBreakpointNotifications;
     bool m_hasPython;
     bool m_hasInferiorThreadList;
diff --git a/src/plugins/debugger/gdb/gdbmi.cpp b/src/plugins/debugger/gdb/gdbmi.cpp
index 5946b57102666a7eec07525462e7e2fcb2545ce2..9d3437a84ef47e26c0f2b8cb711f7c9a7a0d76c0 100644
--- a/src/plugins/debugger/gdb/gdbmi.cpp
+++ b/src/plugins/debugger/gdb/gdbmi.cpp
@@ -409,7 +409,7 @@ QByteArray GdbResponse::toString() const
 //////////////////////////////////////////////////////////////////////////////////
 
 void extractGdbVersion(const QString &msg,
-    int *gdbVersion, int *gdbBuildVersion, bool *isMacGdb)
+    int *gdbVersion, int *gdbBuildVersion, bool *isMacGdb, bool *isQnxGdb)
 {
     const QChar dot(QLatin1Char('.'));
 
@@ -433,6 +433,7 @@ void extractGdbVersion(const QString &msg,
     }
 
     *isMacGdb = msg.contains(QLatin1String("Apple version"));
+    *isQnxGdb = msg.contains(QLatin1String("qnx-nto"));
 
     *gdbVersion = 10000 * cleaned.section(dot, 0, 0).toInt()
                   + 100 * cleaned.section(dot, 1, 1).toInt()
diff --git a/src/plugins/debugger/gdb/gdbmi.h b/src/plugins/debugger/gdb/gdbmi.h
index 1e1036cca3129ad821057076b804e6f9bb63ed7d..9727f427649a88e297d625f4c60538bf008d9663 100644
--- a/src/plugins/debugger/gdb/gdbmi.h
+++ b/src/plugins/debugger/gdb/gdbmi.h
@@ -174,7 +174,7 @@ public:
 };
 
 void extractGdbVersion(const QString &msg,
-    int *gdbVersion, int *gdbBuildVersion, bool *isMacGdb);
+    int *gdbVersion, int *gdbBuildVersion, bool *isMacGdb, bool *isQnxGdb);
 
 } // namespace Internal
 } // namespace Debugger
diff --git a/src/plugins/debugger/gdb/remotegdbserveradapter.cpp b/src/plugins/debugger/gdb/remotegdbserveradapter.cpp
index 6e4b566291a5bde17c256348f808b4c1354cf496..26ee53b9a25797b3e423c8867415c73884c1b4d3 100644
--- a/src/plugins/debugger/gdb/remotegdbserveradapter.cpp
+++ b/src/plugins/debugger/gdb/remotegdbserveradapter.cpp
@@ -173,6 +173,7 @@ void RemoteGdbServerAdapter::setupInferior()
     const QByteArray sysroot = sp.sysroot.toLocal8Bit();
     const QByteArray remoteArch = sp.remoteArchitecture.toLatin1();
     const QByteArray gnuTarget = sp.gnuTarget.toLatin1();
+    const QByteArray searchPath = startParameters().searchPath.toLocal8Bit();
     const QString args = sp.processArgs;
 
     if (!remoteArch.isEmpty())
@@ -181,6 +182,8 @@ void RemoteGdbServerAdapter::setupInferior()
         m_engine->postCommand("set gnutarget " + gnuTarget);
     if (!sysroot.isEmpty())
         m_engine->postCommand("set sysroot " + sysroot);
+    if (!searchPath.isEmpty())
+        m_engine->postCommand("set solib-search-path " + searchPath);
     if (!args.isEmpty())
         m_engine->postCommand("-exec-arguments " + args.toLocal8Bit());
 
@@ -245,8 +248,13 @@ void RemoteGdbServerAdapter::callTargetRemote()
     //     (2) starts the remote application
     //     (3) stops the remote application (early, e.g. in the dynamic linker)
     QString channel = startParameters().remoteChannel;
-    m_engine->postCommand("target remote " + channel.toLatin1(),
-        CB(handleTargetRemote));
+    if (m_engine->m_isQnxGdb) {
+        m_engine->postCommand("target qnx " + channel.toLatin1(),
+            CB(handleTargetQnx));
+    } else {
+        m_engine->postCommand("target remote " + channel.toLatin1(),
+            CB(handleTargetRemote));
+    }
 }
 
 void RemoteGdbServerAdapter::handleTargetRemote(const GdbResponse &record)
@@ -265,6 +273,52 @@ void RemoteGdbServerAdapter::handleTargetRemote(const GdbResponse &record)
     }
 }
 
+void RemoteGdbServerAdapter::handleTargetQnx(const GdbResponse &response)
+{
+    QTC_ASSERT(m_engine->m_isQnxGdb, qDebug() << m_engine->m_isQnxGdb);
+    QTC_ASSERT(state() == InferiorSetupRequested, qDebug() << state());
+    if (response.resultClass == GdbResultDone) {
+        // gdb server will stop the remote application itself.
+        showMessage(_("INFERIOR STARTED"));
+        showMessage(msgAttachedToStoppedInferior(), StatusBar);
+
+        const qint64 pid = startParameters().attachPID;
+        if (pid > -1) {
+            m_engine->postCommand("attach " + QByteArray::number(pid), CB(handleAttach));
+        } else {
+            m_engine->handleInferiorPrepared();
+        }
+    } else {
+        // 16^error,msg="hd:5555: Connection timed out."
+        QString msg = msgConnectRemoteServerFailed(
+            QString::fromLocal8Bit(response.data.findChild("msg").data()));
+        m_engine->notifyInferiorSetupFailed(msg);
+    }
+}
+
+void RemoteGdbServerAdapter::handleAttach(const GdbResponse &response)
+{
+    QTC_ASSERT(state() == InferiorSetupRequested, qDebug() << state());
+    switch (response.resultClass) {
+    case GdbResultDone:
+    case GdbResultRunning: {
+        showMessage(_("INFERIOR ATTACHED"));
+        showMessage(msgAttachedToStoppedInferior(), StatusBar);
+        m_engine->handleInferiorPrepared();
+        break;
+    }
+    case GdbResultError:
+        if (response.data.findChild("msg").data() == "ptrace: Operation not permitted.") {
+            m_engine->notifyInferiorSetupFailed(DumperHelper::msgPtraceError(startParameters().startMode));
+            break;
+        }
+        // if msg != "ptrace: ..." fall through
+    default:
+        QString msg = QString::fromLocal8Bit(response.data.findChild("msg").data());
+        m_engine->notifyInferiorSetupFailed(msg);
+    }
+}
+
 void RemoteGdbServerAdapter::runEngine()
 {
     QTC_ASSERT(state() == EngineRunRequested, qDebug() << state());
diff --git a/src/plugins/debugger/gdb/remotegdbserveradapter.h b/src/plugins/debugger/gdb/remotegdbserveradapter.h
index 50cf81e32e03f179921db9869b55ea8c509ff143..9261797d6d406eb4daf7ed47dc23688f8f2f01c5 100644
--- a/src/plugins/debugger/gdb/remotegdbserveradapter.h
+++ b/src/plugins/debugger/gdb/remotegdbserveradapter.h
@@ -90,6 +90,8 @@ private:
     void handleFileExecAndSymbols(const GdbResponse &response);
     void callTargetRemote();
     void handleTargetRemote(const GdbResponse &response);
+    void handleTargetQnx(const GdbResponse &response);
+    void handleAttach(const GdbResponse &response);
     void handleInterruptInferior(const GdbResponse &response);
 
     QProcess m_uploadProc;