Buggy code:
public class XMPPContainer extends ClientSOContainer implements IPresenceContainerAdapter { public static final int DEFAULT_KEEPALIVE = 30000 ; public static final String CONNECT_NAMESPACE = XmppPlugin . getDefault ( ) . getNamespaceIdentifier ( ) ; public static final String CONTAINER_HELPER_ID = ( XMPPContainer . class . getName ( ) ) + ".xmpphandler" ; protected static final String GOOGLE_SERVICENAME = "gmail.com" ; protected int keepAlive = 0 ; protected XMPPContainerAccountManager accountManager = null ; protected XMPPChatRoomManager chatRoomManager = null ; protected XMPPOutgoingFileTransferHelper outgoingFileTransferContainerAdapter = null ; protected XMPPContainerPresenceHelper presenceHelper = null ; protected ID presenceHelperID = null ; protected XMPPContainer ( SOContainerConfig config , int keepAlive ) throws Exception { } public XMPPContainer ( ) throws Exception { } public XMPPContainer ( int ka ) throws Exception { } public XMPPContainer ( String userhost , int ka ) throws Exception { } public IRosterManager getRosterManager ( ) { } public IAccountManager getAccountManager ( ) { } public IChatRoomManager getChatRoomManager ( ) { } public IChatManager getChatManager ( ) { } public Namespace getConnectNamespace ( ) { } public void connect ( ID remote , IConnectContext joinContext ) throws ContainerConnectException { } public void disconnect ( ) { ID groupID = getConnectedID ( ) ; fireContainerEvent ( new org . eclipse . ecf . core . events . ContainerDisconnectingEvent ( this . getID ( ) , groupID ) ) ; synchronized ( getConnectLock ( ) ) { if ( isConnected ( ) ) { ISynchAsynchConnection conn = getConnection ( ) ; synchronized ( conn ) { synchronized ( getGroupMembershipLock ( ) ) { <START_BUG> memberLeave ( groupID , null ) ; <END_BUG> } } } connectionState = DISCONNECTED ; this . connection = null ; remoteServerID = null ; accountManager . setConnection ( null ) ; chatRoomManager . setConnection ( null , null , null ) ; outgoingFileTransferContainerAdapter . setConnection ( null ) ; presenceHelper . disconnect ( ) ; getSharedObjectManager ( ) . removeSharedObject ( presenceHelperID ) ; } fireContainerEvent ( new org . eclipse . ecf . core . events . ContainerDisconnectedEvent ( this . getID ( ) , groupID ) ) ; } public void dispose ( ) { } public Object getAdapter ( Class clazz ) { } protected ID handleConnectResponse ( ID originalTarget , Object serverData ) throws Exception { } protected ISynchAsynchConnection createConnection ( ID remoteSpace , Object data ) throws ConnectionCreateException { } protected Object getConnectData ( ID remote , IConnectContext joinContext ) throws IOException , UnsupportedCallbackException { } protected Object createConnectData ( ID target , Callback [ ] cbs , Object data ) { } protected Callback [ ] createAuthorizationCallbacks ( ) { } protected int getConnectTimeout ( ) { } protected Roster getRoster ( ) throws IOException { } protected void deliverEvent ( Event evt ) { } protected void handleXMPPMessage ( Packet aPacket ) throws IOException { } protected boolean handleAsExtension ( Packet packet ) { } protected SOContext createSharedObjectContext ( SOConfig soconfig , IQueueEnqueue queue ) { } protected void processAsynch ( AsynchEvent e ) { } public ECFConnection getECFConnection ( ) { } public XMPPConnection getXMPPConnection ( ) { } protected void trace ( String msg ) { } protected void dumpStack ( String msg , Throwable t ) { } }

Fix:
handleLeave ( groupID , null ) ;