@Override
    public void process(ChatSocket sock, ChatPacket packet) {
        if (packet.getType() == PacketType.MANIFEST) {
            ManifestMessage mfst = (ManifestMessage) packet.getPayload();
            // For every persistence sequence number locally known...
            for (int seq : sock.getPersistenceManager().getHeard(mfst.getSrc())) {
                // If the remote instance hasn't received it....
                if (!mfst.getSeqs().contains(seq)) {
                    // Push the message out
                    try {
                        PushMessage msg = new PushMessage(mfst.getSrc(), sock.getPersistenceManager().getPacket(
                                mfst.getSrc(), seq));
                        sock.sendPacket(sock.wrapPayload(msg));
                    } catch (IOException e) {
                        Logging.getLogger().warning("Unable to send PushMessage");
                    }
                }
            }

            // For every persistence sequence number remotely known..
            for (int seq : mfst.getSeqs()) {
                Set<Integer> heard = sock.getPersistenceManager().getHeard(mfst.getSrc());
                // If the local instance hasn't received it...
                if (!heard.contains(seq)) {
                    // Push a manifest out
                    try {
                        sock.sendPacket(sock.wrapPayload(new ManifestMessage(mfst.getSrc(), heard)));
                        return;
                    } catch (IOException e) {
                        Logging.getLogger().warning("Unable to send ManifestMessage");
                    }
                }
            }
        }
    }