diff --git a/ice-server/src/IceServer.cpp b/ice-server/src/IceServer.cpp
index 0877c8591f..a24abd3a49 100644
--- a/ice-server/src/IceServer.cpp
+++ b/ice-server/src/IceServer.cpp
@@ -67,6 +67,10 @@ void IceServer::processDatagrams() {
             // check if this node also included a UUID that they would like to connect to
             QUuid connectRequestUUID;
             hearbeatStream >> connectRequestUUID;
+            
+            if (!connectRequestUUID.isNull()) {
+                qDebug() << "Peer wants to connect to peer with ID" << uuidStringWithoutCurlyBraces(connectRequestUUID);
+            }
         }
     }
 }
diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp
index ec40056299..51b78b6901 100644
--- a/interface/src/Application.cpp
+++ b/interface/src/Application.cpp
@@ -299,9 +299,12 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) :
     
     AddressManager& addressManager = AddressManager::getInstance();
     
-    // connect to the domainChangeRequired signal on AddressManager
-    connect(&addressManager, &AddressManager::possibleDomainChangeRequired,
+    // handle domain change signals from AddressManager
+    connect(&addressManager, &AddressManager::possibleDomainChangeRequiredToHostname,
             this, &Application::changeDomainHostname);
+    
+    connect(&addressManager, &AddressManager::possibleDomainChangeRequiredViaICEForID,
+            &domainHandler, &DomainHandler::setIceServerHostnameAndID);
 
     _settings = new QSettings(this);
     _numChangedSettings = 0;
diff --git a/libraries/networking/src/AddressManager.cpp b/libraries/networking/src/AddressManager.cpp
index 4509a1790c..a78e1e76a4 100644
--- a/libraries/networking/src/AddressManager.cpp
+++ b/libraries/networking/src/AddressManager.cpp
@@ -118,9 +118,21 @@ void AddressManager::handleAPIResponse(const QJsonObject &jsonObject) {
             QJsonObject domainObject = dataObject[ADDRESS_API_DOMAIN_KEY].toObject();
             
             const QString DOMAIN_NETWORK_ADDRESS_KEY = "network_address";
-            QString domainHostname = domainObject[DOMAIN_NETWORK_ADDRESS_KEY].toString();
+            const QString DOMAIN_ICE_SERVER_ADDRESS_KEY = "ice_server_address";
             
-            emit possibleDomainChangeRequired(domainHostname);
+            if (domainObject.contains(DOMAIN_NETWORK_ADDRESS_KEY)) {
+                QString domainHostname = domainObject[DOMAIN_NETWORK_ADDRESS_KEY].toString();
+                
+                emit possibleDomainChangeRequiredToHostname(domainHostname);
+            } else {
+                QString iceServerAddress = domainObject[DOMAIN_ICE_SERVER_ADDRESS_KEY].toString();
+                
+                const QString DOMAIN_ID_KEY = "id";
+                QString domainIDString = domainObject[DOMAIN_ID_KEY].toString();
+                QUuid domainID(domainIDString);
+                
+                emit possibleDomainChangeRequiredViaICEForID(iceServerAddress, domainID);
+            }
             
             // take the path that came back
             const QString LOCATION_KEY = "location";
@@ -182,7 +194,7 @@ bool AddressManager::handleNetworkAddress(const QString& lookupString) {
     QRegExp hostnameRegex(HOSTNAME_REGEX_STRING, Qt::CaseInsensitive);
     
     if (hostnameRegex.indexIn(lookupString) != -1) {
-        emit possibleDomainChangeRequired(hostnameRegex.cap(0));
+        emit possibleDomainChangeRequiredToHostname(hostnameRegex.cap(0));
         emit lookupResultsFinished();
         return true;
     }
@@ -190,7 +202,7 @@ bool AddressManager::handleNetworkAddress(const QString& lookupString) {
     QRegExp ipAddressRegex(IP_ADDRESS_REGEX_STRING);
     
     if (ipAddressRegex.indexIn(lookupString) != -1) {
-        emit possibleDomainChangeRequired(ipAddressRegex.cap(0));
+        emit possibleDomainChangeRequiredToHostname(ipAddressRegex.cap(0));
         emit lookupResultsFinished();
         return true;
     }
diff --git a/libraries/networking/src/AddressManager.h b/libraries/networking/src/AddressManager.h
index f7cc7c52ee..128c395cb4 100644
--- a/libraries/networking/src/AddressManager.h
+++ b/libraries/networking/src/AddressManager.h
@@ -40,7 +40,8 @@ signals:
     void lookupResultsFinished();
     void lookupResultIsOffline();
     void lookupResultIsNotFound();
-    void possibleDomainChangeRequired(const QString& newHostname);
+    void possibleDomainChangeRequiredToHostname(const QString& newHostname);
+    void possibleDomainChangeRequiredViaICEForID(const QString& iceServerHostname, const QUuid& domainID);
     void locationChangeRequired(const glm::vec3& newPosition,
                                 bool hasOrientationChange, const glm::quat& newOrientation,
                                 bool shouldFaceLocation);
diff --git a/libraries/networking/src/DomainHandler.cpp b/libraries/networking/src/DomainHandler.cpp
index b13f598a08..e5c8abb171 100644
--- a/libraries/networking/src/DomainHandler.cpp
+++ b/libraries/networking/src/DomainHandler.cpp
@@ -25,7 +25,7 @@ DomainHandler::DomainHandler(QObject* parent) :
     _uuid(),
     _sockAddr(HifiSockAddr(QHostAddress::Null, DEFAULT_DOMAIN_SERVER_PORT)),
     _assignmentUUID(),
-    _requiresICE(true),
+    _iceServerSockAddr(),
     _isConnected(false),
     _handshakeTimer(NULL),
     _settingsObject(),
@@ -36,7 +36,7 @@ DomainHandler::DomainHandler(QObject* parent) :
 
 void DomainHandler::clearConnectionInfo() {
     _uuid = QUuid();
-    _requiresICE = true;
+    _iceServerSockAddr = HifiSockAddr();
     _isConnected = false;
     emit disconnectedFromDomain();
     
@@ -125,6 +125,19 @@ void DomainHandler::setHostname(const QString& hostname) {
     }
 }
 
+void DomainHandler::setIceServerHostnameAndID(const QString& iceServerHostname, const QUuid& id) {
+    if (id != _uuid) {
+        // re-set the domain info to connect to new domain
+        hardReset();
+        
+        _uuid = id;
+        _iceServerSockAddr = HifiSockAddr(iceServerHostname, ICE_SERVER_DEFAULT_PORT);
+        
+        qDebug() << "Domain ID changed to" << uuidStringWithoutCurlyBraces(_uuid)
+            << "- ICE required via ice server at" << iceServerHostname;
+    }
+}
+
 void DomainHandler::completedHostnameLookup(const QHostInfo& hostInfo) {
     for (int i = 0; i < hostInfo.addresses().size(); i++) {
         if (hostInfo.addresses()[i].protocol() == QAbstractSocket::IPv4Protocol) {
diff --git a/libraries/networking/src/DomainHandler.h b/libraries/networking/src/DomainHandler.h
index 9733a8bff3..ffd288d93d 100644
--- a/libraries/networking/src/DomainHandler.h
+++ b/libraries/networking/src/DomainHandler.h
@@ -54,7 +54,7 @@ public:
     const QUuid& getAssignmentUUID() const { return _assignmentUUID; }
     void setAssignmentUUID(const QUuid& assignmentUUID) { _assignmentUUID = assignmentUUID; }
     
-    bool requiresICE() const { return _requiresICE; }
+    bool requiresICE() const { return !_iceServerSockAddr.isNull(); }
     
     bool isConnected() const { return _isConnected; }
     void setIsConnected(bool isConnected);
@@ -68,6 +68,7 @@ public:
     void softReset();
 public slots:
     void setHostname(const QString& hostname);
+    void setIceServerHostnameAndID(const QString& iceServerHostname, const QUuid& id);
     
 private slots:
     void completedHostnameLookup(const QHostInfo& hostInfo);
@@ -87,7 +88,7 @@ private:
     QString _hostname;
     HifiSockAddr _sockAddr;
     QUuid _assignmentUUID;
-    bool _requiresICE;
+    HifiSockAddr _iceServerSockAddr;
     bool _isConnected;
     QTimer* _handshakeTimer;
     QJsonObject _settingsObject;
diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp
index afefd2a5c1..3af71546ce 100644
--- a/libraries/networking/src/NodeList.cpp
+++ b/libraries/networking/src/NodeList.cpp
@@ -242,63 +242,61 @@ void NodeList::sendDomainServerCheckIn() {
         // we don't know our public socket and we need to send it to the domain server
         // send a STUN request to figure it out
         sendSTUNRequest();
+    } else if (!_domainHandler.isConnected() && _domainHandler.requiresICE()) {
+        sendICERequestForDomainConnection();
     } else if (!_domainHandler.getIP().isNull()) {
         
-        if (!_domainHandler.isConnected() && _domainHandler.requiresICE()) {
-            sendICERequestForDomainConnection();
-        } else {
-            bool isUsingDTLS = false;
-            
-            PacketType domainPacketType = !_domainHandler.isConnected()
-                ? PacketTypeDomainConnectRequest : PacketTypeDomainListRequest;
-            
-            if (!_domainHandler.isConnected()) {
-                qDebug() << "Sending connect request to domain-server at" << _domainHandler.getHostname();
-            }
-            
-            // construct the DS check in packet
-            QUuid packetUUID = _sessionUUID;
-            
-            if (!_domainHandler.getAssignmentUUID().isNull() && domainPacketType == PacketTypeDomainConnectRequest) {
-                // this is a connect request and we're an assigned node
-                // so set our packetUUID as the assignment UUID
-                packetUUID = _domainHandler.getAssignmentUUID();
-            }
-            
-            QByteArray domainServerPacket = byteArrayWithPopulatedHeader(domainPacketType, packetUUID);
-            QDataStream packetStream(&domainServerPacket, QIODevice::Append);
-            
-            // pack our data to send to the domain-server
-            packetStream << _ownerType << _publicSockAddr
-                << HifiSockAddr(QHostAddress(getHostOrderLocalAddress()), _nodeSocket.localPort())
-                << (quint8) _nodeTypesOfInterest.size();
-            
-            // copy over the bytes for node types of interest, if required
-            foreach (NodeType_t nodeTypeOfInterest, _nodeTypesOfInterest) {
-                packetStream << nodeTypeOfInterest;
-            }
-            
-            if (!isUsingDTLS) {
-                writeDatagram(domainServerPacket, _domainHandler.getSockAddr(), QUuid());
-            }
-            
-            const int NUM_DOMAIN_SERVER_CHECKINS_PER_STUN_REQUEST = 5;
-            static unsigned int numDomainCheckins = 0;
-            
-            // send a STUN request every Nth domain server check in so we update our public socket, if required
-            if (numDomainCheckins++ % NUM_DOMAIN_SERVER_CHECKINS_PER_STUN_REQUEST == 0) {
-                sendSTUNRequest();
-            }
-            
-            if (_numNoReplyDomainCheckIns >= MAX_SILENT_DOMAIN_SERVER_CHECK_INS) {
-                // we haven't heard back from DS in MAX_SILENT_DOMAIN_SERVER_CHECK_INS
-                // so emit our signal that indicates that
-                emit limitOfSilentDomainCheckInsReached();
-            }
-            
-            // increment the count of un-replied check-ins
-            _numNoReplyDomainCheckIns++;
+        bool isUsingDTLS = false;
+        
+        PacketType domainPacketType = !_domainHandler.isConnected()
+        ? PacketTypeDomainConnectRequest : PacketTypeDomainListRequest;
+        
+        if (!_domainHandler.isConnected()) {
+            qDebug() << "Sending connect request to domain-server at" << _domainHandler.getHostname();
         }
+        
+        // construct the DS check in packet
+        QUuid packetUUID = _sessionUUID;
+        
+        if (!_domainHandler.getAssignmentUUID().isNull() && domainPacketType == PacketTypeDomainConnectRequest) {
+            // this is a connect request and we're an assigned node
+            // so set our packetUUID as the assignment UUID
+            packetUUID = _domainHandler.getAssignmentUUID();
+        }
+        
+        QByteArray domainServerPacket = byteArrayWithPopulatedHeader(domainPacketType, packetUUID);
+        QDataStream packetStream(&domainServerPacket, QIODevice::Append);
+        
+        // pack our data to send to the domain-server
+        packetStream << _ownerType << _publicSockAddr
+        << HifiSockAddr(QHostAddress(getHostOrderLocalAddress()), _nodeSocket.localPort())
+        << (quint8) _nodeTypesOfInterest.size();
+        
+        // copy over the bytes for node types of interest, if required
+        foreach (NodeType_t nodeTypeOfInterest, _nodeTypesOfInterest) {
+            packetStream << nodeTypeOfInterest;
+        }
+        
+        if (!isUsingDTLS) {
+            writeDatagram(domainServerPacket, _domainHandler.getSockAddr(), QUuid());
+        }
+        
+        const int NUM_DOMAIN_SERVER_CHECKINS_PER_STUN_REQUEST = 5;
+        static unsigned int numDomainCheckins = 0;
+        
+        // send a STUN request every Nth domain server check in so we update our public socket, if required
+        if (numDomainCheckins++ % NUM_DOMAIN_SERVER_CHECKINS_PER_STUN_REQUEST == 0) {
+            sendSTUNRequest();
+        }
+        
+        if (_numNoReplyDomainCheckIns >= MAX_SILENT_DOMAIN_SERVER_CHECK_INS) {
+            // we haven't heard back from DS in MAX_SILENT_DOMAIN_SERVER_CHECK_INS
+            // so emit our signal that indicates that
+            emit limitOfSilentDomainCheckInsReached();
+        }
+        
+        // increment the count of un-replied check-ins
+        _numNoReplyDomainCheckIns++;
     }
 }