diff --git a/Message.cpp b/Message.cpp
index e979626350b4e05cf9f260bee4fd835f6fc92ea7..70721303f56e8b6f947a812be00cfe916ba7b65d 100644
--- a/Message.cpp
+++ b/Message.cpp
@@ -1,4 +1,5 @@
 #include "Message.h"
+#include <bitset>
 #include "definitions.h"
 
 BYTE Message::calcParity() {
@@ -16,6 +17,22 @@ bool Message::checkParity() {
     return (parity == this->header.c_ctrl.parity);
 }
 
+vector<int> Message::getBitFieldsAsInt(){
+    vector<int> bits;
+    // bitset<8> begin(messages[i].header.i_ctrl.begin);
+    // bitset<6> size(messages[i].header.i_ctrl.size);
+    // bitset<6> sequence(messages[i].header.i_ctrl.sequence);
+    // bitset<4> type(messages[i].header.i_ctrl.type);
+    // bitset<8> parity(messages[i].header.i_ctrl.parity);
+    bits.push_back((int)bitset<8>(header.i_ctrl.begin).to_ulong());
+    bits.push_back((int)bitset<6>(header.i_ctrl.size).to_ulong());
+    bits.push_back((int)bitset<6>(header.i_ctrl.sequence).to_ulong());
+    bits.push_back((int)bitset<4>(header.i_ctrl.type).to_ulong());
+    bits.push_back((int)bitset<8>(header.i_ctrl.parity).to_ulong());
+    return bits;
+
+}
+
 string Message::getSendData() {
     calcParity();
     string s(data.begin(), data.end());
@@ -39,5 +56,5 @@ string Message::getSendData() {
 }
 
 Message::Message() {
-    this->header.c_ctrl.begin = BEGIN;
+    this->header.i_ctrl.begin = BEGIN;
 }
diff --git a/Message.h b/Message.h
index 071f1956829095c0fc3a72bef1c21ae6db2494c4..99c8b433fa38a8a6ac79fafe5cc08fbcd8141355 100644
--- a/Message.h
+++ b/Message.h
@@ -10,6 +10,7 @@ public:
     BYTE calcParity();
     bool checkParity();
     string getSendData();
+    vector<int> getBitFieldsAsInt();
 
     Message();
 };
diff --git a/Protocol.cpp b/Protocol.cpp
index ab019cfc6772c152c80f8c0f40bd3b848e2e6b9d..3b77f03f49089530ca01b9891b7beceabe97bd40 100644
--- a/Protocol.cpp
+++ b/Protocol.cpp
@@ -1,4 +1,5 @@
 #include <sys/socket.h>
+#include <bitset>
 #include "Protocol.h"
 #include "definitions.h"
 
@@ -11,9 +12,23 @@ void Protocol::setMessages(vector<Message> messages){
 }
 
 bool Protocol::sendMessages(int socket, int window) {
+    //FIXME: seqType char is wrong, could be because of how sequence is being set
     for(int i=0; i < messages.size(); ++i) {
-        string data = messages[i].getSendData();
-        send(socket, data.c_str(), messages[i].header.i_ctrl.size, 0);
+        vector<BYTE> msg;
+        msg.push_back(messages[i].header.c_ctrl.begin);
+        cout << "vector begin: "<< bitset<8>(msg[0]) << endl;
+        cout << "sizeSeq: " << bitset<8>(messages[i].header.c_ctrl.sizeSeq) << endl;
+        cout << "seqType: " << bitset<8>(messages[i].header.c_ctrl.seqType) << endl;
+        msg.push_back(messages[i].header.c_ctrl.sizeSeq);
+        cout << "vector sizeSeq: "<< bitset<8>(msg[1]) << endl;
+        msg.push_back(messages[i].header.c_ctrl.seqType);
+        msg.insert(msg.end(), messages[i].data.begin(), messages[i].data.end());
+        msg.push_back(messages[i].header.c_ctrl.parity);
+        char* data = reinterpret_cast<char*> (msg.data());
+        cout << "msg size: " << bitset<6>(messages[i].header.i_ctrl.size) << endl;
+        cout << "pointer begin: "<< bitset<8>(data[0]) << "|\t";
+        cout << "msg isize: " << messages[i].getBitFieldsAsInt()[1] << endl;
+        send(socket, data, messages[i].getBitFieldsAsInt()[1]+4, 0);
     }
     return true;
 }
@@ -35,9 +50,8 @@ string Protocol::getDataAsString(){
 void Protocol::setData(vector<BYTE> data, int type){
     vector<BYTE>::const_iterator first, last;
     int i;
-    for (i=0; i <= data.size()-MAXSIZE; i+=MAXSIZE){
-        Message msg;
-        msg.header.i_ctrl.begin = BEGIN;
+    for (i=0; i <= ((int)data.size())-MAXSIZE; i+=MAXSIZE){
+        Message msg = Message();
         msg.header.i_ctrl.size = MAXSIZE;
         msg.header.i_ctrl.sequence = messages.size()%(MAXSIZE+1);
         msg.header.i_ctrl.type = type;
@@ -45,15 +59,16 @@ void Protocol::setData(vector<BYTE> data, int type){
         last = data.begin()+i+MAXSIZE+1;
         vector<BYTE> subvector(first, last);
         msg.data = subvector;
-        //TODO: Set parity
+        msg.calcParity();
         messages.push_back(msg);
     }
     if(i < data.size()){
-        Message msg;
-        msg.header.i_ctrl.begin = BEGIN;
+        cout << "entrou if"<< endl;
+        Message msg = Message();
         msg.header.i_ctrl.sequence = messages.size()%(MAXSIZE+1);
         msg.header.i_ctrl.type = type;
-        int size = data.size()-i;
+        int size = ((int)data.size())-i;
+        cout << "real size " << size<<endl;
         first = data.begin()+i;
         last = data.begin()+size+1;
         vector<BYTE> subvector(first, last);
@@ -62,16 +77,18 @@ void Protocol::setData(vector<BYTE> data, int type){
             size = MINSIZE;
             msg.data.insert(msg.data.begin(), MINSIZE-size, 0x0);
         }
+        cout << "modified size " << size<<endl;
         msg.header.i_ctrl.size = size;
-        //TODO: Set parity
+        msg.calcParity();
         messages.push_back(msg);
     }
 }
 
 int Protocol::recvMessage(int sockt){
     BYTE dataRec[MAXSIZE+4];
-    recv(sockt, dataRec, MAXSIZE, 0);
-    cout << dataRec[0] << dataRec[1] << dataRec[2] << "|\t";
+    int r = recv(sockt, dataRec, MAXSIZE+4, 0);
+    cout << "recv response: " << r << endl;
+    cout << bitset<8>(dataRec[0]) << bitset<8>(dataRec[1]) << bitset<8>(dataRec[2]) << "|\t";
     Message msg;
     msg.header.c_ctrl.begin = dataRec[0];
     if(msg.header.i_ctrl.begin != BEGIN){
@@ -83,7 +100,9 @@ int Protocol::recvMessage(int sockt){
         return SEQ_MISS;
     }
     msg.header.c_ctrl.parity = dataRec[3+msg.header.i_ctrl.size];
-    // TODO: Check parity
+    if(!msg.checkParity()){
+        return INCONSISTENT;
+    }
     if(msg.header.i_ctrl.type == ENDTX){
         return ENDTX;
     }
diff --git a/client.cpp b/client.cpp
index 3cdf3f0c8fa48f7f58ab7f74afe1bd61dbc18b7d..7b3bbf37eb6044ae55fa689c9bba85df80cfb6da 100644
--- a/client.cpp
+++ b/client.cpp
@@ -32,9 +32,7 @@ int main(){
                 //TODO
             }else if(command == "lsr"){
                 Message msg = Message();
-                msg.header.i_ctrl.type = LS;
-                msg.data = vector<BYTE>(line.begin(), line.end());
-                protocol.addMessage(msg);
+                protocol.setData(vector<BYTE>(line.begin(), line.end()), LS);
                 protocol.sendMessages(sockt, WAIT_STOP);
                 // TODO: imprimir resposta
             }else if(command == "put"){
diff --git a/definitions.h b/definitions.h
index 2fb9e0a39bc5f205a556090951a9b74946b8ac3f..cab7dad5aa1eb89057910753c99809acacc7ab03 100644
--- a/definitions.h
+++ b/definitions.h
@@ -35,9 +35,9 @@ using namespace std;
 #define SLIDING 3
 
 //Values of data for ERROR messages
-#define DIR_ERR '0'
-#define PERM_ERR '1'
-#define SPACE_ERR '2'
+#define DIR_ERR '0' //Nonexistent Directory
+#define PERM_ERR '1' //Permission denied
+#define SPACE_ERR '2' //File size bigger than disk free space size
 
 //recvMessage errors
 #define NOISE -1