diff --git a/libraries/networking/src/AccountManager.cpp b/libraries/networking/src/AccountManager.cpp
index a975a86ada..ffc73f0701 100644
--- a/libraries/networking/src/AccountManager.cpp
+++ b/libraries/networking/src/AccountManager.cpp
@@ -93,6 +93,13 @@ AccountManager::AccountManager(UserAgentGetter userAgentGetter) :
 const QString DOUBLE_SLASH_SUBSTITUTE = "slashslash";
 const QString ACCOUNT_MANAGER_REQUESTED_SCOPE = "owner";
 
+AccountManager::~AccountManager() {
+    QMutexLocker lock(&_rsaKeygenLock);
+    while (_rsaKeygenThread) {
+        _rsaKeygenWait.wait(&_rsaKeygenLock);
+    }
+}
+
 void AccountManager::logout() {
     // a logout means we want to delete the DataServerAccountInfo we currently have for this URL, in-memory and in file
     _accountInfo = DataServerAccountInfo();
@@ -761,8 +768,9 @@ void AccountManager::generateNewKeypair(bool isUserKeypair, const QUuid& domainI
                 this, &AccountManager::handleKeypairGenerationError);
 
         connect(keypairGenerator, &QObject::destroyed, generateThread, &QThread::quit);
-        connect(this, &QObject::destroyed, generateThread, &QThread::quit);
+        connect(generateThread, &QThread::finished, this, &AccountManager::rsaKeygenThreadFinished);
         connect(generateThread, &QThread::finished, generateThread, &QThread::deleteLater);
+        _rsaKeygenThread = generateThread;
 
         keypairGenerator->moveToThread(generateThread);
 
@@ -870,3 +878,9 @@ void AccountManager::handleKeypairGenerationError() {
 
     sender()->deleteLater();
 }
+
+void AccountManager::rsaKeygenThreadFinished() {
+    QMutexLocker lock(&_rsaKeygenLock);
+    _rsaKeygenThread = nullptr;
+    _rsaKeygenWait.wakeAll();
+}
diff --git a/libraries/networking/src/AccountManager.h b/libraries/networking/src/AccountManager.h
index 87b17d00d5..af89b67bdc 100644
--- a/libraries/networking/src/AccountManager.h
+++ b/libraries/networking/src/AccountManager.h
@@ -15,6 +15,8 @@
 #include <QtCore/QByteArray>
 #include <QtCore/QObject>
 #include <QtCore/QUrl>
+#include <QtCore/QMutex>
+#include <QtCore/QWaitCondition>
 #include <QtNetwork/QNetworkReply>
 #include <QUrlQuery>
 
@@ -63,6 +65,7 @@ class AccountManager : public QObject, public Dependency {
     Q_OBJECT
 public:
     AccountManager(UserAgentGetter userAgentGetter = DEFAULT_USER_AGENT_GETTER);
+    ~AccountManager();
 
     Q_INVOKABLE void sendRequest(const QString& path,
                                  AccountManagerAuth::Type authType,
@@ -131,6 +134,7 @@ private slots:
     void publicKeyUploadSucceeded(QNetworkReply& reply);
     void publicKeyUploadFailed(QNetworkReply& reply);
     void generateNewKeypair(bool isUserKeypair = true, const QUuid& domainID = QUuid());
+    void rsaKeygenThreadFinished();
 
 private:
     AccountManager(AccountManager const& other) = delete;
@@ -156,6 +160,9 @@ private:
     QByteArray _pendingPrivateKey;
 
     QUuid _sessionID { QUuid::createUuid() };
+    QMutex _rsaKeygenLock;
+    QWaitCondition _rsaKeygenWait;
+    QThread* _rsaKeygenThread { nullptr };
 };
 
 #endif // hifi_AccountManager_h