diff --git a/ethereal/assets/qml/wallet.qml b/ethereal/assets/qml/wallet.qml
index 742a1283a..2c8d1f241 100644
--- a/ethereal/assets/qml/wallet.qml
+++ b/ethereal/assets/qml/wallet.qml
@@ -406,6 +406,15 @@ ApplicationWindow {
                 mainContractColumn.state = "SETUP"
 							}
 						}
+
+						Button {
+							id: debugButton
+							text: "Debug"
+							onClicked: {
+								var res = ui.debugTx("", txValue.text, txGas.text, txGasPrice.text, codeView.text)
+								debugWindow.visible = true
+							}
+						}
 					}
 				}
 			}
@@ -601,6 +610,83 @@ ApplicationWindow {
 
 	}
 
+	Window {
+		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
+					}
+
+					TableView {
+						property var stackModel: ListModel {
+							id: stackModel
+						}
+						height: parent.height/2
+						width: parent.width
+						TableViewColumn{ role: "value" ; title: "Stack" ; width: parent.width }
+						model: stackModel
+					}
+				}
+			}
+		}
+	}
+
+	function setAsm(asm) {
+		//for(var i = 0; i < asm.length; i++) {
+		asmModel.append({asm: asm})
+		//}
+	}
+	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 clearStack() {
+		stackModel.clear()
+	}
+
 	function loadPlugin(name) {
 		console.log("Loading plugin" + name)
 		mainView.addPlugin(name)
diff --git a/ethereal/ui/gui.go b/ethereal/ui/gui.go
index 6184baee6..fa4a5c833 100644
--- a/ethereal/ui/gui.go
+++ b/ethereal/ui/gui.go
@@ -116,6 +116,7 @@ func (ui *Gui) Start(assetPath string) {
 	ui.engine.LoadFile(uiLib.AssetPath("qml/transactions.qml"))
 
 	ui.win = component.CreateWindow(nil)
+	uiLib.win = ui.win
 
 	// Register the ui as a block processor
 	//ui.eth.BlockManager.SecondaryBlockProcessor = ui
diff --git a/ethereal/ui/library.go b/ethereal/ui/library.go
index d4800bf1d..08f99e7db 100644
--- a/ethereal/ui/library.go
+++ b/ethereal/ui/library.go
@@ -94,41 +94,6 @@ func (lib *EthLib) CreateTx(recipient, valueStr, gasStr, gasPriceStr, data strin
 	return ethutil.Hex(tx.Hash()), nil
 }
 
-/*
-func (lib *EthLib) CreateTx(receiver, a, data string) string {
-	var hash []byte
-	if len(receiver) == 0 {
-		hash = ethchain.ContractAddr
-	} else {
-		var err error
-		hash, err = hex.DecodeString(receiver)
-		if err != nil {
-			return err.Error()
-		}
-	}
-
-	k, _ := ethutil.Config.Db.Get([]byte("KeyRing"))
-	keyPair := ethutil.NewKeyFromBytes(k)
-
-	amount := ethutil.Big(a)
-	code := ethchain.Compile(strings.Split(data, "\n"))
-	tx := ethchain.NewTx(hash, amount, code)
-	tx.Nonce = lib.stateManager.GetAddrState(keyPair.Address()).Nonce
-
-	tx.Sign(keyPair.PrivateKey)
-
-	lib.txPool.QueueTransaction(tx)
-
-	if len(receiver) == 0 {
-		ethutil.Config.Log.Infof("Contract addr %x", tx.Hash()[12:])
-	} else {
-		ethutil.Config.Log.Infof("Tx hash %x", tx.Hash())
-	}
-
-	return ethutil.Hex(tx.Hash())
-}
-*/
-
 func (lib *EthLib) GetBlock(hexHash string) *Block {
 	hash, err := hex.DecodeString(hexHash)
 	if err != nil {
diff --git a/ethereal/ui/ui_lib.go b/ethereal/ui/ui_lib.go
index 5c3c98fb9..adba177d0 100644
--- a/ethereal/ui/ui_lib.go
+++ b/ethereal/ui/ui_lib.go
@@ -2,13 +2,18 @@ package ethui
 
 import (
 	"bitbucket.org/kardianos/osext"
+	"fmt"
 	"github.com/ethereum/eth-go"
+	"github.com/ethereum/eth-go/ethchain"
 	"github.com/ethereum/eth-go/ethutil"
 	"github.com/niemeyer/qml"
+	"github.com/obscuren/mutan"
+	"math/big"
 	"os"
 	"path"
 	"path/filepath"
 	"runtime"
+	"strings"
 )
 
 // UI Library that has some basic functionality exposed
@@ -17,6 +22,8 @@ type UiLib struct {
 	eth       *eth.Ethereum
 	connected bool
 	assetPath string
+	// The main application window
+	win *qml.Window
 }
 
 func NewUiLib(engine *qml.Engine, eth *eth.Ethereum, assetPath string) *UiLib {
@@ -81,3 +88,59 @@ func DefaultAssetPath() string {
 
 	return base
 }
+
+type memAddr struct {
+	Num   string
+	Value string
+}
+
+func (ui *UiLib) DebugTx(recipient, valueStr, gasStr, gasPriceStr, data string) (string, error) {
+	state := ui.eth.BlockChain().CurrentBlock.State()
+
+	asm, err := mutan.Compile(strings.NewReader(data), false)
+	if err != nil {
+		fmt.Println(err)
+	}
+
+	callerScript := ethutil.Assemble(asm...)
+	dis := ethchain.Disassemble(callerScript)
+	ui.win.Root().Call("clearAsm")
+	for _, str := range dis {
+		ui.win.Root().Call("setAsm", str)
+	}
+	callerTx := ethchain.NewContractCreationTx(ethutil.Big(valueStr), ethutil.Big(gasPriceStr), callerScript)
+
+	// Contract addr as test address
+	keyPair := ethutil.Config.Db.GetKeys()[0]
+	account := ui.eth.StateManager().GetAddrState(keyPair.Address()).Account
+	c := ethchain.MakeContract(callerTx, state)
+	callerClosure := ethchain.NewClosure(account, c, c.Script(), state, ethutil.Big(gasStr), new(big.Int))
+
+	block := ui.eth.BlockChain().CurrentBlock
+	vm := ethchain.NewVm(state, ethchain.RuntimeVars{
+		Origin:      account.Address(),
+		BlockNumber: block.BlockInfo().Number,
+		PrevHash:    block.PrevHash,
+		Coinbase:    block.Coinbase,
+		Time:        block.Time,
+		Diff:        block.Difficulty,
+		TxData:      nil,
+	})
+	callerClosure.Call(vm, nil, func(op ethchain.OpCode, mem *ethchain.Memory, stack *ethchain.Stack) {
+		ui.win.Root().Call("clearMem")
+		ui.win.Root().Call("clearStack")
+
+		addr := 0
+		for i := 0; i+32 <= mem.Len(); i += 32 {
+			ui.win.Root().Call("setMem", memAddr{fmt.Sprintf("%03d", addr), fmt.Sprintf("% x", mem.Data()[i:i+32])})
+			addr++
+		}
+
+		for _, val := range stack.Data() {
+			ui.win.Root().Call("setStack", val.String())
+		}
+	})
+	state.Reset()
+
+	return "", nil
+}