diff -rub network0/access/qhttpnetworkconnection.cpp network/access/qhttpnetworkconnection.cpp
--- network0/access/qhttpnetworkconnection.cpp	2017-11-30 18:49:46.000000000 +0500
+++ network/access/qhttpnetworkconnection.cpp	2019-12-09 14:56:56.383115600 +0500
@@ -588,9 +588,14 @@
 
     int i = indexOf(socket);
 
+    QAuthenticatorPrivate *priv = QAuthenticatorPrivate::getPrivate(channels[i].authenticator);    
+    priv->host = hostName; //QUrl(request.uri(true)).host();
+
     // Send "Authorization" header, but not if it's NTLM and the socket is already authenticated.
     if (channels[i].authMethod != QAuthenticatorPrivate::None) {
-        if ((channels[i].authMethod != QAuthenticatorPrivate::Ntlm && request.headerField("Authorization").isEmpty()) || channels[i].lastStatus == 401) {
+        if ((channels[i].authMethod != QAuthenticatorPrivate::Ntlm
+        &&   channels[i].authMethod != QAuthenticatorPrivate::Negotiate
+        && request.headerField("Authorization").isEmpty()) || channels[i].lastStatus == 401) {
             QAuthenticatorPrivate *priv = QAuthenticatorPrivate::getPrivate(channels[i].authenticator);
             if (priv && priv->method != QAuthenticatorPrivate::None) {
                 QByteArray response = priv->calculateResponse(request.methodName(), request.uri(false));
@@ -602,7 +607,9 @@
 
     // Send "Proxy-Authorization" header, but not if it's NTLM and the socket is already authenticated.
     if (channels[i].proxyAuthMethod != QAuthenticatorPrivate::None) {
-        if (!(channels[i].proxyAuthMethod == QAuthenticatorPrivate::Ntlm && channels[i].lastStatus != 407)) {
+        if (!((channels[i].proxyAuthMethod == QAuthenticatorPrivate::Ntlm
+        ||     channels[i].proxyAuthMethod == QAuthenticatorPrivate::Negotiate)
+        && channels[i].lastStatus != 407)) {
             QAuthenticatorPrivate *priv = QAuthenticatorPrivate::getPrivate(channels[i].proxyAuthenticator);
             if (priv && priv->method != QAuthenticatorPrivate::None) {
                 QByteArray response = priv->calculateResponse(request.methodName(), request.uri(false));
diff -rub network0/access/qhttpnetworkreply.cpp network/access/qhttpnetworkreply.cpp
--- network0/access/qhttpnetworkreply.cpp	2017-11-30 18:49:46.000000000 +0500
+++ network/access/qhttpnetworkreply.cpp	2019-11-01 07:48:26.908831700 +0500
@@ -422,7 +422,6 @@
     for (int i = 0; i<challenges.size(); i++) {
         QByteArray line = challenges.at(i);
         // todo use qstrincmp
-        if (!line.toLower().startsWith("negotiate"))
             challenge = line;
     }
     return !challenge.isEmpty();
@@ -445,6 +444,9 @@
         } else if (method < QAuthenticatorPrivate::DigestMd5
             && line.startsWith("digest")) {
             method = QAuthenticatorPrivate::DigestMd5;
+        } else if (method < QAuthenticatorPrivate::Negotiate
+            && line.startsWith("negotiate")) {
+            method = QAuthenticatorPrivate::Negotiate;
         }
     }
     return method;
diff -rub network0/kernel/qauthenticator.cpp network/kernel/qauthenticator.cpp
--- network0/kernel/qauthenticator.cpp	2017-11-30 18:49:46.000000000 +0500
+++ network/kernel/qauthenticator.cpp	2019-11-01 15:49:04.458629300 +0500
@@ -377,6 +377,7 @@
 
     switch (method) {
     case QAuthenticatorPrivate::Ntlm:
+    case QAuthenticatorPrivate::Negotiate:
         if ((separatorPosn = user.indexOf(QLatin1String("\\"))) != -1) {
             //domain name is present
             realm.clear();
@@ -424,6 +425,9 @@
         } else if (method < DigestMd5 && str.startsWith("digest")) {
             method = DigestMd5;
             headerVal = current.second.mid(7);
+        } else if (method < Negotiate && str.startsWith("negotiate")) {
+            method = Negotiate;
+            headerVal = current.second.mid(10);
         }
     }
 
@@ -439,6 +443,7 @@
             phase = Done;
         break;
     case Ntlm:
+    case Negotiate:
         // work is done in calculateResponse()
         break;
     case DigestMd5: {
@@ -492,7 +497,8 @@
         phase = Done;
         break;
     case QAuthenticatorPrivate::Ntlm:
-        methodString = "NTLM ";
+    case QAuthenticatorPrivate::Negotiate:
+        methodString = (method == Ntlm) ? "NTLM " : "Negotiate ";
         if (challenge.isEmpty()) {
 #if defined(Q_OS_WIN) && !defined(Q_OS_WINRT)
             QByteArray phase1Token;
@@ -1472,6 +1478,17 @@
 {
     QByteArray result;
 
+    QString pkg;
+    QString host;
+    if(ctx->method == ctx->Ntlm) {
+    	pkg  = QString::fromLatin1("NTLM");
+    	host.clear();
+    }
+    else if(ctx->method == ctx->Negotiate) {
+    	pkg  = QString::fromLatin1("Negotiate");
+    	host = QString::fromLatin1("host/%1").arg( ctx->host );
+    }
+
     if (!q_NTLM_SSPI_library_load())
         return result;
 
@@ -1482,7 +1499,7 @@
     memset(&ctx->ntlmWindowsHandles->credHandle, 0, sizeof(CredHandle));
     TimeStamp tsDummy;
     SECURITY_STATUS secStatus = pSecurityFunctionTable->AcquireCredentialsHandle(
-        NULL, (SEC_WCHAR*)L"NTLM", SECPKG_CRED_OUTBOUND, NULL, NULL,
+        NULL, const_cast<SEC_WCHAR*>( (WCHAR*)pkg.utf16() ), SECPKG_CRED_OUTBOUND, NULL, NULL,
         NULL, NULL, &ctx->ntlmWindowsHandles->credHandle, &tsDummy);
     if (secStatus != SEC_E_OK) {
         delete ctx->ntlmWindowsHandles;
@@ -1504,7 +1521,7 @@
     ULONG attrs;
 
     secStatus = pSecurityFunctionTable->InitializeSecurityContext(&ctx->ntlmWindowsHandles->credHandle, NULL,
-        const_cast<SEC_WCHAR*>(L"") /* host */,
+        const_cast<SEC_WCHAR*>( (WCHAR*)host.utf16() ) /* host */,
         ISC_REQ_ALLOCATE_MEMORY,
         0, SECURITY_NETWORK_DREP,
         NULL, 0,
diff -rub network0/kernel/qauthenticator_p.h network/kernel/qauthenticator_p.h
--- network0/kernel/qauthenticator_p.h	2017-11-30 18:49:46.000000000 +0500
+++ network/kernel/qauthenticator_p.h	2019-11-01 07:48:26.924489600 +0500
@@ -68,7 +68,7 @@
 class Q_AUTOTEST_EXPORT QAuthenticatorPrivate
 {
 public:
-    enum Method { None, Basic, Plain, Login, Ntlm, CramMd5, DigestMd5 };
+    enum Method { None, Basic, Plain, Login, Ntlm, CramMd5, DigestMd5, Negotiate };
     QAuthenticatorPrivate();
     ~QAuthenticatorPrivate();
 
@@ -79,6 +79,7 @@
     Method method;
     QString realm;
     QByteArray challenge;
+    QString host;
 #ifdef Q_OS_WIN
     QNtlmWindowsHandles *ntlmWindowsHandles;
 #endif
