diff --git a/ethereal/assets/debugger/debugger.qml b/ethereal/assets/debugger/debugger.qml
index b93308b3e2b6fe5e82a02485f78326b04a40d508..579e8be3ab3dc83d1c069a18d5600900572351ba 100644
--- a/ethereal/assets/debugger/debugger.qml
+++ b/ethereal/assets/debugger/debugger.qml
@@ -7,6 +7,7 @@ import QtQuick.Controls.Styles 1.1
 import Ethereum 1.0
 
 ApplicationWindow {
+	id: win
 	visible: false
 	title: "IceCREAM"
 	minimumWidth: 1280
@@ -17,6 +18,10 @@ ApplicationWindow {
 	property alias codeText: codeEditor.text
 	property alias dataText: rawDataField.text
 
+	onClosing: {
+		compileTimer.stop()
+	}
+
 	MenuBar {
 		Menu {
 			title: "Debugger"
@@ -34,12 +39,44 @@ ApplicationWindow {
 
 			MenuItem {
 				text: "Continue"
-				shortcut: "Ctrl+c"
+				shortcut: "Ctrl+g"
 				onTriggered: dbg.continue()
 			}
+			MenuItem {
+				text: "Command"
+				shortcut: "Ctrl+l"
+				onTriggered: {
+					dbgCommand.focus = true
+				}
+			}
+			MenuItem {
+				text: "Focus code"
+				shortcut: "Ctrl+1"
+				onTriggered: {
+					codeEditor.focus = true
+				}
+			}
+			MenuItem {
+				text: "Focus data"
+				shortcut: "Ctrl+2"
+				onTriggered: {
+					rawDataField.focus = true
+				}
+			}
+
+			/*
+			MenuItem {
+				text: "Close window"
+				shortcut: "Ctrl+w"
+				onTriggered: {
+					win.close()
+				}
+			}
+			*/
 		}
 	}
 
+
 	SplitView {
 		anchors.fill: parent
 		property var asmModel: ListModel {
@@ -73,6 +110,15 @@ ApplicationWindow {
 						anchors.bottom: parent.bottom
 						anchors.left: parent.left
 						anchors.right: settings.left
+						focus: true
+
+						Timer {
+							id: compileTimer
+							interval: 500 ; running: true ;  repeat: true
+							onTriggered: {
+								dbg.compile(codeEditor.text)
+							}
+						}
 					}
 
 					Column {
@@ -185,7 +231,7 @@ ApplicationWindow {
 							}
 							height: parent.height
 							width: parent.width
-							TableViewColumn{ id: message ; role: "message" ; title: "log" ; width: logTableView.width }
+							TableViewColumn{ id: message ; role: "message" ; title: "log" ; width: logTableView.width -1 }
 							model: logModel
 						}
 					}
@@ -207,7 +253,7 @@ ApplicationWindow {
 			y: 1
 			x: asmTableView.width
 			width: 500
-			placeholderText: "Debugger command (help for help)"
+			placeholderText: "Debugger (type 'help')"
 			Keys.onReturnPressed: {
 				exec()
 			}
@@ -225,6 +271,7 @@ ApplicationWindow {
 	}
 
 	toolBar: ToolBar {
+		height: 30
 		RowLayout {
 			spacing: 5
 
@@ -254,6 +301,23 @@ ApplicationWindow {
 				text: "Continue"
 			}
 		}
+
+
+		ComboBox {
+			id: snippets
+			anchors.right: parent.right
+			model: ListModel {
+				ListElement { text: "Snippets" ; value: "" }
+				ListElement { text: "Call Contract" ; value: "var[2] in;\nvar ret;\n\nin[0] = \"arg1\"\nin[1] = 0xdeadbeef\n\nvar success = call(0x0c542ddea93dae0c2fcb2cf175f03ad80d6be9a0, 0, 7000, in, ret)\n\nreturn ret" }
+			}
+			onCurrentIndexChanged: {
+				if(currentIndex != 0) {
+					var code = snippets.model.get(currentIndex).value;
+					codeEditor.insert(codeEditor.cursorPosition, code)
+				}
+			}
+		}
+
 	}
 
 	function debugCurrent() {
diff --git a/ethereal/debugger.go b/ethereal/debugger.go
index 8eab04b4d6fb02be97973120e87009983a8dffcc..d1516c5d51c4f3d48a7b0ac04f3c571c89ad0a5f 100644
--- a/ethereal/debugger.go
+++ b/ethereal/debugger.go
@@ -52,13 +52,27 @@ func (self *DebuggerWindow) SetCode(code string) {
 func (self *DebuggerWindow) SetData(data string) {
 	self.win.Set("dataText", data)
 }
-func (self *DebuggerWindow) SetAsm(data string) {
-	dis := ethchain.Disassemble(ethutil.Hex2Bytes(data))
+func (self *DebuggerWindow) SetAsm(data []byte) {
+	self.win.Root().Call("clearAsm")
+
+	dis := ethchain.Disassemble(data)
 	for _, str := range dis {
 		self.win.Root().Call("setAsm", str)
 	}
 }
 
+func (self *DebuggerWindow) Compile(code string) {
+	var err error
+	script := ethutil.StringToByteFunc(code, func(s string) (ret []byte) {
+		ret, err = ethutil.Compile(s)
+		return
+	})
+
+	if err == nil {
+		self.SetAsm(script)
+	}
+}
+
 func (self *DebuggerWindow) Debug(valueStr, gasStr, gasPriceStr, scriptStr, dataStr string) {
 	if !self.Db.done {
 		self.Db.Q <- true
@@ -91,27 +105,21 @@ func (self *DebuggerWindow) Debug(valueStr, gasStr, gasPriceStr, scriptStr, data
 		return
 	}
 
-	dis := ethchain.Disassemble(script)
-	self.win.Root().Call("clearAsm")
-
-	for _, str := range dis {
-		self.win.Root().Call("setAsm", str)
-	}
+	self.SetAsm(script)
 
 	var (
 		gas      = ethutil.Big(gasStr)
 		gasPrice = ethutil.Big(gasPriceStr)
 		value    = ethutil.Big(valueStr)
 		// Contract addr as test address
-		keyPair  = self.lib.eth.KeyManager().KeyPair()
-		callerTx = ethchain.NewContractCreationTx(ethutil.Big(valueStr), gas, gasPrice, script)
+		keyPair = self.lib.eth.KeyManager().KeyPair()
 	)
-	callerTx.Sign(keyPair.PrivateKey)
 
-	state := self.lib.eth.BlockChain().CurrentBlock.State()
+	state := self.lib.eth.StateManager().TransState()
 	account := self.lib.eth.StateManager().TransState().GetAccount(keyPair.Address())
-	contract := ethchain.MakeContract(callerTx, state)
+	contract := ethchain.NewStateObject([]byte{0})
 	contract.Amount = value
+
 	callerClosure := ethchain.NewClosure(account, contract, script, state, gas, gasPrice)
 
 	block := self.lib.eth.BlockChain().CurrentBlock
@@ -179,8 +187,9 @@ func (self *DebuggerWindow) ExecCommand(command string) {
 		cmd := strings.Split(command, " ")
 		switch cmd[0] {
 		case "help":
-			self.Logln("Debgger commands:")
-			self.Logln("break, bp      Set breakpoint")
+			self.Logln("Debugger commands:")
+			self.Logln("break, bp            Set breakpoint on instruction")
+			self.Logln("clear [break, bp]    Clears previous set sub-command(s)")
 		case "break", "bp":
 			if len(cmd) > 1 {
 				lineNo, err := strconv.Atoi(cmd[1])