diff --git a/include/messages.h b/include/messages.h
index 676d450e50800c73e0a9611d6a683eb7f9dd22e4..79167c51adffcc171654067a85982002c15cbea4 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 int receiveData(unsigned char*, int, int); // Método que recebe as mensagens e as agrupa
-		
+		static string receiveData(unsigned char*, 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 ea2d9ff5d93e304f1873a08e75ecdeee63a2309d..af11304578cff1224606fa9d453a0902d42205e4 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 = NULL;              // Área para envio dos dados.
+		unsigned char *data = (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/messages.cpp b/src/messages.cpp
index bc20e5b4f1b833b635584d540edd722fb396bfd1..029fe82d0b61cfbb96a5daa4154378822bf3943f 100644
--- a/src/messages.cpp
+++ b/src/messages.cpp
@@ -120,7 +120,7 @@ int Message::sendLS(unsigned char* options){
                           send(soquete,nack.objToString(),68, 0);
                           success = 0;
                         } else {
-                          if(receiveData((unsigned char*)"ls", atoi((char*)answer.getData()), 0) == 0){
+                          if(receiveData((unsigned char*)"ls", atoi((char*)answer.getData())) != ""){
                             success = 1;
                           }else{
                             success = 0;
@@ -316,7 +316,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()),1) == -1){
+                if(receiveData(fileName,atoi((char*)answer.getData())) == ""){
                   cout << "Erro no recebimento de dados (messages.cpp::sendGET)" << endl;
                   return -1;
                 } else {
@@ -398,53 +398,33 @@ int Message::sendData(unsigned char* stringMessage){
   i++;
   subMensagem[i].setData((unsigned char*)"FIM", 15, k); // Dados = "FIM", tipo = 0xF, sequencia = proxima
 
-  // Caso haja só uma ou duas mensagens
-  if (numberOfMessages < 4){
-    while(!success){
-      if(numberOfMessages < 1) {
-        cout << "Algo parece estranho, sua mensagem contém conteúdo?\n" << endl;
-        cout << "Erro: Mensagem nula (messages.cpp::sendData)" << endl;
-        return -1;
-      }
-      // manda a primeira msg
-      error = send(soquete, subMensagem[0].objToString() , subMensagem[i].getSize()+4, 0);
-      if(numberOfMessages > 1) // Se forem 2 ou 3 msgs, manda a segunda
-        error = send(soquete, subMensagem[1].objToString() , subMensagem[i].getSize()+4, 0);
-      if(numberOfMessages > 2) // Se forem 3 msgs, manda a terceira
-        error = send(soquete, subMensagem[2].objToString() , subMensagem[i].getSize()+4, 0);
-
-      if(error == -1){
-        cout << "Problema com o envio da mensagem (messages.cpp::sendData)" << endl;
-      }
-
+  i = 0;
+  while (i < numberOfMessages){
+    success = 0;
+    garbage = 0;
+    error = send(soquete, subMensagem[i].objToString() , 68, 0);
+    if(error == -1){
+      cout << "Problemas com o envio da mensagem! (messages.cpp: sendData)" << endl;
+      success = 1;
+    }
+    while((garbage < 10) && (!success)){ // Tenta 10 vezes para evitar reenviar a mensagem quando recebe lixo
       // 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::sendData)" << endl;
+          return -1;
         } else {
           recv(soquete, receiptMessage, 68, 0);
           answer.stringToObj((unsigned char*)receiptMessage);
           // Lê começo da mensagem e vê se tem o delimitador de início
           if(answer.getStartMessage() == 0x7E){ // 0x7E = 01111110
-            if(numberOfMessages == 1){
-              if(answer.getType() == 1){ //ACK
-                success = 1; // YAY
-              } else {
-                cout << "Mensagem entregue com erro (messages.cpp::sendData)" << endl;
-              }
-            } else if (numberOfMessages == 2){ // numero de mensagens = 2
-              if((answer.getType() == 1) && (answer.getData() == (unsigned char*)'1') ){ // aceitou ambas as msgs
-                success = 1; // YAY
-              } else {
-                cout << "Mensagem entregue com erro (messages.cpp::sendData)" << endl;
-              }
-            } else { // numbero de mensagens = 3
-              if((answer.getType() == 1) && (answer.getData() == (unsigned char*)'2') ){ // aceitou ambas as msgs
-                success = 1; // YAY
-              } else {
-                cout << "Mensagem entregue com erro (messages.cpp::sendData)" << endl;
-              }
+            if(answer.getType() == 1) {
+              success = 1;
+              i++;
+            }else{
+              success = 0;
             }
           }
         }
@@ -453,56 +433,6 @@ int Message::sendData(unsigned char* stringMessage){
         cout << "TIMEOUT ATINGIDO (messages.cpp::sendData)" << endl;
       }
     }
-    success = 0;
-  } else if (numberOfMessages > 3){
-    i = 0;
-    while (i < numberOfMessages - 2){
-      error = send(soquete, subMensagem[i].objToString() , subMensagem[i].getSize()+4, 0);
-      if(i < numberOfMessages - 1)
-        error = send(soquete, subMensagem[i+1].objToString() , subMensagem[i].getSize()+4, 0);
-      if(i < numberOfMessages)
-        error = send(soquete, subMensagem[i+2].objToString() , subMensagem[i].getSize()+4, 0);
-
-      success = 0;
-      garbage = 0;
-      while((garbage < 10) && (!success)){ // Tenta 10 vezes para evitar reenviar a mensagem quando recebe lixo
-        // vetor de pollfd, numero de buffers observados, timeout(ms)
-        rv = poll(ufds, 1, 500);
-        if(rv){
-          if(rv == -1){
-            cout << "Erro no recebimento de resposta (messages.cpp::sendData)" << endl;
-            return -1;
-          } else {
-            recv(soquete, receiptMessage, 68, 0);
-            answer.stringToObj((unsigned char*)receiptMessage);
-            // Lê começo da mensagem e vê se tem o delimitador de início
-            if(answer.getStartMessage() == 0x7E){ // 0x7E = 01111110
-              success = 1;
-              if(answer.getType() == 1) {
-                sprintf(erro1, "%d", i);
-                sprintf(erro2, "%d", i+1);
-                sprintf(sucesso, "%d", i+2);
-                if(answer.getData() == (unsigned char*)erro1){
-                  i += 1;
-                } else if (answer.getData() == (unsigned char*)erro2){
-                  i += 2;
-                } else if (answer.getData() == (unsigned char*)sucesso){
-                  i += 3;
-                } else {
-                  success = 0;
-                }
-              } else if (answer.getType() == 0){
-                success = 0; // NACK
-              }
-            }
-          }
-        } else {
-          cout << "Tempo limite de resposta excedido :c\n" << endl;
-          cout << "TIMEOUT ATINGIDO (messages.cpp::sendData)" << endl;
-        }
-        garbage++;
-      }
-    }
   }
   return 0;
 }
@@ -728,7 +658,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,1) == 0){
+              if(receiveData(fileName,size) == ""){
                 cout << "Dados recebidos com sucesso!" << endl;
                 return 0;
               } else {
@@ -747,15 +677,13 @@ int Message::receivePUT(unsigned char* fileName, char* currentPath){
   }
 }
 
-int Message::receiveData(unsigned char* fileName, int size, int save){
-  int numberOfMessages, messagesCounter = 0, seqCounter;
-  int i, garbage, error, rv, success = 0, greaterSeq = 0;
-  unsigned char *subData;
+string Message::receiveData(unsigned char* fileName, int size){
+  int numberOfMessages, messagesCounter = 0, seqCounter = 0;
+  int i, garbage, error, rv, success = 0;
   char *receiptMessage = (char*)malloc(sizeof(char*)*68);
   struct pollfd ufds[1];
   SubMessage nack, ack, answer;
-  ofstream fileOut;
-  map<int,string> subMensagem;
+  map<int,string> subData;
   string finalMessage;
 
   ufds[0].fd = soquete;
@@ -774,46 +702,28 @@ while(!success){
     if(rv){
       if(rv == -1){
         cout << "Erro no recebimento dos dados (messages.cpp::receiveData)" << endl;
-        return -1;
+        return("");
       }else{
         recv(soquete, receiptMessage, 68, 0);
         answer.stringToObj((unsigned char*)receiptMessage);
         // Lê começo da mensagem e vê se tem o delimitador de início
         if(answer.getStartMessage() == 0x7E){ // 0x7E = 01111110
           if(answer.checkParity()){
-            if(messagesCounter == 0){ // Se a primeira mensagem tiver erro
-              nack.setData((unsigned char*)answer.getSeq(),0,0); // Manda um nack
-              send(soquete,nack.objToString(),nack.getSize()+4, 0);
-            }else{
-              ack.setData((unsigned char*)((answer.getSeq()-1)%64),1,0);
-              send(soquete, ack.objToString(), ack.getSize()+4, 0); // Manda um ACK
-              messagesCounter = 0;
-            }
+            nack.setData((unsigned char*)answer.getSeq(),0,0); // Manda um nack
+            send(soquete,nack.objToString(),68, 0);
           }else{
             if(answer.getType() == 13){
-              if(subMensagem[answer.getSeq()+(seqCounter*64)] == ""){
-                if(answer.getSeq() == 63){
-                  seqCounter++;
-                }
-                subMensagem[answer.getSeq()+(seqCounter*64)] = (char*)answer.getData();
-                messagesCounter++;
-                if(answer.getSeq()+(seqCounter*64) > greaterSeq){
-                  greaterSeq = answer.getSeq()+(seqCounter*64);
-                }
-                if(messagesCounter > 2){
-                  ack.setData((unsigned char*)(greaterSeq%64),1,0);
-                  send(soquete, ack.objToString(), ack.getSize()+4, 0); // Manda um ACK
-                  messagesCounter = 0;
-                }
-              }else{
-                ack.setData((unsigned char*)answer.getSeq(),1,0);
-                send(soquete, ack.objToString(), ack.getSize()+4, 0); // Manda um ACK
-                messagesCounter = 0;
-              }
+              subData[(seqCounter*64)+answer.getSeq()] = (char*)answer.getData();
+              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*)((greaterSeq%64)+1),1,0);
-              send(soquete, ack.objToString(), ack.getSize()+4, 0); // Manda um ACK
+              ack.setData((unsigned char*)answer.getSeq(),1,0);
+              send(soquete, ack.objToString(), 68, 0); // Manda um ACK
+            }else{
+              nack.setData((unsigned char*)answer.getSeq(),0,0); // Manda um nack
+              send(soquete,nack.objToString(),68, 0);
             }
           }
         }
@@ -824,17 +734,9 @@ while(!success){
     }
   }
 
-  for(i = 0; i < greaterSeq; ++i){
-    finalMessage += subMensagem[i];
-  }
-
-  if(save){
-    // Escrita no arquivo de saída.
-    fileOut.open((char *)fileName, ios::out);
-    fileOut << finalMessage;
-  } else {
-    cout << finalMessage << endl;
+  for(i = 0; i < numberOfMessages; ++i){
+    finalMessage += subData[i];
   }
 
-  return 0;
+  return finalMessage;
 }
diff --git a/src/submessages.cpp b/src/submessages.cpp
index 7289c31af362a7c3202fa6de316ac6ccb9386f3a..10da4292af0ed4848ce92139a627016a374c980b 100644
--- a/src/submessages.cpp
+++ b/src/submessages.cpp
@@ -54,10 +54,8 @@ void SubMessage::setData(unsigned char* dataBody, int type, int seq){
   int i, tamanho = 1;
 
   while(dataBody[tamanho-1] != '\0' && tamanho<64) tamanho++;
-  cout << "AQUI" << endl;
-  delete(data);
-  cout << "FERA" << endl;
-  data = new unsigned char[tamanho];
+
+  data = (unsigned char*)realloc(data, sizeof(unsigned char)*tamanho);
 
   for (i = 0; i < tamanho; i++){
       data[i] = dataBody[i];