diff --git a/client/CMT.cpp b/client/CMT.cpp
index 45199effc..01fd32bb6 100644
--- a/client/CMT.cpp
+++ b/client/CMT.cpp
@@ -481,6 +481,7 @@ static void quitApplication()
 		vstd::clear_pointer(graphics);
 	}
 
+	vstd::clear_pointer(CSH);
 	vstd::clear_pointer(VLC);
 
 	vstd::clear_pointer(console);// should be removed after everything else since used by logging
diff --git a/lib/networkPacks/NetPacksBase.h b/lib/networkPacks/NetPacksBase.h
index dc22af57e..b77e92e94 100644
--- a/lib/networkPacks/NetPacksBase.h
+++ b/lib/networkPacks/NetPacksBase.h
@@ -20,7 +20,9 @@ class ICPackVisitor;
 
 struct DLL_LINKAGE CPack
 {
-	std::shared_ptr<CConnection> c; // Pointer to connection that pack received from
+	/// Pointer to connection that pack received from
+	/// Only set & used on server
+	std::shared_ptr<CConnection> c;
 
 	CPack() = default;
 	virtual ~CPack() = default;
diff --git a/lib/serializer/BinaryDeserializer.cpp b/lib/serializer/BinaryDeserializer.cpp
index 0cb95f14a..6efa9ed18 100644
--- a/lib/serializer/BinaryDeserializer.cpp
+++ b/lib/serializer/BinaryDeserializer.cpp
@@ -23,4 +23,9 @@ BinaryDeserializer::BinaryDeserializer(IBinaryReader * r): CLoaderBase(r)
 	registerTypes(*this);
 }
 
+BinaryDeserializer::~BinaryDeserializer()
+{
+
+}
+
 VCMI_LIB_NAMESPACE_END
diff --git a/lib/serializer/BinaryDeserializer.h b/lib/serializer/BinaryDeserializer.h
index 0f880baaf..09cd89efe 100644
--- a/lib/serializer/BinaryDeserializer.h
+++ b/lib/serializer/BinaryDeserializer.h
@@ -140,12 +140,12 @@ public:
 	si32 fileVersion;
 
 	std::map<ui32, void*> loadedPointers;
-	std::map<ui32, const std::type_info*> loadedPointersTypes;
 	std::map<const void*, std::shared_ptr<void>> loadedSharedPointers;
 	bool smartPointerSerialization;
 	bool saving;
 
 	BinaryDeserializer(IBinaryReader * r);
+	~BinaryDeserializer();
 
 	template<class T>
 	BinaryDeserializer & operator&(T & t)
@@ -279,7 +279,6 @@ public:
 			{
 				// We already got this pointer
 				// Cast it in case we are loading it to a non-first base pointer
-				assert(loadedPointersTypes.count(pid));
 				data = static_cast<T>(i->second);
 				return;
 			}
@@ -313,10 +312,7 @@ public:
 	void ptrAllocated(const T *ptr, ui32 pid)
 	{
 		if(smartPointerSerialization && pid != 0xffffffff)
-		{
-			loadedPointersTypes[pid] = &typeid(T);
 			loadedPointers[pid] = (void*)ptr; //add loaded pointer to our lookup map; cast is to avoid errors with const T* pt
-		}
 	}
 
 	template<typename Base, typename Derived> void registerType(const Base * b = nullptr, const Derived * d = nullptr)
diff --git a/lib/serializer/Connection.cpp b/lib/serializer/Connection.cpp
index a4ad78056..c712c383b 100644
--- a/lib/serializer/Connection.cpp
+++ b/lib/serializer/Connection.cpp
@@ -269,13 +269,7 @@ CPack * CConnection::retrievePack()
 	iser & pack;
 	logNetwork->trace("Received CPack of type %s", (pack ? typeid(*pack).name() : "nullptr"));
 	if(pack == nullptr)
-	{
 		logNetwork->error("Received a nullptr CPack! You should check whether client and server ABI matches.");
-	}
-	else
-	{
-		pack->c = this->shared_from_this();
-	}
 
 	enableBufferedRead = false;
 
diff --git a/server/CVCMIServer.cpp b/server/CVCMIServer.cpp
index e9651f91c..46b8be27f 100644
--- a/server/CVCMIServer.cpp
+++ b/server/CVCMIServer.cpp
@@ -445,6 +445,7 @@ void CVCMIServer::threadHandleClient(std::shared_ptr<CConnection> c)
 		try
 		{
 			pack = c->retrievePack();
+			pack->c = c;
 		}
 		catch(boost::system::system_error & e)
 		{