diff --git a/src/messages.cpp b/src/messages.cpp
index 1f0189eff6f98bc7f1e6d6c2408fdbba1e2970f6..083ed2be782b4ba369c9472c9d9e25af01f7f8b3 100644
--- a/src/messages.cpp
+++ b/src/messages.cpp
@@ -11,6 +11,9 @@ int Message::sendCD(unsigned char* dirName){
   struct pollfd ufds[1]; // usado para timeout em recv
   SubMessage changeDir, answer;
 
+  ufds[0].fd = soquete;
+  ufds[0].events = POLLIN;
+
   changeDir.setData(dirName,3,0);
 
   while(!success){
@@ -21,9 +24,6 @@ int Message::sendCD(unsigned char* dirName){
 
     garbage = 0;
     while((garbage < 10) && (!success)){
-      // recebe resposta
-      ufds[0].fd = soquete;
-      ufds[0].events = POLLIN;
       // vetor de pollfd, numero de buffers observados, timeout(ms)
       rv = poll(ufds, 1, 500);
       if(rv){
@@ -69,7 +69,11 @@ int Message::sendLS(unsigned char* options){
   int error, success = 0, garbage, rv;
   char *receiptMessage = (char*)malloc(sizeof(char*)*64);
   struct pollfd ufds[1]; // usado para timeout em recv
-  SubMessage listDir, answer;
+  String listagem;
+  SubMessage listDir, answer, ack, nack;
+
+  ufds[0].fd = soquete;
+  ufds[0].events = POLLIN;
 
   listDir.setData(options,4,0);
 
@@ -81,9 +85,6 @@ int Message::sendLS(unsigned char* options){
 
     garbage = 0;
     while((garbage < 10) && (!success)){
-      // recebe resposta
-      ufds[0].fd = soquete;
-      ufds[0].events = POLLIN;
       // vetor de pollfd, numero de buffers observados, timeout(ms)
       rv = poll(ufds, 1, 500);
       if(rv){
@@ -98,6 +99,33 @@ int Message::sendLS(unsigned char* options){
             success = 1;
             if(answer.getType() == 10){ // 10 = 0xA --> (A)mostra
               // Mostra as mensagens
+              if(answer.checkParity()){ // Caso a paridade dê errado
+                nack.setData(answer.getSeq(),0,0); // Manda um nack
+                send(soquete,nack.objToString(),nack.getSize()+4, 0);
+                success = 0;
+              } else {
+                strcat(listagem,answer.getData()); // Põe o valor recebido em "listagem"
+                success = 0;
+                while(!success){
+                  rv = poll(ufds, 1, 500); // Observa por novas mensagens
+                  if(rv){
+                    recv(soquete, receiptMessage, 68*sizeof(char), 0);
+                    answer.stringToObj((unsigned char*)receiptMessage);
+                    if(answer.getStartMessage() == 0x7E){
+                      if(answer.getType() == 10){ // 10 = 0xA --> (A)mostra
+                        strcat(listagem,answer.getData()); // Põe em "listagem"
+                        ack.setData(answer.getSeq(),1,0);
+                        send(soquete, ack.objToString(), ack.getSize()+4, 0); // Manda um ACK
+                      } else if (answer.getType() == 15) { // Se for FIM
+                        ack.setData(answer.getSeq(),1,0);
+                        success = 1;
+                      }
+                    }
+                  } else {
+                    // TIMEOUT
+                  }
+                }
+              }
               return 0; // YAY
             } else if(answer.getType() == 0){ // 0 = NACK
               // NACK
@@ -105,10 +133,7 @@ int Message::sendLS(unsigned char* options){
             } else if(answer.getType() == 14){ //14 = 0xE --> Erro
               // ERRO
               if(answer.getData()[0] == '0'){
-                cout << "Diretório Inexistente\n" << endl;
-                return -1;
-              } else if (answer.getData()[0] == '1'){
-                cout << "Sem permissão para acessar o diretório\n" << endl;
+                cout << "Opção inválida, por favor tente -l, -a ou -la\n" << endl;
                 return -1;
               } else {
                 success = 0; // reenvia pedido
@@ -134,6 +159,9 @@ int Message::sendData(unsigned char* stringMessage){
   struct pollfd ufds[1]; // usado para timeout em recv
   SubMessage answer, end;
 
+  ufds[0].fd = soquete;
+  ufds[0].events = POLLIN;
+
   // Calcula o tamanho da msg
   while( stringMessage[size] != '\0'){
     size++;
@@ -207,9 +235,6 @@ int Message::sendData(unsigned char* stringMessage){
         cout << "Problema com o envio da mensagem (messages.cpp::sendData)" << endl;
       }
 
-      // recebe resposta
-      ufds[0].fd = soquete;
-      ufds[0].events = POLLIN;
       // vetor de pollfd, numero de buffers observados, timeout(ms)
       rv = poll(ufds, 1, 500);
       if(rv){
@@ -257,9 +282,6 @@ int Message::sendData(unsigned char* stringMessage){
       success = 0;
       garbage = 0;
       while((garbage < 10) && (!success)){ // Tenta 10 vezes para evitar reenviar a mensagem quando recebe lixo
-        // recebe resposta
-        ufds[0].fd = soquete;
-        ufds[0].events = POLLIN;
         // vetor de pollfd, numero de buffers observados, timeout(ms)
         rv = poll(ufds, 1, 500);
         if(rv){