diff --git a/CMakeLists.txt b/CMakeLists.txt
index 34b671502..d8d3dc391 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -339,6 +339,7 @@ if (NOT LANGUAGES)
 	add_subdirectory(secp256k1)
 	add_subdirectory(libethcore)
 	add_subdirectory(libevm)
+	add_subdirectory(libwhisper)
 	add_subdirectory(libethereum)
 	add_subdirectory(libethereumx)
 	add_subdirectory(test)
diff --git a/libethereum/Client.cpp b/libethereum/Client.cpp
index 2ae0d7de4..6249c370b 100644
--- a/libethereum/Client.cpp
+++ b/libethereum/Client.cpp
@@ -506,6 +506,7 @@ void Client::work()
 			m_postMine = m_preMine;
 			rsm = true;
 			changeds.insert(PendingChangedFilter);
+			// TODO: Move transactions pending from m_postMine back to transaction queue.
 		}
 
 		// returns h256s as blooms, once for each transaction.
diff --git a/libethereum/State.cpp b/libethereum/State.cpp
index d9d2fdfe8..41f4a6f1b 100644
--- a/libethereum/State.cpp
+++ b/libethereum/State.cpp
@@ -697,9 +697,10 @@ void State::commitToMine(BlockChain const& _bc)
 
 	m_lastTx = m_db;
 
-	RLPStream uncles;
 	Addresses uncleAddresses;
 
+	RLPStream unclesData;
+	unsigned unclesCount = 0;
 	if (m_previousBlock != BlockChain::genesis())
 	{
 		// Find great-uncles (or second-cousins or whatever they are) - children of great-grandparents, great-great-grandparents... that were not already uncles in previous generations.
@@ -710,18 +711,16 @@ void State::commitToMine(BlockChain const& _bc)
 		{
 			auto us = _bc.details(p).children;
 			assert(us.size() >= 1);	// must be at least 1 child of our grandparent - it's our own parent!
-			uncles.appendList(us.size() - 1);	// one fewer - uncles precludes our parent from the list of grandparent's children.
 			for (auto const& u: us)
 				if (!knownUncles.count(BlockInfo::headerHash(_bc.block(u))))	// ignore any uncles/mainline blocks that we know about. We use header-hash for this.
 				{
 					BlockInfo ubi(_bc.block(u));
-					ubi.fillStream(uncles, true);
+					ubi.fillStream(unclesData, true);
+					++unclesCount;
 					uncleAddresses.push_back(ubi.coinbaseAddress);
 				}
 		}
 	}
-	else
-		uncles.appendList(0);
 
 	MemoryDB tm;
 	GenericTrieDB<MemoryDB> transactionReceipts(&tm);
@@ -741,7 +740,8 @@ void State::commitToMine(BlockChain const& _bc)
 	}
 
 	txs.swapOut(m_currentTxs);
-	uncles.swapOut(m_currentUncles);
+
+	RLPStream(unclesCount).appendRaw(unclesData.out(), unclesCount).swapOut(m_currentUncles);
 
 	m_currentBlock.transactionsRoot = transactionReceipts.root();
 	m_currentBlock.sha3Uncles = sha3(m_currentUncles);
diff --git a/libethereum/Transaction.cpp b/libethereum/Transaction.cpp
index d248ae2fd..5a0fa8eeb 100644
--- a/libethereum/Transaction.cpp
+++ b/libethereum/Transaction.cpp
@@ -38,7 +38,7 @@ Transaction::Transaction(bytesConstRef _rlpData, bool _checkSender)
 		nonce = rlp[field = 0].toInt<u256>();
 		gasPrice = rlp[field = 1].toInt<u256>();
 		gas = rlp[field = 2].toInt<u256>();
-		receiveAddress = rlp[field = 3].isEmpty() ? Address() : Address();
+		receiveAddress = rlp[field = 3].toHash<Address>();
 		value = rlp[field = 4].toInt<u256>();
 		data = rlp[field = 5].toBytes();
 		vrs = Signature{ rlp[field = 6].toInt<byte>(), rlp[field = 7].toInt<u256>(), rlp[field = 8].toInt<u256>() };
diff --git a/libwhisper/CMakeLists.txt b/libwhisper/CMakeLists.txt
new file mode 100644
index 000000000..4d633495f
--- /dev/null
+++ b/libwhisper/CMakeLists.txt
@@ -0,0 +1,66 @@
+cmake_policy(SET CMP0015 NEW)
+
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DSTATICLIB")
+
+aux_source_directory(. SRC_LIST)
+
+set(EXECUTABLE whisper)
+
+# set(CMAKE_INSTALL_PREFIX ../lib)
+if(ETH_STATIC)
+	add_library(${EXECUTABLE} STATIC ${SRC_LIST})
+else()
+	add_library(${EXECUTABLE} SHARED ${SRC_LIST})
+endif()
+
+file(GLOB HEADERS "*.h") 
+
+include_directories(..)
+
+target_link_libraries(${EXECUTABLE} evm)
+target_link_libraries(${EXECUTABLE} lll)
+target_link_libraries(${EXECUTABLE} ethential)
+target_link_libraries(${EXECUTABLE} secp256k1)
+if(MINIUPNPC_LS)
+target_link_libraries(${EXECUTABLE} ${MINIUPNPC_LS})
+endif()
+target_link_libraries(${EXECUTABLE} ${LEVELDB_LS})
+target_link_libraries(${EXECUTABLE} ${CRYPTOPP_LS})
+target_link_libraries(${EXECUTABLE} gmp)
+
+if("${TARGET_PLATFORM}" STREQUAL "w64")
+	target_link_libraries(${EXECUTABLE} boost_system-mt-s)
+	target_link_libraries(${EXECUTABLE} boost_regex-mt-s)
+	target_link_libraries(${EXECUTABLE} boost_filesystem-mt-s)
+	target_link_libraries(${EXECUTABLE} boost_thread_win32-mt-s)
+	target_link_libraries(${EXECUTABLE} iphlpapi)
+	target_link_libraries(${EXECUTABLE} ws2_32)
+	target_link_libraries(${EXECUTABLE} mswsock)
+	target_link_libraries(${EXECUTABLE} shlwapi)
+elseif (APPLE)
+	# Latest mavericks boost libraries only come with -mt
+	target_link_libraries(${EXECUTABLE} boost_system-mt)
+	target_link_libraries(${EXECUTABLE} boost_regex-mt)
+	target_link_libraries(${EXECUTABLE} boost_filesystem-mt)
+	target_link_libraries(${EXECUTABLE} boost_thread-mt)
+	find_package(Threads REQUIRED)
+	target_link_libraries(${EXECUTABLE} ${CMAKE_THREAD_LIBS_INIT})
+elseif (UNIX)
+	target_link_libraries(${EXECUTABLE} ${Boost_SYSTEM_LIBRARY})
+	target_link_libraries(${EXECUTABLE} ${Boost_REGEX_LIBRARY})
+	target_link_libraries(${EXECUTABLE} ${Boost_FILESYSTEM_LIBRARY})
+	target_link_libraries(${EXECUTABLE} ${Boost_THREAD_LIBRARY})
+	target_link_libraries(${EXECUTABLE} ${Boost_DATE_TIME_LIBRARY})
+	target_link_libraries(${EXECUTABLE} ${CMAKE_THREAD_LIBS_INIT})
+else ()
+	target_link_libraries(${EXECUTABLE} boost_system)
+	target_link_libraries(${EXECUTABLE} boost_regex)
+	target_link_libraries(${EXECUTABLE} boost_filesystem)
+	target_link_libraries(${EXECUTABLE} boost_thread)
+	find_package(Threads REQUIRED)
+	target_link_libraries(${EXECUTABLE} ${CMAKE_THREAD_LIBS_INIT})
+endif ()
+
+install( TARGETS ${EXECUTABLE} ARCHIVE DESTINATION lib LIBRARY DESTINATION lib )
+install( FILES ${HEADERS} DESTINATION include/${EXECUTABLE} )
+
diff --git a/libwhisper/Whisper.cpp b/libwhisper/Whisper.cpp
new file mode 100644
index 000000000..905080f4b
--- /dev/null
+++ b/libwhisper/Whisper.cpp
@@ -0,0 +1,34 @@
+/*
+	This file is part of cpp-ethereum.
+
+	cpp-ethereum is free software: you can redistribute it and/or modify
+	it under the terms of the GNU General Public License as published by
+	the Free Software Foundation, either version 3 of the License, or
+	(at your option) any later version.
+
+	cpp-ethereum is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with cpp-ethereum.  If not, see <http://www.gnu.org/licenses/>.
+*/
+/** @file Whisper.cpp
+ * @author Gav Wood <i@gavwood.com>
+ * @date 2014
+ */
+
+#include "Whisper.h"
+
+#include <libethential/Log.h>
+using namespace std;
+using namespace eth;
+
+Whisper::Whisper()
+{
+}
+
+Whisper::~Whisper()
+{
+}
diff --git a/libwhisper/Whisper.h b/libwhisper/Whisper.h
new file mode 100644
index 000000000..7be8a0c49
--- /dev/null
+++ b/libwhisper/Whisper.h
@@ -0,0 +1,50 @@
+/*
+	This file is part of cpp-ethereum.
+
+	cpp-ethereum is free software: you can redistribute it and/or modify
+	it under the terms of the GNU General Public License as published by
+	the Free Software Foundation, either version 3 of the License, or
+	(at your option) any later version.
+
+	cpp-ethereum is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with cpp-ethereum.  If not, see <http://www.gnu.org/licenses/>.
+*/
+/** @file Whisper.h
+ * @author Gav Wood <i@gavwood.com>
+ * @date 2014
+ */
+
+#pragma once
+
+namespace eth
+{
+/*
+class NetPeer
+{
+public:
+	NetPeer();
+	virtual ~NetPeer();
+
+protected:
+	virtual void onIncoming(PeerId);
+	void send(PeerId);
+};
+*/
+/**
+ */
+class Whisper//: public NetPeer
+{
+public:
+	/// Constructor.
+	Whisper();
+
+	/// Destructor.
+	virtual ~Whisper();
+};
+
+}