diff --git a/cmake-build-debug/.ninja_deps b/cmake-build-debug/.ninja_deps
index e8a9542..a5fece2 100644
Binary files a/cmake-build-debug/.ninja_deps and b/cmake-build-debug/.ninja_deps differ
diff --git a/cmake-build-debug/.ninja_log b/cmake-build-debug/.ninja_log
index 9c86c12..69f4ceb 100644
--- a/cmake-build-debug/.ninja_log
+++ b/cmake-build-debug/.ninja_log
@@ -28,3 +28,9 @@
 1830	1932	1699313070127717082	AssignmentProject	e35660c7830bbb12
 2	1960	1699313077803712045	CMakeFiles/AssignmentProject.dir/src/main.cpp.o	7b18e037a23b35ad
 1961	2064	1699313077907711977	AssignmentProject	e35660c7830bbb12
+1	1720	1699313297303548848	CMakeFiles/AssignmentProject.dir/src/main.cpp.o	7b18e037a23b35ad
+1720	1818	1699313297407548764	AssignmentProject	e35660c7830bbb12
+1	1869	1699313337111515909	CMakeFiles/AssignmentProject.dir/src/main.cpp.o	7b18e037a23b35ad
+1869	1975	1699313337219515819	AssignmentProject	e35660c7830bbb12
+1	1853	1699313450731417521	CMakeFiles/AssignmentProject.dir/src/main.cpp.o	7b18e037a23b35ad
+1853	1952	1699313450831417432	AssignmentProject	e35660c7830bbb12
diff --git a/cmake-build-debug/AssignmentProject b/cmake-build-debug/AssignmentProject
index bbb20cd..c82a993 100755
Binary files a/cmake-build-debug/AssignmentProject and b/cmake-build-debug/AssignmentProject differ
diff --git a/cmake-build-debug/CMakeFiles/AssignmentProject.dir/src/main.cpp.o b/cmake-build-debug/CMakeFiles/AssignmentProject.dir/src/main.cpp.o
index 852252e..4b9872b 100644
Binary files a/cmake-build-debug/CMakeFiles/AssignmentProject.dir/src/main.cpp.o and b/cmake-build-debug/CMakeFiles/AssignmentProject.dir/src/main.cpp.o differ
diff --git a/cmake-build-debug/Testing/Temporary/LastTest.log b/cmake-build-debug/Testing/Temporary/LastTest.log
index 144a828..63672d6 100644
--- a/cmake-build-debug/Testing/Temporary/LastTest.log
+++ b/cmake-build-debug/Testing/Temporary/LastTest.log
@@ -1,3 +1,3 @@
-Start testing: Nov 06 18:24 EST
+Start testing: Nov 06 18:30 EST
 ----------------------------------------------------------
-End testing: Nov 06 18:24 EST
+End testing: Nov 06 18:30 EST
diff --git a/cmake-build-debug/bigdata.txt b/cmake-build-debug/bigdata.txt
new file mode 100644
index 0000000..acdee92
--- /dev/null
+++ b/cmake-build-debug/bigdata.txt
@@ -0,0 +1,22 @@
+This is some really large data that i am going to send to you.
+This is some really large data that i am going to send to you 12;
+This is some really large data that i am going to send to you 23;
+This is some really large data that i am going to send to you 43;
+This is some really large data that i am going to send to you 74;
+This is some really large data that i am going to send to you 123;
+This is some really large data that i am going to send to you 643;
+This is some really large data that i am going to send to you 785;
+This is some really large data that i am going to send to you 875;
+This is some really large data that i am going to send to you 1000;
+This is some really large data that i am going to send to you 1200;
+This is some really large data that i am going to send to you 1300;
+This is some really large data that i am going to send to you 1400;
+This is some really large data that i am going to send to you 1500;
+This is some really large data that i am going to send to you 1600;
+This is some really large data that i am going to send to you 1700;
+This is some really large data that i am going to send to you 1800;
+This is some really large data that i am going to send to you 1900;
+This is some really large data that i am going to send to you 2000;
+This is some really large data that i am going to send to you 2100;
+This is some really large data that i am going to send to you 2200;
+This is some really large data that i am going to send to you 2300;
\ No newline at end of file
diff --git a/libraries/BLT b/libraries/BLT
index 1a72728..a555b53 160000
--- a/libraries/BLT
+++ b/libraries/BLT
@@ -1 +1 @@
-Subproject commit 1a72728aeb9299d168868bb1c79f319031d9d8a1
+Subproject commit a555b53a612ebbb5aabee61269f090a2ac06b731
diff --git a/src/main.cpp b/src/main.cpp
index 4dd64a7..3413ee3 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -40,19 +40,19 @@
 constexpr size_t PACKET_SIZE = 512;
 
 // header:
-// 1 byte type
+// 4 bytes for CRC32
+// 4 byte type
 //      0: data send
 //      7: data resend
 //      15: data ack
 //      31: ack ack
-// 3 unused
 // 8 bytes send_id
 // 8 bytes recv_id
 // 8 bytes unused
-// 4 bytes for CRC32
-
 constexpr size_t HEADER_SIZE = 32;
 
+bool running = true;
+
 class packet
 {
     protected:
@@ -220,16 +220,18 @@ class pipe
 class transceiver
 {
     private:
+        static constexpr size_t MAX_QUEUE_SIZE = 32;
         // the pipe to send on
         pipe& uplink;
         // the pipe to receive on
         pipe& downlink;
         
-        size_t sendID = 0;
-        size_t recvID = 0;
-        bool ack = true;
-        bool ackack = false;
-        packet sendBuffer;
+        std::mutex send_mutex;
+        std::mutex receive_mutex;
+        std::condition_variable receive_cv;
+        std::condition_variable send_cv;
+        std::queue<packet> send_queue;
+        std::queue<packet> receive_queue;
         
         static DWORD crc(const packet& p)
         {
@@ -238,96 +240,48 @@ class transceiver
                 c = UPDC32(p[i], c);
             return c;
         }
-        
-        void request_resend()
-        {
-            packet datagram{PACKET_SIZE + HEADER_SIZE};
-            std::memset(datagram.data(), 0, PACKET_SIZE + HEADER_SIZE);
-            
-            std::uint32_t type = 2;
-            blt::mem::toBytes<true>(type, &datagram.data()[PACKET_SIZE]);
-            
-            blt::mem::toBytes<true>(crc(datagram), &datagram.data()[PACKET_SIZE + 4 + 8 * 3]);
-            
-            uplink.send(datagram);
-        }
-        
-        void resend_packet()
-        {
-            uplink.send(sendBuffer);
-        }
     
     public:
         transceiver(pipe& uplink, pipe& downlink): uplink(uplink), downlink(downlink)
-        {}
+        { virtual_kernel_subsystem_init(); }
         
         void send(const packet& p)
         {
-            while (!ack);
+            std::unique_lock lock(send_mutex);
+            send_cv.wait(lock, [this] { return send_queue.size() < MAX_QUEUE_SIZE; });
             
-            packet datagram{PACKET_SIZE + HEADER_SIZE};
-            // yes i am putting the header at the end because i don't want to deal with CRC too much
-            // my brain is actually ḗ̵͙m̷͕̩͛p̸͉͉͒t̷͔̘̕ÿ̸͕̟́̆ right now I think I am making this code worse. Sorry.
-            // I like writing clean code but there is no more passion for this assignment (blame naser)
-            std::memset(&datagram.data()[PACKET_SIZE], 0, HEADER_SIZE);
-            std::memcpy(datagram.data(), p.data(), PACKET_SIZE);
+            predicator pred{[&]() -> void { lock.unlock(); }};
             
-            std::uint32_t type = 0;
-            blt::mem::toBytes<true>(type, &datagram.data()[PACKET_SIZE]);
-            blt::mem::toBytes<true>(sendID++, &datagram.data()[PACKET_SIZE + 4]);
-            blt::mem::toBytes<true>(recvID, &datagram.data()[PACKET_SIZE + 12]);
-            
-            blt::mem::toBytes<true>(crc(datagram), &datagram.data()[PACKET_SIZE + 4 + 8 * 3]);
-            
-            uplink.send(datagram);
-            sendBuffer = p;
-            ack = false;
+            send_queue.push(p);
         }
         
         bool receive(packet& p)
         {
-            downlink.receive(p);
+            std::unique_lock lock(receive_mutex);
+            receive_cv.wait(lock, [this] { return !receive_queue.empty(); });
             
-            std::uint32_t crc;
-            blt::mem::fromBytes<true>(&p.data()[PACKET_SIZE + 4 + 8 * 3], crc);
+            predicator pred{[&]() -> void { lock.unlock(); }};
             
-            DWORD calc_crc = 0;
-            for (size_t i = 0; i < p.buffer_size() - 12; i++)
-                calc_crc = updateCRC32(p[i], calc_crc);
-            
-            if (crc != calc_crc)
-            {
-                BLT_DEBUG("CRC NOT THE SAME %d != %d", crc, calc_crc);
-                request_resend();
-                return false;
-            }
-            
-            uint32_t type = 0;
-            size_t r_sendID = 0;
-            size_t r_recvID = 0;
-            
-            blt::mem::fromBytes<true>(&p.data()[PACKET_SIZE], type);
-            blt::mem::fromBytes<true>(&p.data()[PACKET_SIZE + 4], r_sendID);
-            blt::mem::fromBytes<true>(&p.data()[PACKET_SIZE + 12], r_recvID);
-            
-            BLT_TRACE("%d, %d : %d, %d", sendID, recvID, r_sendID, r_recvID);
-            
-            if (type == 7)
-            {
-                BLT_DEBUG("We need to resend the packet!");
-                resend_packet();
-                return false;
-            }
-            
-            if (type == 15)
-            {
-                BLT_DEBUG("Message ACK");
-                ack = true;
-                return false;
-            }
-            
-            recvID++;
-            return true;
+            p = receive_queue.front();
+            receive_queue.pop();
+        }
+        
+        /**
+         * Because the 'TCP' is normally handled by the kernel, which happens outside our process, we need a way of simulating that
+         * introducing the virtual kernel subsystem to handle all your reliability needs!
+         */
+        void virtual_kernel_subsystem_init()
+        {
+            std::thread kernel([this] {
+                while (running)
+                {
+                    bool ack = false;
+                    while (!ack)
+                    {
+                    
+                    }
+                }
+            });
         }
 };
 
@@ -344,6 +298,10 @@ void load_packets(const std::string& path, std::vector<packet>& packets)
     size_t length = file.tellg();
     file.seekg(0, std::ifstream::beg);
     
+    if (length <= 0)
+        return;
+    
+    BLT_INFO("Loading file of length %d", length);
     blt::scoped_buffer<std::uint8_t> data(length);
     
     file.read(reinterpret_cast<char*>(data.data()), static_cast<long>(length));
@@ -408,14 +366,14 @@ int main(int argc, const char** argv)
         size_t send = 0;
         
         transceiver server(uplink, downlink);
-        while (true)
+        while (running)
         {
             send %= packets.size();
             server.send(packets[send++]);
         }
     });
     
-    while (true)
+    while (running)
     {
         packet pack;
         //p.receive(pack);