commit a6da0dbb93e6e77729839ffbf1bd363072aaaa22
parent 6f0bc82e07c56602988c53dbd8dff95cefe04577
Author: boyska <piuttosto@logorroici.org>
Date:   Sun, 29 Jan 2012 19:18:41 +0100
Merge branch 'qtgui' basic ftrs for create/open
Create is quite good, but has no support for automatic-key-on-usb
Open is very raw, it only supports opening while explicitly choosing
where to get the key from
Python wrapper for tomb is in a distinct library, called "tomblib":
it currently supports tomb, basic undertaker, and parsing output
messages
Diffstat:
30 files changed, 2303 insertions(+), 39 deletions(-)
diff --git a/src/HACKING.txt b/src/HACKING.txt
@@ -0,0 +1,12 @@
+### Code organization:
+* tomblib: a library that wraps on tomb. Meant to be used by various scripts, and every UI
+* qt / wx / whatever: directory for different gui implementations
+
+### QT project:
+
+status: only create wizard
+the graphical part is done through create.ui, which can be edited by designer
+
+The UI should be (if possible) completely autocontained in this .ui file, and no code (or very few) should be added to make it work.
+*  ATM, some code has been added for the "password don't match" part.
+*  Some code need to be added to make the filedialog work
diff --git a/src/Makefile.am b/src/Makefile.am
@@ -1,5 +1,5 @@
 
-bin_SCRIPTS = tomb tomb-open
+bin_SCRIPTS = tomb tomb-open undertaker
 
 bin_PROGRAMS = tomb-status
 
diff --git a/src/pytomb/.gitignore b/src/pytomb/.gitignore
@@ -0,0 +1,5 @@
+.*.swp
+*.pyc
+*.egg-info
+build
+dist
diff --git a/src/pytomb/.wrapper.py.swp b/src/pytomb/.wrapper.py.swp
Binary files differ.
diff --git a/src/pytomb/setup.py b/src/pytomb/setup.py
@@ -0,0 +1,11 @@
+from setuptools import setup
+
+setup(
+        name = 'TombLib',
+        version = '1.1',
+        packages = ['tomblib'],
+
+        test_suite = 'nose.collector'
+)
+
+
diff --git a/src/pytomb/tomblib/__init__.py b/src/pytomb/tomblib/__init__.py
diff --git a/src/pytomb/tomblib/parser.py b/src/pytomb/tomblib/parser.py
@@ -0,0 +1,34 @@
+'''
+Utilities to analyze tomb output
+'''
+import re
+
+#found: [m] followed by some ID (usually "found") inside square brackets, then
+#something else, then a space, then the content
+_found_regex = re.compile(r'^\[m\]\[([^]]+)\] +(([^:]+)://(.+))$')
+#generic: programname, then some identifiers in square (or round) brackets,
+#then maybe something else, then a space, then the context
+_generic_regex = re.compile(r'^[a-z-]+ [[(]([^]]+)[\])] +(.+)$')
+types = {'E':'error', 'W':'warning', 'D':'debug', '*':'success'}
+def parse_line(line):
+    '''Analyze a single line.
+    Return None if no standard format is detected, a dict otherwise.
+    The fields 'type' and 'content' are always in the dict; 'content' may be
+    empty
+    'type' can be 'error', 'progress'
+    '''
+
+
+    match = _found_regex.match(line)
+    if match:
+        return { 'type': types.get(match.group(1)) or match.group(1),
+                'content': match.group(2), 'scheme': match.group(3),
+                'path': match.group(4) }
+    match = _generic_regex.search(line)
+    if match:
+        return { 'type': types.get(match.group(1)) or match.group(1),
+                'content': match.group(2) }
+
+    return None
+
+
diff --git a/src/pytomb/tomblib/test_parser.py b/src/pytomb/tomblib/test_parser.py
@@ -0,0 +1,52 @@
+from tomblib.parser import *
+
+class TestWrong:
+    def test_short(self):
+        '''short format is not supported anymore'''
+        assert parse_line('[!] foo') is None
+    def test_colors(self):
+        '''parsing while using colors should fail'''
+        parse = parse_line('\033[32mundertaker [W] url protocol not recognized: nonscheme')
+        assert parse is None
+    def test_no_spaces_in_programname(self):
+        parse = parse_line('tomb open [W] url protocol not recognized: nonscheme')
+        assert parse is None
+
+class TestFound:
+    def test_simple(self):
+        parse = parse_line('[m][found] scheme:///and/path')
+        assert parse is not None
+        assert parse['type'] == 'found'
+        assert parse['content'] == 'scheme:///and/path'
+        assert 'scheme' in parse
+        assert parse['scheme'] == 'scheme'
+        assert 'path' in parse
+        assert parse['path'] == '/and/path'
+
+class TestGeneric:
+    def test_simple(self):
+        parse = parse_line('undertaker [W] url protocol not recognized: nonscheme')
+        assert parse is not None
+        assert parse['type'] == 'warning'
+        assert parse['content'] == 'url protocol not recognized: nonscheme'
+
+    def test_debug(self):
+        parse = parse_line('undertaker [D] url protocol not recognized: nonscheme')
+        assert parse is not None
+        assert parse['type'] == 'debug'
+        assert parse['content'] == 'url protocol not recognized: nonscheme'
+
+    def test_success(self):
+        parse = parse_line('undertaker (*) url protocol not recognized: nonscheme')
+        assert parse is not None
+        assert parse['type'] == 'success'
+        assert parse['content'] == 'url protocol not recognized: nonscheme'
+
+    def test_dash(self):
+        parse = parse_line('tomb-open [W] url protocol not recognized: nonscheme')
+        assert parse is not None
+        assert parse['type'] == 'warning'
+        assert parse['content'] == 'url protocol not recognized: nonscheme'
+
+
+
diff --git a/src/pytomb/tomblib/tomb.py b/src/pytomb/tomblib/tomb.py
@@ -0,0 +1,91 @@
+'''
+Module structure:
+
+this contain a class, which is indeed just a collection of functions
+(the methods are all static).
+It's meant to behave in a way which is similar to the command line, for
+    
+Notes: consider moving to a more typical usage (instantiate, then use method)
+to make it more configurable (ie set the tomb executable path).
+'''
+
+import subprocess
+
+class Tomb(object):
+    '''
+    This is just a collection of static methods, so you should NOT instantiate
+
+    The methods are meant to resemble the command line interface as much as
+    possible
+
+    There is no support to things like threading, multiprocessing, whatever.
+    If you want to interact asynchronously with tomb, just do it in a separate
+    layer.
+    '''
+    tombexec = 'tomb'
+    def _check_exec_path(self):
+        '''Checks, using which, if tomb is available.
+        Returns None on error, the path on success.
+        '''
+        try:
+            path = subprocess.check_output(['which', 'tomb'])
+        except subprocess.CalledProcessError:
+            return None
+        return path
+
+    @classmethod
+    def check(cls, command, stdout=None, stderr=None, no_color=True, ignore_swap=False):
+        args = [command]
+        if no_color:
+            args += ['--no-color']
+        if ignore_swap:
+            args += ['--ignore-swap']
+        try:
+            subprocess.check_call([cls.tombexec, 'check'] + args, stdout=stdout, stderr=stderr)
+        except subprocess.CalledProcessError:
+            return False
+        return True
+
+    @classmethod
+    def create(cls, tombpath, tombsize,keypath, stdout=None, stderr=None,
+            no_color=True, ignore_swap=False):
+        '''If keypath is None, it will be created adjacent to the tomb.
+        This is unsafe, and you should NOT do it.
+
+        Note that this will invoke pinentry
+
+        no_color is supported as an option for short-lived retrocompatibility:
+            it will be removed as soon as no-color will be integrated
+        '''
+        args = [tombpath, '-s', tombsize]
+        if keypath is not None:
+            args += ['-k', keypath]
+        if no_color:
+            args += ['--no-color']
+        if ignore_swap:
+            args += ['--ignore-swap']
+        try:
+            subprocess.check_call([cls.tombexec, 'create'] + args, stdout=stdout, stderr=stderr)
+        except subprocess.CalledProcessError:
+            return False
+        return True
+
+    @classmethod
+    def open(cls, tombpath,keypath=None, no_color=True, ignore_swap=False):
+        args = [tombpath]
+        if keypath is not None:
+            args += ['-k', keypath]
+        if no_color:
+            args += ['--no-color']
+        if ignore_swap:
+            args += ['--ignore-swap']
+        try:
+            subprocess.check_call([cls.tombexec, 'open'] + args)
+        except subprocess.CalledProcessError:
+            return False
+        return True
+
+
+if __name__ == '__main__':
+    #Debug stuff. Also useful for an example
+    print Tomb.create('/tmp/a.tomb', '10', '/tmp/akey')
diff --git a/src/pytomb/tomblib/undertaker.py b/src/pytomb/tomblib/undertaker.py
@@ -0,0 +1,79 @@
+import subprocess
+from tempfile import NamedTemporaryFile
+
+import parser
+
+class Undertaker(object):
+    '''
+    This is similar to Tomb class, and provides a wrapper on undertaker.
+
+    TODO:
+    * methods for automagical scan
+    * output parsing, giving meaningful output
+
+    Due to the non-interactive nature of undertaker, it's simpler than Tomb
+    '''
+    undertakerexec = 'undertaker'
+    @classmethod
+    def check(cls, paths):
+        '''Will check if there are keys available there, as in --path
+
+        paths can be a string (one address), or a list of
+        '''
+        #TODO: more solid check: something like
+        if type(paths) is not str:
+            out = []
+            for p in paths:
+                try:
+                    res = cls.check(p)
+                except:
+                    continue
+                else:
+                    if res:
+                        out.extend(res)
+            return out
+
+        buf = NamedTemporaryFile()
+        try:
+            subprocess.check_call([cls.undertakerexec, paths, '--batch',
+                '--path'], stderr=buf)
+        except subprocess.CalledProcessError as exc:
+            return False
+
+        out = []
+        buf.seek(0)
+        for line in buf:
+            ret = parser.parse_line(line)
+            if ret and ret['type'] == 'found':
+                out.append(ret['content'])
+        return out
+
+
+    @classmethod
+    def get(cls, paths):
+        '''
+        Similar to check, but truly get the key content.
+        If paths is iterable, stop at the first successful path
+        '''
+        if type(paths) is not str:
+            for p in paths:
+                try:
+                    res = cls.get(p)
+                except:
+                    continue
+                else:
+                    if res:
+                        return res
+        buf = NamedTemporaryFile()
+        try:
+            subprocess.check_call([cls.undertakerexec, paths, '--batch'],
+                    stdout=buf)
+        except subprocess.CalledProcessError:
+            return False
+        buf.seek(0)
+        return buf.read()
+
+
+if __name__ == '__main__':
+    Undertaker.undertakerexec = '/home/davide/coding/projects/tomb/src/undertaker'
+    print Undertaker.get('near:///home/davide/Desktop/testing.tomb')
diff --git a/src/qt/.gitignore b/src/qt/.gitignore
@@ -0,0 +1,6 @@
+.*.swp
+*.pyc
+TombQt.egg-info
+build
+dist
+disk
diff --git a/src/qt/Makefile b/src/qt/Makefile
@@ -0,0 +1,23 @@
+TARGETS_OPEN=tombqt/ui_open_tombfile.py tombqt/ui_open_keymethod.py tombqt/ui_open_success.py
+TARGETS=tombqt/ui_create.py $(TARGETS_OPEN)
+
+all: $(TARGETS)
+test_create: tombqt/ui_create.py
+	python2 -3 tombqt/create.py
+test_open: $(TARGETS_OPEN)
+	python2 -3 tombqt/open.py
+
+
+tombqt/ui_create.py: tombqt/create.ui
+	 pyuic4 create.ui -o tombqt/ui_create.py
+tombqt/ui_open_tombfile.py: tombqt/open_tombfile.ui
+	pyuic4 tombqt/open_tombfile.ui -o tombqt/ui_open_tombfile.py
+tombqt/ui_open_keymethod.py: tombqt/open_keymethod.ui
+	pyuic4 tombqt/open_keymethod.ui -o tombqt/ui_open_keymethod.py
+tombqt/ui_open_success.py: tombqt/open_success.ui
+	pyuic4 tombqt/open_success.ui -o tombqt/ui_open_success.py
+
+clean:
+	rm $(TARGETS)
+
+.PHONY: test clean
diff --git a/src/qt/notes.txt b/src/qt/notes.txt
@@ -0,0 +1,9 @@
+Some conventions:
+.ui files are designers files
+Sometimes it's necessary to create custom widget to extend the functionality
+given by designer in a clean way. These files should be called ui_whatever.py
+
+.ui files must be "compiled" using pyuic4. This should be done with make, but
+won't be right now. So, for the moment, I'll keep compiled files directly in
+the sources, for easiness.
+
diff --git a/src/qt/setup.py b/src/qt/setup.py
@@ -0,0 +1,52 @@
+import os
+import glob
+from setuptools import setup
+from StringIO import StringIO
+
+from distutils import log
+from distutils.core import Command
+from distutils.dep_util import newer
+
+class build_ui(Command):
+# Stolen from picard
+    description = "build Qt UI files"
+    user_options = []
+
+    def initialize_options(self):
+        pass
+
+    def finalize_options(self):
+        pass
+
+    def run(self):
+        from PyQt4 import uic
+        for uifile in glob.glob("tombqt/*.ui"):
+            pyfile = "ui_%s.py" % os.path.splitext(os.path.basename(uifile))[0]
+            pyfile = os.path.join('tombqt', pyfile)
+            if newer(uifile, pyfile):
+                log.info("compiling %s -> %s", uifile, pyfile)
+                tmp = StringIO()
+                uic.compileUi(uifile, tmp)
+                source = tmp.getvalue()
+                f = open(pyfile, "w")
+                f.write(source)
+                f.close()
+
+setup(
+        name = 'TombQt',
+        version = '0.1',
+        packages = ['tombqt'],
+        cmdclass = {
+            'build_ui': build_ui
+            },
+        entry_points = {
+            'gui_scripts': [
+                'tomb-qt-create = tombqt.create:run_create_wizard',
+                'tomb-qt-open = tombqt.open:run_open_wizard'
+                ]
+            }
+)
+
+
+
+
diff --git a/src/qt/tombqt/__init__.py b/src/qt/tombqt/__init__.py
diff --git a/src/qt/tombqt/create.py b/src/qt/tombqt/create.py
@@ -0,0 +1,134 @@
+import sys, os
+
+from PyQt4.QtGui import QApplication, QWizard
+from PyQt4 import QtCore
+from PyQt4 import QtGui
+from ui_create import Ui_Wizard
+
+if __name__ == '__main__':
+    parentdir = sys.path[0].split(os.sep)[:-1]
+    sys.path.append(os.sep.join(parentdir))
+from tomblib.tomb import Tomb
+from worker import TombCreateThread
+
+try:
+    _fromUtf8 = QtCore.QString.fromUtf8
+except AttributeError:
+    _fromUtf8 = lambda s: s
+
+class TombCreateWizard(QWizard):
+    def __init__(self, *args, **kwargs):
+        QWizard.__init__(self, *args, **kwargs)
+        self.ui = ui = Ui_Wizard()
+        ui.setupUi(self)
+        #instance attributes:
+        self.ignore_swap = False
+        self._tomb_check = False #ugly; it's used by check_progress_complete
+
+        ui.wizardPage_tomb_location.registerField('tombpath*',
+                ui.lineEdit_tombpath) #required field, note the *
+        ui.wizardPage_key_location.setCommitPage(True)
+
+        QtCore.QObject.connect(ui.button_tombpath,
+                QtCore.SIGNAL(_fromUtf8('clicked()')),
+                self.on_tomb_location_clicked)
+        QtCore.QObject.connect(self,
+                QtCore.SIGNAL(_fromUtf8('currentIdChanged(int)')),
+                self.on_change_page)
+        QtCore.QObject.connect(ui.radioButton_swapoff,
+                QtCore.SIGNAL(_fromUtf8('toggled(bool)')),
+                ui.wizardPage_check.completeChanged)
+        QtCore.QObject.connect(ui.radioButton_ignore,
+                QtCore.SIGNAL(_fromUtf8('toggled(bool)')),
+                ui.wizardPage_check.completeChanged)
+        def check_progress_complete(*args, **kwargs):
+            if self.ui.progressBar.value() == 100:
+                return True
+            return False
+        def check_is_solved():
+            if self._tomb_check:
+                return True
+            if self.ui.radioButton_swapoff.isChecked() or \
+                    self.ui.radioButton_ignore.isChecked():
+                return True
+            return False
+        self.ui.wizardPage_progress.isComplete = check_progress_complete
+        self.ui.wizardPage_check.isComplete = check_is_solved
+        self.ui.groupBox_swap.setVisible(False)
+        self.finished.connect(self.on_finish)
+
+    def _keyloc(self):
+        keyloc = None
+        if self.ui.radioButton_usb.isChecked():
+            print 'Warning: it is not supported'
+            raise NotImplementedError
+        elif self.ui.radioButton_near.isChecked():
+            print 'going near'
+            keyloc = None
+        else:
+            keyloc = self.ui.lineEdit_custom.text()
+            if not keyloc:
+                raise ValueError
+        return keyloc
+
+    def on_tomb_location_clicked(self, *args, **kwargs):
+        filename = QtGui.QFileDialog.getSaveFileName(self, 'Create Tomb',
+                filter="Tomb(*.tomb)")
+        self.ui.lineEdit_tombpath.setText(filename)
+    def on_change_page(self, pagenumber):
+        if self.currentPage() == self.ui.wizardPage_progress:
+            self.create_tomb()
+        if self.currentPage() == self.ui.wizardPage_check:
+            self.check_requisite()
+
+    def on_finish(self, finishedint):
+        if self.currentPage() != self.ui.wizardPage_end:
+            #there has been an error
+            return
+
+        if self.ui.checkBox_open.isChecked():
+            Tomb.open(self.ui.lineEdit_tombpath.text(), self._keyloc())
+    def on_thread_creation_finished(self):
+        if self.thread.get_success():
+            self.ui.progressBar.setValue(100)
+        else:
+            self.ui.progressBar.setEnabled(False)
+            self.ui.label_progress.setText('Error while creating the tomb!')
+            self.ui.wizardPage_progress.setFinalPage(True)
+        self.ui.wizardPage_progress.completeChanged.emit()
+    def create_tomb(self):
+        self.thread = TombCreateThread(self.ui.lineEdit_tombpath.text(),
+                str(self.ui.spinBox_size.value()), self._keyloc(),
+                no_color=False, ignore_swap=self.ui.radioButton_ignore.isChecked())
+        self.thread.finished.connect(self.on_thread_creation_finished)
+        self.thread.terminated.connect(self.on_thread_creation_finished)
+        self.thread.line_received.connect(self.ui.textBrowser_log.append)
+        def err_append_to_log(text):
+            self.ui.textBrowser_log.append('Error: <strong>' + text +
+                    '</strong>')
+        self.thread.error_received.connect(err_append_to_log)
+        self.thread.start()
+    def check_requisite(self):
+        self._tomb_check = check = Tomb.check('create', no_color=False)
+        self.ui.wizardPage_check.completeChanged.emit()
+        if check:
+            self.ui.label_check.setText('Everything seems fine!')
+            return
+        self.ui.label_check.setText('Some error occurred')
+        if Tomb.check('create', no_color=False, ignore_swap=True): # swap is the only error
+            self.ui.groupBox_swap.setVisible(True)
+            #TODO: support swapoff
+            #TODO: calculate the amount of ram available vs swap used
+            self.ui.radioButton_swapoff.setEnabled(False)
+            self.ui.label_swapoff.setEnabled(False)
+
+
+def run_create_wizard():
+    app = QApplication(sys.argv)
+    window = TombCreateWizard()
+    window.show()
+    sys.exit(app.exec_())
+
+if __name__ == '__main__':
+    run_create_wizard()
+
diff --git a/src/qt/tombqt/create.ui b/src/qt/tombqt/create.ui
@@ -0,0 +1,553 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>Wizard</class>
+ <widget class="QWizard" name="Wizard">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>710</width>
+    <height>368</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Wizard</string>
+  </property>
+  <property name="options">
+   <set>QWizard::HaveHelpButton|QWizard::IndependentPages</set>
+  </property>
+  <widget class="QWizardPage" name="wizardPage_intro">
+   <property name="title">
+    <string>Tomb</string>
+   </property>
+   <property name="subTitle">
+    <string>tomb creation</string>
+   </property>
+   <layout class="QVBoxLayout" name="verticalLayout">
+    <item>
+     <widget class="QLabel" name="label">
+      <property name="text">
+       <string>This wizard will guide you to the creation of a tomb.<br> It will be fun!</string>
+      </property>
+      <property name="textFormat">
+       <enum>Qt::RichText</enum>
+      </property>
+      <property name="wordWrap">
+       <bool>true</bool>
+      </property>
+     </widget>
+    </item>
+   </layout>
+  </widget>
+  <widget class="QWizardPage" name="wizardPage_check">
+   <property name="title">
+    <string>Requirements check</string>
+   </property>
+   <layout class="QVBoxLayout" name="verticalLayout_12">
+    <item>
+     <widget class="QLabel" name="label_check">
+      <property name="text">
+       <string>Checking...</string>
+      </property>
+     </widget>
+    </item>
+    <item>
+     <widget class="QGroupBox" name="groupBox_swap">
+      <property name="enabled">
+       <bool>true</bool>
+      </property>
+      <property name="title">
+       <string>Swap error</string>
+      </property>
+      <layout class="QVBoxLayout" name="verticalLayout_13">
+       <item>
+        <widget class="QLabel" name="label_7">
+         <property name="text">
+          <string>It seems that you have swap activated. It is very dangerous, since you could leave LOT of traces on your computer UNencrypted. You have some options:</string>
+         </property>
+         <property name="wordWrap">
+          <bool>true</bool>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <layout class="QVBoxLayout" name="verticalLayout_swapoff">
+         <item>
+          <widget class="QRadioButton" name="radioButton_swapoff">
+           <property name="text">
+            <string>Swapoff</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <layout class="QHBoxLayout" name="horizontalLayout_6">
+           <item>
+            <spacer name="horizontalSpacer_3">
+             <property name="orientation">
+              <enum>Qt::Horizontal</enum>
+             </property>
+             <property name="sizeType">
+              <enum>QSizePolicy::Maximum</enum>
+             </property>
+             <property name="sizeHint" stdset="0">
+              <size>
+               <width>20</width>
+               <height>20</height>
+              </size>
+             </property>
+            </spacer>
+           </item>
+           <item>
+            <widget class="QLabel" name="label_swapoff">
+             <property name="text">
+              <string>Note: swapoff could take a long time, and, in case the memory is not enough, could even make your system crash. Your system seems to have %freeram%MB free</string>
+             </property>
+             <property name="wordWrap">
+              <bool>true</bool>
+             </property>
+            </widget>
+           </item>
+          </layout>
+         </item>
+        </layout>
+       </item>
+       <item>
+        <layout class="QVBoxLayout" name="verticalLayout_11">
+         <item>
+          <widget class="QRadioButton" name="radioButton_ignore">
+           <property name="text">
+            <string>Ignore</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <layout class="QHBoxLayout" name="horizontalLayout_7">
+           <item>
+            <spacer name="horizontalSpacer_4">
+             <property name="orientation">
+              <enum>Qt::Horizontal</enum>
+             </property>
+             <property name="sizeType">
+              <enum>QSizePolicy::Maximum</enum>
+             </property>
+             <property name="sizeHint" stdset="0">
+              <size>
+               <width>20</width>
+               <height>20</height>
+              </size>
+             </property>
+            </spacer>
+           </item>
+           <item>
+            <widget class="QLabel" name="label_9">
+             <property name="text">
+              <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Note:</span> You should use this only if you are sure that your swap is encrypted, or that you are using compcache.</p>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If this is not the case, DON'T select this, as it is <span style=" font-weight:600;">VERY DANGEROUS </span>to use encryption with swap activated</p></body></html></string>
+             </property>
+             <property name="wordWrap">
+              <bool>true</bool>
+             </property>
+            </widget>
+           </item>
+          </layout>
+         </item>
+        </layout>
+       </item>
+      </layout>
+     </widget>
+    </item>
+   </layout>
+  </widget>
+  <widget class="QWizardPage" name="wizardPage_tomb_size">
+   <layout class="QVBoxLayout" name="verticalLayout_2">
+    <item>
+     <widget class="QLabel" name="label_2">
+      <property name="text">
+       <string>Please enter tomb size. Digging the tomb will require some time: usually, one minute per GB, but your mileage may vary. <br>Keep in mind that resizing it in the future is still NOT implemented</string>
+      </property>
+      <property name="wordWrap">
+       <bool>true</bool>
+      </property>
+     </widget>
+    </item>
+    <item>
+     <layout class="QHBoxLayout" name="horizontalLayout">
+      <item>
+       <widget class="QLabel" name="label_3">
+        <property name="text">
+         <string>Enter tomb size, in MB. 1GB=1000MB)</string>
+        </property>
+        <property name="buddy">
+         <cstring>spinBox_size</cstring>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QSpinBox" name="spinBox_size">
+        <property name="minimum">
+         <number>10</number>
+        </property>
+        <property name="maximum">
+         <number>100000</number>
+        </property>
+        <property name="value">
+         <number>100</number>
+        </property>
+       </widget>
+      </item>
+     </layout>
+    </item>
+   </layout>
+  </widget>
+  <widget class="QWizardPage" name="wizardPage_tomb_location">
+   <layout class="QVBoxLayout" name="verticalLayout_3">
+    <item>
+     <widget class="QLabel" name="label_4">
+      <property name="text">
+       <string>Where do you want your tomb to be digged?</string>
+      </property>
+      <property name="wordWrap">
+       <bool>true</bool>
+      </property>
+      <property name="buddy">
+       <cstring>lineEdit_tombpath</cstring>
+      </property>
+     </widget>
+    </item>
+    <item>
+     <layout class="QHBoxLayout" name="horizontalLayout_2">
+      <item>
+       <widget class="QLineEdit" name="lineEdit_tombpath">
+        <property name="frame">
+         <bool>true</bool>
+        </property>
+        <property name="placeholderText">
+         <string>/path/to/file.tomb</string>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QPushButton" name="button_tombpath">
+        <property name="text">
+         <string>Open file</string>
+        </property>
+       </widget>
+      </item>
+     </layout>
+    </item>
+   </layout>
+  </widget>
+  <widget class="QWizardPage" name="wizardPage_key_location">
+   <property name="title">
+    <string>Key creation</string>
+   </property>
+   <property name="subTitle">
+    <string>Choose the location for your key</string>
+   </property>
+   <layout class="QVBoxLayout" name="verticalLayout_6">
+    <item>
+     <widget class="QLabel" name="label_5">
+      <property name="text">
+       <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Now, you have to decide where to put the <span style=" font-weight:600;">key</span> for your tomb<br />You should not leave your key at the door, as this will lower security A LOT</p>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Also, the keyfile is very small (less than a KB), so disk space is not an issue</p></body></html></string>
+      </property>
+      <property name="textFormat">
+       <enum>Qt::RichText</enum>
+      </property>
+      <property name="wordWrap">
+       <bool>true</bool>
+      </property>
+     </widget>
+    </item>
+    <item>
+     <layout class="QVBoxLayout" name="verticalLayout_5">
+      <item>
+       <layout class="QVBoxLayout" name="verticalLayout_4">
+        <item>
+         <widget class="QRadioButton" name="radioButton_usb">
+          <property name="enabled">
+           <bool>false</bool>
+          </property>
+          <property name="text">
+           <string>On a USB pen (best security)</string>
+          </property>
+          <property name="checkable">
+           <bool>true</bool>
+          </property>
+          <property name="checked">
+           <bool>false</bool>
+          </property>
+         </widget>
+        </item>
+        <item>
+         <layout class="QHBoxLayout" name="horizontalLayout_4">
+          <item>
+           <spacer name="horizontalSpacer_2">
+            <property name="orientation">
+             <enum>Qt::Horizontal</enum>
+            </property>
+            <property name="sizeType">
+             <enum>QSizePolicy::Maximum</enum>
+            </property>
+            <property name="sizeHint" stdset="0">
+             <size>
+              <width>40</width>
+              <height>20</height>
+             </size>
+            </property>
+           </spacer>
+          </item>
+          <item>
+           <widget class="QLabel" name="label_6">
+            <property name="enabled">
+             <bool>false</bool>
+            </property>
+            <property name="text">
+             <string>If you choose to do so, do not insert it NOW. Do it when you are asked to do so</string>
+            </property>
+           </widget>
+          </item>
+         </layout>
+        </item>
+       </layout>
+      </item>
+      <item>
+       <widget class="QRadioButton" name="radioButton_near">
+        <property name="toolTip">
+         <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It will be created as a regular file in the same directory of your tomb.</p>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It is much easier to use, but also much more <span style=" font-style:italic;">insecure</span>: all your security will be guaranteed by your <span style=" font-weight:600;">password</span>. If you really want to do this, choose a strong password (lot of random/non-dictionary words, spaces, numbers, odd characters)</p></body></html></string>
+        </property>
+        <property name="text">
+         <string>Near to the tomb itself (this is BAD)</string>
+        </property>
+        <property name="checked">
+         <bool>true</bool>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QRadioButton" name="radioButton_custom">
+        <property name="text">
+         <string>Specify location</string>
+        </property>
+       </widget>
+      </item>
+     </layout>
+    </item>
+    <item>
+     <layout class="QHBoxLayout" name="horizontalLayout_3">
+      <item>
+       <spacer name="horizontalSpacer">
+        <property name="orientation">
+         <enum>Qt::Horizontal</enum>
+        </property>
+        <property name="sizeType">
+         <enum>QSizePolicy::Maximum</enum>
+        </property>
+        <property name="sizeHint" stdset="0">
+         <size>
+          <width>40</width>
+          <height>20</height>
+         </size>
+        </property>
+       </spacer>
+      </item>
+      <item>
+       <widget class="QLineEdit" name="lineEdit_custom">
+        <property name="enabled">
+         <bool>false</bool>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QPushButton" name="pushButton_custom">
+        <property name="enabled">
+         <bool>false</bool>
+        </property>
+        <property name="text">
+         <string>Choose location</string>
+        </property>
+       </widget>
+      </item>
+     </layout>
+    </item>
+    <item>
+     <widget class="QLabel" name="label_11">
+      <property name="text">
+       <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Help: </span>the key file is very small, so disk usage is not an issue</p></body></html></string>
+      </property>
+      <property name="wordWrap">
+       <bool>true</bool>
+      </property>
+     </widget>
+    </item>
+   </layout>
+  </widget>
+  <widget class="QWizardPage" name="wizardPage_progress">
+   <property name="title">
+    <string>Creating</string>
+   </property>
+   <property name="subTitle">
+    <string>Please wait</string>
+   </property>
+   <layout class="QVBoxLayout" name="verticalLayout_9">
+    <item>
+     <layout class="QVBoxLayout" name="verticalLayout_7">
+      <item>
+       <widget class="QProgressBar" name="progressBar">
+        <property name="value">
+         <number>0</number>
+        </property>
+        <property name="textVisible">
+         <bool>true</bool>
+        </property>
+        <property name="invertedAppearance">
+         <bool>false</bool>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <layout class="QHBoxLayout" name="horizontalLayout_5">
+        <item>
+         <widget class="QLabel" name="label_progress">
+          <property name="text">
+           <string>Creating tomb, please wait...</string>
+          </property>
+         </widget>
+        </item>
+       </layout>
+      </item>
+     </layout>
+    </item>
+    <item>
+     <widget class="QTextBrowser" name="textBrowser_log">
+      <property name="documentTitle">
+       <string>Log</string>
+      </property>
+      <property name="html">
+       <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><title>Log</title><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif'; font-size:9pt; font-weight:600;">Log</span></p>
+<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt; font-weight:600;"></p></body></html></string>
+      </property>
+     </widget>
+    </item>
+   </layout>
+  </widget>
+  <widget class="QWizardPage" name="wizardPage_end">
+   <layout class="QVBoxLayout" name="verticalLayout_8">
+    <item>
+     <widget class="QLabel" name="label_10">
+      <property name="text">
+       <string>You successfully created the tomb!</string>
+      </property>
+     </widget>
+    </item>
+    <item>
+     <widget class="QCheckBox" name="checkBox_open">
+      <property name="enabled">
+       <bool>false</bool>
+      </property>
+      <property name="text">
+       <string>Open the just-created tomb NOW!</string>
+      </property>
+      <property name="checked">
+       <bool>false</bool>
+      </property>
+      <property name="tristate">
+       <bool>false</bool>
+      </property>
+     </widget>
+    </item>
+   </layout>
+  </widget>
+ </widget>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>radioButton_custom</sender>
+   <signal>toggled(bool)</signal>
+   <receiver>lineEdit_custom</receiver>
+   <slot>setEnabled(bool)</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>91</x>
+     <y>56</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>53</x>
+     <y>56</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>radioButton_custom</sender>
+   <signal>toggled(bool)</signal>
+   <receiver>pushButton_custom</receiver>
+   <slot>setEnabled(bool)</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>98</x>
+     <y>56</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>98</x>
+     <y>56</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>Wizard</sender>
+   <signal>currentIdChanged(int)</signal>
+   <receiver>label_11</receiver>
+   <slot>hide()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>181</x>
+     <y>335</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>99</x>
+     <y>60</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>Wizard</sender>
+   <signal>helpRequested()</signal>
+   <receiver>label_11</receiver>
+   <slot>show()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>135</x>
+     <y>356</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>99</x>
+     <y>60</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+ <slots>
+  <slot>check_passwords_equal()</slot>
+ </slots>
+</ui>
diff --git a/src/qt/tombqt/open.py b/src/qt/tombqt/open.py
@@ -0,0 +1,109 @@
+import sys
+
+from PyQt4 import QtCore, QtGui
+
+from ui_open_tombfile import Ui_tombfile
+from ui_open_keymethod import Ui_keymethod
+from ui_open_success import Ui_success
+
+from tomblib.tomb import Tomb
+from tomblib.undertaker import Undertaker
+
+try:
+    _fromUtf8 = QtCore.QString.fromUtf8
+except AttributeError:
+    _fromUtf8 = lambda s: s
+
+class TombfilePage(QtGui.QWizardPage):
+    def __init__(self, *args, **kwargs):
+        QtGui.QWizardPage.__init__(self, *args)
+        self.ui = Ui_tombfile()
+        self.ui.setupUi(self)
+        if 'tombfile' in kwargs and kwargs['tombfile'] is not None:
+            self.ui.tomb_line.setText(kwargs['tombfile'])
+        self.ui.tomb_browse.clicked.connect(self.on_tomb_location_clicked)
+    def on_tomb_location_clicked(self, *args, **kwargs):
+        filename = QtGui.QFileDialog.getOpenFileName(self, 'Select Tomb',
+                filter="Tomb (*.tomb)")
+        self.ui.tomb_line.setText(filename)
+
+class MethodPage(QtGui.QWizardPage):
+    def __init__(self, *args, **kwargs):
+        QtGui.QWizardPage.__init__(self, *args, **kwargs)
+        self.ui = Ui_keymethod()
+        self.ui.setupUi(self)
+        self.group = group = QtGui.QButtonGroup()
+        for radio in self.children():
+            if type(radio) == QtGui.QRadioButton:
+                group.addButton(radio)
+
+    def initializePage(self):
+        self.found = Undertaker.check( str('near://' + self.wizard().get_tombfile()) ) or []
+        box = self.ui.radio_layout
+
+        for key in self.found:
+            radio = QtGui.QRadioButton('Automatically found: ' + key, parent=self)
+            radio.setChecked(True)
+            radio.setProperty('path', key)
+            box.insertWidget(0, radio)
+            self.group.addButton(radio)
+
+
+    def nextId(self):
+        '''Virtual method reimplemented to decide next page'''
+        if self.ui.fs.isChecked():
+            keyfile = QtGui.QFileDialog.getOpenFileName(self.wizard(), 'Key file',
+                    filter="Tomb keys (*.tomb.key);;Buried keys (*.jpeg)")
+            if keyfile:
+                #TODO: check if this really is a success :)
+                if Tomb.open(self.wizard().get_tombfile(), keyfile): #bugs when wrong password
+                    return TombOpenWizard.SUCCESS_PAGE
+                #else: #TODO: should alert the user that we failed
+            return TombOpenWizard.METHOD_PAGE
+        if self.ui.usb.isChecked():
+            return TombOpenWizard.USB_PAGE
+        print self.group.checkedButton().property('path').toPyObject()
+        return TombOpenWizard.SUCCESS_PAGE
+
+class SuccessPage(QtGui.QWizardPage):
+    def __init__(self, *args, **kwargs):
+        QtGui.QWizardPage.__init__(self, *args, **kwargs)
+        self.ui = Ui_success()
+        self.ui.setupUi(self)
+
+class TombOpenWizard(QtGui.QWizard):
+    TOMBFILE_PAGE=1
+    METHOD_PAGE=2
+    SUCCESS_PAGE=99
+    USB_PAGE=20
+    def __init__(self, *args, **kwargs):
+        QtGui.QWizard.__init__(self, *args)
+        self.setPage(TombOpenWizard.TOMBFILE_PAGE,
+                TombfilePage(self, tombfile = kwargs['tombfile']
+                    if 'tombfile' in kwargs else None))
+        self.setPage(TombOpenWizard.METHOD_PAGE, MethodPage(self))
+        self.setPage(TombOpenWizard.SUCCESS_PAGE, SuccessPage(self))
+        if 'tombfile' in kwargs and kwargs['tombfile'] is not None:
+            self.setStartId(TombOpenWizard.METHOD_PAGE)
+
+    def get_tombfile(self):
+        page = self.page(TombOpenWizard.TOMBFILE_PAGE)
+        return page.ui.tomb_line.text()
+
+        
+
+def run_open_wizard():
+    app = QtGui.QApplication(sys.argv)
+    window = TombOpenWizard(tombfile=sys.argv[1] if len(sys.argv) > 1 else None)
+    window.show()
+    sys.exit(app.exec_())
+
+if __name__ == '__main__':
+    Undertaker.undertakerexec = '/home/davide/coding/projects/tomb/src/undertaker'
+    run_open_wizard()
+
+
+
+
+
+
diff --git a/src/qt/tombqt/open.ui b/src/qt/tombqt/open.ui
@@ -0,0 +1,239 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>Dialog</class>
+ <widget class="QDialog" name="Dialog">
+  <property name="windowTitle">
+   <string>Tomb open</string>
+  </property>
+  <property name="toolTip">
+   <string>Open a tomb file; this will require a passphrase</string>
+  </property>
+  <property name="autoFillBackground">
+   <bool>false</bool>
+  </property>
+  <property name="sizeGripEnabled">
+   <bool>true</bool>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout">
+   <item>
+    <layout class="QVBoxLayout" name="verticalLayout_2">
+     <item>
+      <widget class="QLabel" name="label">
+       <property name="text">
+        <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:14pt; font-weight:600;">Opening %tombname%</span></p></body></html></string>
+       </property>
+       <property name="textFormat">
+        <enum>Qt::RichText</enum>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <layout class="QHBoxLayout" name="horizontalLayout">
+       <item>
+        <spacer name="horizontalSpacer">
+         <property name="orientation">
+          <enum>Qt::Horizontal</enum>
+         </property>
+         <property name="sizeType">
+          <enum>QSizePolicy::Maximum</enum>
+         </property>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>40</width>
+           <height>20</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+       <item>
+        <widget class="QLabel" name="label_2">
+         <property name="text">
+          <string>Size: %tombsize%</string>
+         </property>
+        </widget>
+       </item>
+      </layout>
+     </item>
+    </layout>
+   </item>
+   <item>
+    <spacer name="verticalSpacer">
+     <property name="orientation">
+      <enum>Qt::Vertical</enum>
+     </property>
+     <property name="sizeType">
+      <enum>QSizePolicy::Fixed</enum>
+     </property>
+     <property name="sizeHint" stdset="0">
+      <size>
+       <width>20</width>
+       <height>25</height>
+      </size>
+     </property>
+    </spacer>
+   </item>
+   <item>
+    <widget class="QGroupBox" name="groupBox">
+     <property name="title">
+      <string>Opening key</string>
+     </property>
+     <property name="flat">
+      <bool>false</bool>
+     </property>
+     <property name="checkable">
+      <bool>false</bool>
+     </property>
+     <layout class="QHBoxLayout" name="horizontalLayout_2">
+      <item>
+       <widget class="QLabel" name="label_3">
+        <property name="text">
+         <string>Key found in %autokeypath%</string>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QPushButton" name="pushButton">
+        <property name="toolTip">
+         <string>Select a key to open the tomb</string>
+        </property>
+        <property name="text">
+         <string>Choose another key</string>
+        </property>
+        <property name="autoDefault">
+         <bool>true</bool>
+        </property>
+        <property name="default">
+         <bool>false</bool>
+        </property>
+        <property name="flat">
+         <bool>false</bool>
+        </property>
+       </widget>
+      </item>
+     </layout>
+    </widget>
+   </item>
+   <item>
+    <spacer name="verticalSpacer_2">
+     <property name="orientation">
+      <enum>Qt::Vertical</enum>
+     </property>
+     <property name="sizeType">
+      <enum>QSizePolicy::Preferred</enum>
+     </property>
+     <property name="sizeHint" stdset="0">
+      <size>
+       <width>20</width>
+       <height>40</height>
+      </size>
+     </property>
+    </spacer>
+   </item>
+   <item>
+    <widget class="QLabel" name="label_4">
+     <property name="text">
+      <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">HELP</span></p>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">To open a tomb, you need both:</p>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">  1. a key, which is a file with secret information.</p>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">  2. a passphrase</p>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This dialog will help you choose the keyfile. We try hard to find the key, but if we can't found the right one, choose it yourself using the button</p></body></html></string>
+     </property>
+     <property name="wordWrap">
+      <bool>true</bool>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <widget class="QDialogButtonBox" name="buttonBox">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="standardButtons">
+      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Help|QDialogButtonBox::Open</set>
+     </property>
+     <property name="centerButtons">
+      <bool>false</bool>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>rejected()</signal>
+   <receiver>Dialog</receiver>
+   <slot>reject()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>578</x>
+     <y>751</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>529</x>
+     <y>381</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>accepted()</signal>
+   <receiver>Dialog</receiver>
+   <slot>accept()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>447</x>
+     <y>735</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>279</x>
+     <y>326</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>Dialog</sender>
+   <signal>created()</signal>
+   <receiver>label_4</receiver>
+   <slot>hide()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>141</x>
+     <y>756</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>136</x>
+     <y>692</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>helpRequested()</signal>
+   <receiver>label_4</receiver>
+   <slot>hide()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>39</x>
+     <y>738</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>71</x>
+     <y>676</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+ <slots>
+  <signal>created()</signal>
+ </slots>
+</ui>
diff --git a/src/qt/tombqt/open_choosekey.ui b/src/qt/tombqt/open_choosekey.ui
@@ -0,0 +1,147 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>Dialog</class>
+ <widget class="QDialog" name="Dialog">
+  <property name="sizePolicy">
+   <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
+    <horstretch>0</horstretch>
+    <verstretch>0</verstretch>
+   </sizepolicy>
+  </property>
+  <property name="windowTitle">
+   <string>Dialog</string>
+  </property>
+  <property name="modal">
+   <bool>true</bool>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout">
+   <item>
+    <widget class="QLabel" name="label">
+     <property name="text">
+      <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:12pt; font-weight:600;">Auto-search</span></p></body></html></string>
+     </property>
+     <property name="textFormat">
+      <enum>Qt::RichText</enum>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <spacer name="verticalSpacer">
+     <property name="orientation">
+      <enum>Qt::Vertical</enum>
+     </property>
+     <property name="sizeType">
+      <enum>QSizePolicy::Expanding</enum>
+     </property>
+     <property name="sizeHint" stdset="0">
+      <size>
+       <width>20</width>
+       <height>40</height>
+      </size>
+     </property>
+    </spacer>
+   </item>
+   <item>
+    <layout class="QVBoxLayout" name="verticalLayout_radio">
+     <item>
+      <layout class="QVBoxLayout" name="verticalLayout_custom">
+       <item>
+        <widget class="QRadioButton" name="radioButton">
+         <property name="text">
+          <string>Custom location</string>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <layout class="QHBoxLayout" name="horizontalLayout_custom_input">
+         <item>
+          <widget class="QLineEdit" name="lineEdit">
+           <property name="readOnly">
+            <bool>false</bool>
+           </property>
+           <property name="placeholderText">
+            <string>/path/to/keyfile</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QPushButton" name="pushButton">
+           <property name="text">
+            <string>Choose file</string>
+           </property>
+          </widget>
+         </item>
+        </layout>
+       </item>
+      </layout>
+     </item>
+    </layout>
+   </item>
+   <item>
+    <spacer name="verticalSpacer_2">
+     <property name="orientation">
+      <enum>Qt::Vertical</enum>
+     </property>
+     <property name="sizeType">
+      <enum>QSizePolicy::Expanding</enum>
+     </property>
+     <property name="sizeHint" stdset="0">
+      <size>
+       <width>20</width>
+       <height>40</height>
+      </size>
+     </property>
+    </spacer>
+   </item>
+   <item>
+    <widget class="QDialogButtonBox" name="buttonBox">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="standardButtons">
+      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>accepted()</signal>
+   <receiver>Dialog</receiver>
+   <slot>accept()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>247</x>
+     <y>604</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>157</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>rejected()</signal>
+   <receiver>Dialog</receiver>
+   <slot>reject()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>315</x>
+     <y>604</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>286</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>
diff --git a/src/qt/tombqt/open_keymethod.ui b/src/qt/tombqt/open_keymethod.ui
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>keymethod</class>
+ <widget class="QWizardPage" name="keymethod">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>480</width>
+    <height>640</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>WizardPage</string>
+  </property>
+  <property name="title">
+   <string>Choose key</string>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout">
+   <item>
+    <spacer name="verticalSpacer">
+     <property name="orientation">
+      <enum>Qt::Vertical</enum>
+     </property>
+     <property name="sizeHint" stdset="0">
+      <size>
+       <width>20</width>
+       <height>265</height>
+      </size>
+     </property>
+    </spacer>
+   </item>
+   <item>
+    <layout class="QVBoxLayout" name="radio_layout">
+     <item>
+      <widget class="QRadioButton" name="fs">
+       <property name="text">
+        <string>Filesystem</string>
+       </property>
+       <property name="checked">
+        <bool>true</bool>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QRadioButton" name="usb">
+       <property name="enabled">
+        <bool>false</bool>
+       </property>
+       <property name="text">
+        <string>USB drive</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QRadioButton" name="bluetooth">
+       <property name="enabled">
+        <bool>false</bool>
+       </property>
+       <property name="text">
+        <string>Retrieve via bluetooth (advanced)</string>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+   <item>
+    <spacer name="verticalSpacer_2">
+     <property name="orientation">
+      <enum>Qt::Vertical</enum>
+     </property>
+     <property name="sizeHint" stdset="0">
+      <size>
+       <width>20</width>
+       <height>265</height>
+      </size>
+     </property>
+    </spacer>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/src/qt/tombqt/open_success.ui b/src/qt/tombqt/open_success.ui
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>success</class>
+ <widget class="QWizardPage" name="success">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>480</width>
+    <height>640</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>WizardPage</string>
+  </property>
+  <property name="title">
+   <string>Tomb opened</string>
+  </property>
+  <property name="subTitle">
+   <string>success</string>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout">
+   <item>
+    <widget class="QLabel" name="label">
+     <property name="text">
+      <string>You successfully opened the tomb</string>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/src/qt/tombqt/open_tombfile.ui b/src/qt/tombqt/open_tombfile.ui
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>tombfile</class>
+ <widget class="QWizardPage" name="tombfile">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>480</width>
+    <height>640</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>WizardPage</string>
+  </property>
+  <property name="title">
+   <string>Choose tomb</string>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout_2">
+   <item>
+    <spacer name="verticalSpacer">
+     <property name="orientation">
+      <enum>Qt::Vertical</enum>
+     </property>
+     <property name="sizeHint" stdset="0">
+      <size>
+       <width>20</width>
+       <height>276</height>
+      </size>
+     </property>
+    </spacer>
+   </item>
+   <item>
+    <layout class="QVBoxLayout" name="verticalLayout">
+     <item>
+      <widget class="QLabel" name="label">
+       <property name="text">
+        <string>Choose a tomb file on your filesystem</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <layout class="QHBoxLayout" name="horizontalLayout">
+       <item>
+        <widget class="QLineEdit" name="tomb_line">
+         <property name="placeholderText">
+          <string>/path/to/your.tomb</string>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <widget class="QPushButton" name="tomb_browse">
+         <property name="text">
+          <string>Browse</string>
+         </property>
+        </widget>
+       </item>
+      </layout>
+     </item>
+    </layout>
+   </item>
+   <item>
+    <spacer name="verticalSpacer_2">
+     <property name="orientation">
+      <enum>Qt::Vertical</enum>
+     </property>
+     <property name="sizeHint" stdset="0">
+      <size>
+       <width>20</width>
+       <height>276</height>
+      </size>
+     </property>
+    </spacer>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/src/qt/tombqt/ui_create.py b/src/qt/tombqt/ui_create.py
@@ -0,0 +1,282 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'create.ui'
+#
+# Created: Thu Nov  3 00:16:51 2011
+#      by: PyQt4 UI code generator 4.8.6
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt4 import QtCore, QtGui
+
+try:
+    _fromUtf8 = QtCore.QString.fromUtf8
+except AttributeError:
+    _fromUtf8 = lambda s: s
+
+class Ui_Wizard(object):
+    def setupUi(self, Wizard):
+        Wizard.setObjectName(_fromUtf8("Wizard"))
+        Wizard.resize(710, 368)
+        Wizard.setWindowTitle(QtGui.QApplication.translate("Wizard", "Wizard", None, QtGui.QApplication.UnicodeUTF8))
+        Wizard.setOptions(QtGui.QWizard.HaveHelpButton|QtGui.QWizard.IndependentPages)
+        self.wizardPage_intro = QtGui.QWizardPage()
+        self.wizardPage_intro.setTitle(QtGui.QApplication.translate("Wizard", "Tomb", None, QtGui.QApplication.UnicodeUTF8))
+        self.wizardPage_intro.setSubTitle(QtGui.QApplication.translate("Wizard", "tomb creation", None, QtGui.QApplication.UnicodeUTF8))
+        self.wizardPage_intro.setObjectName(_fromUtf8("wizardPage_intro"))
+        self.verticalLayout = QtGui.QVBoxLayout(self.wizardPage_intro)
+        self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
+        self.label = QtGui.QLabel(self.wizardPage_intro)
+        self.label.setText(QtGui.QApplication.translate("Wizard", "This wizard will guide you to the creation of a tomb.<br> It will be fun!", None, QtGui.QApplication.UnicodeUTF8))
+        self.label.setTextFormat(QtCore.Qt.RichText)
+        self.label.setWordWrap(True)
+        self.label.setObjectName(_fromUtf8("label"))
+        self.verticalLayout.addWidget(self.label)
+        Wizard.addPage(self.wizardPage_intro)
+        self.wizardPage_check = QtGui.QWizardPage()
+        self.wizardPage_check.setTitle(QtGui.QApplication.translate("Wizard", "Requirements check", None, QtGui.QApplication.UnicodeUTF8))
+        self.wizardPage_check.setObjectName(_fromUtf8("wizardPage_check"))
+        self.verticalLayout_12 = QtGui.QVBoxLayout(self.wizardPage_check)
+        self.verticalLayout_12.setObjectName(_fromUtf8("verticalLayout_12"))
+        self.label_check = QtGui.QLabel(self.wizardPage_check)
+        self.label_check.setText(QtGui.QApplication.translate("Wizard", "Checking...", None, QtGui.QApplication.UnicodeUTF8))
+        self.label_check.setObjectName(_fromUtf8("label_check"))
+        self.verticalLayout_12.addWidget(self.label_check)
+        self.groupBox_swap = QtGui.QGroupBox(self.wizardPage_check)
+        self.groupBox_swap.setEnabled(True)
+        self.groupBox_swap.setTitle(QtGui.QApplication.translate("Wizard", "Swap error", None, QtGui.QApplication.UnicodeUTF8))
+        self.groupBox_swap.setObjectName(_fromUtf8("groupBox_swap"))
+        self.verticalLayout_13 = QtGui.QVBoxLayout(self.groupBox_swap)
+        self.verticalLayout_13.setObjectName(_fromUtf8("verticalLayout_13"))
+        self.label_7 = QtGui.QLabel(self.groupBox_swap)
+        self.label_7.setText(QtGui.QApplication.translate("Wizard", "It seems that you have swap activated. It is very dangerous, since you could leave LOT of traces on your computer UNencrypted. You have some options:", None, QtGui.QApplication.UnicodeUTF8))
+        self.label_7.setWordWrap(True)
+        self.label_7.setObjectName(_fromUtf8("label_7"))
+        self.verticalLayout_13.addWidget(self.label_7)
+        self.verticalLayout_swapoff = QtGui.QVBoxLayout()
+        self.verticalLayout_swapoff.setObjectName(_fromUtf8("verticalLayout_swapoff"))
+        self.radioButton_swapoff = QtGui.QRadioButton(self.groupBox_swap)
+        self.radioButton_swapoff.setText(QtGui.QApplication.translate("Wizard", "Swapoff", None, QtGui.QApplication.UnicodeUTF8))
+        self.radioButton_swapoff.setObjectName(_fromUtf8("radioButton_swapoff"))
+        self.verticalLayout_swapoff.addWidget(self.radioButton_swapoff)
+        self.horizontalLayout_6 = QtGui.QHBoxLayout()
+        self.horizontalLayout_6.setObjectName(_fromUtf8("horizontalLayout_6"))
+        spacerItem = QtGui.QSpacerItem(20, 20, QtGui.QSizePolicy.Maximum, QtGui.QSizePolicy.Minimum)
+        self.horizontalLayout_6.addItem(spacerItem)
+        self.label_swapoff = QtGui.QLabel(self.groupBox_swap)
+        self.label_swapoff.setText(QtGui.QApplication.translate("Wizard", "Note: swapoff could take a long time, and, in case the memory is not enough, could even make your system crash. Your system seems to have %freeram%MB free", None, QtGui.QApplication.UnicodeUTF8))
+        self.label_swapoff.setWordWrap(True)
+        self.label_swapoff.setObjectName(_fromUtf8("label_swapoff"))
+        self.horizontalLayout_6.addWidget(self.label_swapoff)
+        self.verticalLayout_swapoff.addLayout(self.horizontalLayout_6)
+        self.verticalLayout_13.addLayout(self.verticalLayout_swapoff)
+        self.verticalLayout_11 = QtGui.QVBoxLayout()
+        self.verticalLayout_11.setObjectName(_fromUtf8("verticalLayout_11"))
+        self.radioButton_ignore = QtGui.QRadioButton(self.groupBox_swap)
+        self.radioButton_ignore.setText(QtGui.QApplication.translate("Wizard", "Ignore", None, QtGui.QApplication.UnicodeUTF8))
+        self.radioButton_ignore.setObjectName(_fromUtf8("radioButton_ignore"))
+        self.verticalLayout_11.addWidget(self.radioButton_ignore)
+        self.horizontalLayout_7 = QtGui.QHBoxLayout()
+        self.horizontalLayout_7.setObjectName(_fromUtf8("horizontalLayout_7"))
+        spacerItem1 = QtGui.QSpacerItem(20, 20, QtGui.QSizePolicy.Maximum, QtGui.QSizePolicy.Minimum)
+        self.horizontalLayout_7.addItem(spacerItem1)
+        self.label_9 = QtGui.QLabel(self.groupBox_swap)
+        self.label_9.setText(QtGui.QApplication.translate("Wizard", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
+"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
+"p, li { white-space: pre-wrap; }\n"
+"</style></head><body style=\" font-family:\'DejaVu Sans\'; font-size:10pt; font-weight:400; font-style:normal;\">\n"
+"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-weight:600;\">Note:</span> You should use this only if you are sure that your swap is encrypted, or that you are using compcache.</p>\n"
+"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">If this is not the case, DON\'T select this, as it is <span style=\" font-weight:600;\">VERY DANGEROUS </span>to use encryption with swap activated</p></body></html>", None, QtGui.QApplication.UnicodeUTF8))
+        self.label_9.setWordWrap(True)
+        self.label_9.setObjectName(_fromUtf8("label_9"))
+        self.horizontalLayout_7.addWidget(self.label_9)
+        self.verticalLayout_11.addLayout(self.horizontalLayout_7)
+        self.verticalLayout_13.addLayout(self.verticalLayout_11)
+        self.verticalLayout_12.addWidget(self.groupBox_swap)
+        Wizard.addPage(self.wizardPage_check)
+        self.wizardPage_tomb_size = QtGui.QWizardPage()
+        self.wizardPage_tomb_size.setObjectName(_fromUtf8("wizardPage_tomb_size"))
+        self.verticalLayout_2 = QtGui.QVBoxLayout(self.wizardPage_tomb_size)
+        self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2"))
+        self.label_2 = QtGui.QLabel(self.wizardPage_tomb_size)
+        self.label_2.setText(QtGui.QApplication.translate("Wizard", "Please enter tomb size. Digging the tomb will require some time: usually, one minute per GB, but your mileage may vary. <br>Keep in mind that resizing it in the future is still NOT implemented", None, QtGui.QApplication.UnicodeUTF8))
+        self.label_2.setWordWrap(True)
+        self.label_2.setObjectName(_fromUtf8("label_2"))
+        self.verticalLayout_2.addWidget(self.label_2)
+        self.horizontalLayout = QtGui.QHBoxLayout()
+        self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
+        self.label_3 = QtGui.QLabel(self.wizardPage_tomb_size)
+        self.label_3.setText(QtGui.QApplication.translate("Wizard", "Enter tomb size, in MB. 1GB=1000MB)", None, QtGui.QApplication.UnicodeUTF8))
+        self.label_3.setObjectName(_fromUtf8("label_3"))
+        self.horizontalLayout.addWidget(self.label_3)
+        self.spinBox_size = QtGui.QSpinBox(self.wizardPage_tomb_size)
+        self.spinBox_size.setMinimum(10)
+        self.spinBox_size.setMaximum(100000)
+        self.spinBox_size.setProperty("value", 100)
+        self.spinBox_size.setObjectName(_fromUtf8("spinBox_size"))
+        self.horizontalLayout.addWidget(self.spinBox_size)
+        self.verticalLayout_2.addLayout(self.horizontalLayout)
+        Wizard.addPage(self.wizardPage_tomb_size)
+        self.wizardPage_tomb_location = QtGui.QWizardPage()
+        self.wizardPage_tomb_location.setObjectName(_fromUtf8("wizardPage_tomb_location"))
+        self.verticalLayout_3 = QtGui.QVBoxLayout(self.wizardPage_tomb_location)
+        self.verticalLayout_3.setObjectName(_fromUtf8("verticalLayout_3"))
+        self.label_4 = QtGui.QLabel(self.wizardPage_tomb_location)
+        self.label_4.setText(QtGui.QApplication.translate("Wizard", "Where do you want your tomb to be digged?", None, QtGui.QApplication.UnicodeUTF8))
+        self.label_4.setWordWrap(True)
+        self.label_4.setObjectName(_fromUtf8("label_4"))
+        self.verticalLayout_3.addWidget(self.label_4)
+        self.horizontalLayout_2 = QtGui.QHBoxLayout()
+        self.horizontalLayout_2.setObjectName(_fromUtf8("horizontalLayout_2"))
+        self.lineEdit_tombpath = QtGui.QLineEdit(self.wizardPage_tomb_location)
+        self.lineEdit_tombpath.setFrame(True)
+        self.lineEdit_tombpath.setPlaceholderText(QtGui.QApplication.translate("Wizard", "/path/to/file.tomb", None, QtGui.QApplication.UnicodeUTF8))
+        self.lineEdit_tombpath.setObjectName(_fromUtf8("lineEdit_tombpath"))
+        self.horizontalLayout_2.addWidget(self.lineEdit_tombpath)
+        self.button_tombpath = QtGui.QPushButton(self.wizardPage_tomb_location)
+        self.button_tombpath.setText(QtGui.QApplication.translate("Wizard", "Open file", None, QtGui.QApplication.UnicodeUTF8))
+        self.button_tombpath.setObjectName(_fromUtf8("button_tombpath"))
+        self.horizontalLayout_2.addWidget(self.button_tombpath)
+        self.verticalLayout_3.addLayout(self.horizontalLayout_2)
+        Wizard.addPage(self.wizardPage_tomb_location)
+        self.wizardPage_key_location = QtGui.QWizardPage()
+        self.wizardPage_key_location.setTitle(QtGui.QApplication.translate("Wizard", "Key creation", None, QtGui.QApplication.UnicodeUTF8))
+        self.wizardPage_key_location.setSubTitle(QtGui.QApplication.translate("Wizard", "Choose the location for your key", None, QtGui.QApplication.UnicodeUTF8))
+        self.wizardPage_key_location.setObjectName(_fromUtf8("wizardPage_key_location"))
+        self.verticalLayout_6 = QtGui.QVBoxLayout(self.wizardPage_key_location)
+        self.verticalLayout_6.setObjectName(_fromUtf8("verticalLayout_6"))
+        self.label_5 = QtGui.QLabel(self.wizardPage_key_location)
+        self.label_5.setText(QtGui.QApplication.translate("Wizard", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
+"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
+"p, li { white-space: pre-wrap; }\n"
+"</style></head><body style=\" font-family:\'Sans Serif\'; font-size:9pt; font-weight:400; font-style:normal;\">\n"
+"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">Now, you have to decide where to put the <span style=\" font-weight:600;\">key</span> for your tomb<br />You should not leave your key at the door, as this will lower security A LOT</p>\n"
+"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">Also, the keyfile is very small (less than a KB), so disk space is not an issue</p></body></html>", None, QtGui.QApplication.UnicodeUTF8))
+        self.label_5.setTextFormat(QtCore.Qt.RichText)
+        self.label_5.setWordWrap(True)
+        self.label_5.setObjectName(_fromUtf8("label_5"))
+        self.verticalLayout_6.addWidget(self.label_5)
+        self.verticalLayout_5 = QtGui.QVBoxLayout()
+        self.verticalLayout_5.setObjectName(_fromUtf8("verticalLayout_5"))
+        self.verticalLayout_4 = QtGui.QVBoxLayout()
+        self.verticalLayout_4.setObjectName(_fromUtf8("verticalLayout_4"))
+        self.radioButton_usb = QtGui.QRadioButton(self.wizardPage_key_location)
+        self.radioButton_usb.setEnabled(False)
+        self.radioButton_usb.setText(QtGui.QApplication.translate("Wizard", "On a USB pen (best security)", None, QtGui.QApplication.UnicodeUTF8))
+        self.radioButton_usb.setCheckable(True)
+        self.radioButton_usb.setChecked(False)
+        self.radioButton_usb.setObjectName(_fromUtf8("radioButton_usb"))
+        self.verticalLayout_4.addWidget(self.radioButton_usb)
+        self.horizontalLayout_4 = QtGui.QHBoxLayout()
+        self.horizontalLayout_4.setObjectName(_fromUtf8("horizontalLayout_4"))
+        spacerItem2 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Maximum, QtGui.QSizePolicy.Minimum)
+        self.horizontalLayout_4.addItem(spacerItem2)
+        self.label_6 = QtGui.QLabel(self.wizardPage_key_location)
+        self.label_6.setEnabled(False)
+        self.label_6.setText(QtGui.QApplication.translate("Wizard", "If you choose to do so, do not insert it NOW. Do it when you are asked to do so", None, QtGui.QApplication.UnicodeUTF8))
+        self.label_6.setObjectName(_fromUtf8("label_6"))
+        self.horizontalLayout_4.addWidget(self.label_6)
+        self.verticalLayout_4.addLayout(self.horizontalLayout_4)
+        self.verticalLayout_5.addLayout(self.verticalLayout_4)
+        self.radioButton_near = QtGui.QRadioButton(self.wizardPage_key_location)
+        self.radioButton_near.setToolTip(QtGui.QApplication.translate("Wizard", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
+"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
+"p, li { white-space: pre-wrap; }\n"
+"</style></head><body style=\" font-family:\'Sans Serif\'; font-size:9pt; font-weight:400; font-style:normal;\">\n"
+"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">It will be created as a regular file in the same directory of your tomb.</p>\n"
+"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">It is much easier to use, but also much more <span style=\" font-style:italic;\">insecure</span>: all your security will be guaranteed by your <span style=\" font-weight:600;\">password</span>. If you really want to do this, choose a strong password (lot of random/non-dictionary words, spaces, numbers, odd characters)</p></body></html>", None, QtGui.QApplication.UnicodeUTF8))
+        self.radioButton_near.setText(QtGui.QApplication.translate("Wizard", "Near to the tomb itself (this is BAD)", None, QtGui.QApplication.UnicodeUTF8))
+        self.radioButton_near.setChecked(True)
+        self.radioButton_near.setObjectName(_fromUtf8("radioButton_near"))
+        self.verticalLayout_5.addWidget(self.radioButton_near)
+        self.radioButton_custom = QtGui.QRadioButton(self.wizardPage_key_location)
+        self.radioButton_custom.setText(QtGui.QApplication.translate("Wizard", "Specify location", None, QtGui.QApplication.UnicodeUTF8))
+        self.radioButton_custom.setObjectName(_fromUtf8("radioButton_custom"))
+        self.verticalLayout_5.addWidget(self.radioButton_custom)
+        self.verticalLayout_6.addLayout(self.verticalLayout_5)
+        self.horizontalLayout_3 = QtGui.QHBoxLayout()
+        self.horizontalLayout_3.setObjectName(_fromUtf8("horizontalLayout_3"))
+        spacerItem3 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Maximum, QtGui.QSizePolicy.Minimum)
+        self.horizontalLayout_3.addItem(spacerItem3)
+        self.lineEdit_custom = QtGui.QLineEdit(self.wizardPage_key_location)
+        self.lineEdit_custom.setEnabled(False)
+        self.lineEdit_custom.setObjectName(_fromUtf8("lineEdit_custom"))
+        self.horizontalLayout_3.addWidget(self.lineEdit_custom)
+        self.pushButton_custom = QtGui.QPushButton(self.wizardPage_key_location)
+        self.pushButton_custom.setEnabled(False)
+        self.pushButton_custom.setText(QtGui.QApplication.translate("Wizard", "Choose location", None, QtGui.QApplication.UnicodeUTF8))
+        self.pushButton_custom.setObjectName(_fromUtf8("pushButton_custom"))
+        self.horizontalLayout_3.addWidget(self.pushButton_custom)
+        self.verticalLayout_6.addLayout(self.horizontalLayout_3)
+        self.label_11 = QtGui.QLabel(self.wizardPage_key_location)
+        self.label_11.setText(QtGui.QApplication.translate("Wizard", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
+"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
+"p, li { white-space: pre-wrap; }\n"
+"</style></head><body style=\" font-family:\'Sans Serif\'; font-size:9pt; font-weight:400; font-style:normal;\">\n"
+"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-weight:600;\">Help: </span>the key file is very small, so disk usage is not an issue</p></body></html>", None, QtGui.QApplication.UnicodeUTF8))
+        self.label_11.setWordWrap(True)
+        self.label_11.setObjectName(_fromUtf8("label_11"))
+        self.verticalLayout_6.addWidget(self.label_11)
+        Wizard.addPage(self.wizardPage_key_location)
+        self.wizardPage_progress = QtGui.QWizardPage()
+        self.wizardPage_progress.setTitle(QtGui.QApplication.translate("Wizard", "Creating", None, QtGui.QApplication.UnicodeUTF8))
+        self.wizardPage_progress.setSubTitle(QtGui.QApplication.translate("Wizard", "Please wait", None, QtGui.QApplication.UnicodeUTF8))
+        self.wizardPage_progress.setObjectName(_fromUtf8("wizardPage_progress"))
+        self.verticalLayout_9 = QtGui.QVBoxLayout(self.wizardPage_progress)
+        self.verticalLayout_9.setObjectName(_fromUtf8("verticalLayout_9"))
+        self.verticalLayout_7 = QtGui.QVBoxLayout()
+        self.verticalLayout_7.setObjectName(_fromUtf8("verticalLayout_7"))
+        self.progressBar = QtGui.QProgressBar(self.wizardPage_progress)
+        self.progressBar.setProperty("value", 0)
+        self.progressBar.setTextVisible(True)
+        self.progressBar.setInvertedAppearance(False)
+        self.progressBar.setObjectName(_fromUtf8("progressBar"))
+        self.verticalLayout_7.addWidget(self.progressBar)
+        self.horizontalLayout_5 = QtGui.QHBoxLayout()
+        self.horizontalLayout_5.setObjectName(_fromUtf8("horizontalLayout_5"))
+        self.label_progress = QtGui.QLabel(self.wizardPage_progress)
+        self.label_progress.setText(QtGui.QApplication.translate("Wizard", "Creating tomb, please wait...", None, QtGui.QApplication.UnicodeUTF8))
+        self.label_progress.setObjectName(_fromUtf8("label_progress"))
+        self.horizontalLayout_5.addWidget(self.label_progress)
+        self.verticalLayout_7.addLayout(self.horizontalLayout_5)
+        self.verticalLayout_9.addLayout(self.verticalLayout_7)
+        self.textBrowser_log = QtGui.QTextBrowser(self.wizardPage_progress)
+        self.textBrowser_log.setDocumentTitle(QtGui.QApplication.translate("Wizard", "Log", None, QtGui.QApplication.UnicodeUTF8))
+        self.textBrowser_log.setHtml(QtGui.QApplication.translate("Wizard", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
+"<html><head><meta name=\"qrichtext\" content=\"1\" /><title>Log</title><style type=\"text/css\">\n"
+"p, li { white-space: pre-wrap; }\n"
+"</style></head><body style=\" font-family:\'DejaVu Sans\'; font-size:10pt; font-weight:400; font-style:normal;\">\n"
+"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Sans Serif\'; font-size:9pt; font-weight:600;\">Log</span></p>\n"
+"<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:\'Sans Serif\'; font-size:9pt; font-weight:600;\"></p></body></html>", None, QtGui.QApplication.UnicodeUTF8))
+        self.textBrowser_log.setObjectName(_fromUtf8("textBrowser_log"))
+        self.verticalLayout_9.addWidget(self.textBrowser_log)
+        Wizard.addPage(self.wizardPage_progress)
+        self.wizardPage_end = QtGui.QWizardPage()
+        self.wizardPage_end.setObjectName(_fromUtf8("wizardPage_end"))
+        self.verticalLayout_8 = QtGui.QVBoxLayout(self.wizardPage_end)
+        self.verticalLayout_8.setObjectName(_fromUtf8("verticalLayout_8"))
+        self.label_10 = QtGui.QLabel(self.wizardPage_end)
+        self.label_10.setText(QtGui.QApplication.translate("Wizard", "You successfully created the tomb!", None, QtGui.QApplication.UnicodeUTF8))
+        self.label_10.setObjectName(_fromUtf8("label_10"))
+        self.verticalLayout_8.addWidget(self.label_10)
+        self.checkBox_open = QtGui.QCheckBox(self.wizardPage_end)
+        self.checkBox_open.setEnabled(False)
+        self.checkBox_open.setText(QtGui.QApplication.translate("Wizard", "Open the just-created tomb NOW!", None, QtGui.QApplication.UnicodeUTF8))
+        self.checkBox_open.setChecked(False)
+        self.checkBox_open.setTristate(False)
+        self.checkBox_open.setObjectName(_fromUtf8("checkBox_open"))
+        self.verticalLayout_8.addWidget(self.checkBox_open)
+        Wizard.addPage(self.wizardPage_end)
+        self.label_3.setBuddy(self.spinBox_size)
+        self.label_4.setBuddy(self.lineEdit_tombpath)
+
+        self.retranslateUi(Wizard)
+        QtCore.QObject.connect(self.radioButton_custom, QtCore.SIGNAL(_fromUtf8("toggled(bool)")), self.lineEdit_custom.setEnabled)
+        QtCore.QObject.connect(self.radioButton_custom, QtCore.SIGNAL(_fromUtf8("toggled(bool)")), self.pushButton_custom.setEnabled)
+        QtCore.QObject.connect(Wizard, QtCore.SIGNAL(_fromUtf8("currentIdChanged(int)")), self.label_11.hide)
+        QtCore.QObject.connect(Wizard, QtCore.SIGNAL(_fromUtf8("helpRequested()")), self.label_11.show)
+        QtCore.QMetaObject.connectSlotsByName(Wizard)
+
+    def retranslateUi(self, Wizard):
+        pass
+
diff --git a/src/qt/tombqt/ui_open_keymethod.py b/src/qt/tombqt/ui_open_keymethod.py
@@ -0,0 +1,51 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'tombqt/open_keymethod.ui'
+#
+# Created: Sat Jan 28 03:36:11 2012
+#      by: PyQt4 UI code generator 4.9
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt4 import QtCore, QtGui
+
+try:
+    _fromUtf8 = QtCore.QString.fromUtf8
+except AttributeError:
+    _fromUtf8 = lambda s: s
+
+class Ui_keymethod(object):
+    def setupUi(self, keymethod):
+        keymethod.setObjectName(_fromUtf8("keymethod"))
+        keymethod.resize(480, 640)
+        self.verticalLayout = QtGui.QVBoxLayout(keymethod)
+        self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
+        spacerItem = QtGui.QSpacerItem(20, 265, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+        self.verticalLayout.addItem(spacerItem)
+        self.radio_layout = QtGui.QVBoxLayout()
+        self.radio_layout.setObjectName(_fromUtf8("radio_layout"))
+        self.fs = QtGui.QRadioButton(keymethod)
+        self.fs.setObjectName(_fromUtf8("fs"))
+        self.radio_layout.addWidget(self.fs)
+        self.usb = QtGui.QRadioButton(keymethod)
+        self.usb.setEnabled(False)
+        self.usb.setObjectName(_fromUtf8("usb"))
+        self.radio_layout.addWidget(self.usb)
+        self.bluetooth = QtGui.QRadioButton(keymethod)
+        self.bluetooth.setEnabled(False)
+        self.bluetooth.setObjectName(_fromUtf8("bluetooth"))
+        self.radio_layout.addWidget(self.bluetooth)
+        self.verticalLayout.addLayout(self.radio_layout)
+        spacerItem1 = QtGui.QSpacerItem(20, 265, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+        self.verticalLayout.addItem(spacerItem1)
+
+        self.retranslateUi(keymethod)
+        QtCore.QMetaObject.connectSlotsByName(keymethod)
+
+    def retranslateUi(self, keymethod):
+        keymethod.setWindowTitle(QtGui.QApplication.translate("keymethod", "WizardPage", None, QtGui.QApplication.UnicodeUTF8))
+        keymethod.setTitle(QtGui.QApplication.translate("keymethod", "Choose key", None, QtGui.QApplication.UnicodeUTF8))
+        self.fs.setText(QtGui.QApplication.translate("keymethod", "Filesystem", None, QtGui.QApplication.UnicodeUTF8))
+        self.usb.setText(QtGui.QApplication.translate("keymethod", "USB drive", None, QtGui.QApplication.UnicodeUTF8))
+        self.bluetooth.setText(QtGui.QApplication.translate("keymethod", "Retrieve via bluetooth (advanced)", None, QtGui.QApplication.UnicodeUTF8))
+
diff --git a/src/qt/tombqt/ui_open_success.py b/src/qt/tombqt/ui_open_success.py
@@ -0,0 +1,35 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'tombqt/open_success.ui'
+#
+# Created: Mon Jan 23 23:06:38 2012
+#      by: PyQt4 UI code generator 4.9
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt4 import QtCore, QtGui
+
+try:
+    _fromUtf8 = QtCore.QString.fromUtf8
+except AttributeError:
+    _fromUtf8 = lambda s: s
+
+class Ui_success(object):
+    def setupUi(self, success):
+        success.setObjectName(_fromUtf8("success"))
+        success.resize(480, 640)
+        self.verticalLayout = QtGui.QVBoxLayout(success)
+        self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
+        self.label = QtGui.QLabel(success)
+        self.label.setObjectName(_fromUtf8("label"))
+        self.verticalLayout.addWidget(self.label)
+
+        self.retranslateUi(success)
+        QtCore.QMetaObject.connectSlotsByName(success)
+
+    def retranslateUi(self, success):
+        success.setWindowTitle(QtGui.QApplication.translate("success", "WizardPage", None, QtGui.QApplication.UnicodeUTF8))
+        success.setTitle(QtGui.QApplication.translate("success", "Tomb opened", None, QtGui.QApplication.UnicodeUTF8))
+        success.setSubTitle(QtGui.QApplication.translate("success", "success", None, QtGui.QApplication.UnicodeUTF8))
+        self.label.setText(QtGui.QApplication.translate("success", "You successfully opened the tomb", None, QtGui.QApplication.UnicodeUTF8))
+
diff --git a/src/qt/tombqt/ui_open_tombfile.py b/src/qt/tombqt/ui_open_tombfile.py
@@ -0,0 +1,52 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'tombqt/open_tombfile.ui'
+#
+# Created: Tue Jan 24 00:49:10 2012
+#      by: PyQt4 UI code generator 4.9
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt4 import QtCore, QtGui
+
+try:
+    _fromUtf8 = QtCore.QString.fromUtf8
+except AttributeError:
+    _fromUtf8 = lambda s: s
+
+class Ui_tombfile(object):
+    def setupUi(self, tombfile):
+        tombfile.setObjectName(_fromUtf8("tombfile"))
+        tombfile.resize(480, 640)
+        self.verticalLayout_2 = QtGui.QVBoxLayout(tombfile)
+        self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2"))
+        spacerItem = QtGui.QSpacerItem(20, 276, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+        self.verticalLayout_2.addItem(spacerItem)
+        self.verticalLayout = QtGui.QVBoxLayout()
+        self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
+        self.label = QtGui.QLabel(tombfile)
+        self.label.setObjectName(_fromUtf8("label"))
+        self.verticalLayout.addWidget(self.label)
+        self.horizontalLayout = QtGui.QHBoxLayout()
+        self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
+        self.tomb_line = QtGui.QLineEdit(tombfile)
+        self.tomb_line.setObjectName(_fromUtf8("tomb_line"))
+        self.horizontalLayout.addWidget(self.tomb_line)
+        self.tomb_browse = QtGui.QPushButton(tombfile)
+        self.tomb_browse.setObjectName(_fromUtf8("tomb_browse"))
+        self.horizontalLayout.addWidget(self.tomb_browse)
+        self.verticalLayout.addLayout(self.horizontalLayout)
+        self.verticalLayout_2.addLayout(self.verticalLayout)
+        spacerItem1 = QtGui.QSpacerItem(20, 276, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+        self.verticalLayout_2.addItem(spacerItem1)
+
+        self.retranslateUi(tombfile)
+        QtCore.QMetaObject.connectSlotsByName(tombfile)
+
+    def retranslateUi(self, tombfile):
+        tombfile.setWindowTitle(QtGui.QApplication.translate("tombfile", "WizardPage", None, QtGui.QApplication.UnicodeUTF8))
+        tombfile.setTitle(QtGui.QApplication.translate("tombfile", "Choose tomb", None, QtGui.QApplication.UnicodeUTF8))
+        self.label.setText(QtGui.QApplication.translate("tombfile", "Choose a tomb file on your filesystem", None, QtGui.QApplication.UnicodeUTF8))
+        self.tomb_line.setPlaceholderText(QtGui.QApplication.translate("tombfile", "/path/to/your.tomb", None, QtGui.QApplication.UnicodeUTF8))
+        self.tomb_browse.setText(QtGui.QApplication.translate("tombfile", "Browse", None, QtGui.QApplication.UnicodeUTF8))
+
diff --git a/src/qt/tombqt/worker.py b/src/qt/tombqt/worker.py
@@ -0,0 +1,62 @@
+import sys,os
+import time
+from tempfile import NamedTemporaryFile
+
+from PyQt4 import QtCore
+
+parentdir = sys.path[0].split(os.sep)[:-1]
+sys.path.append(os.sep.join(parentdir))
+from tomblib.tomb import Tomb
+from tomblib.parser import parse_line
+
+class TombCreateThread(QtCore.QThread):
+    line_received = QtCore.pyqtSignal(QtCore.QString)
+    error_received = QtCore.pyqtSignal(QtCore.QString)
+    def __init__(self, tombpath, size, keypath, **opts):
+        QtCore.QThread.__init__(self)
+        self.tombpath = tombpath
+        self.size = size
+        self.keypath = keypath
+        self.opts = opts
+
+        self.err_thread = TombOutputThread()
+        self.err_thread.line_received.connect(self.line_received)
+        self.err_thread.error_received.connect(self.error_received)
+
+    def run(self):
+        self.err_thread.start()
+        self.status = Tomb.create(str(self.tombpath), str(self.size),
+                self.keypath, stderr=self.err_thread.buffer, **self.opts)
+#        self.err_thread.terminate()
+    
+    def get_success(self):
+        return self.status
+
+class TombOutputThread(QtCore.QThread):
+    line_received = QtCore.pyqtSignal(QtCore.QString)
+    error_received = QtCore.pyqtSignal(QtCore.QString)
+    progressed = QtCore.pyqtSignal(int) #value in percent
+
+    def __init__(self):
+        QtCore.QThread.__init__(self)
+        self.buffer = NamedTemporaryFile()
+
+    def run(self):
+        while True:
+            where = self.buffer.tell()
+            line = self.buffer.readline()
+            if not line:
+                time.sleep(1)
+                self.buffer.seek(where)
+            else:
+                #ansi color escapes messes this up, but it'ok anyway
+                self.line_received.emit(line)
+                self.parse_line(line)
+
+    def parse_line(self, line):
+        #This could be simplified, and s/search/match, if --no-color supported
+        #see #59
+        #TODO: this should be moved to tomblib.parse
+        parsed = parse_line(line)
+        if parsed and parsed['type'] == 'error':
+            self.error_received.emit(parsed.content)
diff --git a/src/tomb b/src/tomb
@@ -48,8 +48,8 @@ PATH=/sbin:/bin:/usr/sbin:/usr/bin
 
 function _msg() {
     local command="print -P"
-    local progname="$fg[magenta]${TOMBEXEC##*/}$fg[reset_color]"
-    local message="$fg_bold[normal]$fg_no_bold[normal]${2}$fg[reset_color]"
+    local progname="$fg[magenta]${TOMBEXEC##*/}$reset_color"
+    local message="$fg_bold[normal]$fg_no_bold[normal]${2}$reset_color"
     local -i returncode
 
     case "$1" in
@@ -57,19 +57,19 @@ function _msg() {
 	    command+=" -n"; pchars=" > "; pcolor="yellow"
 	    ;;
 	message)
-	    pchars=" . "; pcolor="white"; message="$fg_no_bold[$pcolor]${2}$fg[reset_color]"
+	    pchars=" . "; pcolor="white"; message="$fg_no_bold[$pcolor]${2}$reset_color"
 	    ;;
 	verbose)
 	    pchars="[D]"; pcolor="blue"
 	    ;;
 	success)
-	    pchars="(*)"; pcolor="green"; message="$fg_no_bold[$pcolor]${2}$fg[reset_color]"
+	    pchars="(*)"; pcolor="green"; message="$fg_no_bold[$pcolor]${2}$reset_color"
 	    ;;
 	warning)
-	    pchars="[W]"; pcolor="yellow"; message="$fg_no_bold[$pcolor]${2}$fg[reset_color]"
+	    pchars="[W]"; pcolor="yellow"; message="$fg_no_bold[$pcolor]${2}$reset_color"
 	    ;;
 	failure)
-	    pchars="[E]"; pcolor="red"; message="$fg_no_bold[$pcolor]${2}$fg[reset_color]"
+	    pchars="[E]"; pcolor="red"; message="$fg_no_bold[$pcolor]${2}$reset_color"
 	    returncode=1
 	    ;;
 	*)
@@ -78,7 +78,7 @@ function _msg() {
 	    returncode=127
 	    ;;
     esac
-    ${=command} "${progname} $fg_bold[$pcolor]$pchars$fg[reset_color] ${message}$color[reset_color]" >&2
+    ${=command} "${progname} $fg_bold[$pcolor]$pchars$reset_color ${message}$color[reset_color]" >&2
     return $returncode
 }
 function _message say()
@@ -298,8 +298,20 @@ EOF
     return 0
 }
 # }}}
-# }}}
-# {{{ - TOMB USAGE
+check_command() {
+    #generic checks; useful for interaction, to check if there are problems
+    #before wasting user's time
+    
+    if ! option_is_set --ignore-swap; then
+        if [[ $1 == 'create' || $1 == 'open' ]]; then
+            if ! check_swap; then
+                error "Swap activated. Disable it with swapoff, or use --ignore-swap"
+                exit 1
+            fi
+        fi
+    fi
+}
+
 usage() {
     cat <<EOF
 
@@ -1591,19 +1603,19 @@ main() {
     # to add some options?  Well, keep in mind that an option CAN'T
     # have differente meanings/behaviour in different subcommands.
 
-    #    For example, "-s" means "size" and accept an argument. If you are tempted to add
-    #    an option "-s" (that means, for example "silent", and doesn't accept an argument)
-    #              DON'T DO IT!
+    # For example, "-s" means "size" and accept an argument. If you are tempted to add
+    # an option "-s" (that means, for example "silent", and doesn't accept an argument)
+    #           DON'T DO IT!
 
-    #     There are two reasons for that:
+    #  There are two reasons for that:
     #       I. usability; user expect that "-s" is "size"
-    #       II. Option parsing WILL EXPLODE if you do this kind of bad things
-    #               (it will say "option defined more than once, and he's right")
+    #    II. Option parsing WILL EXPLODE if you do this kind of bad things
+    #            (it will say "option defined more than once, and he's right")
     #
     #    If you want to use the same option in multiple commands then
     #    you can only use the non-abbreviated long-option version like:
     #    -force and NOT -f
-    main_opts=(q -quiet=q D -debug=D h -help=h v -version=v -no-color)
+	main_opts=(q -quiet=q D -debug=D h -help=h v -version=v -no-color)
     subcommands_opts[__default]=""
     subcommands_opts[open]="f n -nohook=n k: -key=k o: -mount-options=o"
     subcommands_opts[mount]=${subcommands_opts[open]}
@@ -1624,6 +1636,7 @@ main() {
     subcommands_opts[source]=""
     subcommands_opts[status]=""
     subcommands_opts[resize]="s: -size=s k: -key=k"
+    subcommands_opts[check]="-ignore-swap"
 #    subcommands_opts[translate]=""
     
     ### Detect subcommand
@@ -1635,7 +1648,20 @@ main() {
     done
     local -a oldstar
     oldstar=($argv)
-    zparseopts -M -E -D -Adiscardme ${every_opts}
+	#### detect early: useful for --optiion-parsing
+    zparseopts -M -D -Adiscardme ${every_opts}
+	if [[ -n ${(k)discardme[--option-parsing]} ]]; then
+		echo $1
+		if [[ -n "$1" ]]; then
+			return 1
+		fi
+		return 0
+	fi
+	unset discardme
+    if ! zparseopts -M -E -D -Adiscardme ${every_opts}; then
+		error "error parsing"
+		return 127
+	fi
     unset discardme
     subcommand=$1
     if [[ -z $subcommand ]]; then
@@ -1723,14 +1749,13 @@ main() {
 		_warning "steghide not installed. Cannot bury your key"
 		return 1
 	    fi
-	    encode_key ${CMD2} ${CMD3}
-	    ;;
+		 encode_key $PARAM[1] $PARAM[2] ;;	
 	exhume)
 	    if [ "$STEGHIDE" = 0 ]; then
  		_warning "steghide not installed. Cannot exhume your key"
 		return 1
 	    fi
-	    decode_key ${CMD2}
+		 decode_key $PARAM[1] 
 	    ;;
 	resize)
         check_priv
@@ -1740,8 +1765,9 @@ main() {
 	'source')   return 0 ;;
 	install)    check_priv ; install_tomb ;;
 	askpass)    ask_password ${CMD2} ${CMD3} ;;
-	mktemp)     safe_dir ${CMD2} ;;
+	 mktemp) safe_dir $PARAM[1] ;;
 	translate)  generate_translatable_strings ;;
+      check) check_command $PARAM[1] ;;
 	__default)
 	    cat <<EOF
 Tomb $VERSION - a strong and gentle undertaker for your secrets
@@ -1770,8 +1796,9 @@ EOF
 # {{{ RUNTIME
 check_bin
 main $@
-if [[ $? != 0 ]]; then #this "if" seems useless, but avoid source tomb source from exiting
-    exit $?
+ret=$?
+if [[ $ret != 0 ]]; then #this "if" seems useless, but avoid source tomb source from exiting
+    exit $ret
 fi
 # }}}
 
diff --git a/src/undertaker b/src/undertaker
@@ -32,21 +32,21 @@ TRAPSTOP() die "STOP signal caught, undertaker aborting."
 # first of all source the tomb core functions
 which tomb > /dev/null
 if [[ $? != 0 ]]; then
-    print "$fg[red][!]$fg[white] Tomb command not found, operation aborted."; exit 1
+    print "$fg[red][!]$fg[white] Tomb command not found, operation aborted." >&2; exit 1
 fi
 
 key_found() {
     # $1 is "url"
-    if option_is_set --machine-parseable; then
-        print -n '[m]'
+    if option_is_set --batch; then
+        print -n '[m]' >&2
     fi
-    print "$fg[white][found] $1"
+    print "$fg[white][found] $1" >&2
 }
 
 
 
 function undertaker_scheme() {
-    zparseopts -D -print-path=print_path
+    zparseopts -D -path=print_path
 
     local scheme
     scheme=$1
@@ -60,7 +60,7 @@ function undertaker_scheme() {
             act "access to bluetooth protocol requested"
             which obexftp &> /dev/null
             if [[ $? != 0 ]]; then
-                error "obexftp not found, needed for bluetooth: operation aborted."
+                _warning "obexftp not found, needed for bluetooth: operation aborted."
                 return 64
             fi
             keytmp=`safe_dir undertaker`
@@ -95,10 +95,10 @@ function undertaker_scheme() {
 
         file)
             if ! [[ -f $keypath ]]; then
-                error "Invalid path $keypath"
+                _warning "Invalid path $keypath"
                 return 1
             fi
-            if [[ -n $print_path ]]; then
+            if option_is_set --path; then
                 key_found $scheme://$keypath;
             else
                 < $keypath
@@ -122,7 +122,7 @@ function undertaker_scheme() {
             #It implements automounting using udisks; udisks is a (recently)
             #new technology, so we can't rely on it being present
             if ! which udisks &> /dev/null; then
-                error 'udisks not found'
+                _warning 'udisks not found'
                 exit 64
             fi
             while true; do
@@ -149,7 +149,7 @@ function undertaker_scheme() {
 
         *)
             if ! which undertaker-$scheme &> /dev/null; then
-                error "url protocol not recognized: $scheme"
+                _warning "url protocol not recognized: $scheme"
                 return 64
             fi
             undertaker-$scheme ${print_path[@]} ${scheme}://$keypath
@@ -162,13 +162,14 @@ function main() {
         typeset -A opts
         zparseopts -M -E -D -Aopts -poll -path -batch
         if ! [ $1 ] ; then
-            error "an argument is missing, the undertaker is confused"
-            act "usage: undertaker [options] url://host:path/to/tomb.key"
+            print "[W] an argument is missing, the undertaker is confused" >&2
+            print "usage: undertaker [options] url://host:path/to/tomb.key" >&2
             exit 1;
         fi
         local -a tomb_opts
         if [[ -n ${(k)opts[--batch]} ]]; then
-            tomb_opts+='--batch'
+            tomb_opts+='--no-color'
+			tomb_opts+='--quiet'
         fi
         local -a under_opts
         if [[ -n ${(k)opts[--path]} ]]; then
@@ -178,13 +179,14 @@ function main() {
         for a in ${(k)opts}; do
             backupopts[$a]=${opts[$a]}
         done
-        source tomb ${tomb_opts[@]} source
+		source tomb ${tomb_opts[@]} source
+		TOMBEXEC=undertaker
         for a in ${(k)backupopts}; do
             opts[$a]=${backupopts[$a]}
         done
         check_bin
 
-        notice "Undertaker will look for $1"
+        _success "Undertaker will look for $1"
 
         ARG1=${1}
         scheme=${ARG1%://*}