diff --git a/include/submessages.h b/include/submessages.h
index 9ba2d2e69a64bd2b1a42c18eb01b69b94f9a04cd..ecff63c4579447cba0c5eaaa4d511339e99db2c9 100644
--- a/include/submessages.h
+++ b/include/submessages.h
@@ -28,6 +28,8 @@ class SubMessage{
 		// Aqui nós entramos com os dados e o tamanho dos dados (em bytes).
 		void setData(unsigned char*, int, int);
 
+		void deleteData();
+
 		int getStartMessage();
 
 		unsigned char getParity(); //Retorna a paridade
diff --git a/src/messages.cpp b/src/messages.cpp
index 2b9614a27c80bc62fead712eea092003c699d838..40faec1bce542a9153b6f99039250b7058663d67 100644
--- a/src/messages.cpp
+++ b/src/messages.cpp
@@ -63,6 +63,7 @@ int Message::sendCD(unsigned char* dirName){
       garbage++;
     }
   }
+  changeDir.deleteData();
 }
 
 int Message::sendLS(unsigned char* options){
@@ -91,16 +92,22 @@ int Message::sendLS(unsigned char* options){
           cout << "Erro no recebimento de resposta (messages.cpp::sendLS)" << endl;
           return -1;
         } else {
+cout << "recv" << endl;
           recv(soquete, receiptMessage, 68, 0);
           // Lê começo da mensagem e vê se tem o delimitador de início
           if(receiptMessage[0] == 0x7E){ // 0x7E = 01111110
             answer.stringToObj((unsigned char*)receiptMessage);
             success = 1;
+cout << "checkparity" << endl;
             if(answer.checkParity()){ // Caso a paridade dê errado
               success = 0; // Vai reenviar
+cout << "deu ruim" << endl;
             }else{
+cout << "deu boa" << endl;
               if(answer.getType() == 1){
+cout << "recebeu ack" << endl;
                 showLS = receiveData(10);
+cout << "recebeu dados" << endl;
                 if(showLS != ""){
                   success = 1;
                   cout << showLS << endl;
@@ -124,6 +131,7 @@ int Message::sendLS(unsigned char* options){
         cout << "Tempo limite de resposta excedido :c\n" << endl;
         cout << "TIMEOUT ATINGIDO (messages.cpp::sendData)" << endl;
       }
+      answer.deleteData();
     }
   }
 }
@@ -402,6 +410,9 @@ int Message::sendData(unsigned char* stringMessage, int type){
       }
     }
   }
+  for(i = 0; i < numberOfMessages; i++){
+    subMensagem[i].deleteData();
+  }
   return 0;
 }
 
@@ -474,13 +485,11 @@ int Message::receiveLS(unsigned char* options, char* currentPath){
 	fileName = path + "/ls.txt";
 	lsFile.open(fileName.c_str(), ios::in);
 	lsFile.seekg (0);
-cout << "+1+" << endl;
 	// Leitura do arquivo.
   show += path + "\n";
 	while(getline(lsFile, temp)) {
 		show += temp + "\n";
 	}
-cout << "+2+" << endl;
 	// Remove arquivo ls.txt
 	remove(fileName.c_str());
 
@@ -488,13 +497,10 @@ cout << "+2+" << endl;
   for(i = 0; i < show.size(); i++){
     lsData[i] = show[i];
   }
-cout << "+3+" << endl;
 
-  if(sendData(lsData, 14) == 0){
-cout << "+return 0+" << endl;
+  if(sendData(lsData, 10) == 0){
     return 0;
   }else{
-cout << "+return -1+" << endl;
     return -1;
   }
 }
@@ -649,27 +655,36 @@ string Message::receiveData(int type){
         cout << "Erro no recebimento dos dados (messages.cpp::receiveData)" << endl;
         return("");
       }else{
+cout << "recv" << endl;
         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
+cout << "startmesg" << endl;
           if(answer.checkParity()){
+cout << "paridade deu ruim" << endl;
             nack.setData((unsigned char*)"0",0,0); // Manda um nack
             send(soquete,nack.objToString(),68, 0);
           }else{
+cout << "paridade deu boa" << endl;
             if(answer.getType() == type){
+cout << "tipo = ls" << endl;
               if(subData[(seqCounter*64)+answer.getSeq()] == ""){
                 subData[(seqCounter*64)+answer.getSeq()] = (char*)answer.getData();
                 if(answer.getSeq() == 63) seqCounter++;
                 size++;
+cout << "seqc = " << seqCounter << endl;
+cout << "size = " << size << endl;
               }
               ack.setData((unsigned char*)"0",1,0);
               send(soquete, ack.objToString(), 68, 0); // Manda um ACK
             }else if(answer.getType() == 15){
+cout << "tipo = fim" << endl;
               success = 1;
               ack.setData((unsigned char*)"0",1,0);
               send(soquete, ack.objToString(), 68, 0); // Manda um ACK
             }else{
+cout << "tipo = sei la -> nack" << endl;
               nack.setData((unsigned char*)"0",0,0); // Manda um nack
               send(soquete,nack.objToString(),68, 0);
             }
@@ -679,6 +694,7 @@ string Message::receiveData(int type){
     }else{
       cout << "TIMEOUT ATINGIDO (messages.cpp::receiveData)" << endl;
     }
+    answer.deleteData();
   }
 
   for(i = 0; i < size; ++i){
diff --git a/src/submessages.cpp b/src/submessages.cpp
index 841cf8884a738bc2a9f91d0fda4db355687757ce..184008b42727b3e2e534217fe5d1bcf23adace01 100644
--- a/src/submessages.cpp
+++ b/src/submessages.cpp
@@ -13,8 +13,8 @@ void SubMessage::setParity(){
   int i, j, bitsParity[8];
 
   // Alocação da matriz de bits
-  bitsMessage = new int*[this->getSize()];
-  for(i = 0 ; i < this->getSize() ; i++){
+  bitsMessage = new int*[getSize()];
+  for(i = 0 ; i < getSize() ; i++){
     bitsMessage[i] = new int[8];
     // Divide os dados em bits
     for(j = 0 ; j < 8 ; j++){
@@ -25,7 +25,7 @@ void SubMessage::setParity(){
   // Soma os bits verticalmente
   for(j = 0 ; j < 8 ; j++){
     bitsParity[j] = 0;
-    for(i = 0 ; i < this->getSize() ; i++){
+    for(i = 0 ; i < getSize() ; i++){
       bitsParity[j] = bitsParity[j] + bitsMessage[i][j];
     }
     // Caso a soma vertical de uma coluna for par, bitsParity recebe 1,
@@ -38,7 +38,12 @@ void SubMessage::setParity(){
     // Atribui os bits para parity (variável de paridade do objeto)
     parity = (parity << 1) | bitsParity[j];
   }
-
+  for(i = 0 ; i < getSize() ; i++){
+    if(bitsMessage[i]){
+      delete(bitsMessage[i]);
+    }
+  }
+  delete(bitsMessage);
 }
 
 void SubMessage::setSizSeqTyp(int size, int seq, int type){
@@ -65,6 +70,10 @@ void SubMessage::setData(unsigned char* dataBody, int type, int seq){
   setParity();
 }
 
+void SubMessage::deleteData(){
+  data = (unsigned char*)realloc(data, sizeof(unsigned char));
+}
+
 void SubMessage::setStartMessage(){
   startMessage = 0x7E;
 }
@@ -132,20 +141,26 @@ int SubMessage::checkParity(){
   int i, j, bitsParity[8];
   unsigned char parityTest;
 
+cout << "AQUI" << endl;
   // Alocação da matriz de bits
-  bitsMessage = new int*[this->getSize()];
-  for(i = 0 ; i < this->getSize() ; i++){
+cout << "this-getSize = " << getSize() << endl;
+// bitsMessage = (int**) malloc(sizeof(int*)*getSize());
+  bitsMessage = new int*[getSize()];
+  //bitsMessage = (int**) realloc(bitsMessage,sizeof(int*)*getSize());
+cout << "AQUI2" << endl;
+  for(i = 0 ; i < getSize() ; i++){
     bitsMessage[i] = new int[8];
     // Divide os dados em bits
     for(j = 0 ; j < 8 ; j++){
       bitsMessage[i][j] = ((data[i] >> (7-j)) & 0x01);
     }
   }
+cout << "AQUI 3" << endl;
 
   // Soma os bits verticalmente
   for(j = 0 ; j < 8 ; j++){
     bitsParity[j] = 0;
-    for(i = 0 ; i < this->getSize() ; i++){
+    for(i = 0 ; i < getSize() ; i++){
       bitsParity[j] = bitsParity[j] + bitsMessage[i][j];
     }
     // Caso a soma vertical de uma coluna for par, bitsParity recebe 1,
@@ -158,6 +173,12 @@ int SubMessage::checkParity(){
     // Atribui os bits para parity (variável de paridade do objeto)
     parityTest = (parityTest << 1) | bitsParity[j];
   }
+  for(i = 0 ; i < getSize() ; i++){
+    if(bitsMessage[i]){
+      delete(bitsMessage[i]);
+    }
+  }
+  delete(bitsMessage);
   if (parityTest == parity){
     return 0;
   }else{