diff --git a/FTPClient/.vs/FTPClient/v16/.suo b/FTPClient/.vs/FTPClient/v16/.suo
index 6673e9a882835d38464b4c43250666caa156c4b9..cdd0ec8842a690d2b5d19bce85e2c178c60e3e1a 100644
Binary files a/FTPClient/.vs/FTPClient/v16/.suo and b/FTPClient/.vs/FTPClient/v16/.suo differ
diff --git a/FTPClient/FTPClient/TftpClient.cs b/FTPClient/FTPClient/TftpClient.cs
index ab36dad6c6659f41507ad5279cb9f43c29473513..c266e3c42b1846768ddc9e2888b2dda2b6fb64b0 100644
--- a/FTPClient/FTPClient/TftpClient.cs
+++ b/FTPClient/FTPClient/TftpClient.cs
@@ -169,23 +169,20 @@ namespace FTPClient
 
                     numBytesRead += n;
                     numBytesToRead -= n;
-                    bool waitAck = true;
+                    bool ackPassed = true;
                     int counter = 0;
                     
                     do
                     {
-                        waitAck = WaitAcknowledge(packetNumber, endpoint);
-                        if(!waitAck)
+                        ackPassed = WaitAcknowledge(packetNumber, endpoint);
+                        if(!ackPassed)
                         {
                             socket.SendTo(buffer, endpoint);
                         }
                         counter += 1;
-                    } while (waitAck && counter < 2);
-                    if(waitAck)
-                    {
-                        Console.WriteLine("Clients ack packet was flawed...");
+                    } while (!ackPassed && counter < 2);
+                    if (!ackPassed)
                         break;
-                    }
                     packetNumber += 1;
                 }
                 Console.WriteLine($"Sent {numBytesRead} bytes");
diff --git a/FTPClient/FTPClient/bin/Debug/netcoreapp3.1/FTPClient.dll b/FTPClient/FTPClient/bin/Debug/netcoreapp3.1/FTPClient.dll
index 8832b7756ea377279498316e19228ee6711c22cf..f7283796f4fd1c1cd442ec7ebd62d0311b94e3f8 100644
Binary files a/FTPClient/FTPClient/bin/Debug/netcoreapp3.1/FTPClient.dll and b/FTPClient/FTPClient/bin/Debug/netcoreapp3.1/FTPClient.dll differ
diff --git a/FTPClient/FTPClient/bin/Debug/netcoreapp3.1/FTPClient.pdb b/FTPClient/FTPClient/bin/Debug/netcoreapp3.1/FTPClient.pdb
index b1f122fdd5c052389e6b8019d799446ccf9e98bd..5b1de4e2949fd3e2241beb1fde01a6329ef988af 100644
Binary files a/FTPClient/FTPClient/bin/Debug/netcoreapp3.1/FTPClient.pdb and b/FTPClient/FTPClient/bin/Debug/netcoreapp3.1/FTPClient.pdb differ
diff --git a/FTPClient/FTPClient/obj/Debug/netcoreapp3.1/FTPClient.dll b/FTPClient/FTPClient/obj/Debug/netcoreapp3.1/FTPClient.dll
index 8832b7756ea377279498316e19228ee6711c22cf..f7283796f4fd1c1cd442ec7ebd62d0311b94e3f8 100644
Binary files a/FTPClient/FTPClient/obj/Debug/netcoreapp3.1/FTPClient.dll and b/FTPClient/FTPClient/obj/Debug/netcoreapp3.1/FTPClient.dll differ
diff --git a/FTPClient/FTPClient/obj/Debug/netcoreapp3.1/FTPClient.pdb b/FTPClient/FTPClient/obj/Debug/netcoreapp3.1/FTPClient.pdb
index b1f122fdd5c052389e6b8019d799446ccf9e98bd..5b1de4e2949fd3e2241beb1fde01a6329ef988af 100644
Binary files a/FTPClient/FTPClient/obj/Debug/netcoreapp3.1/FTPClient.pdb and b/FTPClient/FTPClient/obj/Debug/netcoreapp3.1/FTPClient.pdb differ
diff --git a/TFTPServer/.vs/TFTPServer/v16/.suo b/TFTPServer/.vs/TFTPServer/v16/.suo
index 34d11f300cc8265c02311a98d2e652fd13d5dc8b..e403dfe508c21d2766bdc4af5c612dd567b65da4 100644
Binary files a/TFTPServer/.vs/TFTPServer/v16/.suo and b/TFTPServer/.vs/TFTPServer/v16/.suo differ
diff --git a/TFTPServer/TFTPServer/Server.cs b/TFTPServer/TFTPServer/Server.cs
index 052a3993f87aba55ae97a9376824713811a8f9a3..c97ebd584f5af8b1e0ad725383e383cc313ea6dd 100644
--- a/TFTPServer/TFTPServer/Server.cs
+++ b/TFTPServer/TFTPServer/Server.cs
@@ -84,7 +84,23 @@ namespace TFTPServer
                     numBytesRead += n;
                     numBytesToRead -= n;
 
-                    if (!WaitAcknowledge(packetNumber, remote)) break;
+                    bool ackPassed = true;
+                    int counter = 0;
+
+                    do
+                    {
+                        ackPassed = WaitAcknowledge(packetNumber, remote);
+                        if (!ackPassed)
+                        {
+                            socket.SendTo(buffer, remote);
+                        }
+                        counter += 1;
+                    } while (!ackPassed && counter < 2);
+                    if (!ackPassed)
+                    {
+                        Console.WriteLine("Client didn't respond in time");
+                        break;
+                    }
                     packetNumber += 1;
                 }
                 Console.WriteLine($"Sent {numBytesRead} bytes");
@@ -99,17 +115,23 @@ namespace TFTPServer
         private static bool WaitAcknowledge(int number, EndPoint remote)
         {
             byte[] buffer = new byte[4];
-            socket.ReceiveFrom(buffer, ref remote);
+            try
+            {
+                socket.ReceiveFrom(buffer, ref remote);
 
-            int opcode = buffer[0] | buffer[1] << 8;
-            int block_number = buffer[2] | buffer[3] << 8;
+                int opcode = buffer[0] | buffer[1] << 8;
+                int block_number = buffer[2] | buffer[3] << 8;
 
-            if (opcode != (int)PACKET_TYPE.ACK || block_number != number)
+                if (opcode != (int)PACKET_TYPE.ACK || block_number != number)
+                {
+                    SendError(remote, ERROR_CODE.Not_defined, "invalid ack packet");
+                    return false;
+                }
+                return true;
+            } catch (SocketException)
             {
-                SendError(remote, ERROR_CODE.Not_defined, "invalid ack packet");
                 return false;
             }
-            return true;
         }
 
         /// <summary>
@@ -204,7 +226,8 @@ namespace TFTPServer
         {
             string path = Path.Combine(FILE_DIR, filename + ".txt");    
             bool conversation = true;
-            
+            int errorCount = 0;
+
             // Create a file to write to.
             using (StreamWriter sw = File.CreateText(path))
             {
@@ -213,12 +236,17 @@ namespace TFTPServer
                     byte[] packet = new byte[512];
                     socket.ReceiveFrom(packet, ref remote);
                     int opcode = packet[0] | packet[1] << 8;
+                    int blockNumber = packet[2] | packet[3] << 8;
 
-                    if (opcode == (int)PACKET_TYPE.DATA)
+                    if (opcode == (int)PACKET_TYPE.DATA && blockNumber == (blockNumber + 1))
                     {
                         conversation = ReadData(packet, sw);
                         SendAck(remote);
                         blockNumber += 1;
+                    } else if (errorCount < 1)
+                    {
+                        SendAck(remote);
+                        errorCount += 1;
                     }
                     else if (opcode == (int)PACKET_TYPE.ERROR)
                     {
@@ -301,7 +329,7 @@ namespace TFTPServer
             {
                 socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
                 socket.Bind(iep);
-                //socket.ReceiveTimeout = socket_timeout;
+                socket.ReceiveTimeout = socket_timeout;
             }
             catch (Exception ex)
             {
diff --git a/TFTPServer/TFTPServer/bin/Debug/netcoreapp3.1/TFTPServer.dll b/TFTPServer/TFTPServer/bin/Debug/netcoreapp3.1/TFTPServer.dll
index 1deae0997e79168307c4c61c8bfb69bb0bea010f..f7fbf9166a5e4ef7e6b9523396b4c3f084d81794 100644
Binary files a/TFTPServer/TFTPServer/bin/Debug/netcoreapp3.1/TFTPServer.dll and b/TFTPServer/TFTPServer/bin/Debug/netcoreapp3.1/TFTPServer.dll differ
diff --git a/TFTPServer/TFTPServer/bin/Debug/netcoreapp3.1/TFTPServer.pdb b/TFTPServer/TFTPServer/bin/Debug/netcoreapp3.1/TFTPServer.pdb
index eb96aa419a0e6fa85f3db1ede9fd4cacd47d3c89..27b0cb57c81b89bbc2397f16f0c8b6ee6373a5dc 100644
Binary files a/TFTPServer/TFTPServer/bin/Debug/netcoreapp3.1/TFTPServer.pdb and b/TFTPServer/TFTPServer/bin/Debug/netcoreapp3.1/TFTPServer.pdb differ
diff --git a/TFTPServer/TFTPServer/obj/Debug/netcoreapp3.1/TFTPServer.dll b/TFTPServer/TFTPServer/obj/Debug/netcoreapp3.1/TFTPServer.dll
index 1deae0997e79168307c4c61c8bfb69bb0bea010f..f7fbf9166a5e4ef7e6b9523396b4c3f084d81794 100644
Binary files a/TFTPServer/TFTPServer/obj/Debug/netcoreapp3.1/TFTPServer.dll and b/TFTPServer/TFTPServer/obj/Debug/netcoreapp3.1/TFTPServer.dll differ
diff --git a/TFTPServer/TFTPServer/obj/Debug/netcoreapp3.1/TFTPServer.pdb b/TFTPServer/TFTPServer/obj/Debug/netcoreapp3.1/TFTPServer.pdb
index eb96aa419a0e6fa85f3db1ede9fd4cacd47d3c89..27b0cb57c81b89bbc2397f16f0c8b6ee6373a5dc 100644
Binary files a/TFTPServer/TFTPServer/obj/Debug/netcoreapp3.1/TFTPServer.pdb and b/TFTPServer/TFTPServer/obj/Debug/netcoreapp3.1/TFTPServer.pdb differ