diff --git a/src/main.cpp b/src/main.cpp
index 173bc8451d9b125b7332564ff9986fb61f0de822..a9d29301d2e898642861e3393a5c58a32b639abc 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -43,9 +43,10 @@ int main(int argc, char *argv[]) {
       cout << currentPath << "(C) " << endl;
 
       /* Executa o comando escolhido. */
+      cin.clear();
       cin >> command;
+      cin.clear();
       if(command == "ls"){
-        parameter = "";
         cin >> parameter;
         lsMini(parameter, currentPath);
       }else if(command == "cd"){
@@ -57,6 +58,9 @@ int main(int argc, char *argv[]) {
       }else if(command == "lsr"){
         cin >> parameter;
         mainMessage.sendLS((unsigned char*)(parameter.c_str()));
+      }else if(command == "put"){
+        cin >> parameter;
+        mainMessage.sendPUT((unsigned char*)(parameter.c_str()));
       }
     }
   }else if(service == "server"){
@@ -97,6 +101,17 @@ int main(int argc, char *argv[]) {
                 cout << "ERRO: ls remoto.";
               }
             }
+          }else if(serverReceive.getType() == 5){
+            if(serverReceive.checkParity()){ // Se a paridade estiver errada
+              resposta.setData((unsigned char*)"4",0,0); // Manda um Nack
+              send(soquete,resposta.objToString(),68, 0);
+            } else {
+              resposta.setData((unsigned char*)"4",1,0); // Manda um ack
+              send(soquete,resposta.objToString(),68, 0);
+              if(mainMessage.receivePUT(serverReceive.getData(), currentPath)){
+                cout << "ERRO: put.";
+              }
+            }
           }
         }
       }
diff --git a/src/messages.cpp b/src/messages.cpp
index dafeb2d8793162675eb48559951ba6e638fd3339..fbb318eb585c7090ac7c8912f479da10be2d9097 100644
--- a/src/messages.cpp
+++ b/src/messages.cpp
@@ -138,7 +138,7 @@ int Message::sendLS(unsigned char* options){
 
 int Message::sendPUT(unsigned char* fileName){
   int error, success = 0, garbage, rv;
-  char *receiptMessage = (char*)malloc(sizeof(char*)*68);
+  char *receiptMessage = (char*)malloc(sizeof(char*)*68), fileSize[10];
   string temp, fileData;
   struct pollfd ufds[1]; // usado para timeout em recv
   SubMessage put, answer, size;
@@ -157,7 +157,7 @@ int Message::sendPUT(unsigned char* fileName){
   }
 
   while(!success){
-    error = send(soquete, put.objToString(), put.getSize()+4, 0);
+    error = send(soquete, put.objToString(), 68, 0);
     if (error == -1){
       cout << "Erro ao enviar arquivo (messages.cpp::sendPUT)" << endl;
     }
@@ -178,8 +178,9 @@ int Message::sendPUT(unsigned char* fileName){
             success = 1;
             if(answer.getType() == 8){ // 8 = OK
               // OK, mandar tamanho
-              size.setData((unsigned char*)fileData.size(),9,0);
-              send(soquete, size.objToString(), size.getSize()+4, 0);
+              sprintf(fileSize, "%d", fileData.size());
+              size.setData((unsigned char*)fileSize,9,0);
+              send(soquete, size.objToString(), 68, 0);
               success = 0;
               while(!success){
                 rv = poll(ufds, 1, 500);
@@ -579,13 +580,15 @@ int Message::receiveGET(unsigned char* fileName){
 }
 
 int Message::receivePUT(unsigned char* fileName, char* currentPath){
-  int success = 0, rv, size, availableSize;
+  int success = 0, rv, size, availableSize, i;
   char *receiptMessage = (char*)malloc(sizeof(char*)*68);
   SubMessage resposta, answer;
   struct statvfs *buff;
   struct pollfd ufds[1];
   ufds[0].fd = soquete;
   ufds[0].events = POLLIN;
+  string receivedFile;
+  ofstream fileOut;
 
   // Calcula espaço livre
   if(statvfs(currentPath, buff) == -1){
@@ -608,17 +611,22 @@ int Message::receivePUT(unsigned char* fileName, char* currentPath){
             success = 1;
             size = atoi((char*)answer.getData()); // Converte o tamanho para int
             if(answer.checkParity()){ // Se a paridade estiver errada
-              resposta.setData((unsigned char*)answer.getSeq(),0,0); // Manda um nack
-              send(soquete,resposta.objToString(),resposta.getSize()+4, 0);
+              resposta.setData((unsigned char*)"0",0,0); // Manda um nack
+              send(soquete,resposta.objToString(),68, 0);
             } else if (availableSize < size){ // Se não houver espaço
-              resposta.setData((unsigned char*)'2',14,0); // Manda um Erro
-              send(soquete,resposta.objToString(),resposta.getSize()+4, 0);
+              resposta.setData((unsigned char*)"2",14,0); // Manda um Erro
+              send(soquete,resposta.objToString(),68, 0);
             } else {
-              resposta.setData((unsigned char*)'0',8,0); // Manda um OK
-              send(soquete,resposta.objToString(),resposta.getSize()+4, 0);
+              resposta.setData((unsigned char*)"0",8,0); // Manda um OK
+              send(soquete,resposta.objToString(),68, 0);
               // Fica esperando dados
-              if(receiveData(13) == ""){
+              receivedFile = receiveData(13);
+              if(receivedFile != ""){
                 cout << "Dados recebidos com sucesso!" << endl;
+                fileOut.open((char*)fileName, ios::binary);
+                for(i = 0; i < receivedFile.size(); i++){
+                  fileOut.write((char*)&receivedFile[i], sizeof(unsigned char));
+                }
                 return 0;
               } else {
                 cout << "Erro ao receber dados (messages.cpp::receivePUT)" << endl;