diff --git a/bigbluebutton-client/locale/en_US/bbbResources.properties b/bigbluebutton-client/locale/en_US/bbbResources.properties
index f0592da75cbbc3f753be619049a2aee9cc03a638..bc98fe27718d8dca26e9da5e8695707ee5e74c06 100755
--- a/bigbluebutton-client/locale/en_US/bbbResources.properties
+++ b/bigbluebutton-client/locale/en_US/bbbResources.properties
@@ -75,6 +75,7 @@ bbb.webrtcWarning.failedError.1006 = Error 1006: Call timed out
 bbb.webrtcWarning.failedError.1007 = Error 1007: ICE negotiation failed
 bbb.webrtcWarning.failedError.1008 = Error 1008: Transfer failed
 bbb.webrtcWarning.failedError.1009 = Error 1009: Could not fetch STUN/TURN server information
+bbb.webrtcWarning.failedError.1010 = Error 1010: ICE negotiation timeout
 bbb.webrtcWarning.failedError.unknown = Error {0}: Unknown error code
 bbb.webrtcWarning.failedError.mediamissing = Could not get your microphone for a WebRTC call
 bbb.webrtcWarning.failedError.endedunexpectedly = The WebRTC echo test ended unexpectedly
diff --git a/bigbluebutton-client/resources/prod/lib/bbb_webrtc_bridge_sip.js b/bigbluebutton-client/resources/prod/lib/bbb_webrtc_bridge_sip.js
index 782e3c5f9f01f0c10eed9820e137cc1cec823d8c..884026f2e444d2378a433df79f155566eec80ef8 100755
--- a/bigbluebutton-client/resources/prod/lib/bbb_webrtc_bridge_sip.js
+++ b/bigbluebutton-client/resources/prod/lib/bbb_webrtc_bridge_sip.js
@@ -1,5 +1,5 @@
 
-var userID, callerIdName, conferenceVoiceBridge, userAgent=null, userMicMedia, userWebcamMedia, currentSession=null, callTimeout, callActive, callICEConnected, callFailCounter, callPurposefullyEnded, uaConnected, transferTimeout;
+var userID, callerIdName, conferenceVoiceBridge, userAgent=null, userMicMedia, userWebcamMedia, currentSession=null, callTimeout, callActive, callICEConnected, iceConnectedTimeout, callFailCounter, callPurposefullyEnded, uaConnected, transferTimeout;
 var inEchoTest = true;
 
 function webRTCCallback(message) {
@@ -419,6 +419,17 @@ function make_call(username, voiceBridge, server, callback, recall, isListenOnly
 			callback({'status':'started'});
 		} else {
 			callback({'status':'waitingforice'});
+			console.log('Waiting for ICE negotiation');
+			iceConnectedTimeout = setTimeout(function() {
+				console.log('60 seconds without ICE finishing');
+				callback({'status':'failed', 'errorcode': 1010}); // Failure on call
+				currentSession = null;
+				if (userAgent != null) {
+					var userAgentTemp = userAgent;
+					userAgent = null;
+					userAgentTemp.stop();
+				}
+			}, 60000);
 		}
 		clearTimeout(callTimeout);
 	});
@@ -426,6 +437,7 @@ function make_call(username, voiceBridge, server, callback, recall, isListenOnly
 		console.log('received ice negotiation failed');
 		callback({'status':'failed', 'errorcode': 1007}); // Failure on call
 		currentSession = null;
+		clearTimeout(iceConnectedTimeout);
 		if (userAgent != null) {
 			var userAgentTemp = userAgent;
 			userAgent = null;
@@ -441,6 +453,7 @@ function make_call(username, voiceBridge, server, callback, recall, isListenOnly
 		console.log('Received ICE status changed to connected');
 		if (callICEConnected === false) {
 			callICEConnected = true;
+			clearTimeout(iceConnectedTimeout);
 			if (callActive === true) {
 				callback({'status':'started'});
 			}
@@ -452,6 +465,7 @@ function make_call(username, voiceBridge, server, callback, recall, isListenOnly
 		console.log('Received ICE status changed to completed');
 		if (callICEConnected === false) {
 			callICEConnected = true;
+			clearTimeout(iceConnectedTimeout);
 			if (callActive === true) {
 				callback({'status':'started'});
 			}