diff --git a/headers/client.h b/headers/client.h
index d8a15faf5c74d94de43d818dbb7746975bc09e9f..b92ab451951ef10e08c631c954a4b3a86f231ec3 100644
--- a/headers/client.h
+++ b/headers/client.h
@@ -257,15 +257,15 @@ void client::send_file() {
     return;
   }
   
-  //  cout << "Enviando arquivo\n";
-  //  vector<char> file = read_file(fileName);
-  //  if (file.empty() || !send_message(file, DADOS))
-  //  {
-  //    cout << "Limite de timout, arquivo nao foi enviado\n";
-  //    return;
-  //  }
-  //
-  //  cout << "Arquivo enviado com sucesso\n";
+  cout << "Enviando arquivo\n";
+  vector<char> file = read_file(fileName);
+  if (file.empty() || !send_message(file, DADOS))
+  {  
+    cout << "Limite de timout, arquivo nao foi enviado\n";
+    return;
+  }
+  
+  cout << "Arquivo enviado com sucesso\n";
 }
 
 /**
diff --git a/headers/server.h b/headers/server.h
index 0eb13092dc463f8a3ea8c1c735a815697aec8b39..e602feafca7063db126c18065ac70bf3f6942992 100644
--- a/headers/server.h
+++ b/headers/server.h
@@ -47,10 +47,11 @@ private:
   frame *receive_frame_socket();
   int receive_valid_frame(frame **f);
   unsigned long chk_available_size();
-  long long receive_file_size(frame *f);
+  int receive_file_size(frame *f);
   void start_receveing_message();
   bool create_received_dir();
-  bool receive_file_name();
+  string receive_file_name();
+  int receive_file_data(string fileName);
 
 public:
   // ------- Construtores ------ //
@@ -138,16 +139,19 @@ unsigned long server::chk_available_size() {
 }
 
 // Recebe o frame com o tamanho do arquivo
-long long server::receive_file_size(frame *f) {
+int server::receive_file_size(frame *f) {
+  if ( !strncmp(f->get_dado(), "NAME", 4)) { return 0; }
+
   unsigned long availSize = chk_available_size();
   if (availSize == -1) { return -1; }
 
-  unsigned long fileSize = stoi(f->get_dado());
+  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 -1;
+    return 0;
   }
 
   cout << "Espaco suficiente em disco\n";
@@ -156,43 +160,45 @@ long long server::receive_file_size(frame *f) {
 
 bool server::create_received_dir() {
 
-  //check if the directory exists
+  // check if the directory exists
   struct stat info;
   if (stat(FILE_DESTINATION, &info) == 0 && (info.st_mode & S_IFDIR)) {
-    cout << "Diretorio ja existe\n";  
+    cout << "Diretorio ja existe\n";
     return true;
   }
 
-  //create the directory
+  // 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;
 }
 
-bool server::receive_file_name() { 
+string server::receive_file_name() {
   frame *fReceive;
+  int lastSeq = -1;
 
   // Aguarda receber um frame do tipo midia com o nome do arquivo
   do {
-    if (!receive_valid_frame(&fReceive))          
-    { 
-      cout << "Timeout, falha ao receber o nome do arquivo. Abortado\n";
-      return false; 
-    }
-
+    if (!receive_valid_frame(&fReceive)) { continue; }
     if (fReceive->get_tipo() != MIDIA) { continue; }
+    if (strncmp(fReceive->get_dado(), "NAME", 4)) { continue; }
+
+
+    if (fReceive->get_seq() == lastSeq) { continue; }
+    lastSeq = fReceive->get_seq();
+
+  } while (fReceive->get_tipo() != FIMT);
 
-  } while ( !strncmp(fReceive->get_dado(), "NAME", 4) );
   
   cout << "Nome do arquivo recebido com sucesso\n";
-  return true;
- }
-
+  cout << "Nome do arquivo: " << fReceive->get_dado()+4 << "\n";
 
+  return string(fReceive->get_dado()+4);
+}
 
 // void server::receive_file_data(){
 //   vector<frame *> framesMidia;
@@ -200,11 +206,28 @@ bool server::receive_file_name() {
 
 // };
 
+int server::receive_file_data(string fileName) {
+  frame *fReceive;
+  int lastSeq = -1;
+  int retries = 0;
+
+  // Aguarda receber um frame do tipo midia com o nome do arquivo
+  do {
+    if (!receive_valid_frame(&fReceive)) { continue; }
+    if (fReceive->get_tipo() != MIDIA) { continue; }
+    if (strncmp(fReceive->get_dado(), "NAME", 4)) { continue; }
+  } while( fReceive->get_tipo() != FIMT);
+};
+
 void server::receive_midia(frame *f) {
-  if ( !create_received_dir() )   { return; }
-  if ( !receive_file_size(f)  )   { return; }
-  if ( !receive_file_name()   )   { return; }
-  // receive_file_data();
+  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)) { return; }
 }
 
 // Recebe um frame do cliente
@@ -246,7 +269,7 @@ int server::receive_valid_frame(frame **f) {
 }
 
 void server::start_receveing_message() {
-  int endTransmission = 0;
+  int continueTransmission = 1;
 
   frame *f;
   do {
@@ -257,18 +280,18 @@ void server::start_receveing_message() {
     switch (frameType) {
     case TEXTO:
       receive_text(f);
-      endTransmission = 1;
+      continueTransmission = 0;
       break;
 
     case MIDIA:
       receive_midia(f);
-      endTransmission = 1;
+      continueTransmission = 0;
       break;
 
     default:
       break;
     }
-  } while (!endTransmission);
+  } while (continueTransmission);
 }
 
 // ------------------------------- PUBLIC --------------------------------- //
diff --git a/todo.txt b/todo.txt
index 2242c510feec551c963ab6cdbc898e1356cba81b..bb047c2b84a429f02ea16c90521530d292d3d1b9 100644
--- a/todo.txt
+++ b/todo.txt
@@ -1,8 +1,8 @@
 -> Ver se os frames que estao vindo sao arquivos e juntar eles no arquivo
 
--> Arrumar nome arquivo > 63
+-> Arrumar receive valid frame, retries
 
--> Testar tamanho antes de enviar o arquivo
+-> Arrumar nome arquivo > 63
 
 -> Arrumar a interface