diff --git a/bbb-fsesl-client/deploy.sh b/bbb-fsesl-client/deploy.sh
old mode 100644
new mode 100755
diff --git a/bbb-voice/src/main/java/org/bigbluebutton/voiceconf/sip/CallAgent.java b/bbb-voice/src/main/java/org/bigbluebutton/voiceconf/sip/CallAgent.java
index 29af4ce241afe3e822e3ff9efe739faba51b6446..513c77f8e3e2ceb4294922baac24268b16d58478 100755
--- a/bbb-voice/src/main/java/org/bigbluebutton/voiceconf/sip/CallAgent.java
+++ b/bbb-voice/src/main/java/org/bigbluebutton/voiceconf/sip/CallAgent.java
@@ -63,7 +63,8 @@ public class CallAgent extends CallListenerAdapter implements CallStreamObserver
     private String _destination;
     private Boolean listeningToGlobal = false;
     private IMessagingService messagingService;
-    
+    private ForceHangupGlobalAudioUsersListener forceHangupGlobalAudioUsersListener;
+
     private enum CallState {
     	UA_IDLE(0), UA_INCOMING_CALL(1), UA_OUTGOING_CALL(2), UA_ONCALL(3);    	
     	private final int state;
@@ -404,15 +405,23 @@ public class CallAgent extends CallListenerAdapter implements CallStreamObserver
     
     /** Callback function called when arriving a BYE request */
     public void onCallClosing(Call call, Message bye) {
-    	log.info("Received a BYE from the other end telling us to hangup.");
-        
-    	if (!isCurrentCall(call)) return;               
-        closeVoiceStreams();
-        notifyListenersOfOnCallClosed();
-        callState = CallState.UA_IDLE;
+      log.info("Received a BYE from the other end telling us to hangup.");
 
-        // Reset local sdp for next call.
-        initSessionDescriptor();
+      if (!isCurrentCall(call)) return;
+      closeVoiceStreams();
+      notifyListenersOfOnCallClosed();
+
+      // FreeSWITCH initiated hangup of call. Hangup all listen only users.
+      // ralam jan 24, 2019
+      if (forceHangupGlobalAudioUsersListener != null) {
+        log.info("Forcing hangup for listen only users of of voice conf {}.", getDestination());
+        forceHangupGlobalAudioUsersListener.forceHangupGlobalAudioUsers(getDestination());
+      }
+
+      callState = CallState.UA_IDLE;
+
+      // Reset local sdp for next call.
+      initSessionDescriptor();
     }
 
 
@@ -451,7 +460,11 @@ public class CallAgent extends CallListenerAdapter implements CallStreamObserver
     private boolean isCurrentCall(Call call) {
     	return this.call == call;
     }
-    
+
+    public void setForceHangupGlobalAudioUsersListener(ForceHangupGlobalAudioUsersListener listener) {
+      forceHangupGlobalAudioUsersListener = listener;
+    }
+
     public void setCallStreamFactory(CallStreamFactory csf) {
     	this.callStreamFactory = csf;
     }
diff --git a/bbb-voice/src/main/java/org/bigbluebutton/voiceconf/sip/ForceHangupGlobalAudioUsersListener.java b/bbb-voice/src/main/java/org/bigbluebutton/voiceconf/sip/ForceHangupGlobalAudioUsersListener.java
new file mode 100755
index 0000000000000000000000000000000000000000..a60a1c8b86ad937f011a3e0f9ee0f3039b8ce688
--- /dev/null
+++ b/bbb-voice/src/main/java/org/bigbluebutton/voiceconf/sip/ForceHangupGlobalAudioUsersListener.java
@@ -0,0 +1,5 @@
+package org.bigbluebutton.voiceconf.sip;
+
+public interface ForceHangupGlobalAudioUsersListener {
+  void forceHangupGlobalAudioUsers(String voiceConf);
+}
diff --git a/bbb-voice/src/main/java/org/bigbluebutton/voiceconf/sip/GlobalCall.java b/bbb-voice/src/main/java/org/bigbluebutton/voiceconf/sip/GlobalCall.java
index 84c69c3ffe348c52a0460c960fe277c8468a3fe6..aacc66bdcdee22fc58e35ae5a936ff850f3778dd 100755
--- a/bbb-voice/src/main/java/org/bigbluebutton/voiceconf/sip/GlobalCall.java
+++ b/bbb-voice/src/main/java/org/bigbluebutton/voiceconf/sip/GlobalCall.java
@@ -1,6 +1,7 @@
 package org.bigbluebutton.voiceconf.sip;
 
 
+import java.util.Collection;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 import org.red5.app.sip.codecs.Codec;
@@ -80,6 +81,13 @@ public class GlobalCall {
     	return null;
     }
 
+    public static synchronized Collection<ListenOnlyUser> getAllListenOnlyUsers(String voiceConf) {
+        if (voiceConfToListenOnlyUsersMap.containsKey(voiceConf)) {
+            return voiceConfToListenOnlyUsersMap.get(voiceConf).getAllListenOnlyUsers();
+        }
+        return null;
+    }
+
     public static Codec getRoomCodec(String roomName) {
         return roomToCodecMap.get(roomName);
     }
diff --git a/bbb-voice/src/main/java/org/bigbluebutton/voiceconf/sip/SipPeer.java b/bbb-voice/src/main/java/org/bigbluebutton/voiceconf/sip/SipPeer.java
index faa078a910e6ecb38c93882290a2c96b5291aefc..724e384c83f8300ea1250a8daad9ab260f98367b 100755
--- a/bbb-voice/src/main/java/org/bigbluebutton/voiceconf/sip/SipPeer.java
+++ b/bbb-voice/src/main/java/org/bigbluebutton/voiceconf/sip/SipPeer.java
@@ -36,7 +36,7 @@ import org.red5.server.api.stream.IBroadcastStream;
  * @author Richard Alam
  *
  */
-public class SipPeer implements SipRegisterAgentListener {
+public class SipPeer implements SipRegisterAgentListener, ForceHangupGlobalAudioUsersListener {
     private static Logger log = Red5LoggerFactory.getLogger(SipPeer.class, "sip");
 
     private ClientConnectionManager clientConnManager;
@@ -130,6 +130,7 @@ public class SipPeer implements SipRegisterAgentListener {
     	SipPeerProfile callerProfile = SipPeerProfile.copy(registeredProfile);
     	CallAgent ca = new CallAgent(this.clientRtpIp, sipProvider, callerProfile, audioconfProvider, clientId, messagingService);
     	ca.setClientConnectionManager(clientConnManager);
+    	ca.setForceHangupGlobalAudioUsersListener(this);
     	ca.setCallStreamFactory(callStreamFactory);
     	callManager.add(ca);
 
@@ -229,6 +230,15 @@ public class SipPeer implements SipRegisterAgentListener {
 		log.info("Successfully unregistered with Sip Server");
 		registered = false;
 	}
+
+  public void forceHangupGlobalAudioUsers(String voiceConf) {
+      Collection<ListenOnlyUser> listenOnlyUsers = GlobalCall.getAllListenOnlyUsers(voiceConf);
+    Iterator iter = listenOnlyUsers.iterator();
+    while (iter.hasNext()) {
+      ListenOnlyUser listenOnlyUser = (ListenOnlyUser) iter.next();
+      hangup(listenOnlyUser.clientId, true);
+    }
+  }
 	
 	public void setCallStreamFactory(CallStreamFactory csf) {
 		callStreamFactory = csf;
diff --git a/bbb-voice/src/main/java/org/bigbluebutton/voiceconf/sip/VoiceConfToListenOnlyUsersMap.java b/bbb-voice/src/main/java/org/bigbluebutton/voiceconf/sip/VoiceConfToListenOnlyUsersMap.java
index 84d647cce0f7d3375f99e7586d55daad5315b461..c1e2646102c0cec49ed706690961851ecdca6213 100755
--- a/bbb-voice/src/main/java/org/bigbluebutton/voiceconf/sip/VoiceConfToListenOnlyUsersMap.java
+++ b/bbb-voice/src/main/java/org/bigbluebutton/voiceconf/sip/VoiceConfToListenOnlyUsersMap.java
@@ -1,5 +1,7 @@
 package org.bigbluebutton.voiceconf.sip;
 
+import java.util.Collection;
+import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
@@ -23,4 +25,8 @@ public class VoiceConfToListenOnlyUsersMap {
 	public int numUsers() {
 		return listenOnlyUsers.size();
 	}
+
+	public Collection<ListenOnlyUser> getAllListenOnlyUsers() {
+		return listenOnlyUsers.values();
+	}
 }