diff --git a/Protocol.cpp b/Protocol.cpp
index 7d37b7a178130416fa925af6d3808beed1d18cd6..f481d35daac77ac2356ef705a9dcca73f9f89525 100644
--- a/Protocol.cpp
+++ b/Protocol.cpp
@@ -1,4 +1,5 @@
 #include <sys/socket.h>
+#include <sys/time.h>
 #include "Protocol.h"
 #include "definitions.h"
 
@@ -7,6 +8,12 @@ typedef struct{
     bool sent;
 }FrameItem;
 
+double timestamp(void) {
+    struct timeval tp;
+    gettimeofday(&tp, NULL);
+    return ((double)(tp.tv_sec + tp.tv_usec/1000000.0));
+}
+
 vector<Message> Protocol::getMessages(){
     return messages;
 }
@@ -27,7 +34,7 @@ bool Protocol::sendMessages(int socket) {
 }
 
 bool Protocol::sendMessage(int socket, int index) {
-    cout << "message sent: " << messages[index] << endl;
+    // cout << "message sent: " << messages[index] << endl;
     vector<BYTE> message = messages[index].getMessage();
     unsigned char* msg = reinterpret_cast<unsigned char*> (message.data());
     int status = send(socket, msg, messages[index].getMessageSize(), 0);
@@ -88,57 +95,60 @@ int Protocol::setData(vector<BYTE> data, int type){
 int Protocol::recvMessage(int sockt){
     BYTE dataRec[MAXSIZE+4];
     int r = recv(sockt, dataRec, MAXSIZE+4, 0);
-    cout << "begin: "<< bitset<8>(dataRec[0]) <<endl;
-    cout << "recv response: " << r << endl;
+    // cout << "begin: "<< bitset<8>(dataRec[0]) <<endl;
+    // cout << "recv response: " << r << endl;
     if(dataRec[0] != BEGIN){
         return NOISE;
     }
     Message msg = Message();
     int size = (int)(dataRec[1]>>2);
-    cout << "Tamanho:" << size << "\t";
+    // cout << "Tamanho:" << size << "\t";
     int dataSize = size < MINSIZE ? MINSIZE : size;
     msg.setBitFields(dataRec[0], dataRec[1], dataRec[2], dataRec[dataSize+3]);
-    cout << "Sequence:" << msg.sequence.to_ulong() << "\t";
+    // cout << "Sequence:" << msg.sequence.to_ulong() << "\t";
     BYTE msgData[size];
     memcpy(msgData,dataRec+3,size);
     msg.data.insert(msg.data.end(), msgData, msgData+size);
 
     messages.push_back(msg);
-    cout << "Tipo:" << (int)msg.type.to_ulong() << endl;
+    // cout << "Tipo:" << (int)msg.type.to_ulong() << endl;
 
-    cout <<"message received: "<< msg<<endl;
+    // cout <<"message received: "<< msg<<endl;
     if(!msg.checkParity()){
         return INCONSISTENT;
     }
     return (int)msg.type.to_ulong();
 }
 
-void Protocol::transmit(int sockt, int window, bool dataEndable){
+void Protocol::transmit(int sockt, int window){
     int status;
     vector<FrameItem> frame;
     int lastFramed = -1;
-    if(dataEndable) setData(vector<BYTE>(1, 0), ENDTX);
+    setData(vector<BYTE>(1, 0), ENDTX);
     int messagesLeft = messages.size();
     Protocol response;
+    double t0 = 0.0;
+    bool timeout = false;
     while(messagesLeft > 0){
         cout << "Restantes: " << messagesLeft << endl;
         for(int j=0; j < window; ++j) {
             if(frame.size() < window && frame.size() < messagesLeft) {
-                cout << "frame size: " << frame.size() << endl;
+                // cout << "frame size: " << frame.size() << endl;
                 FrameItem fi = {.index = ++lastFramed, .sent=false};
-                cout << "lastFramed: " << fi.index << endl;
+                // cout << "lastFramed: " << fi.index << endl;
                 frame.push_back(fi);
             }
-            if(!frame[j].sent){
+            if(!frame[j].sent || timeout){
                 sendMessage(sockt, frame[j].index);
                 frame[j].sent = true;
+                t0 = timestamp();
             }
         }
         // TODO: timeout
         status = response.recvMessage(sockt);
-        cout << "transmit status:" << status << endl;
+        // cout << "transmit status:" << status << endl;
         if(status == NACK){
-            printf("nstoi %i\n", response.getMessages().back().getDataAsString()[0]);
+            // printf("nstoi %i\n", response.getMessages().back().getDataAsString()[0]);
             int nackIndex = response.getMessages().back().getDataAsString()[0];
             for(int j=0; j < window;) {
                 if(frame[j].index < nackIndex) {
@@ -149,12 +159,13 @@ void Protocol::transmit(int sockt, int window, bool dataEndable){
                 } else ++j;
             }
             response.reset();
+            t0 = timestamp();
 
         }else if(status == ACK){
-            printf("astoi %i\n", response.getMessages().back().getDataAsString()[0]);
+            // printf("astoi %i\n", response.getMessages().back().getDataAsString()[0]);
             int ackIndex = response.getMessages().back().getDataAsString()[0];
             for(int j=0; j < frame.size();) {
-                cout << "ackIndex: " << ackIndex << "frame[j].index: " << frame[j].index << endl;
+                // cout << "ackIndex: " << ackIndex << "frame[j].index: " << frame[j].index << endl;
                 if(ackIndex == 0) {
                     if((frame[j].index % (MAXSIZE+1)) == 62 || (frame[j].index % (MAXSIZE+1)) == 63 || (frame[j].index % (MAXSIZE+1)) == 0) {
                         frame.erase(frame.begin() + j);
@@ -166,9 +177,12 @@ void Protocol::transmit(int sockt, int window, bool dataEndable){
                 } else ++j;
             }
             response.reset();
+            t0 = timestamp();
         } else {
             //TODO: treat error
         }
+        timeout = ((timestamp() - t0) > 2.0);
+        if(timeout) cout << "TIMEOUT!\n";
     }
     reset();
 }
@@ -186,7 +200,7 @@ int Protocol::receive(int sockt, int type, int window, bool dataEndable){
             shouldSend = false;
         }
         status = recvMessage(sockt);
-        cout << "receive status:" << status << endl;
+        // cout << "receive status:" << status << endl;
         // cout << "sequence: "<<messages.back().sequence.to_ulong()<<" next: "<<nextSequence<<endl;
         if(status == NOISE){
             continue;
diff --git a/Protocol.h b/Protocol.h
index 242722417ae046ba3d55a62eb8fa15ecc72af0f8..fba73fb378af1e9ea6cb50c272430898a55eb5c1 100644
--- a/Protocol.h
+++ b/Protocol.h
@@ -7,7 +7,6 @@ class Protocol{
 
 private:
     vector<Message> messages;
-    int timeout;
 public:
     bool sendMessages(int socket);
     bool sendMessage(int socket, int index);
@@ -18,7 +17,7 @@ public:
     string getDataAsString();
     int recvMessage(int sockt);
     void addMessage(Message msg);
-    void transmit(int sockt, int window, bool dataEndable);
+    void transmit(int sockt, int window);
     int receive(int sockt, int type, int window, bool dataEndable);
     void reset();
 
diff --git a/client.cpp b/client.cpp
index cf6fcaabaaf54b7b784a0027d73b017c71c5ab36..954f302e378cf0044f9b68a1d5f5c09125f717ca 100644
--- a/client.cpp
+++ b/client.cpp
@@ -38,14 +38,14 @@ int main(){
                 line.replace(line.find("lsr"), string("lsr").length(), "ls");
                 sendProtocol.setData(vector<BYTE>(line.begin(), line.end()), LS);
                 sendProtocol.sendMessage(sockt,0);
-                cout << "Remoto:" << endl;
+                cout << "Remoto:\n";
                 receiveProtocol.receive(sockt, OUTPUT, WAIT_STOP, true);
                 cout << receiveProtocol.getDataAsString() << endl;
             }else if(command == "put"){
                 args = line.substr(pos+1, line.size());
                 if(fexists(args)) {
                     string size = to_string(filesize(args));
-                    cout << "ARQUIVO: " << args << "|" << size << endl;
+                    cout << "ARQUIVO: " << args << "|\tTAMANHO:" << size << endl;
                     sendProtocol.setData(vector<BYTE>(args.begin(), args.end()), PUT);
                     sendProtocol.sendMessage(sockt, 0);
                     int error = receiveProtocol.receive(sockt, OK, WAIT_STOP, false);
@@ -76,7 +76,7 @@ int main(){
                 string s_size = receiveProtocol.getDataAsString();
                 cout << s_size << endl;
                 unsigned int fileSize = stoi(s_size);
-                cout << "Tamanho: " << fileSize << endl;
+                // cout << "Tamanho: " << fileSize << endl;
                 sendProtocol.reset();
                 if(hasEnoughSpace(fileSize)) {
                     sendProtocol.setData(vector<BYTE>(1,(BYTE)0), OK);
@@ -89,7 +89,6 @@ int main(){
                 }
                 receiveProtocol.reset();
                 receiveProtocol.receive(sockt,DATA,SLIDING,true);
-                cout <<"conteudo: "<< receiveProtocol.getDataAsString()<<endl;
                 writeFile(getWorkingPath()+"/"+args,receiveProtocol.getData());
                 sendProtocol.reset();
                 receiveProtocol.reset();
diff --git a/dirFunctions.cpp b/dirFunctions.cpp
index f2b5153a4a5f3dc860e84f25bdfea783eaf19d6d..845835a9a59367170f7d2d3c3ae661caef4e6810 100644
--- a/dirFunctions.cpp
+++ b/dirFunctions.cpp
@@ -53,7 +53,7 @@ bool hasEnoughSpace(int size){
     string path = getWorkingPath();
     statvfs(path.c_str(), &fsData);
     long long freeSpace = fsData.f_bsize * fsData.f_bfree;
-    cout << "freeSpace: " << freeSpace << "fsData: " << fsData.f_bsize << "\t" << fsData.f_bfree     << endl;
+    // cout << "freeSpace: " << freeSpace << "fsData: " << fsData.f_bsize << "\t" << fsData.f_bfree     << endl;
     return (freeSpace > size);
 }