protected void processClients(Map<Integer, ClientInfo> connectedClients) {
        // Don't process if previous map is null, i.e. not yet initialized
        if(map == null) return;

        // Loop through all of the clients in the previous mapping
        for(ClientInfo client : map.values()) {

            // Send an event notification if the client does not exist in the
            // map of currently connected clients
            if(!connectedClients.containsKey(client.clientId)) {
                serverQuery.getEventThread().notify(
                        new TS3ClientDisconnectedEvent(client.clientName,
                                client.clientId, client.clientUid));
            }
        }

        // Loop through all of the clients in the current map
        for(ClientInfo client : connectedClients.values()) {

            // Get the ClientInfo object in the previous map
            ClientInfo previous = map.get(client.clientId);

            if(previous == null) {
                // Send an event notification if the client does not exist in
                // the previous map of connected clients
                serverQuery.getEventThread().notify(new TS3ClientConnectedEvent(
                        client.clientName, client.clientId, client.clientUid));
            } else {
                // Check if the client moved channels
                if(client.channelId != previous.channelId) {

                    // Send notification
                    serverQuery.getEventThread().notify(new TS3ClientMovedEvent(
                            client.clientName, client.clientId,
                            client.clientUid, previous.channelId,
                            client.channelId));
                }
            }
        }
    }