diff --git a/ethereal/main.go b/ethereal/main.go
index 5dfab4c455d3fcb898ec6d0c10e0df74463ee4a6..cfd85afe7666c76a1eb2141fbed939105fc175e4 100644
--- a/ethereal/main.go
+++ b/ethereal/main.go
@@ -3,17 +3,24 @@ package main
 import (
 	"github.com/ethereum/go-ethereum/ethereal/ui"
 	"github.com/ethereum/go-ethereum/utils"
+  "github.com/ethereum/eth-go/ethlog"
 	"github.com/go-qml/qml"
 	"runtime"
+	"os"
 )
 
 func main() {
 	runtime.GOMAXPROCS(runtime.NumCPU())
 
-	utils.HandleInterrupt()
-
 	qml.Init(nil)
 
+	var interrupted = false
+	utils.RegisterInterrupt(func(os.Signal) {
+		interrupted = true
+	})
+
+	utils.HandleInterrupt()
+
 	// precedence: code-internal flag default < config file < environment variables < command line
 	Init() // parsing command line
 	utils.InitConfig(ConfigFile, Datadir, Identifier, "ETH")
@@ -36,9 +43,19 @@ func main() {
 	}
 
 	gui := ethui.New(ethereum, LogLevel)
-	gui.Start(AssetPath)
 
+	utils.RegisterInterrupt(func(os.Signal) {
+    gui.Stop()
+  })
 	utils.StartEthereum(ethereum, UseSeed)
-
-
+  // gui blocks the main thread
+  gui.Start(AssetPath)
+  // we need to run the interrupt callbacks in case gui is closed
+  // this skips if we got here by actual interrupt stopping the GUI
+	if !interrupted {
+		utils.RunInterruptCallbacks(os.Interrupt)
+  }
+  // this blocks the thread
+  ethereum.WaitForShutdown()
+  ethlog.Flush()
 }
diff --git a/ethereal/ui/gui.go b/ethereal/ui/gui.go
index 8845f6af3d54674c729f3fe5dff8adb20c05cc77..938037b903ea77762c47eb3f719bbeb229460fb3 100644
--- a/ethereal/ui/gui.go
+++ b/ethereal/ui/gui.go
@@ -37,6 +37,7 @@ type Gui struct {
 
 	pub *ethpub.PEthereum
 	logLevel ethlog.LogLevel
+	open bool
 }
 
 // Create GUI, but doesn't start it
@@ -56,7 +57,7 @@ func New(ethereum *eth.Ethereum, logLevel int) *Gui {
 
 	pub := ethpub.NewPEthereum(ethereum)
 
-	return &Gui{eth: ethereum, lib: lib, txDb: db, addr: addr, pub: pub, logLevel: ethlog.LogLevel(logLevel)}
+	return &Gui{eth: ethereum, lib: lib, txDb: db, addr: addr, pub: pub, logLevel: ethlog.LogLevel(logLevel), open: false}
 }
 
 func (gui *Gui) Start(assetPath string) {
@@ -104,7 +105,7 @@ func (gui *Gui) Start(assetPath string) {
 	}
 
 	logger.Infoln("Starting GUI")
-
+	gui.open = true
 	win.Show()
 	// only add the gui logger after window is shown otherwise slider wont be shown
 	if addlog {
@@ -113,7 +114,16 @@ func (gui *Gui) Start(assetPath string) {
 	win.Wait()
 	// need to silence gui logger after window closed otherwise logsystem hangs
 	gui.SetLogLevel(ethlog.Silence)
-	gui.eth.Stop()
+	gui.open = false
+}
+
+func (gui *Gui) Stop() {
+	if gui.open {
+		gui.SetLogLevel(ethlog.Silence)
+		gui.open = false
+		gui.win.Hide()
+	}
+	logger.Infoln("Stopped")
 }
 
 func (gui *Gui) ToggleMining() {
diff --git a/ethereum/main.go b/ethereum/main.go
index 800486e56e0e1933afd24dba903072c771b3eba5..93b2b47d382809e63121c64b591c9d27612e5c59 100644
--- a/ethereum/main.go
+++ b/ethereum/main.go
@@ -46,4 +46,8 @@ func main() {
 	}
 
 	utils.StartEthereum(ethereum, UseSeed)
+
+	// this blocks the thread
+  ethereum.WaitForShutdown()
+  ethlog.Flush()
 }
diff --git a/utils/cmd.go b/utils/cmd.go
index da05c6d83bdd0b500d54f9de400d3a318be18cdf..db5ec5b4806f337c1e3c91c71a3de4da227169c3 100644
--- a/utils/cmd.go
+++ b/utils/cmd.go
@@ -32,13 +32,17 @@ func HandleInterrupt() {
     signal.Notify(c, os.Interrupt)
     for sig := range c {
       logger.Errorf("Shutting down (%v) ... \n", sig)
-      for _, cb := range interruptCallbacks {
-        cb(sig)
-      }
+      RunInterruptCallbacks(sig)
     }
   }()
 }
 
+func RunInterruptCallbacks(sig os.Signal) {
+  for _, cb := range interruptCallbacks {
+    cb(sig)
+  }
+}
+
 func AbsolutePath(Datadir string, filename string) string {
   if path.IsAbs(filename) {
     return filename
@@ -94,6 +98,7 @@ func InitLogging (Datadir string, LogFile string, LogLevel int, DebugFile string
 }
 
 func InitConfig(ConfigFile string, Datadir string, Identifier string, EnvPrefix string) {
+  InitDataDir(Datadir)
   ethutil.ReadConfig(ConfigFile, Datadir, Identifier, EnvPrefix)
   ethutil.Config.Set("rpcport", "700")
 }
@@ -120,8 +125,6 @@ func StartEthereum(ethereum *eth.Ethereum, UseSeed bool) {
     ethereum.Stop()
     ethlog.Flush()
   })
-  // this blocks the thread
-  ethereum.WaitForShutdown()
 }
 
 func ShowGenesis(ethereum *eth.Ethereum) {