diff --git a/ethereal/assets/ext/ethereum.js b/ethereal/assets/ext/ethereum.js
index 03b25179bd0f6e514138016b124d754bec640845..fb8bd23a74440bce094d8d8aefa76f2beca83b01 100644
--- a/ethereal/assets/ext/ethereum.js
+++ b/ethereal/assets/ext/ethereum.js
@@ -4,6 +4,16 @@ window.eth = {
 	_callbacks: {},
 	_onCallbacks: {},
 
+    test: function() {
+        var t = undefined;
+        navigator.qt.onmessage = function(d) { t = d; }
+        for(;;) {
+            if(t !== undefined) {
+                return t
+            }
+        }
+    },
+
 	mutan: function(code) {
 	},
 
diff --git a/ethereal/assets/ext/test.html b/ethereal/assets/ext/test.html
index 0d6b710fa14c74af9cad76407677741d98b64825..980001f907e175bab7ebd828410ff411fa4c7d45 100644
--- a/ethereal/assets/ext/test.html
+++ b/ethereal/assets/ext/test.html
@@ -25,6 +25,10 @@ function test() {
 	eth.getEachStorageAt("9ef0f0d81e040012600b0c1abdef7c48f720f88a", function(a, b) {
 			console.log(a,b)
 	})
+
+	eth.getBlock("f70097659f329a09642a27f11338d9269de64f1d4485786e36bfc410832148cd", function(block) {
+			console.log(block)
+	})
 }
 </script>
 
diff --git a/ethereal/assets/qml/views/info.qml b/ethereal/assets/qml/views/info.qml
index fcddd46e2e0ddaca93e3f30be1ec0ded449c8cbd..3335a306ad7083329a7a7b6d27604d51158d52c9 100644
--- a/ethereal/assets/qml/views/info.qml
+++ b/ethereal/assets/qml/views/info.qml
@@ -28,7 +28,7 @@ Rectangle {
 			text: "Address"
 		}
 		TextField {
-			text: pub.getKey().address
+			text: eth.getKey().address
 			width: 500
 		}
 
diff --git a/ethereal/assets/qml/views/transaction.qml b/ethereal/assets/qml/views/transaction.qml
index 80e1670f815605a763d810b69844b66349c4aacc..ac38ebe0c347f0dcb7c8cbdc00bf2ff7ed0dc68b 100644
--- a/ethereal/assets/qml/views/transaction.qml
+++ b/ethereal/assets/qml/views/transaction.qml
@@ -169,7 +169,7 @@ Rectangle {
 			onClicked: {
 				var value = txValue.text + denomModel.get(valueDenom.currentIndex).zeros;
 				var gasPrice = txGasPrice.text + denomModel.get(gasDenom.currentIndex).zeros;
-				var res = gui.create(txFuelRecipient.text, value, txGas.text, gasPrice, codeView.text)
+				var res = gui.transact(txFuelRecipient.text, value, txGas.text, gasPrice, codeView.text)
 				if(res[1]) {
 					txResult.text = "Your contract <b>could not</b> be sent over the network:\n<b>"
 					txResult.text += res[1].error()
diff --git a/ethereal/assets/qml/webapp.qml b/ethereal/assets/qml/webapp.qml
index 5faf50e91c3ecf2be13486ee2274431ea946c1a3..ac48e32a117f7391942c5adc4638d33ea7b18859 100644
--- a/ethereal/assets/qml/webapp.qml
+++ b/ethereal/assets/qml/webapp.qml
@@ -165,13 +165,13 @@ ApplicationWindow {
 						break
 
 						case "getBlockByNumber":
-						var block = eth.getBlock(data.args[0])
+						var block = eth.getBlockByNumber(data.args[0])
 						postData(data._seed, block)
 
 						break
 
 						case "getBlockByHash":
-						var block = eth.getBlock(data.args[0])
+						var block = eth.getBlockByHash(data.args[0])
 						postData(data._seed, block)
 
 						break
@@ -195,8 +195,8 @@ ApplicationWindow {
 
 						case "getEachStorage":
 						require(1);
-						var stateObject = eth.getStateObject(data.args[0]).stateKeyVal(true)
-						postData(data._seed,stateObject)
+						var storage = eth.getEachStorage(data.args[0])
+						postData(data._seed, storage)
 
 						break
 
diff --git a/ethereal/debugger.go b/ethereal/debugger.go
index 1cf5e0b6642ed0d57f82b51227158ab973b888a3..56f0b47fc281c45bc3c80ef76f4bb335f13242b6 100644
--- a/ethereal/debugger.go
+++ b/ethereal/debugger.go
@@ -103,14 +103,7 @@ func (self *DebuggerWindow) Debug(valueStr, gasStr, gasPriceStr, scriptStr, data
 		}
 	}()
 
-	data := ethutil.StringToByteFunc(dataStr, func(s string) (ret []byte) {
-		slice := strings.Split(dataStr, "\n")
-		for _, dataItem := range slice {
-			d := ethutil.FormatData(dataItem)
-			ret = append(ret, d...)
-		}
-		return
-	})
+	data := utils.FormatTransactionData(dataStr)
 
 	var err error
 	script := ethutil.StringToByteFunc(scriptStr, func(s string) (ret []byte) {
diff --git a/ethereal/ext_app.go b/ethereal/ext_app.go
index 37e9676ffd9d7d16d3f967f5e334124304d6b21c..ad826eaa61c5dd7e0c6abfd597c3adcd5d085772 100644
--- a/ethereal/ext_app.go
+++ b/ethereal/ext_app.go
@@ -4,7 +4,7 @@ import (
 	"encoding/json"
 
 	"github.com/ethereum/eth-go/ethchain"
-	"github.com/ethereum/eth-go/ethpub"
+	"github.com/ethereum/eth-go/ethpipe"
 	"github.com/ethereum/eth-go/ethreact"
 	"github.com/ethereum/eth-go/ethstate"
 	"github.com/ethereum/go-ethereum/javascript"
@@ -19,42 +19,36 @@ type AppContainer interface {
 	Engine() *qml.Engine
 
 	NewBlock(*ethchain.Block)
-	ObjectChanged(*ethstate.StateObject)
-	StorageChanged(*ethstate.StorageState)
 	NewWatcher(chan bool)
 	Messages(ethstate.Messages, string)
 }
 
 type ExtApplication struct {
-	*ethpub.PEthereum
+	*ethpipe.JSPipe
 	eth ethchain.EthManager
 
 	blockChan       chan ethreact.Event
-	changeChan      chan ethreact.Event
 	messageChan     chan ethreact.Event
 	quitChan        chan bool
 	watcherQuitChan chan bool
 
 	filters map[string]*ethchain.Filter
 
-	container        AppContainer
-	lib              *UiLib
-	registeredEvents []string
+	container AppContainer
+	lib       *UiLib
 }
 
 func NewExtApplication(container AppContainer, lib *UiLib) *ExtApplication {
 	app := &ExtApplication{
-		ethpub.New(lib.eth),
+		ethpipe.NewJSPipe(lib.eth),
 		lib.eth,
 		make(chan ethreact.Event, 100),
 		make(chan ethreact.Event, 100),
-		make(chan ethreact.Event, 100),
 		make(chan bool),
 		make(chan bool),
 		make(map[string]*ethchain.Filter),
 		container,
 		lib,
-		nil,
 	}
 
 	return app
@@ -93,9 +87,6 @@ func (app *ExtApplication) stop() {
 	// Clean up
 	reactor := app.lib.eth.Reactor()
 	reactor.Unsubscribe("newBlock", app.blockChan)
-	for _, event := range app.registeredEvents {
-		reactor.Unsubscribe(event, app.changeChan)
-	}
 
 	// Kill the main loop
 	app.quitChan <- true
@@ -103,7 +94,6 @@ func (app *ExtApplication) stop() {
 
 	close(app.blockChan)
 	close(app.quitChan)
-	close(app.changeChan)
 
 	app.container.Destroy()
 }
@@ -118,13 +108,6 @@ out:
 			if block, ok := block.Resource.(*ethchain.Block); ok {
 				app.container.NewBlock(block)
 			}
-		case object := <-app.changeChan:
-			if stateObject, ok := object.Resource.(*ethstate.StateObject); ok {
-				app.container.ObjectChanged(stateObject)
-			} else if storageObject, ok := object.Resource.(*ethstate.StorageState); ok {
-				app.container.StorageChanged(storageObject)
-			}
-
 		case msg := <-app.messageChan:
 			if messages, ok := msg.Resource.(ethstate.Messages); ok {
 				for id, filter := range app.filters {
diff --git a/ethereal/gui.go b/ethereal/gui.go
index c0584936d1febc826744c3975c8425125a695720..5cc305977bb3b427446c0fe1824096f04ea39165 100644
--- a/ethereal/gui.go
+++ b/ethereal/gui.go
@@ -14,7 +14,6 @@ import (
 	"github.com/ethereum/eth-go/ethlog"
 	"github.com/ethereum/eth-go/ethminer"
 	"github.com/ethereum/eth-go/ethpipe"
-	"github.com/ethereum/eth-go/ethpub"
 	"github.com/ethereum/eth-go/ethreact"
 	"github.com/ethereum/eth-go/ethutil"
 	"github.com/ethereum/eth-go/ethwire"
@@ -39,10 +38,11 @@ type Gui struct {
 
 	txDb *ethdb.LDBDatabase
 
-	pub      *ethpub.PEthereum
 	logLevel ethlog.LogLevel
 	open     bool
 
+	pipe *ethpipe.JSPipe
+
 	Session        string
 	clientIdentity *ethwire.SimpleClientIdentity
 	config         *ethutil.ConfigManager
@@ -57,9 +57,9 @@ func NewWindow(ethereum *eth.Ethereum, config *ethutil.ConfigManager, clientIden
 		panic(err)
 	}
 
-	pub := ethpub.New(ethereum)
+	pipe := ethpipe.NewJSPipe(ethereum)
 
-	return &Gui{eth: ethereum, txDb: db, pub: pub, logLevel: ethlog.LogLevel(logLevel), Session: session, open: false, clientIdentity: clientIdentity, config: config}
+	return &Gui{eth: ethereum, txDb: db, pipe: pipe, logLevel: ethlog.LogLevel(logLevel), Session: session, open: false, clientIdentity: clientIdentity, config: config}
 }
 
 func (gui *Gui) Start(assetPath string) {
@@ -68,13 +68,12 @@ func (gui *Gui) Start(assetPath string) {
 
 	// Register ethereum functions
 	qml.RegisterTypes("Ethereum", 1, 0, []qml.TypeSpec{{
-		Init: func(p *ethpub.PBlock, obj qml.Object) { p.Number = 0; p.Hash = "" },
+		Init: func(p *ethpipe.JSBlock, obj qml.Object) { p.Number = 0; p.Hash = "" },
 	}, {
-		Init: func(p *ethpub.PTx, obj qml.Object) { p.Value = ""; p.Hash = ""; p.Address = "" },
+		Init: func(p *ethpipe.JSTransaction, obj qml.Object) { p.Value = ""; p.Hash = ""; p.Address = "" },
 	}, {
-		Init: func(p *ethpub.KeyVal, obj qml.Object) { p.Key = ""; p.Value = "" },
+		Init: func(p *ethpipe.KeyVal, obj qml.Object) { p.Key = ""; p.Value = "" },
 	}})
-
 	// Create a new QML engine
 	gui.engine = qml.NewEngine()
 	context := gui.engine.Context()
@@ -82,7 +81,6 @@ func (gui *Gui) Start(assetPath string) {
 
 	// Expose the eth library and the ui library to QML
 	context.SetVar("gui", gui)
-	context.SetVar("pub", gui.pub)
 	context.SetVar("eth", gui.uiLib)
 
 	// Load the main QML interface
@@ -231,7 +229,7 @@ func (gui *Gui) loadAddressBook() {
 	view := gui.getObjectByName("infoView")
 	view.Call("clearAddress")
 
-	nameReg := ethpub.EthereumConfig(gui.eth.StateManager()).NameReg()
+	nameReg := gui.pipe.World().Config().Get("NameReg")
 	if nameReg != nil {
 		nameReg.EachStorage(func(name string, value *ethutil.Value) {
 			if name[0] != 0 {
@@ -255,7 +253,7 @@ func (gui *Gui) insertTransaction(window string, tx *ethchain.Transaction) {
 	}
 
 	var (
-		ptx  = ethpub.NewPTx(tx)
+		ptx  = ethpipe.NewJSTx(tx)
 		send = nameReg.Storage(tx.Sender())
 		rec  = nameReg.Storage(tx.Recipient)
 		s, r string
@@ -301,8 +299,9 @@ func (gui *Gui) readPreviousTransactions() {
 }
 
 func (gui *Gui) processBlock(block *ethchain.Block, initial bool) {
-	name := ethpub.FindNameInNameReg(gui.eth.StateManager(), block.Coinbase)
-	b := ethpub.NewPBlock(block)
+	//name := ethpub.FindNameInNameReg(gui.eth.StateManager(), block.Coinbase)
+	name := strings.Trim(gui.pipe.World().Config().Get("NameReg").Storage(block.Coinbase).Str(), "\x00")
+	b := ethpipe.NewJSBlock(block)
 	b.Name = name
 
 	gui.getObjectByName("chainView").Call("addBlock", b, initial)
@@ -391,12 +390,12 @@ func (gui *Gui) update() {
 					if bytes.Compare(tx.Sender(), gui.address()) == 0 {
 						object.SubAmount(tx.Value)
 
-						gui.getObjectByName("transactionView").Call("addTx", ethpub.NewPTx(tx), "send")
+						gui.getObjectByName("transactionView").Call("addTx", ethpipe.NewJSTx(tx), "send")
 						gui.txDb.Put(tx.Hash(), tx.RlpEncode())
 					} else if bytes.Compare(tx.Recipient, gui.address()) == 0 {
 						object.AddAmount(tx.Value)
 
-						gui.getObjectByName("transactionView").Call("addTx", ethpub.NewPTx(tx), "recv")
+						gui.getObjectByName("transactionView").Call("addTx", ethpipe.NewJSTx(tx), "recv")
 						gui.txDb.Put(tx.Hash(), tx.RlpEncode())
 					}
 
@@ -442,10 +441,9 @@ func (gui *Gui) update() {
 	reactor.Subscribe("miner:start", miningChan)
 	reactor.Subscribe("miner:stop", miningChan)
 
-	nameReg := ethpub.EthereumConfig(gui.eth.StateManager()).NameReg()
-	if nameReg != nil {
-		reactor.Subscribe("object:"+string(nameReg.Address()), objectChan)
-	}
+	nameReg := gui.pipe.World().Config().Get("NameReg")
+	reactor.Subscribe("object:"+string(nameReg.Address()), objectChan)
+
 	reactor.Subscribe("peerList", peerChan)
 }
 
@@ -453,7 +451,7 @@ func (gui *Gui) setPeerInfo() {
 	gui.win.Root().Call("setPeers", fmt.Sprintf("%d / %d", gui.eth.PeerCount(), gui.eth.MaxPeers))
 
 	gui.win.Root().Call("resetPeers")
-	for _, peer := range gui.pub.GetPeers() {
+	for _, peer := range gui.pipe.GetPeers() {
 		gui.win.Root().Call("addPeer", peer)
 	}
 }
@@ -466,18 +464,10 @@ func (gui *Gui) address() []byte {
 	return gui.eth.KeyManager().Address()
 }
 
-func (gui *Gui) RegisterName(name string) {
-	name = fmt.Sprintf("\"register\"\n\"%s\"", name)
-
-	gui.pub.Transact(gui.privateKey(), "NameReg", "", "10000", "10000000000000", name)
-}
-
-func (gui *Gui) Transact(recipient, value, gas, gasPrice, data string) (*ethpub.PReceipt, error) {
-	return gui.pub.Transact(gui.privateKey(), recipient, value, gas, gasPrice, data)
-}
+func (gui *Gui) Transact(recipient, value, gas, gasPrice, d string) (*ethpipe.JSReceipt, error) {
+	data := ethutil.Bytes2Hex(utils.FormatTransactionData(d))
 
-func (gui *Gui) Create(recipient, value, gas, gasPrice, data string) (*ethpub.PReceipt, error) {
-	return gui.pub.Transact(gui.privateKey(), recipient, value, gas, gasPrice, data)
+	return gui.pipe.Transact(gui.privateKey(), recipient, value, gas, gasPrice, data)
 }
 
 func (gui *Gui) SetCustomIdentifier(customIdentifier string) {
diff --git a/ethereal/html_container.go b/ethereal/html_container.go
index 7deee487d9ac9fdfb6cc63311107741751f7549d..bbf77402e4fdd9d96b2e5c8a8d1f739423b49137 100644
--- a/ethereal/html_container.go
+++ b/ethereal/html_container.go
@@ -125,14 +125,6 @@ func (app *HtmlApplication) NewBlock(block *ethchain.Block) {
 	app.webView.Call("onNewBlockCb", b)
 }
 
-func (app *HtmlApplication) ObjectChanged(stateObject *ethstate.StateObject) {
-	app.webView.Call("onObjectChangeCb", ethpub.NewPStateObject(stateObject))
-}
-
-func (app *HtmlApplication) StorageChanged(storageObject *ethstate.StorageState) {
-	app.webView.Call("onStorageChangeCb", ethpub.NewPStorageState(storageObject))
-}
-
 func (self *HtmlApplication) Messages(messages ethstate.Messages, id string) {
 	var msgs []javascript.JSMessage
 	for _, m := range messages {
diff --git a/ethereal/ui_lib.go b/ethereal/ui_lib.go
index f900fcaeef0fd9765a4a0d9cb1e0a4a9eafc57a8..c48a06547e81288a304352b4c9c3b32089d9cce2 100644
--- a/ethereal/ui_lib.go
+++ b/ethereal/ui_lib.go
@@ -6,6 +6,7 @@ import (
 
 	"github.com/ethereum/eth-go"
 	"github.com/ethereum/eth-go/ethchain"
+	"github.com/ethereum/eth-go/ethpipe"
 	"github.com/ethereum/eth-go/ethutil"
 	"github.com/ethereum/go-ethereum/javascript"
 	"github.com/go-qml/qml"
@@ -18,6 +19,7 @@ type memAddr struct {
 
 // UI Library that has some basic functionality exposed
 type UiLib struct {
+	*ethpipe.JSPipe
 	engine    *qml.Engine
 	eth       *eth.Ethereum
 	connected bool
@@ -31,7 +33,7 @@ type UiLib struct {
 }
 
 func NewUiLib(engine *qml.Engine, eth *eth.Ethereum, assetPath string) *UiLib {
-	return &UiLib{engine: engine, eth: eth, assetPath: assetPath, jsEngine: javascript.NewJSRE(eth)}
+	return &UiLib{JSPipe: ethpipe.NewJSPipe(eth), engine: engine, eth: eth, assetPath: assetPath, jsEngine: javascript.NewJSRE(eth)}
 }
 
 func (self *UiLib) ImportTx(rlpTx string) {
diff --git a/javascript/types.go b/javascript/types.go
index fb1e54ae7311b51afd104ce0b16417a6d54a2f88..375e7b24cc245f131e2f1e6ef775bd4040af605b 100644
--- a/javascript/types.go
+++ b/javascript/types.go
@@ -128,37 +128,7 @@ func (self *JSEthereum) toVal(v interface{}) otto.Value {
 }
 
 func (self *JSEthereum) Messages(object map[string]interface{}) otto.Value {
-	filter := ethchain.NewFilter(self.ethereum)
-
-	if object["earliest"] != nil {
-		earliest := object["earliest"]
-		if e, ok := earliest.(string); ok {
-			filter.SetEarliestBlock(ethutil.Hex2Bytes(e))
-		} else {
-			filter.SetEarliestBlock(earliest)
-		}
-	}
-
-	if object["latest"] != nil {
-		latest := object["latest"]
-		if l, ok := latest.(string); ok {
-			filter.SetLatestBlock(ethutil.Hex2Bytes(l))
-		} else {
-			filter.SetLatestBlock(latest)
-		}
-	}
-	if object["to"] != nil {
-		filter.AddTo(ethutil.Hex2Bytes(object["to"].(string)))
-	}
-	if object["from"] != nil {
-		filter.AddFrom(ethutil.Hex2Bytes(object["from"].(string)))
-	}
-	if object["max"] != nil {
-		filter.SetMax(object["max"].(int))
-	}
-	if object["skip"] != nil {
-		filter.SetSkip(object["skip"].(int))
-	}
+	filter := ethchain.NewFilterFromMap(object, self.ethereum)
 
 	messages := filter.Find()
 	var msgs []JSMessage
diff --git a/utils/cmd.go b/utils/cmd.go
index d34348ad86c06b71304c2b5f7ae8cd68db334168..58e3eed1e627c5f18dc0ed22c0784a107e4d5e96 100644
--- a/utils/cmd.go
+++ b/utils/cmd.go
@@ -8,6 +8,7 @@ import (
 	"os/signal"
 	"path"
 	"path/filepath"
+	"regexp"
 	"runtime"
 	"time"
 
@@ -267,6 +268,19 @@ func StartMining(ethereum *eth.Ethereum) bool {
 	return false
 }
 
+func FormatTransactionData(data string) []byte {
+	d := ethutil.StringToByteFunc(data, func(s string) (ret []byte) {
+		slice := regexp.MustCompile("\\n|\\s").Split(s, 1000000000)
+		for _, dataItem := range slice {
+			d := ethutil.FormatData(dataItem)
+			ret = append(ret, d...)
+		}
+		return
+	})
+
+	return d
+}
+
 func StopMining(ethereum *eth.Ethereum) bool {
 	if ethereum.Mining && miner != nil {
 		miner.Stop()