diff --git a/Protocol.cpp b/Protocol.cpp
index e96f14b95408887e05e783232847c9e1f06628f6..081fde22990a24d3f4c8409e6f1db729b859f66e 100644
--- a/Protocol.cpp
+++ b/Protocol.cpp
@@ -131,7 +131,8 @@ void Protocol::transmit(int sockt, int window){
         status = response.recvMessage(sockt);
         cout << "transmit status:" << status << endl;
         if(status == NACK){
-            int nackIndex = stoi(getDataAsString());
+            printf("nstoi %i\n", response.getMessages().back().getDataAsString()[0]);
+            int nackIndex = response.getMessages().back().getDataAsString()[0];
             for(int j=0; j < window; ++j) {
                 if(frame[j].index < nackIndex) {
                     frame.erase(frame.begin() + j);
@@ -143,7 +144,8 @@ void Protocol::transmit(int sockt, int window){
             response.reset();
 
         }else if(status == ACK){
-            int ackIndex = stoi(response.getMessages().back().getDataAsString());
+            printf("astoi %i\n", response.getMessages().back().getDataAsString()[0]);
+            int ackIndex = response.getMessages().back().getDataAsString()[0];
             for(int j=0; j < window; ++j) {
                 if(frame[j].index <= ackIndex) {
                     frame.erase(frame.begin() + j);
@@ -168,48 +170,73 @@ void Protocol::transmit(int sockt, int window){
     sendMessage(sockt,0);
 }
 
-void Protocol::receive(int sockt, int window){
-    int status, nextSequence;
+int Protocol::receive(int sockt, int type, int window, bool dataEndable){
+    int status, nextSequence = 0;
     vector<int> frame;
     Protocol response;
     bool shouldSend = false;
+    int end = ((dataEndable)? ENDTX : type);
     do{
         if(shouldSend){
             response.sendMessages(sockt);
+            response.reset();
+            shouldSend = false;
         }
         status = recvMessage(sockt);
+        cout << "receive status:" << status << endl;
         if(status == NOISE){
             continue;
-        }else if(response.getMessages().back().sequence.to_ulong() != nextSequence){
-            response.reset();
-            vector<BYTE> val(1,(BYTE)nextSequence);
-            response.setData(val, NACK);
-            shouldSend = true;
-        }
-        else if(status == OUTPUT) {
-            cout << messages.back().getDataAsString();
-
-            frame.push_back(messages.size());
-
-            response.reset();
-            vector<BYTE> val(1,(BYTE)messages.back().sequence.to_ulong());
-            response.setData(val, ACK);
-            nextSequence = (messages.back().sequence.to_ulong()+1)%(MAXSIZE+1);
-        }else if(status == ERROR){
+        } else if(status == type) {
+            if(messages.back().sequence.to_ulong() != nextSequence){
+                response.reset();
+                vector<BYTE> val(1,(BYTE)nextSequence);
+                response.setData(val, NACK);
+                shouldSend = true;
+            } else if(window == WAIT_STOP || ((nextSequence % SLIDING) == 0)) {
+                response.reset();
+                vector<BYTE> val(1,(BYTE)messages.back().sequence.to_ulong());
+                response.setData(val, ACK);
+                nextSequence = (messages.back().sequence.to_ulong()+1)%(MAXSIZE+1);
+            } else {
+                //TODO: treat something?
+            }
+        } else if(status == ERROR) {
             string str(messages.back().data.begin(), messages.back().data.end());
             cout << "ERROR: " << getDataAsString() << endl;
-            break;
-        }else if(status == INCONSISTENT){
-            response.reset();
-            vector<BYTE> val(1,(BYTE)nextSequence);
-            response.setData(val, NACK);
-            shouldSend = true;
-        }else{
-            //TODO: treat error
-            break;
+            return -1;
         }
-        shouldSend = shouldSend || (frame.size()%window == 0);
-    }while(status != ENDTX);
+
+        // else if(messages.back().sequence.to_ulong() != nextSequence){
+        //     response.reset();
+        //     vector<BYTE> val(1,(BYTE)nextSequence);
+        //     response.setData(val, NACK);
+        //     shouldSend = true;
+        // }
+        // else if(status == OUTPUT) {
+        //     cout << messages.back().getDataAsString();
+        //
+        //     frame.push_back(messages.size());
+        //
+        //     response.reset();
+        //     vector<BYTE> val(1,(BYTE)messages.back().sequence.to_ulong());
+        //     response.setData(val, ACK);
+        //     nextSequence = (messages.back().sequence.to_ulong()+1)%(MAXSIZE+1);
+        // }else if(status == ERROR){
+        //     string str(messages.back().data.begin(), messages.back().data.end());
+        //     cout << "ERROR: " << getDataAsString() << endl;
+        //     break;
+        // }else if(status == INCONSISTENT){
+        //     response.reset();
+        //     vector<BYTE> val(1,(BYTE)nextSequence);
+        //     response.setData(val, NACK);
+        //     shouldSend = true;
+        // }else{
+        //     //TODO: treat error
+        //     break;
+        // }
+        // shouldSend = shouldSend || (frame.size()%window == 0);
+    }while(status != end);
+    return 0;
 }
 
 void Protocol::addMessage(Message msg) {
diff --git a/Protocol.h b/Protocol.h
index 6577966eaf665acc47778b9ff3497f1a4b3e0d2a..76bf29b8a5d5669d5fd711e425d69eb6a8c95ebe 100644
--- a/Protocol.h
+++ b/Protocol.h
@@ -19,7 +19,7 @@ public:
     int recvMessage(int sockt);
     void addMessage(Message msg);
     void transmit(int sockt, int window);
-    void receive(int sockt, int window);
+    int receive(int sockt, int type, int window, bool dataEndable);
     void reset();
 
     Protocol();
diff --git a/client.cpp b/client.cpp
index 4d261135fa919679c10ae70addce636bfc99cfaa..2044d83b9b3fc34b81cf5f263813d8855c13dcb5 100644
--- a/client.cpp
+++ b/client.cpp
@@ -31,14 +31,16 @@ int main(){
             }else if(command == "cdr"){
                 args = line.substr(pos+1, line.size());
                 sendProtocol.setData(vector<BYTE>(args.begin(), args.end()), CD);
-                sendProtocol.transmit(sockt, WAIT_STOP);
+                sendProtocol.sendMessage(sockt, 0);
+                receiveProtocol.receive(sockt, OK, WAIT_STOP, false);
+                cout << "Diretório remoto: " << args;
             }else if(command == "lsr"){
                 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;
-                receiveProtocol.receive(sockt, WAIT_STOP);
-                cout << endl;
+                receiveProtocol.receive(sockt, OUTPUT, WAIT_STOP, true);
+                cout << receiveProtocol.getDataAsString() << endl;
             }else if(command == "put"){
                 sendProtocol.setData(vector<BYTE>(line.begin(), line.end()), PUT);
                 sendProtocol.transmit(sockt, WAIT_STOP);