diff --git a/ethereal/assets/qml/first_run.qml b/ethereal/assets/qml/first_run.qml
index 0bd3b4ce10fa3f1e2d94f5720c65760917017794..0b1dac4c602047e0f1d2fe0ede02984beb1935ee 100644
--- a/ethereal/assets/qml/first_run.qml
+++ b/ethereal/assets/qml/first_run.qml
@@ -10,146 +10,146 @@ import QtQuick.Controls.Styles 1.1
 import QtQuick.Dialogs 1.1
 
 ApplicationWindow {
-  id: wizardRoot
-  width: 500
-  height: 400
-  title: "Ethereal first run setup"
+    id: wizardRoot
+    width: 500
+    height: 400
+    title: "Ethereal first run setup"
 
-  Column {
-    spacing: 5
-    anchors.leftMargin: 10
-    anchors.left: parent.left
+    Column {
+        spacing: 5
+        anchors.leftMargin: 10
+        anchors.left: parent.left
 
-    Text {
-      visible: true
-      text: "<h2>Ethereal setup</h2>"
-    }
+        Text {
+            visible: true
+            text: "<h2>Ethereal setup</h2>"
+        }
 
-    Column {
-      id: restoreColumn
-      spacing: 5
-      Text {
-        visible: true
-        font.pointSize: 14
-        text: "Restore your Ethereum account"
-        id: restoreLabel
-      }
+        Column {
+            id: restoreColumn
+            spacing: 5
+            Text {
+                visible: true
+                font.pointSize: 14
+                text: "Restore your Ethereum account"
+                id: restoreLabel
+            }
 
-      TextField {
-        id: txPrivKey
-        width: 480
-        placeholderText: "Private key or mnemonic words"
-        focus: true
-        onTextChanged: {
-          if(this.text.length == 64){
-            detailLabel.text = "Private (hex) key detected."
-            actionButton.enabled = true
-          }
-          else if(this.text.split(" ").length == 24){
-            detailLabel.text = "Mnemonic key detected."
-            actionButton.enabled = true
-          }else{
-            detailLabel.text = ""
-            actionButton.enabled = false
-          }
+            TextField {
+                id: txPrivKey
+                width: 480
+                placeholderText: "Private key or mnemonic words"
+                focus: true
+                onTextChanged: {
+                    if(this.text.length == 64){
+                        detailLabel.text = "Private (hex) key detected."
+                        actionButton.enabled = true
+                    }
+                    else if(this.text.split(" ").length == 24){
+                        detailLabel.text = "Mnemonic key detected."
+                        actionButton.enabled = true
+                    }else{
+                        detailLabel.text = ""
+                        actionButton.enabled = false
+                    }
+                }
+            }
+            Row {
+                spacing: 10
+                Button {
+                    id: actionButton
+                    text: "Restore"
+                    enabled: false
+                    onClicked: {
+                        var success = lib.importAndSetPrivKey(txPrivKey.text)
+                        if(success){
+                            importedDetails.visible = true
+                            restoreColumn.visible = false
+                            newKey.visible = false
+                            wizardRoot.height = 120
+                        }
+                    }
+                }
+                Text {
+                    id: detailLabel
+                    font.pointSize: 12
+                    anchors.topMargin: 10
+                }
+            }
         }
-      }
-      Row {
-        spacing: 10
-        Button {
-          id: actionButton
-          text: "Restore"
-          enabled: false
-          onClicked: {
-           var success = eth.importAndSetPrivKey(txPrivKey.text)
-           if(success){
-             importedDetails.visible = true
-             restoreColumn.visible = false
-             newKey.visible = false
-             wizardRoot.height = 120
-           }
-          }
+        Column {
+            id: importedDetails
+            visible: false
+            Text {
+                text: "<b>Your account has been imported. Please close the application and restart it again to let the changes take effect.</b>"
+                wrapMode: Text.WordWrap
+                width: 460
+            }
         }
-        Text {
-          id: detailLabel
-          font.pointSize: 12
-          anchors.topMargin: 10
+        Column {
+            spacing: 5
+            id: newDetailsColumn
+            visible: false
+            Text {
+                font.pointSize: 14
+                text: "Your account details"
+            }
+            Label {
+                text: "Address"
+            }
+            TextField {
+                id: addressInput
+                readOnly:true
+                width: 480
+            }
+            Label {
+                text: "Private key"
+            }
+            TextField {
+                id: privkeyInput
+                readOnly:true
+                width: 480
+            }
+            Label {
+                text: "Mnemonic words"
+            }
+            TextField {
+                id: mnemonicInput
+                readOnly:true
+                width: 480
+            }
+            Label {
+                text: "<b>A new account has been created. Please take the time to write down the <i>24 words</i>. You can use those to restore your account at a later date.</b>"
+                wrapMode: Text.WordWrap
+                width: 480
+            }
+            Label {
+                text: "Please restart the application once you have completed the steps above."
+                wrapMode: Text.WordWrap
+                width: 480
+            }
         }
-      }
-    }
-    Column {
-      id: importedDetails
-      visible: false
-      Text {
-        text: "<b>Your account has been imported. Please close the application and restart it again to let the changes take effect.</b>"
-        wrapMode: Text.WordWrap
-        width: 460
-      }
-    }
-    Column {
-      spacing: 5
-      id: newDetailsColumn
-      visible: false
-      Text {
-        font.pointSize: 14
-        text: "Your account details"
-      }
-      Label {
-        text: "Address"
-      }
-      TextField {
-        id: addressInput
-        readOnly:true
-        width: 480
-      }
-      Label {
-        text: "Private key"
-      }
-      TextField {
-        id: privkeyInput
-        readOnly:true
-        width: 480
-      }
-      Label {
-        text: "Mnemonic words"
-      }
-      TextField {
-        id: mnemonicInput
-        readOnly:true
-        width: 480
-      }
-      Label {
-        text: "<b>A new account has been created. Please take the time to write down the <i>24 words</i>. You can use those to restore your account at a later date.</b>"
-        wrapMode: Text.WordWrap
-        width: 480
-      }
-      Label {
-        text: "Please restart the application once you have completed the steps above."
-        wrapMode: Text.WordWrap
-        width: 480
-      }
-    }
 
-  }
-  Button {
-    anchors.right: parent.right
-    anchors.bottom: parent.bottom
-    anchors.rightMargin: 10
-    anchors.bottomMargin: 10
-    id: newKey
-    text: "I don't have an account yet"
-    onClicked: {
-      var res = eth.createAndSetPrivKey()
-      mnemonicInput.text = res[0]
-      addressInput.text = res[1]
-      privkeyInput.text = res[2]
+    }
+    Button {
+        anchors.right: parent.right
+        anchors.bottom: parent.bottom
+        anchors.rightMargin: 10
+        anchors.bottomMargin: 10
+        id: newKey
+        text: "I don't have an account yet"
+        onClicked: {
+            var res = lib.createAndSetPrivKey()
+            mnemonicInput.text = res[0]
+            addressInput.text = res[1]
+            privkeyInput.text = res[2]
 
-      // Hide restore
-      restoreColumn.visible = false
+            // Hide restore
+            restoreColumn.visible = false
 
-      // Show new details
-      newDetailsColumn.visible = true
-      newKey.visible = false
+            // Show new details
+            newDetailsColumn.visible = true
+            newKey.visible = false
+        }
     }
-  }
 }
diff --git a/ethereal/ui/gui.go b/ethereal/ui/gui.go
index 46bfa01334450aa8649eb0a986f0bcd31833afb4..65c87c4c2f8a7030da76c346ffb72dbb6185454d 100644
--- a/ethereal/ui/gui.go
+++ b/ethereal/ui/gui.go
@@ -24,7 +24,8 @@ type Gui struct {
 	eth *eth.Ethereum
 
 	// The public Ethereum library
-	lib *EthLib
+	lib   *EthLib
+	uiLib *UiLib
 
 	txDb *ethdb.LDBDatabase
 
@@ -75,19 +76,55 @@ func (gui *Gui) Start(assetPath string) {
 
 	// Expose the eth library and the ui library to QML
 	context.SetVar("eth", gui)
-	uiLib := NewUiLib(gui.engine, gui.eth, assetPath)
-	context.SetVar("ui", uiLib)
+	gui.uiLib = NewUiLib(gui.engine, gui.eth, assetPath)
+	context.SetVar("ui", gui.uiLib)
 
 	// Load the main QML interface
 	data, _ := ethutil.Config.Db.Get([]byte("KeyRing"))
-	var err error
-	var component qml.Object
-	firstRun := len(data) == 0
+	/*
+		var err error
+		var component qml.Object
+		firstRun := len(data) == 0
+
+		if firstRun {
+			component, err = gui.engine.LoadFile(uiLib.AssetPath("qml/first_run.qml"))
+		} else {
+			component, err = gui.engine.LoadFile(uiLib.AssetPath("qml/wallet.qml"))
+		}
+		if err != nil {
+			ethutil.Config.Log.Infoln("FATAL: asset not found: you can set an alternative asset path on on the command line using option 'asset_path'")
+
+			panic(err)
+		}
+
+		gui.win = component.CreateWindow(nil)
+		uiLib.win = gui.win
+		db := &Debugger{gui.win, make(chan bool)}
+		gui.lib.Db = db
+		uiLib.Db = db
+
+		// Add the ui as a log system so we can log directly to the UGI
+		ethutil.Config.Log.AddLogSystem(gui)
+
+		// Loads previous blocks
+		if firstRun == false {
+			go gui.setInitialBlockChain()
+			go gui.readPreviousTransactions()
+			go gui.update()
+		}
 
-	if firstRun {
-		component, err = gui.engine.LoadFile(uiLib.AssetPath("qml/first_run.qml"))
+		gui.win.Show()
+		gui.win.Wait()
+
+		gui.eth.Stop()
+	*/
+
+	var win *qml.Window
+	var err error
+	if len(data) == 0 {
+		win, err = gui.showKeyImport(context)
 	} else {
-		component, err = gui.engine.LoadFile(uiLib.AssetPath("qml/wallet.qml"))
+		win, err = gui.showWallet(context)
 	}
 	if err != nil {
 		ethutil.Config.Log.Infoln("FATAL: asset not found: you can set an alternative asset path on on the command line using option 'asset_path'")
@@ -95,26 +132,48 @@ func (gui *Gui) Start(assetPath string) {
 		panic(err)
 	}
 
-	gui.win = component.CreateWindow(nil)
-	uiLib.win = gui.win
-	db := &Debugger{gui.win, make(chan bool)}
-	gui.lib.Db = db
-	uiLib.Db = db
+	win.Show()
+	win.Wait()
+
+	gui.eth.Stop()
+}
+
+func (gui *Gui) showWallet(context *qml.Context) (*qml.Window, error) {
+	component, err := gui.engine.LoadFile(gui.uiLib.AssetPath("qml/wallet.qml"))
+	if err != nil {
+		return nil, err
+	}
 
-	// Add the ui as a log system so we can log directly to the UGI
-	ethutil.Config.Log.AddLogSystem(gui)
+	win := gui.createWindow(component)
 
-	// Loads previous blocks
-	if firstRun == false {
-		go gui.setInitialBlockChain()
-		go gui.readPreviousTransactions()
-		go gui.update()
+	go gui.setInitialBlockChain()
+	go gui.readPreviousTransactions()
+	go gui.update()
+
+	return win, nil
+}
+
+func (gui *Gui) showKeyImport(context *qml.Context) (*qml.Window, error) {
+	context.SetVar("lib", gui.lib)
+	component, err := gui.engine.LoadFile(gui.uiLib.AssetPath("qml/first_run.qml"))
+	if err != nil {
+		return nil, err
 	}
 
-	gui.win.Show()
-	gui.win.Wait()
+	return gui.createWindow(component), nil
+}
 
-	gui.eth.Stop()
+func (gui *Gui) createWindow(comp qml.Object) *qml.Window {
+	win := comp.CreateWindow(nil)
+
+	gui.win = win
+	gui.uiLib.win = win
+
+	db := &Debugger{gui.win, make(chan bool)}
+	gui.lib.Db = db
+	gui.uiLib.Db = db
+
+	return gui.win
 }
 
 func (gui *Gui) setInitialBlockChain() {