diff --git a/Protocol.cpp b/Protocol.cpp
index ee6d55225a4508b98694c683a6f832d6b077212a..321b3c40e49e231c0a263af53751503dc17dfc5b 100644
--- a/Protocol.cpp
+++ b/Protocol.cpp
@@ -116,14 +116,19 @@ int Protocol::recvMessage(int sockt){
 void Protocol::transmit(int sockt, int window){
     int status;
     vector<FrameItem> frame;
-    int lastFramed = 0;
+    int lastFramed = -1;
+    setData(vector<BYTE>(1, 0), ENDTX);
     int messagesLeft = messages.size();
     Protocol response;
     while(messagesLeft > 0){
+        cout << "Restantes: " << messagesLeft << endl;
         for(int j=0; j < window; ++j) {
-            // FIXME: this will probably brake with many messages
-            FrameItem fi = {.index = lastFramed++, .sent=false};
-            frame.push_back(fi);
+            if(frame.size() < window && frame.size() < messagesLeft) {
+                cout << "frame size: " << frame.size() << endl;
+                FrameItem fi = {.index = ++lastFramed, .sent=false};
+                cout << "lastFramed: " << fi.index << endl;
+                frame.push_back(fi);
+            }
             if(!frame[j].sent){
                 sendMessage(sockt, frame[j].index);
                 frame[j].sent = true;
@@ -135,33 +140,26 @@ void Protocol::transmit(int sockt, int window){
         if(status == NACK){
             printf("nstoi %i\n", response.getMessages().back().getDataAsString()[0]);
             int nackIndex = response.getMessages().back().getDataAsString()[0];
-            for(int j=0; j < window; ++j) {
+            for(int j=0; j < window;) {
                 if(frame[j].index < nackIndex) {
                     frame.erase(frame.begin() + j);
                     --messagesLeft;
-                }else if(frame[j].index == nackIndex) {
+                } else if(frame[j].index == nackIndex) {
                     frame[j].sent = false;
-                }
+                } else ++j;
             }
             response.reset();
 
         }else if(status == ACK){
             printf("astoi %i\n", response.getMessages().back().getDataAsString()[0]);
             int ackIndex = response.getMessages().back().getDataAsString()[0];
-            for(int j=0; j < window; ++j) {
+            for(int j=0; j < frame.size();) {
                 if(frame[j].index <= ackIndex) {
                     frame.erase(frame.begin() + j);
                     --messagesLeft;
-                }
+                } else ++j;
             }
             response.reset();
-        // }else if(status == OK) {
-        //     frame.erase(frame.begin());
-        //     --messagesLeft;
-        // } else if(status == OUTPUT || status == ERROR) {
-        //     frame.erase(frame.begin());
-        //     --messagesLeft;
-        //     cout << "Remoto:\n" << ((status == ERROR)?"ERROR: ":"") << getDataAsString() << endl;
         } else {
             //TODO: treat error
         }
@@ -190,54 +188,25 @@ int Protocol::receive(int sockt, int type, int window, bool dataEndable){
             continue;
         } else if(status == type) {
             if(!messages.empty() && (messages.back().sequence.to_ulong() != nextSequence)){
+                messages.pop_back();
                 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);
-                shouldSend = true;
             } else {
-                //TODO: treat something?
+                if(window == WAIT_STOP || ((nextSequence % SLIDING) == 0)) {
+                    response.reset();
+                    vector<BYTE> val(1,(BYTE)messages.back().sequence.to_ulong());
+                    response.setData(val, ACK);
+                    shouldSend = true;
+                }
+                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;
             return -1;
         }
-
-        // 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;
 }
diff --git a/client.cpp b/client.cpp
index 0ff6cf39b06635d0fec28758da7a673e8c2cc8c5..c5f3b508688677ebd019ead849cc3f4239089429 100644
--- a/client.cpp
+++ b/client.cpp
@@ -44,14 +44,14 @@ int main(){
             }else if(command == "put"){
                 args = line.substr(pos+1, line.size());
                 if(fexists(args)) {
-                    int size = filesize(args);
+                    string size = to_string(filesize(args));
                     cout << "ARQUIVO: " << args << "|" << size << endl;
                     sendProtocol.setData(vector<BYTE>(args.begin(), args.end()), PUT);
                     sendProtocol.sendMessage(sockt, 0);
                     int error = receiveProtocol.receive(sockt, OK, WAIT_STOP, false);
                     if(error < 0) continue;
                     sendProtocol.reset();
-                    sendProtocol.setData(vector<BYTE>(size), SIZE);
+                    sendProtocol.setData(vector<BYTE>(size.begin(), size.end()), SIZE);
                     sendProtocol.sendMessage(sockt, 0);
                     error = receiveProtocol.receive(sockt, OK, WAIT_STOP, false);
                     if(error < 0) continue;
@@ -59,7 +59,8 @@ int main(){
                     ifstream putFile (args);
                     stringstream buffer;
                     buffer << putFile.rdbuf();
-                    sendProtocol.setData(vector<BYTE>(buffer.str().begin(), buffer.str().begin()), PUT);
+                    string data = buffer.str();
+                    sendProtocol.setData(vector<BYTE>(data.begin(), data.end()), DATA);
                     sendProtocol.transmit(sockt, SLIDING);
                 } else {
                     cout << "ERROR: arquivo não existe\n";
@@ -68,9 +69,9 @@ int main(){
                 args = line.substr(pos+1, line.size());
                 sendProtocol.setData(vector<BYTE>(args.begin(), args.end()), GET);
                 sendProtocol.sendMessage(sockt, 0);
-                int error = receiveProtocol.receive()sockt, SIZE, WAIT_STOP, false;
+                int error = receiveProtocol.receive(sockt, SIZE, WAIT_STOP, false);
                 if(error < 0) continue;
-                int fileSize = (int) receiveProtocol.getDataAsString();
+                // int fileSize = (int) receiveProtocol.getDataAsString()[0];
             }else if(command == "help"){
                 printCommandsList();
             }else{
diff --git a/test.sh b/test.sh
index 50df3103851fba1b75d47fb54ebb07abc7051134..710caf57de84d744cd4841144b90339e6e04b72f 100755
--- a/test.sh
+++ b/test.sh
@@ -7,7 +7,7 @@ done
 
 for i in {1..100}
 do
-    echo -e "$i\n">>10.txt
+    echo -e "$i\n">>100.txt
 done
 
 for i in {1..1000};