diff --git a/ethereal/assets/debugger/debugger.qml b/ethereal/assets/debugger/debugger.qml
new file mode 100644
index 0000000000000000000000000000000000000000..b7d954e73f89eedf7747a0dc7139532f0c376b2d
--- /dev/null
+++ b/ethereal/assets/debugger/debugger.qml
@@ -0,0 +1,114 @@
+import QtQuick 2.0
+import QtQuick.Controls 1.0;
+import QtQuick.Layouts 1.0;
+import QtQuick.Dialogs 1.0;
+import QtQuick.Window 2.1;
+import QtQuick.Controls.Styles 1.1
+import Ethereum 1.0
+
+ApplicationWindow {
+	id: debugWindow
+	visible: false
+	title: "Debugger"
+	minimumWidth: 600
+	minimumHeight: 600
+	width: 800
+	height: 600
+
+	SplitView {
+		anchors.fill: parent
+		property var asmModel: ListModel {
+			id: asmModel
+		}
+		TableView {
+			id: asmTableView
+			width: 200
+			TableViewColumn{ role: "value" ; title: "" ; width: 100 }
+			model: asmModel
+		}
+
+		Rectangle {
+			anchors.left: asmTableView.right
+			anchors.right: parent.right
+			SplitView {
+				orientation: Qt.Vertical
+				anchors.fill: parent
+
+				TableView {
+					property var memModel: ListModel {
+						id: memModel
+					}
+					height: parent.height/2
+					width: parent.width
+					TableViewColumn{ id:mnumColmn ; role: "num" ; title: "#" ; width: 50}
+					TableViewColumn{ role: "value" ; title: "Memory" ; width: 750}
+					model: memModel
+				}
+
+				SplitView {
+					orientation: Qt.Horizontal
+					TableView {
+						property var debuggerLog: ListModel {
+							id: debuggerLog
+						}
+						TableViewColumn{ role: "value"; title: "Debug messages" }
+						model: debuggerLog
+					}
+					TableView {
+						property var stackModel: ListModel {
+							id: stackModel
+						}
+						height: parent.height/2
+						width: parent.width
+						TableViewColumn{ role: "value" ; title: "Stack" ; width: 200 }
+						model: stackModel
+					}
+				}
+			}
+		}
+	}
+	statusBar: StatusBar {
+		RowLayout {
+			anchors.fill: parent
+			Button {
+				property var enabled: true
+				id: debugNextButton
+				onClicked: {
+					//db.next()
+				}
+				text: "Next"
+			}
+		}
+	}
+
+	function setAsm(asm) {
+		asmModel.append({asm: asm})
+	}
+
+	function setInstruction(num) {
+		asmTableView.selection.clear()
+		asmTableView.selection.select(num-1)
+	}
+
+	function clearAsm() {
+		asmModel.clear()
+	}
+
+	function setMem(mem) {
+		memModel.append({num: mem.num, value: mem.value})
+	}
+	function clearMem(){
+		memModel.clear()
+	}
+
+	function setStack(stack) {
+		stackModel.append({value: stack})
+	}
+	function addDebugMessage(message){
+		debuggerLog.append({value: message})
+	}
+
+	function clearStack() {
+		stackModel.clear()
+	}
+}
diff --git a/ethereal/assets/qml/wallet.qml b/ethereal/assets/qml/wallet.qml
index f42cf3b1bc721cd667a4ca6f04ae31d343b2d565..40de8624e668a64e6e87ac43001ab1eb02f5c9bb 100644
--- a/ethereal/assets/qml/wallet.qml
+++ b/ethereal/assets/qml/wallet.qml
@@ -294,6 +294,7 @@ ApplicationWindow {
 	statusBar: StatusBar {
 		RowLayout {
 			anchors.fill: parent
+			/*
 			Button {
 				property var enabled: true
 				id: connectButton
@@ -304,10 +305,19 @@ ApplicationWindow {
 				}
 				text: "Connect"
 			}
+			*/
+			Button {
+				property var enabled: true
+				id: debuggerWindow
+				onClicked: {
+					ui.startDebugger()
+				}
+				text: "Debugger"
+			}
 
 			Button {
 				id: importAppButton
-				anchors.left: connectButton.right
+				anchors.left: debuggerWindow.right
 				anchors.leftMargin: 5
 				onClicked: openAppDialog.open()
 				text: "Import App"
@@ -473,7 +483,7 @@ ApplicationWindow {
 							}
 							height: parent.height/2
 							width: parent.width
-							TableViewColumn{ role: "value" ; title: "Stack" ; width: parent.width }
+							TableViewColumn{ role: "value" ; title: "Stack" ; width: 300 }
 							model: stackModel
 						}
 					}
diff --git a/ethereal/ui/debugger.go b/ethereal/ui/debugger.go
new file mode 100644
index 0000000000000000000000000000000000000000..4debc05b29cc0fad8723448dcd792e604b63d69e
--- /dev/null
+++ b/ethereal/ui/debugger.go
@@ -0,0 +1,86 @@
+package ethui
+
+import (
+	"fmt"
+	"github.com/ethereum/eth-go/ethchain"
+	"github.com/ethereum/eth-go/ethutil"
+	"github.com/go-qml/qml"
+)
+
+type DebuggerWindow struct {
+	win    *qml.Window
+	engine *qml.Engine
+	lib    *UiLib
+	Db     *Debugger
+}
+
+func NewDebuggerWindow(lib *UiLib) *DebuggerWindow {
+	engine := qml.NewEngine()
+	component, err := engine.LoadFile(lib.AssetPath("debugger/debugger.qml"))
+	if err != nil {
+		fmt.Println(err)
+
+		return nil
+	}
+
+	win := component.CreateWindow(nil)
+	db := &Debugger{win, make(chan bool), true}
+
+	return &DebuggerWindow{engine: engine, win: win, lib: lib, Db: db}
+}
+
+func (self *DebuggerWindow) Show() {
+	go func() {
+		self.win.Show()
+		self.win.Wait()
+	}()
+}
+
+func (self *DebuggerWindow) DebugTx(recipient, valueStr, gasStr, gasPriceStr, data string) {
+	state := self.lib.eth.BlockChain().CurrentBlock.State()
+
+	script, err := ethutil.Compile(data)
+	if err != nil {
+		ethutil.Config.Log.Debugln(err)
+
+		return
+	}
+
+	dis := ethchain.Disassemble(script)
+	self.lib.win.Root().Call("clearAsm")
+
+	for _, str := range dis {
+		self.lib.win.Root().Call("setAsm", str)
+	}
+	// Contract addr as test address
+	keyPair := ethutil.GetKeyRing().Get(0)
+	callerTx := ethchain.NewContractCreationTx(ethutil.Big(valueStr), ethutil.Big(gasStr), ethutil.Big(gasPriceStr), script)
+	callerTx.Sign(keyPair.PrivateKey)
+
+	account := self.lib.eth.StateManager().TransState().GetStateObject(keyPair.Address())
+	contract := ethchain.MakeContract(callerTx, state)
+	callerClosure := ethchain.NewClosure(account, contract, contract.Init(), state, ethutil.Big(gasStr), ethutil.Big(gasPriceStr))
+
+	block := self.lib.eth.BlockChain().CurrentBlock
+	vm := ethchain.NewVm(state, self.lib.eth.StateManager(), ethchain.RuntimeVars{
+		Origin:      account.Address(),
+		BlockNumber: block.BlockInfo().Number,
+		PrevHash:    block.PrevHash,
+		Coinbase:    block.Coinbase,
+		Time:        block.Time,
+		Diff:        block.Difficulty,
+	})
+
+	self.Db.done = false
+	go func() {
+		callerClosure.Call(vm, contract.Init(), self.Db.halting)
+
+		state.Reset()
+
+		self.Db.done = true
+	}()
+}
+
+func (self *DebuggerWindow) Next() {
+	self.Db.Next()
+}
diff --git a/ethereal/ui/ui_lib.go b/ethereal/ui/ui_lib.go
index 51fa26a88c33396aa4572ec6c944ca24577b6801..c3f9f52e64ded3095cf504f860cbd5b933583441 100644
--- a/ethereal/ui/ui_lib.go
+++ b/ethereal/ui/ui_lib.go
@@ -90,6 +90,12 @@ func (ui *UiLib) AssetPath(p string) string {
 	return path.Join(ui.assetPath, p)
 }
 
+func (self *UiLib) StartDebugger() {
+	dbWindow := NewDebuggerWindow(self)
+
+	dbWindow.Show()
+}
+
 func DefaultAssetPath() string {
 	var base string
 	// If the current working directory is the go-ethereum dir
@@ -163,9 +169,7 @@ func (ui *UiLib) DebugTx(recipient, valueStr, gasStr, gasPriceStr, data string)
 }
 
 func (ui *UiLib) Next() {
-	if !ui.Db.done {
-		ui.Db.Next()
-	}
+	ui.Db.Next()
 }
 
 type Debugger struct {
@@ -200,5 +204,7 @@ out:
 }
 
 func (d *Debugger) Next() {
-	d.N <- true
+	if !d.done {
+		d.N <- true
+	}
 }