diff --git a/libi2pd/RouterContext.cpp b/libi2pd/RouterContext.cpp
index 53244b6c..ebc3546f 100644
--- a/libi2pd/RouterContext.cpp
+++ b/libi2pd/RouterContext.cpp
@@ -78,6 +78,12 @@ namespace i2p
 			m_Service->Stop ();
 			CleanUp (); // GarlicDestination
 		}
+		if (m_SavingRouterInfo.valid ())
+		{	
+			m_SaveBuffer = nullptr;
+			m_SavingRouterInfo.get ();
+		}	
+		
 	}	
 
 	std::shared_ptr<i2p::data::RouterInfo::Buffer> RouterContext::CopyRouterInfoBuffer () const
@@ -254,11 +260,38 @@ namespace i2p
 
 	void RouterContext::UpdateRouterInfo ()
 	{
+		std::shared_ptr<i2p::data::RouterInfo::Buffer> buffer;
 		{
 			std::lock_guard<std::mutex> l(m_RouterInfoMutex);
 			m_RouterInfo.CreateBuffer (m_Keys);
+			buffer = m_RouterInfo.CopyBuffer ();
 		}
-		m_RouterInfo.SaveToFile (i2p::fs::DataDirPath (ROUTER_INFO));
+		{
+			// update save buffer to latest
+			std::lock_guard<std::mutex> l(m_SaveBufferMutex);
+			m_SaveBuffer = buffer;
+		}
+		bool isSaving = m_SavingRouterInfo.valid (); 
+		if (isSaving && m_SavingRouterInfo.wait_for(std::chrono::seconds(0)) == std::future_status::ready)
+		{
+			m_SavingRouterInfo.get ();
+			isSaving = false;
+		}	
+		if (!isSaving) // try to save only if not being saved
+			m_SavingRouterInfo = std::async (std::launch::async, [this]() 
+				{
+					std::shared_ptr<i2p::data::RouterInfo::Buffer> buffer;
+					while (m_SaveBuffer)
+					{
+						{
+							std::lock_guard<std::mutex> l(m_SaveBufferMutex);
+							buffer = m_SaveBuffer;
+							m_SaveBuffer = nullptr;
+						}
+						if (buffer)
+							i2p::data::RouterInfo::SaveToFile (i2p::fs::DataDirPath (ROUTER_INFO), buffer);
+					}	
+				});
 		m_LastUpdateTime = i2p::util::GetSecondsSinceEpoch ();
 	}
 
diff --git a/libi2pd/RouterContext.h b/libi2pd/RouterContext.h
index ae62ebf3..1c724617 100644
--- a/libi2pd/RouterContext.h
+++ b/libi2pd/RouterContext.h
@@ -13,6 +13,7 @@
 #include <string>
 #include <memory>
 #include <random>
+#include <future>
 #include <unordered_set>
 #include <boost/asio.hpp>
 #include "Identity.h"
@@ -266,6 +267,9 @@ namespace garlic
 			bool m_IsHiddenMode; // not publish
 			mutable std::mutex m_RouterInfoMutex;
 			std::mt19937 m_Rng;
+			std::future<void> m_SavingRouterInfo;
+			std::shared_ptr<i2p::data::RouterInfo::Buffer> m_SaveBuffer;
+			std::mutex m_SaveBufferMutex; // TODO: make m_SaveBuffer atomic
 	};
 
 	extern RouterContext context;