diff --git a/libdevcrypto/MemoryDB.h b/libdevcrypto/MemoryDB.h
index ecda3b6ec..7d39ba73b 100644
--- a/libdevcrypto/MemoryDB.h
+++ b/libdevcrypto/MemoryDB.h
@@ -52,7 +52,8 @@ public:
 	void purge();
 
 	bytes lookupAux(h256 _h) const { auto h = aux(_h); return m_aux.count(h) ? m_aux.at(h) : bytes(); }
-	void insertAux(h256 _h, bytesConstRef _v) { m_auxKey = aux(_h); m_aux[m_auxKey] = _v.toBytes(); }
+	void removeAux(h256 _h) { m_auxActive.erase(aux(_h)); }
+	void insertAux(h256 _h, bytesConstRef _v) { auto h = aux(_h); m_auxActive.insert(h); m_aux[h] = _v.toBytes(); }
 
 	std::set<h256> keys() const;
 
@@ -61,7 +62,7 @@ protected:
 
 	std::map<h256, std::string> m_over;
 	std::map<h256, unsigned> m_refCount;
-	h256 m_auxKey;
+	std::set<h256> m_auxActive;
 	std::map<h256, bytes> m_aux;
 
 	mutable bool m_enforceRefs = false;
diff --git a/libdevcrypto/OverlayDB.cpp b/libdevcrypto/OverlayDB.cpp
index d34dd1906..ffe996bb6 100644
--- a/libdevcrypto/OverlayDB.cpp
+++ b/libdevcrypto/OverlayDB.cpp
@@ -52,14 +52,15 @@ void OverlayDB::commit()
 			if (m_refCount[i.first])
 				m_db->Put(m_writeOptions, ldb::Slice((char const*)i.first.data(), i.first.size), ldb::Slice(i.second.data(), i.second.size()));
 		}
-		if (m_auxKey && m_aux.count(m_auxKey))
-		{
-			m_db->Put(m_writeOptions, m_auxKey.ref(), bytesConstRef(&m_aux[m_auxKey]));
-			cdebug << "Committing aux: " << m_auxKey;
-			m_aux.erase(m_auxKey);
-			cdebug << "Discarding " << keysOf(m_aux);
-		}
-		m_auxKey = h256();
+		for (auto const& i: m_auxActive)
+			if (m_aux.count(i))
+			{
+				m_db->Put(m_writeOptions, i.ref(), bytesConstRef(&m_aux[i]));
+				cdebug << "Committing aux: " << i;
+				m_aux.erase(i);
+			}
+		cdebug << "Discarding " << keysOf(m_aux);
+		m_auxActive.clear();
 		m_aux.clear();
 		m_over.clear();
 		m_refCount.clear();
diff --git a/libdevcrypto/TrieDB.h b/libdevcrypto/TrieDB.h
index e00e03f44..1abf2d8c0 100644
--- a/libdevcrypto/TrieDB.h
+++ b/libdevcrypto/TrieDB.h
@@ -404,8 +404,12 @@ public:
 
 	void setRoot(h256 _root)
 	{
+		if (!m_secure.isNull())
+			Super::db()->removeAux(m_secure.root());
 		m_secure.setRoot(_root);
-		Super::setRoot(h256(Super::db()->lookupAux(m_secure.root())));
+		auto rb = Super::db()->lookupAux(m_secure.root());
+		auto r = h256(rb);
+		Super::setRoot(r);
 	}
 
 	h256 root() const { return m_secure.root(); }
diff --git a/libethereum/Client.cpp b/libethereum/Client.cpp
index c9c182028..b5355f1e0 100644
--- a/libethereum/Client.cpp
+++ b/libethereum/Client.cpp
@@ -278,9 +278,14 @@ LocalisedLogEntries Client::checkWatch(unsigned _watchId)
 	LocalisedLogEntries ret;
 
 	try {
-//		cdebug << "checkWatch" << _watchId;
+#if ETH_DEBUG && 0
+		cdebug << "checkWatch" << _watchId;
+#endif
+		auto& w = m_watches.at(_watchId);
+#if ETH_DEBUG && 0
+		cdebug << "lastPoll updated to " << chrono::duration_cast<chrono::seconds>(chrono::system_clock::now().time_since_epoch()).count();
+#endif
 		auto& w = m_watches.at(_watchId);
-//		cdebug << "lastPoll updated to " << chrono::duration_cast<chrono::seconds>(chrono::system_clock::now().time_since_epoch()).count();
 		std::swap(ret, w.changes);
 		w.lastPoll = chrono::system_clock::now();
 	} catch (...) {}
diff --git a/libevm/VM.cpp b/libevm/VM.cpp
index 9f2fa6874..f4e904e3f 100644
--- a/libevm/VM.cpp
+++ b/libevm/VM.cpp
@@ -82,19 +82,13 @@ bytesConstRef VM::go(ExtVMFace& _ext, OnOpFunc const& _onOp, uint64_t _steps)
 			BOOST_THROW_EXCEPTION(BadInstruction());
 
 		// FEES...
-		bigint runGas;
+		bigint runGas = c_tierStepGas[metric.gasPriceTier];
 		bigint newTempSize = m_temp.size();
 		bigint copySize = 0;
 
 		// should work, but just seems to result in immediate errorless exit on initial execution. yeah. weird.
 		//m_onFail = std::function<void()>(onOperation);
 
-		auto metric = c_metrics[(int)inst];
-		int gasPriceTier = metric.gasPriceTier;
-		if (gasPriceTier == InvalidTier)
-			BOOST_THROW_EXCEPTION(BadInstruction());
-		else
-			runGas = c_tierStepGas[metric.gasPriceTier];
 		require(metric.args);
 
 		auto onOperation = [&]()