diff --git a/src/peer.cpp b/src/peer.cpp
index 3aac02dcb7633f0bcf8440d0de8230ca9abeb608..7cb221793d3b1a1f42594f590b46448717c166db 100644
--- a/src/peer.cpp
+++ b/src/peer.cpp
@@ -288,21 +288,24 @@ void Peer::data() {
     int rc = 0;
 
     // Only need to lock and reserve buffer if there isn't enough
-    if (recv_buf_.buffer_capacity() < kMaxMessage) {
+    if (recv_buf_.buffer_capacity() < recv_buf_max_) {
         UNIQUE_LOCK(recv_mtx_, lk);
-        recv_buf_.reserve_buffer(kMaxMessage);
+        recv_buf_.reserve_buffer(recv_buf_max_);
     }
 
-    int cap = static_cast<int>(recv_buf_.buffer_capacity());
+    size_t cap = recv_buf_.buffer_capacity();
 
     try {
         rc = sock_->recv(recv_buf_.buffer(), recv_buf_.buffer_capacity());
 
-        if (rc >= cap - 1) {
+        if (rc >= static_cast<int>(cap - 1)) {
             net_->_notifyError(this, Error::kBufferSize, "Too much data received");
-            // TODO(Nick): Increase the buffer size next time
+            // Increase buffer size
+            if (recv_buf_max_ < kMaxMessage) {
+                recv_buf_max_ += 512 * 1024;
+            }
         }
-        if (cap < (kMaxMessage / 10)) {
+        if (cap < (recv_buf_max_ / 10)) {
             net_->_notifyError(this, Error::kBufferSize, "Buffer is at capacity");
         }
     } catch (std::exception& ex) {
diff --git a/src/peer.hpp b/src/peer.hpp
index fb1a2ba283ae9f7cbe9d23f89f4201f052c53664..7541d896e8d39ab4c7ff08b9c188c4ca9e0b7d53 100644
--- a/src/peer.hpp
+++ b/src/peer.hpp
@@ -213,7 +213,8 @@ class Peer {
     void data();
 
  public:
-    static const int kMaxMessage = 2*1024*1024;  // 10Mb currently
+    static const int kMaxMessage = 4*1024*1024;      // 4Mb currently
+    static const int kDefaultMessage = 512*1024;     // 0.5Mb currently
 
  private:  // Functions
     bool socketError();  // Process one error from socket
@@ -266,6 +267,7 @@ class Peer {
     std::atomic_flag recv_checked_ = ATOMIC_FLAG_INIT;
 
     msgpack::unpacker recv_buf_;
+    size_t recv_buf_max_ = kDefaultMessage;
     MUTEX recv_mtx_;
 
     // Send buffers