diff --git a/arc b/arc
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/messages.cpp b/src/messages.cpp
index e18cd9449660dd34f159d6f83fb0c97144eb2076..6d2b3b876fc7390f402ff6e68084fbd942d94d0a 100644
--- a/src/messages.cpp
+++ b/src/messages.cpp
@@ -335,6 +335,9 @@ int Message::sendGET(unsigned char* fileName, char* currentPath){
             }
           }
         }
+      }else{
+        cout << "Tempo limite de resposta excedido :c\n" << endl;
+        cout << "TIMEOUT ATINGIDO (messages.cpp::sendPUT)" << endl;
       }
     }
   }
@@ -537,9 +540,9 @@ int Message::receiveLS(unsigned char* options, char* currentPath){
 
 int Message::receiveGET(unsigned char* fileName){
   char* tam;
-  unsigned char* dados;
-  int fileSize, rv, i, success = 0;
-  ifstream file;
+  unsigned char *dados, *fileData;
+  int fileSize, rv, i, success = 0, length;
+  ifstream fileIn;
   string temp, data;
   SubMessage resposta, answer;
   struct pollfd ufds[1];
@@ -554,58 +557,73 @@ int Message::receiveGET(unsigned char* fileName){
     send(soquete,resposta.objToString(),68, 0);
   } else {
     // Calcula o tamanho do arquivo
-    file.seekg (0, ios::end);
-    fileSize = file.tellg();
-    file.seekg (0, ios::beg);
-
-    while(getline(file, temp)) {
-      data += temp + "\n";
-    }
-    dados=(unsigned char*)malloc(sizeof(unsigned char)*data.size());
-    for(i = 0; i < data.size(); ++i){
-      dados[i] = data[i];
+    // file.seekg (0, ios::end);
+    // fileSize = file.tellg();
+    // file.seekg (0, ios::beg);
+    //
+    // while(getline(file, temp)) {
+    //   data += temp + "\n";
+    // }
+    // dados=(unsigned char*)malloc(sizeof(unsigned char)*data.size());
+    // for(i = 0; i < data.size(); ++i){
+    //   dados[i] = data[i];
+    // }
+
+    fileIn.open((char*)fileName, ios::binary);
+
+    // Contagem do tamanho do arquivo.
+    fileIn.seekg (0, ios::end);
+    length = fileIn.tellg();
+    fileIn.seekg (0, ios::beg);
+
+    // Alocação do vetor para a leitura do arquivo.
+    fileData = new unsigned char[length];
+
+    // Leitura.
+    for (i = 0; i < length; ++i){
+      fileIn.read((char*)&fileData[i], sizeof(unsigned char));
     }
 
     // Manda o tamanho do arquivo
-    sprintf(tam, "%d", fileSize);
-      while(!success){ // Esse while está aqui pois a mensagem pode não chegar e precisar ser reenviada
-        resposta.setData((unsigned char*)tam,9,0);
-        send(soquete, resposta.objToString(), resposta.getSize()+4, 0);
-        // Espera resposta
-        rv = poll(ufds, 1, 500);
-        if(rv){
-          if(rv == -1){
-            cout << "Erro no recebimento dos dados (messages.cpp::receiveGET)" << endl;
-            return -1;
-          } else {
-            // Lê começo da mensagem e vê se tem o delimitador de início
-            if(answer.getStartMessage() == 0x7E){ // 0x7E = 01111110
-              if(answer.getType() == 14){ // Recebemos um erro
-                // Tamanho é muito pequeno
-                cout << "Tamanho de arquivo muito grande, pare (messages.cpp::receiveGET)" << endl;
+    sprintf(tam, "%d", length);
+    while(!success){ // Esse while está aqui pois a mensagem pode não chegar e precisar ser reenviada
+      resposta.setData((unsigned char*)tam,9,0);
+      send(soquete, resposta.objToString(), resposta.getSize()+4, 0);
+      // Espera resposta
+      rv = poll(ufds, 1, 500);
+      if(rv){
+        if(rv == -1){
+          cout << "Erro no recebimento dos dados (messages.cpp::receiveGET)" << endl;
+          return -1;
+        } else {
+          // Lê começo da mensagem e vê se tem o delimitador de início
+          if(answer.getStartMessage() == 0x7E){ // 0x7E = 01111110
+            if(answer.getType() == 14){ // Recebemos um erro
+              // Tamanho é muito pequeno
+              cout << "Tamanho de arquivo muito grande, pare (messages.cpp::receiveGET)" << endl;
+              return -1;
+            } else if(answer.getType() == 8){ // Recebemos um OK, enviar dados
+              success = 1;
+              if(sendData(dados, 13)){
+                cout << "Erro ao enviar dados, abortando (messages.cpp::receiveGET)" << endl;
                 return -1;
-              } else if(answer.getType() == 8){ // Recebemos um OK, enviar dados
-                success = 1;
-                if(sendData(dados, 13)){
-                  cout << "Erro ao enviar dados, abortando (messages.cpp::receiveGET)" << endl;
-                  return -1;
-                } else {
-                  cout << "Dados enviados com sucesso" << endl;
-                  return 0;
-                }
-              } else { // Provavelmente recebemos um NACK, de qualquer jeito, enviamos de novo
-                success = 0;
+              } else {
+                cout << "Dados enviados com sucesso" << endl;
+                return 0;
               }
+            } else { // Provavelmente recebemos um NACK, de qualquer jeito, enviamos de novo
+              success = 0;
             }
           }
-        } else {
-          // TIMEOUT
-          cout << "Tempo limite de resposta excedido :c\n" << endl;
-          cout << "TIMEOUT ATINGIDO (messages.cpp::receiveGET)" << endl;
-          return -1;
         }
+      } else {
+        // TIMEOUT
+        cout << "Tempo limite de resposta excedido :c\n" << endl;
+        cout << "TIMEOUT ATINGIDO (messages.cpp::receiveGET)" << endl;
+        return -1;
       }
     }
+  }
 }
 
 int Message::receivePUT(unsigned char* fileName, char* currentPath){
diff --git a/src/submessages.cpp b/src/submessages.cpp
index e791a094c2de5db94122a33e8afea55b8648941b..b25c5255c8ced29f7fb4efdec2533e6f1d05504b 100644
--- a/src/submessages.cpp
+++ b/src/submessages.cpp
@@ -13,8 +13,14 @@ void SubMessage::setParity(){
   int i, j, bitsParity[8];
 
   // Alocação da matriz de bits
-  bitsMessage = new int*[getSize()];
-  for(i = 0 ; i < getSize() ; i++){
+  bitsMessage = new int*[getSize()+2];
+  bitsMessage[0] = new int[8];
+  bitsMessage[1] = new int[8];
+  for(j = 0 ; j < 8 ; j++){
+    bitsMessage[0][j] = ((((sizSeqTyp >> 8) & 0x00FF) >> (7-j)) & 0x01);
+    bitsMessage[1][j] = ((((sizSeqTyp >> 0) & 0x00FF) >> (7-j)) & 0x01);
+  }
+  for(i = 2 ; i < getSize()+2 ; i++){
     bitsMessage[i] = new int[8];
     // Divide os dados em bits
     for(j = 0 ; j < 8 ; j++){
@@ -25,7 +31,7 @@ void SubMessage::setParity(){
   // Soma os bits verticalmente
   for(j = 0 ; j < 8 ; j++){
     bitsParity[j] = 0;
-    for(i = 0 ; i < getSize() ; i++){
+    for(i = 0 ; i < getSize()+2 ; i++){
       bitsParity[j] = bitsParity[j] + bitsMessage[i][j];
     }
     // Caso a soma vertical de uma coluna for par, bitsParity recebe 1,
@@ -38,7 +44,7 @@ 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++){
+  for(i = 0 ; i < getSize()+2 ; i++){
     if(bitsMessage[i]){
       delete(bitsMessage[i]);
     }
@@ -141,26 +147,26 @@ int SubMessage::checkParity(){
   int i, j, bitsParity[8];
   unsigned char parityTest;
 
-cout << "AQUI" << endl;
   // Alocação da matriz de bits
-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 = new int*[getSize()+2];
+  bitsMessage[0] = new int[8];
+  bitsMessage[1] = new int[8];
+  for(j = 0 ; j < 8 ; j++){
+    bitsMessage[0][j] = ((((sizSeqTyp >> 8) & 0x00FF) >> (7-j)) & 0x01);
+    bitsMessage[1][j] = ((((sizSeqTyp >> 0) & 0x00FF) >> (7-j)) & 0x01);
+  }
+  for(i = 2 ; i < getSize()+2 ; 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 < getSize() ; i++){
+    for(i = 0 ; i < getSize()+2 ; i++){
       bitsParity[j] = bitsParity[j] + bitsMessage[i][j];
     }
     // Caso a soma vertical de uma coluna for par, bitsParity recebe 1,
@@ -173,13 +179,11 @@ cout << "AQUI 3" << endl;
     // Atribui os bits para parity (variável de paridade do objeto)
     parityTest = (parityTest << 1) | bitsParity[j];
   }
-cout << "AQUI 4" << endl;
-  for(i = 0 ; i < getSize() ; i++){
+  for(i = 0 ; i < getSize()+2 ; i++){
     if(bitsMessage[i]){
       delete(bitsMessage[i]);
     }
   }
-cout << "AQUI 5" << endl;
   delete(bitsMessage);
 cout << "AQUI 6" << endl;
   if (parityTest == parity){