Index: src/Common/PersistentMap.h
===================================================================
--- src/Common/PersistentMap.h	(revision 42f1279c182e0cf2f329749d809a250ef38193f3)
+++ src/Common/PersistentMap.h	(revision 181a6af827366fe6389b05252c74c16582ffae8e)
@@ -114,11 +114,4 @@
 	}
 
-	/// check if this is the only reference to itself
-	/// NOTE: optimizations employing this function are not thread-safe
-	bool is_shared(long local_ptrs = 0) const {
-		// 2 accounts for both the pointer which owns "this" and the one created for its use_count
-		return (this->shared_from_this().use_count() - local_ptrs) > 2;
-	}
-
 public:
 	using key_type = typename Base::key_type;
@@ -154,4 +147,5 @@
 		// remove map from base
 		Base base_map = base->take_as<Base>();
+		base->reset_as_base();
 
 		// switch base to inverse of self and mutate base map
@@ -161,10 +155,7 @@
 				auto it = base_map.find( self.key );
 
-				if ( base->is_shared( 1 ) ) {
-					base->reset_as_base();
-					base->init<Ins>( 
+				base->init<Ins>( 
 						mut_this->shared_from_this(), std::move(self.key), std::move(it->second) );
-					base->mode = INS;
-				}
+				base->mode = INS;
 
 				base_map.erase( it );
@@ -174,9 +165,6 @@
 				Ins& self = mut_this->as<Ins>();
 
-				if ( base->is_shared( 1 ) ) {
-					base->reset_as_base();
-					base->init<Rem>( mut_this->shared_from_this(), self.key );
-					base->mode = REM;
-				}
+				base->init<Rem>( mut_this->shared_from_this(), self.key );
+				base->mode = REM;
 
 				base_map.emplace( std::move(self.key), std::move(self.val) );
@@ -187,10 +175,7 @@
 				auto it = base_map.find( self.key );
 
-				if ( base->is_shared( 1 ) ) {
-					base->reset_as_base();
-					base->init<Ins>( 
+				base->init<Ins>( 
 						mut_this->shared_from_this(), std::move(self.key), std::move(it->second) );
-					base->mode = UPD;
-				}
+				base->mode = UPD;
 
 				it->second = std::move(self.val);
@@ -257,4 +242,5 @@
 		// transfer map to new node
 		Ptr ret = std::make_shared<Self>( take_as<Base>() );
+		reset_as_base();
 		Base& base_map = ret->as<Base>();
 
@@ -262,19 +248,13 @@
 		auto it = base_map.find( k );
 		if ( it == base_map.end() ) {
-			if ( is_shared() ) {
-				// set self to REM node and insert into base
-				reset_as_base();
-				init<Rem>( ret, k );
-				mode = REM;
-			}
+			// set self to REM node and insert into base
+			init<Rem>( ret, k );
+			mode = REM;
 
 			base_map.emplace_hint( it, std::forward<K>(k), std::forward<V>(v) );
 		} else {
-			if ( is_shared() ) {
-				// set self to UPD node and modify base
-				reset_as_base();
-				init<Ins>( ret, std::forward<K>(k), std::move(it->second) );
-				mode = UPD;
-			}
+			// set self to UPD node and modify base
+			init<Ins>( ret, std::forward<K>(k), std::move(it->second) );
+			mode = UPD;
 
 			it->second = std::forward<V>(v);
@@ -293,12 +273,10 @@
 		// transfer map to new node
 		Ptr ret = std::make_shared<Self>( take_as<Base>() );
+		reset_as_base();
 		Base& base_map = ret->as<Base>();
 
-		if ( is_shared() ) {
-			// set self to INS node and remove from base
-			reset_as_base();
-			init<Ins>( ret, k, base_map[k] );
-			mode = INS;
-		}
+		// set self to INS node and remove from base
+		init<Ins>( ret, k, base_map[k] );
+		mode = INS;
 
 		base_map.erase( k );
