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 c961a3be3319bf59d75df99a365223ca139ef6fc..a29923966fa58015032c35d3daa8f3e8c68d5696 100755
--- a/bigbluebutton-client/resources/prod/lib/bbb_webrtc_bridge_sip.js
+++ b/bigbluebutton-client/resources/prod/lib/bbb_webrtc_bridge_sip.js
@@ -129,6 +129,7 @@ function stopWebRTCAudioTestJoinConference(){
 	transferTimeout = setTimeout( function() {
 		console.log("Call transfer failed. No response after 3 seconds");
 		webRTCCallback({'status': 'failed', 'errorcode': 1008});
+		releaseUserMedia();
 		currentSession = null;
 		if (userAgent != null) {
 			var userAgentTemp = userAgent;
@@ -287,7 +288,7 @@ function webrtc_call(username, voiceBridge, callback, isListenOnly) {
 	}
 	// if the user requests to proceed as listen only (does not require media) or media is already acquired,
 	// proceed with making the call
-	if (isListenOnly || userMicMedia !== undefined) {
+	if (isListenOnly || userMicMedia != null) {
 		makeCallFunc();
 	} else {
 		callback({'status':'mediarequest'});
@@ -387,6 +388,7 @@ function make_call(username, voiceBridge, server, callback, recall, isListenOnly
 	callTimeout = setTimeout(function() {
 		console.log('Ten seconds without updates sending timeout code');
 		callback({'status':'failed', 'errorcode': 1006}); // Failure on call
+		releaseUserMedia();
 		currentSession = null;
 		if (userAgent != null) {
 			var userAgentTemp = userAgent;
@@ -414,6 +416,7 @@ function make_call(username, voiceBridge, server, callback, recall, isListenOnly
 	iceGatheringTimeout = setTimeout(function() {
 		console.log('Thirty seconds without ICE gathering finishing');
 		callback({'status':'failed', 'errorcode': 1011}); // ICE Gathering Failed
+		releaseUserMedia();
 		currentSession = null;
 		if (userAgent != null) {
 			var userAgentTemp = userAgent;
@@ -439,6 +442,7 @@ function make_call(username, voiceBridge, server, callback, recall, isListenOnly
 		console.log('call failed with cause: '+ cause);
 		
 		if (currentSession) {
+			releaseUserMedia();
 			if (callActive === false) {
 				callback({'status':'failed', 'errorcode': 1004, 'cause': cause}); // Failure on call
 				currentSession = null;
@@ -463,7 +467,7 @@ function make_call(username, voiceBridge, server, callback, recall, isListenOnly
 		
 		if (currentSession) {
 			console.log('call ended ' + currentSession.endTime);
-			
+			releaseUserMedia();
 			if (callPurposefullyEnded === true) {
 				callback({'status':'ended'});
 			} else {
@@ -480,6 +484,7 @@ function make_call(username, voiceBridge, server, callback, recall, isListenOnly
 
 		if (currentSession) {
 			console.log('call canceled');
+			releaseUserMedia();
 			clearTimeout(callTimeout);
 			currentSession = null;
 		} else {
@@ -498,6 +503,7 @@ function make_call(username, voiceBridge, server, callback, recall, isListenOnly
 			iceConnectedTimeout = setTimeout(function() {
 				console.log('5 seconds without ICE finishing');
 				callback({'status':'failed', 'errorcode': 1010}); // ICE negotiation timeout
+				releaseUserMedia();
 				currentSession = null;
 				if (userAgent != null) {
 					var userAgentTemp = userAgent;
@@ -511,6 +517,7 @@ function make_call(username, voiceBridge, server, callback, recall, isListenOnly
 	currentSession.mediaHandler.on('iceConnectionFailed', function() {
 		console.log('received ice negotiation failed');
 		callback({'status':'failed', 'errorcode': 1007}); // Failure on call
+		releaseUserMedia();
 		currentSession = null;
 		clearTimeout(iceConnectedTimeout);
 		if (userAgent != null) {
@@ -564,6 +571,22 @@ function webrtc_hangup(callback) {
 	}
 }
 
+function releaseUserMedia() {
+	if (!!userMicMedia) {
+		console.log("Releasing media tracks");
+	
+		userMicMedia.getAudioTracks().forEach(function(track) {
+			track.stop();
+		});
+
+		userMicMedia.getVideoTracks().forEach(function(track) {
+			track.stop();
+		});
+		
+		userMicMedia = null;
+	}
+}
+
 function isWebRTCAvailable() {
 	if (bowser.msedge) {
 		return false;