private void mergeUsuario(String multicastGroup, Boolean novoUsuario) throws UnknownHostException, IOException, RemoteException, XPathExpressionException {
        InetAddress group = InetAddress.getByName(multicastGroup);
        try (MulticastSocket mSckt = new MulticastSocket();) { //usuario "escuta" na mesma porta do multicast
            String mensagem;
            if (novoUsuario) {
                mensagem = PainelDeControle.NOVO_USUARIO;
            } else {
                mensagem = PainelDeControle.USUARIO_EXISTENTE + "-" + PainelDeControle.username;
            }
            byte[] m = mensagem.getBytes();
            DatagramPacket messageOut = new DatagramPacket(m, m.length, group, PainelDeControle.PORTA_MULTICAST);
            mSckt.send(messageOut);
            try (ServerSocket welcome = new ServerSocket(PainelDeControle.PORTA_MULTICAST)) {
                long tempoInicio, tempoTeste;
                int i = 0;
                tempoInicio = System.nanoTime();
                while (true) {
                    if (i == 2) {
                        break;
                    }
                    tempoTeste = System.nanoTime();
                    //N segundos aguardando respostas => Definido na classe Painel de controle
                    if ((tempoTeste - tempoInicio) / 1000000000 > PainelDeControle.deltaTRespostaMulticast) {
                        break;
                    }
                    welcome.setSoTimeout((PainelDeControle.deltaTRespostaMulticast) * 100); //bloqueia por (tempo em milisegundos de espera multicast)/10
                    try (Socket resp = welcome.accept()) {
                        System.out.println("Esperando mensagem server");
                        byte[] resposta = new byte[PainelDeControle.TAMANHO_BUFFER];
                        resp.getInputStream().read(resposta);
                        //confirmação do servidor
                        servidoresArquivo.add(resp.getInetAddress());
                        i++;
                    } catch (SocketTimeoutException ex) {
                        //faz nada e continua execução
                    }
                }
            }

            new Thread(new ServidorConexaoHeartBeat()).start(); //inicia Servidor de conexoes para Heartbeat

            for (InetAddress ip : servidoresArquivo) {
                System.out.println(ip.getHostAddress());
                try (Socket con = new Socket(ip, PainelDeControle.PORTA_SERVIDORES)) {
                    byte[] b = PainelDeControle.EU_ESCOLHO_VOCE.getBytes();
                    con.getOutputStream().write(b);
                }
            }

            if (servidoresArquivo.size() == 0) {
                JOptionPane.showMessageDialog(InterfaceUsuario.main, "Não foram encontrados servidores para o usuário");
                System.exit(0);
            }
            if (servidoresArquivo.size() == 1) {
                System.out.println("Falha detectada no MergeUsuario");
                new Thread(new NotificadorDeFalhas()).start();
            }
            mantenedorServidores = new MantenedorServidores();
            new Thread(mantenedorServidores).start(); //inicia atualizador de enderecos de servidor
        }
    }