diff --git a/ethereal/assets/ext/filter.js b/ethereal/assets/ext/filter.js
index 7af6f56e77e81620657fed3e851779ea60dac5d1..5c1c03aada487c658ae0eb5c8bf6097d23291cb4 100644
--- a/ethereal/assets/ext/filter.js
+++ b/ethereal/assets/ext/filter.js
@@ -3,7 +3,11 @@ var Filter = function(options) {
 	this.seed = Math.floor(Math.random() * 1000000);
 	this.options = options;
 
-	eth.registerFilter(options, this.seed);
+	if(options == "chain") {
+		eth.registerFilterString(options, this.seed);
+	} else if(typeof options === "object") {
+		eth.registerFilter(options, this.seed);
+	}
 };
 
 Filter.prototype.changed = function(callback) {
diff --git a/ethereal/gui.go b/ethereal/gui.go
index 3f989fe5115e9bbd44d3064ba06a35c1cb6f4c01..f450acde677d8b4fedaf5b6ce0e44724afe32c3b 100644
--- a/ethereal/gui.go
+++ b/ethereal/gui.go
@@ -72,7 +72,7 @@ func NewWindow(ethereum *eth.Ethereum, config *ethutil.ConfigManager, clientIden
 	if err != nil {
 		fmt.Println(err)
 	}
-	fmt.Println(string(data))
+	fmt.Println("plugins:", string(data))
 
 	json.Unmarshal([]byte(data), &gui.plugins)
 
diff --git a/ethereal/ui_lib.go b/ethereal/ui_lib.go
index 7b2627c49c018c45b5b83dcc868219d44a2a126a..4b8210da64c41c75570d9c8d694e420917db658a 100644
--- a/ethereal/ui_lib.go
+++ b/ethereal/ui_lib.go
@@ -169,6 +169,20 @@ func (self *UiLib) RegisterFilter(object map[string]interface{}, seed int) {
 			self.win.Root().Call("invokeFilterCallback", filter.MessagesToJson(messages), seed, callbackSeed)
 		}
 	}
+
+}
+
+func (self *UiLib) RegisterFilterString(typ string, seed int) {
+	filter := &GuiFilter{ethpipe.NewJSFilterFromMap(nil, self.eth), seed}
+	self.filters[seed] = filter
+
+	if typ == "chain" {
+		filter.BlockCallback = func(block *ethchain.Block) {
+			for _, callbackSeed := range self.filterCallbacks[seed] {
+				self.win.Root().Call("invokeFilterCallback", "{}", seed, callbackSeed)
+			}
+		}
+	}
 }
 
 func (self *UiLib) RegisterFilterCallback(seed, cbSeed int) {
@@ -187,3 +201,51 @@ type GuiFilter struct {
 	*ethpipe.JSFilter
 	seed int
 }
+
+func (self *UiLib) Transact(object map[string]interface{}) (*ethpipe.JSReceipt, error) {
+	// Default values
+	if object["from"] == nil {
+		object["from"] = ""
+	}
+	if object["to"] == nil {
+		object["to"] = ""
+	}
+	if object["value"] == nil {
+		object["value"] = ""
+	}
+	if object["gas"] == nil {
+		object["gas"] = ""
+	}
+	if object["gasPrice"] == nil {
+		object["gasPrice"] = ""
+	}
+
+	var dataStr string
+	var data []string
+	if list, ok := object["data"].(*qml.List); ok {
+		list.Convert(&data)
+	}
+
+	for _, str := range data {
+		if ethutil.IsHex(str) {
+			str = str[2:]
+
+			if len(str) != 64 {
+				str = ethutil.LeftPadString(str, 64)
+			}
+		} else {
+			str = ethutil.Bytes2Hex(ethutil.LeftPadBytes(ethutil.Big(str).Bytes(), 32))
+		}
+
+		dataStr += str
+	}
+
+	return self.JSPipe.Transact(
+		object["from"].(string),
+		object["to"].(string),
+		object["value"].(string),
+		object["gas"].(string),
+		object["gasPrice"].(string),
+		dataStr,
+	)
+}