diff --git a/Adicionar b/Adicionar
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/Arrumar b/Arrumar
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/Demonstracao b/Demonstracao
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/Enviar b/Enviar
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/Janela b/Janela
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/Merge b/Merge
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/Readme b/Readme
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/headers/macros.h b/headers/macros.h
index a936d2fd44134ddbf5398f985340968d5de3535f..57c4d1b865683cfea8b293c11ce6e34d8f292d04 100644
--- a/headers/macros.h
+++ b/headers/macros.h
@@ -3,6 +3,7 @@
 
 #define UC unsigned char
 #define UI unsigned int
+#define UL unsigned long
 
 // Macro que cria uma sequencia com o 1 deslocado "des" posicoes a direita
 #define MASKR(des) (1 << des)
diff --git a/headers/server.h b/headers/server.h
index 6a10bc40e9c6360deaf3457ee0e840e745ff9c2e..3eb74e6d346a66c7f821be471947a8c6bb2c08be 100644
--- a/headers/server.h
+++ b/headers/server.h
@@ -21,8 +21,9 @@
 #include <sys/types.h>
 
 // include local
-#include "conexao.h"
 #include "frame.h"
+#include "macros.h"
+#include "conexao.h"
 
 #define FILE_DESTINATION "./received"
 
@@ -41,18 +42,19 @@ private:
 
   // ---------- Funcoes -------- //
 
-  frame *create_ack_nack(int tipo, int seq);
-  int send_nack(frame *fReceive);
-  int send_ack(frame *fReceive);
-  bool verify_seq(int seq, int lastSeq);
+  frame*    create_ack_nack     (int tipo, int seq);
+  int       send_nack           (frame *fReceive);
+  int       send_ack            (frame *fReceive);
+  bool      verify_seq          (int seq, int lastSeq);
+  int       next_tipo_midia     (frame *f);
+  bool      create_received_dir ();
+  UL        chk_available_size  ();
+  int       receive_file_size   (frame *f);
+  ofstream  create_file         (string fileName);
+  int       receive_midia       (frame *f);
   //void send_confirm(frame *fReceive);
   //void receive_text(frame *f);
-  //void receive_midia(frame *f);
   //int receive_valid_frame(frame **f);
-  //unsigned long chk_available_size();
-  //int receive_file_size(frame *f);
-  //bool create_received_dir();
-  //string receive_file_name();
   //int receive_file_data(string fileName);
   //bool verify_crc8(frame *f);
   frame *receive_frame_socket();
@@ -149,6 +151,15 @@ bool server::verify_seq(int seq, int lastSeq) {
   if (seq != lastSeq + 1) { return false; }
   return true;
 }
+
+int server::next_tipo_midia(frame *f) {
+  if ( f->get_tipo() != MIDIA ) { return -1; }
+  if ( f->get_seq() == 0 )      { return MIDIA; }
+  if ( f->get_seq() == 1 )      { return DADOS; }
+
+  return -1;
+}
+
 //// Recebe uma mensagem em forma de texto
 //void server::receive_text(frame *f) {
 //  string textoReceive;
@@ -168,139 +179,59 @@ bool server::verify_seq(int seq, int lastSeq) {
 //}
 //
 //// Verifica o espaco disponivel em disco
-//unsigned long server::chk_available_size() {
-//  struct statvfs st;
-//  if (statvfs(FILE_DESTINATION, &st) == -1) {
-//    cout << "Erro no statvfs, abortado\n";
-//    // send_error();
-//    return -1;
-//  }
-//
-//  return st.f_bsize * st.f_bavail;
-//}
-//
+
+UL server::chk_available_size() {
+  struct statvfs st;
+  if (statvfs(FILE_DESTINATION, &st) == -1) {
+    cout << "Erro no statvfs, abortado\n";
+    // send_error();
+    return -1;
+  }
+
+  return st.f_bsize * st.f_bavail;
+}
+
 //// Recebe o frame com o tamanho do arquivo
-//int server::receive_file_size(frame *f) {
-//
-//  /*
-//     > verifica a sequencia do frame e o tipo
-//     > se o frame nao for a sequencia esperada, envia um ack(0) e espera receber
-//     a sequencia esperada > se o frame for o esperado, verifica o crc8 > se o
-//     crc estiver certo, envia um ack e continua > se estiver errado, envia um
-//     nack e espera receber o proximo frame
-//  */
-//  cout << "Recebendo tamanho do frame\n";
-//  do {
-//    if ( f->get_tipo() != MIDIA ) { continue; }
-//    if ( f->get_seq() == 0 && verify_crc8(f) ) { break; }
-//    
-//    if ( f->get_seq() != 0 )
-//      cout << "Sequencia errada\n";
-//    else
-//      cout << "Crc errado\n";
-//
-//    cout << "Aguardando frame\n";
-//
-//    f = receive_frame_socket();
-//    if (!f) { return 0; }
-//
-//    cout << "Frame recebido\n";
-//
-//  } while (true);
-//
-//  unsigned long availSize = chk_available_size();
-//  if (availSize == -1) { return -1; }
-//
-//  cout << "Frame file size:" << f->get_dado() << "\n";
-//  int fileSize = stoi(f->get_dado());
-//
-//  if (fileSize > availSize * 0.9) {
-//    cout << "Tamanho do arquivo muito grande, abortado\n";
-//    // send_error();
-//    return 0;
-//  }
-//
-//  cout << "Espaco suficiente em disco\n";
-//  return 1;
-//}
-//
-//bool server::create_received_dir() {
-//
-//  // check if the directory exists
-//  struct stat info;
-//  if (stat(FILE_DESTINATION, &info) == 0 && (info.st_mode & S_IFDIR)) {
-//    cout << "Diretorio ja existe\n";
-//    return true;
-//  }
-//
-//  // create the directory
-//  if (mkdir(FILE_DESTINATION, 0700) == -1) {
-//    cout << "Erro ao criar o diretorio\n";
-//    return false;
-//  }
-//
-//  cout << "Diretorio criado com sucesso\n";
-//  return true;
-//}
-//
-//string server::receive_file_name() {
-//  frame *fReceive;
-//
-//  // Aguarda receber um frame do tipo midia com o nome do arquivo
-//  // E com a sequencia de numero 2
-//  /*
-//    > recebe o frame e verifica se o tipo e a sequencia estao corretos
-//    > se estiverem, verifica o crc8
-//    > se estiver correto, envia um ack e continua
-//    > se estiver errado, envia um nack e espera receber o proximo frame
-//  */
-//  cout << "Recebendo nome do arquivo\n";
-//
-//  do {
-//    cout << "Aguardando frame\n";
-//    fReceive = receive_frame_socket();
-//    if (!fReceive) { return string{}; }
-//
-//    cout << "Frame recebido\n";
-//
-//    if (fReceive->get_tipo() != MIDIA) { continue; }
-//    if ( fReceive->get_seq() != 1 )    
-//    { 
-//      cout << "Sequencia errada\n";
-//      fReceive->set_seq(0);
-//      send_ack(fReceive);
-//      continue;
-//    }
-//
-//    if (verify_crc8(fReceive)) { break; }
-//
-//    cout << "Crc invalido, aguardando retransmissao\n";
-//
-//  } while (true);
-//
-//  cout << "Nome do arquivo recebido com sucesso\n";
-//  cout << "Nome do arquivo: " << fReceive->get_dado() << "\n";
-//
-//  return string(fReceive->get_dado());
-//}
+int server::receive_file_size(frame *f) {
 
+ cout << "Recebendo tamanho do frame\n";
+ unsigned long availSize = chk_available_size();
+ if (availSize == -1) { return -1; }
+
+ cout << "Frame file size:" << f->get_dado() << "\n";
+ int fileSize = stoi(f->get_dado());
+
+ if (fileSize > availSize * 0.9) {
+   cout << "Tamanho do arquivo muito grande, abortado\n";
+   // send_error();
+   return 0;
+ }
+
+  cout << "Espaco suficiente em disco\n";
+  return 1;
+}
+
+bool server::create_received_dir() {
+
+  cout << "Criando diretorio";
+  // Check if the directory exists
+  struct stat info;
+  if (stat(FILE_DESTINATION, &info) == 0 && (info.st_mode & S_IFDIR)) {
+    cout << "Diretorio ja existe\n";
+    return true;
+  }
+
+  // create the directory
+  if (mkdir(FILE_DESTINATION, 0700) == -1) {
+    cout << "Erro ao criar o diretorio\n";
+    return false;
+  }
+
+  cout << "Diretorio criado com sucesso\n";
+  return true;
+}
 
-//
 //int server::receive_file_data(string fileName) {
-//  string fileDestination;
-//  fileDestination.append(FILE_DESTINATION);
-//  fileDestination.push_back('/');
-//  fileDestination.append(fileName);
-//
-//  // Abre o arquivo para escrita
-//  ofstream file;
-//  file.open(fileDestination, ios::binary);
-//  if (!file.is_open()) {
-//    cout << "Falha ao criar o arquivo. Abortado\n";
-//    return 0;
-//  }
-//
-//  cout << "Arquivo criado com sucesso\n";
 //
 //  int lastSeq = 1;
 //  frame *f;
@@ -348,23 +279,53 @@ bool server::verify_seq(int seq, int lastSeq) {
 //  return 1;
 //}
 //
-//void server::receive_midia(frame *f) {
-//  cout << "Recebendo frame midia\n";
-//  if (!create_received_dir()) { return; }
-//  if (!receive_file_size(f)) { return; }
-//
-//  string fileName = receive_file_name();
-//
-//  if (fileName.size() == 0) { return; }
-//
-//  if ( !receive_file_data(fileName) ) {
-//    cout << "Falha ao receber o arquivo\n";
-//    return;
-//  }
-//
-//  cout << "Arquivo recebido com sucesso\n";
-//}
-//
+
+ofstream server::create_file(string fileName) {
+  string fileDestination;
+  fileDestination.append(FILE_DESTINATION);
+  fileDestination.push_back('/');
+  fileDestination.append(fileName);
+
+  // Abre o arquivo para escrita
+  ofstream file;
+  file.open(fileDestination, ios::binary);
+  return file;
+}
+
+int server::receive_midia(frame *f) {
+  
+  ofstream file;
+
+  // Escreve o dado no arquivo
+  if ( f->get_tipo() == DADOS )
+  {
+    file.write(f->get_dado(), f->get_tam());
+    return 1;
+  }
+
+  // Primeiro frame de midia
+  if ( f->get_seq() == 0 )
+  {
+    cout << "Recebendo tamanho do arquivo\n";
+    if (!create_received_dir()) { return 0; }
+    if (!receive_file_size(f))  { return 0; }
+  }
+
+  // Segundo frame de midia
+  string fileName = string(f->get_dado());
+  file = create_file(fileName);
+
+  if (!file.is_open())
+  {
+   cout << "Falha ao criar o arquivo. Abortado\n";
+   return 0;
+  }
+
+  cout << "Arquivo criado com sucesso\n";
+  if ( !file.is_open() )     { return 0; }
+  return 1;
+}
+
 //// Recebe um frame do cliente
 frame *server::receive_frame_socket() {
   frame *fReceive;
@@ -517,6 +478,7 @@ void server::start_receveing_message() {
       int tipo = f->get_tipo();
       int tam = f->get_tam();
       char *data_f = f->get_dado();
+
       switch (tipo)
       {
         case FIMT:
@@ -531,9 +493,15 @@ void server::start_receveing_message() {
           break;
 
         case MIDIA:
+          if ( !receive_midia(f) ) { return; }
+          lastSeq = f->get_seq();
+          tipo_data = next_tipo_midia(f);
           break;
 
         case DADOS:
+          if ( !receive_midia(f)) { return; }
+          lastSeq = f->get_seq();
+          tipo_data = DADOS;
           break;
 
         default:
@@ -569,6 +537,9 @@ void server::start_receveing_message() {
 
   if ( tipo_data == TEXTO ) 
     cout << ">>>>>>>>>>>>>> Mensagem recebida: " << string(data.begin(), data.end()) << "\n";
+
+  if ( tipo_data == DADOS )
+    cout << ">>>>>>>>>>>>>> Arquivo recebido\n";
 }
 
 // ------------------------------- PUBLIC --------------------------------- //
diff --git a/63 b/received/135828
similarity index 100%
rename from 63
rename to received/135828
diff --git a/received/foto.jpg b/received/foto.jpg
index 42cedf4a23e28ccea764d16047faa18f7149ddb8..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644
Binary files a/received/foto.jpg and b/received/foto.jpg differ