diff --git a/include/messages.h b/include/messages.h
index 79167c51adffcc171654067a85982002c15cbea4..ebb324a3fe8000a6fd633553511e78f3122eebb6 100644
--- a/include/messages.h
+++ b/include/messages.h
@@ -22,7 +22,7 @@ class Message{
 		static int receiveLS(unsigned char*, char*); // Lida com mensagens tipo LS
 		static int receivePUT(unsigned char*, char*); // Lida com... ok você entendeu
 		static int receiveGET(unsigned char*);
-		static string receiveData(unsigned char*, int); // Método que recebe as mensagens e as agrupa
+		static string receiveData(int); // Método que recebe as mensagens e as agrupa
 
 		static int lsParameter(string); // Usado para decidir qual tipo de ls será feito.
 };
diff --git a/include/submessages.h b/include/submessages.h
index af11304578cff1224606fa9d453a0902d42205e4..9ba2d2e69a64bd2b1a42c18eb01b69b94f9a04cd 100644
--- a/include/submessages.h
+++ b/include/submessages.h
@@ -9,7 +9,7 @@ class SubMessage{
 	private:
 		unsigned char startMessage;    // Delimitador de início.
 		int sizSeqTyp;       // 6 bits para tamanho, 6 bits para sequencia e 4 bits para o tipo.
-		unsigned char *data = (unsigned char*)"";              // Área para envio dos dados.
+		unsigned char *data = (unsigned char*)malloc(sizeof(unsigned char));              // Área para envio dos dados.
 		unsigned char parity;             // 1 Byte para a paridade vertical (detecção de erros).
 
 		// Calcula a paridade da mensagem, esse método está como privado para ser
diff --git a/src/main.cpp b/src/main.cpp
index 1cf10fd1886465f11911f812ddb3103c359171ee..0774bc40d82023f1cd4933b8c58499ed3d1d7ab8 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -88,6 +88,8 @@ int main(int argc, char *argv[]) {
               resposta.setData((unsigned char*)"4",0,0); // Manda um Nack
               send(soquete,resposta.objToString(),68, 0);
             } else {
+              resposta.setData((unsigned char*)"4",1,0); // Manda um ack
+              send(soquete,resposta.objToString(),68, 0);
               cout << "res " << serverReceive.getData() << endl;
               if(mainMessage.receiveLS(serverReceive.getData(), currentPath)){
                 cout << "ERRO: ls remoto.";
diff --git a/src/messages.cpp b/src/messages.cpp
index 029fe82d0b61cfbb96a5daa4154378822bf3943f..a9a46569420e4e174563449124b8430b00d8810c 100644
--- a/src/messages.cpp
+++ b/src/messages.cpp
@@ -66,27 +66,29 @@ int Message::sendCD(unsigned char* dirName){
 }
 
 int Message::sendLS(unsigned char* options){
-  int error, success = 0, garbage, rv;
+  int error, success, garbage, rv;
   char *receiptMessage = (char*)malloc(sizeof(char*)*68);
   struct pollfd ufds[1]; // usado para timeout em recv
-  char *listagem, sequence[3];
   SubMessage listDir, answer, ack, nack;
+  string showLS;
 
   ufds[0].fd = soquete;
   ufds[0].events = POLLIN;
-
+cout << "lsr ----> 1 " << endl;
   listDir.setData(options,4,0);
-
+cout << "lsr ----> 1 " << endl;
   while(!success){
     error = send(soquete, listDir.objToString(), 68, 0);
     if (error == -1){
       cout << "Erro ao tentar listar diretorio (messages.cpp::sendLS)" << endl;
     }
-
+cout << "lsr ----> 1 " << endl;
     garbage = 0;
+    success = 0;
     while((garbage < 10) && (!success)){
       // vetor de pollfd, numero de buffers observados, timeout(ms)
       rv = poll(ufds, 1, 500);
+      garbage++;
       if(rv){
         if(rv == -1){
           cout << "Erro no recebimento de resposta (messages.cpp::sendLS)" << endl;
@@ -97,55 +99,26 @@ int Message::sendLS(unsigned char* options){
           if(receiptMessage[0] == 0x7E){ // 0x7E = 01111110
             answer.stringToObj((unsigned char*)receiptMessage);
             success = 1;
-            if(answer.getType() == 10){ // 10 = 0xA --> (A)mostra
-              // Mostra as mensagens
-              if(answer.checkParity()){ // Caso a paridade dê errado
-                sprintf(sequence, "%d", answer.getSeq());
-                nack.setData((unsigned char*)sequence,0,0); // Manda um nack
-                send(soquete,nack.objToString(),68, 0);
-                success = 0;
-              } else {
-                strcat(listagem,(char*)answer.getData()); // Põe o valor recebido em "listagem"
+            if(answer.checkParity()){ // Caso a paridade dê errado
+              success = 0; // Vai reenviar
+            }else{
+              if(answer.getType() == 1){
+                showLS = receiveData(10);
+                if(showLS != ""){
+                  success = 1;
+                }else{
+                  success = 0;
+                }
+              }else if(answer.getType() == 0){
                 success = 0;
-                while(!success){
-                  rv = poll(ufds, 1, 500); // Observa por novas mensagens
-                  if(rv){
-                    recv(soquete, receiptMessage, 68, 0);
-                    if(receiptMessage[0] == 0x7E){
-                      answer.stringToObj((unsigned char*)receiptMessage);
-                      if(answer.getType() == 10){ // 10 = 0xA --> (A)mostra
-                        if(answer.checkParity()){ // Caso a paridade dê errado
-                          sprintf(sequence, "%d", answer.getSeq());
-                          nack.setData((unsigned char*)sequence,0,0); // Manda um nack
-                          send(soquete,nack.objToString(),68, 0);
-                          success = 0;
-                        } else {
-                          if(receiveData((unsigned char*)"ls", atoi((char*)answer.getData())) != ""){
-                            success = 1;
-                          }else{
-                            success = 0;
-                          }
-                        }
-                      }
-                    }
-                  } else {
-                    cout << "TIMEOUT DO LS (messages.cpp::sendLS)" << endl;
-                  }
+              }else if(answer.getType() == 14){
+                if(answer.getData()[0] == '0'){
+                  cout << "Opção inválida, por favor tente -l, -a ou -la\n" << endl;
+                  return -1;
+                } else {
+                  success = 0; // reenvia pedido
                 }
               }
-              cout << listagem << endl;
-              return 0; // YAY
-            } else if(answer.getType() == 0){ // 0 = NACK
-              // NACK
-              success = 0; // reenvia pedido
-            } else if(answer.getType() == 14){ //14 = 0xE --> Erro
-              // ERRO
-              if(answer.getData()[0] == '0'){
-                cout << "Opção inválida, por favor tente -l, -a ou -la\n" << endl;
-                return -1;
-              } else {
-                success = 0; // reenvia pedido
-              }
             }
           }
         }
@@ -153,7 +126,6 @@ int Message::sendLS(unsigned char* options){
         cout << "Tempo limite de resposta excedido :c\n" << endl;
         cout << "TIMEOUT ATINGIDO (messages.cpp::sendData)" << endl;
       }
-      garbage++;
     }
   }
 }
@@ -316,7 +288,7 @@ int Message::sendGET(unsigned char* fileName, char* currentPath){
               } else {
                 ok.setData((unsigned char*)answer.getSeq(),8,0); // Manda um ok
                 send(soquete,ok.objToString(),ok.getSize()+4, 0);
-                if(receiveData(fileName,atoi((char*)answer.getData())) == ""){
+                if(receiveData(13) == ""){
                   cout << "Erro no recebimento de dados (messages.cpp::sendGET)" << endl;
                   return -1;
                 } else {
@@ -658,7 +630,7 @@ int Message::receivePUT(unsigned char* fileName, char* currentPath){
               resposta.setData((unsigned char*)'0',8,0); // Manda um OK
               send(soquete,resposta.objToString(),resposta.getSize()+4, 0);
               // Fica esperando dados
-              if(receiveData(fileName,size) == ""){
+              if(receiveData(13) == ""){
                 cout << "Dados recebidos com sucesso!" << endl;
                 return 0;
               } else {
@@ -677,9 +649,9 @@ int Message::receivePUT(unsigned char* fileName, char* currentPath){
   }
 }
 
-string Message::receiveData(unsigned char* fileName, int size){
+string Message::receiveData(int type){
   int numberOfMessages, messagesCounter = 0, seqCounter = 0;
-  int i, garbage, error, rv, success = 0;
+  int i, garbage, error, rv, success = 0, size = 0;
   char *receiptMessage = (char*)malloc(sizeof(char*)*68);
   struct pollfd ufds[1];
   SubMessage nack, ack, answer;
@@ -689,15 +661,8 @@ string Message::receiveData(unsigned char* fileName, int size){
   ufds[0].fd = soquete;
   ufds[0].events = POLLIN;
 
-  // Verifica quantas mensagens serao necessarias
-  if (size%64){
-    numberOfMessages = (size/64) + 1;
-  }else{
-    numberOfMessages = (size/64);
-  }
-  numberOfMessages++;  // +1 = Mensagem de FIM
 
-while(!success){
+  while(!success){
     rv = poll(ufds, 1, 500);
     if(rv){
       if(rv == -1){
@@ -712,11 +677,14 @@ while(!success){
             nack.setData((unsigned char*)answer.getSeq(),0,0); // Manda um nack
             send(soquete,nack.objToString(),68, 0);
           }else{
-            if(answer.getType() == 13){
-              subData[(seqCounter*64)+answer.getSeq()] = (char*)answer.getData();
+            if(answer.getType() == type){
+              if(subData[(seqCounter*64)+answer.getSeq()] == ""){
+                subData[(seqCounter*64)+answer.getSeq()] = (char*)answer.getData();
+                if(answer.getSeq() == 63) seqCounter++;
+                size++;
+              }
               ack.setData((unsigned char*)answer.getSeq(),1,0);
               send(soquete, ack.objToString(), 68, 0); // Manda um ACK
-              if(answer.getSeq() == 63) seqCounter++;
             }else if(answer.getType() == 15){
               success = 1;
               ack.setData((unsigned char*)answer.getSeq(),1,0);
@@ -734,7 +702,7 @@ while(!success){
     }
   }
 
-  for(i = 0; i < numberOfMessages; ++i){
+  for(i = 0; i < size; ++i){
     finalMessage += subData[i];
   }