← Back to team overview

openlp-core team mailing list archive

[Merge] lp:~googol/openlp/central-settings-place into lp:openlp

 

Andreas Preikschat has proposed merging lp:~googol/openlp/central-settings-place into lp:openlp.

Requested reviews:
  Tim Bentley (trb143)
Related bugs:
  Bug #1096559 in OpenLP: "Central place for default settings"
  https://bugs.launchpad.net/openlp/+bug/1096559

For more details, see:
https://code.launchpad.net/~googol/openlp/central-settings-place/+merge/143418

Hello,

NOTE: There is still a bugs:
1) the defaults for the display screen are not taken from the current screen (instead build in defaults are used). But please review this anyway!

- fixed bug #1096559 (Central place for default settings)

I reworked the settings management. All core settings are now stored in the Settings class. The plugin settings are stored in the <my>plugin.py file. On start up the plugin settings are pulled in the central dict.

Unfortunately I had to leave the default_value parameter in the value() method definiton, because we have some "dynamic" methods ("<myPlugin> %s").

I also implemented a central dict to store old and replaced settings. This allows us to rename settings without losing the value saved.

Together with this rework I moved/splitted a few files.
Namely, I have moved the ScreenList class from openlp/core/ui to openlp/core/lib. When you look at trunk you'll see that in most cases the ScreenList was the only class imported from ui (indicating that it does not belong to ui). And basically the ScreenList is just like the ImageManager. It does not really display anything.
Furthermore, I splitted the ui.py file. Now we have a uistrings.py and ui.py file. While programming I noticed, that the UiStrings class does not require any module (other then the translate function).

In both cases (ScreenList and UiStrings) they caused import errors because importing them triggered other imports pointing to openlp.ui.Whatever; which then triggered the import of openlp.core.ui(.__init__) .

I hope that makes sense to you :)
-- 
https://code.launchpad.net/~googol/openlp/central-settings-place/+merge/143418
Your team OpenLP Core is subscribed to branch lp:openlp.
=== modified file 'openlp/core/__init__.py'
--- openlp/core/__init__.py	2012-12-29 20:56:56 +0000
+++ openlp/core/__init__.py	2013-01-15 22:23:25 +0000
@@ -43,14 +43,13 @@
 
 from PyQt4 import QtCore, QtGui
 
-from openlp.core.lib import Receiver, Settings, check_directory_exists
-from openlp.core.lib.ui import UiStrings
+from openlp.core.lib import Receiver, Settings, check_directory_exists, ScreenList, UiStrings
 from openlp.core.resources import qInitResources
 from openlp.core.ui.mainwindow import MainWindow
 from openlp.core.ui.firsttimelanguageform import FirstTimeLanguageForm
 from openlp.core.ui.firsttimeform import FirstTimeForm
 from openlp.core.ui.exceptionform import ExceptionForm
-from openlp.core.ui import SplashScreen, ScreenList
+from openlp.core.ui import SplashScreen
 from openlp.core.utils import AppLocation, LanguageManager, VersionThread, \
     get_application_version
 
@@ -118,7 +117,7 @@
         # Decide how many screens we have and their size
         screens = ScreenList.create(self.desktop())
         # First time checks in settings
-        has_run_wizard = Settings().value(u'general/has run wizard', False)
+        has_run_wizard = Settings().value(u'general/has run wizard')
         if not has_run_wizard:
             if FirstTimeForm(screens).exec_() == QtGui.QDialog.Accepted:
                 Settings().setValue(u'general/has run wizard', True)
@@ -129,7 +128,7 @@
                 u'QTableWidget, QListWidget, QTreeWidget {alternate-background-color: ' + base_color.name() + ';}\n'
             application_stylesheet += nt_repair_stylesheet
             self.setStyleSheet(application_stylesheet)
-        show_splash = Settings().value(u'general/show splash', True)
+        show_splash = Settings().value(u'general/show splash')
         if show_splash:
             self.splash = SplashScreen()
             self.splash.show()
@@ -148,7 +147,7 @@
         self.processEvents()
         if not has_run_wizard:
             self.mainWindow.firstTime()
-        update_check = Settings().value(u'general/update check', True)
+        update_check = Settings().value(u'general/update check')
         if update_check:
             VersionThread(self.mainWindow).start()
         Receiver.send_message(u'live_display_blank_check')
@@ -276,7 +275,7 @@
         portable_settings_file = os.path.abspath(os.path.join(app_path, u'..', u'..', u'Data', u'OpenLP.ini'))
         # Make this our settings file
         log.info(u'INI file: %s', portable_settings_file)
-        Settings.setFilename(portable_settings_file)
+        Settings.set_filename(portable_settings_file)
         portable_settings = Settings()
         # Set our data path
         data_path = os.path.abspath(os.path.join(app_path,
@@ -295,7 +294,7 @@
         if app.isAlreadyRunning():
             sys.exit()
     # First time checks in settings
-    if not Settings().value(u'general/has run wizard', False):
+    if not Settings().value(u'general/has run wizard'):
         if not FirstTimeLanguageForm().exec_():
             # if cancel then stop processing
             sys.exit()

=== modified file 'openlp/core/lib/__init__.py'
--- openlp/core/lib/__init__.py	2013-01-02 11:26:21 +0000
+++ openlp/core/lib/__init__.py	2013-01-15 22:23:25 +0000
@@ -90,83 +90,6 @@
     Next = 3
 
 
-class Settings(QtCore.QSettings):
-    """
-    Class to wrap QSettings.
-
-    * Exposes all the methods of QSettings.
-    * Adds functionality for OpenLP Portable. If the ``defaultFormat`` is set to
-    ``IniFormat``, and the path to the Ini file is set using ``setFilename``,
-    then the Settings constructor (without any arguments) will create a Settings
-    object for accessing settings stored in that Ini file.
-    """
-    __filePath__ = u''
-
-    @staticmethod
-    def setFilename(iniFile):
-        """
-        Sets the complete path to an Ini file to be used by Settings objects.
-
-        Does not affect existing Settings objects.
-        """
-        Settings.__filePath__ = iniFile
-
-    def __init__(self, *args):
-        if not args and Settings.__filePath__ and \
-            Settings.defaultFormat() == Settings.IniFormat:
-            QtCore.QSettings.__init__(self, Settings.__filePath__, Settings.IniFormat)
-        else:
-            QtCore.QSettings.__init__(self, *args)
-
-    def value(self, key, defaultValue):
-        """
-        Returns the value for the given ``key``. The returned ``value`` is
-        of the same type as the ``defaultValue``.
-
-        ``key``
-            The key to return the value from.
-
-        ``defaultValue``
-            The value to be returned if the given ``key`` is not present in the
-            config. Note, the ``defaultValue``'s type defines the type the
-            returned is converted to. In other words, if the ``defaultValue`` is
-            a boolean, then the returned value will be converted to a boolean.
-
-            **Note**, this method only converts a few types and might need to be
-            extended if a certain type is missing!
-        """
-        # Check for none as u'' is passed as default and is valid! This is
-        # needed because the settings export does not know the default values,
-        # thus just passes None.
-        if defaultValue is None and not super(Settings, self).contains(key):
-            return None
-        setting =  super(Settings, self).value(key, defaultValue)
-        # On OS X (and probably on other platforms too) empty value from QSettings
-        # is represented as type PyQt4.QtCore.QPyNullVariant. This type has to be
-        # converted to proper 'None' Python type.
-        if isinstance(setting, QtCore.QPyNullVariant) and setting.isNull():
-            setting = None
-        # Handle 'None' type (empty value) properly.
-        if setting is None:
-            # An empty string saved to the settings results in a None type being
-            # returned. Convert it to empty unicode string.
-            if isinstance(defaultValue, unicode):
-                return u''
-            # An empty list saved to the settings results in a None type being
-            # returned.
-            else:
-                return []
-        # Convert the setting to the correct type.
-        if isinstance(defaultValue, bool):
-            if isinstance(setting, bool):
-                return setting
-            # Sometimes setting is string instead of a boolean.
-            return setting == u'true'
-        if isinstance(defaultValue, int):
-            return int(setting)
-        return setting
-
-
 def translate(context, text, comment=None,
     encoding=QtCore.QCoreApplication.CodecForTr, n=-1,
     translate=QtCore.QCoreApplication.translate):
@@ -459,7 +382,10 @@
             u'Locale list separator: start') % (stringlist[0], merged)
 
 
+from uistrings import UiStrings
 from eventreceiver import Receiver
+from screen import ScreenList
+from settings import Settings
 from listwidgetwithdnd import ListWidgetWithDnD
 from formattingtags import FormattingTags
 from spelltextedit import SpellTextEdit
@@ -468,8 +394,7 @@
 from pluginmanager import PluginManager
 from settingstab import SettingsTab
 from serviceitem import ServiceItem, ServiceItemType, ItemCapabilities
-from htmlbuilder import build_html, build_lyrics_format_css, \
-    build_lyrics_outline_css
+from htmlbuilder import build_html, build_lyrics_format_css, build_lyrics_outline_css
 from toolbar import OpenLPToolbar
 from dockwidget import OpenLPDockWidget
 from imagemanager import ImageManager

=== modified file 'openlp/core/lib/db.py'
--- openlp/core/lib/db.py	2012-12-29 20:56:56 +0000
+++ openlp/core/lib/db.py	2013-01-15 22:23:25 +0000
@@ -119,8 +119,7 @@
             session.commit()
             version += 1
     else:
-        version_meta = Metadata.populate(key=u'version',
-            value=int(upgrade.__version__))
+        version_meta = Metadata.populate(key=u'version', value=int(upgrade.__version__))
         session.commit()
     return int(version_meta.value), upgrade.__version__
 
@@ -186,7 +185,7 @@
         self.db_url = u''
         self.is_dirty = False
         self.session = None
-        db_type = settings.value(u'db type', u'sqlite')
+        db_type = settings.value(u'db type')
         if db_type == u'sqlite':
             if db_file_name:
                 self.db_url = u'sqlite:///%s/%s' % (AppLocation.get_section_data_path(plugin_name), db_file_name)
@@ -194,12 +193,12 @@
                 self.db_url = u'sqlite:///%s/%s.sqlite' % (AppLocation.get_section_data_path(plugin_name), plugin_name)
         else:
             self.db_url = u'%s://%s:%s@%s/%s' % (db_type,
-                urlquote(settings.value(u'db username', u'')),
-                urlquote(settings.value(u'db password', u'')),
-                urlquote(settings.value(u'db hostname', u'')),
-                urlquote(settings.value(u'db database', u'')))
+                urlquote(settings.value(u'db username')),
+                urlquote(settings.value(u'db password')),
+                urlquote(settings.value(u'db hostname')),
+                urlquote(settings.value(u'db database')))
             if db_type == u'mysql':
-                db_encoding = settings.value(u'db encoding', u'utf8')
+                db_encoding = settings.value(u'db encoding')
                 self.db_url += u'?charset=%s' % urlquote(db_encoding)
         settings.endGroup()
         if upgrade_mod:

=== modified file 'openlp/core/lib/dockwidget.py'
--- openlp/core/lib/dockwidget.py	2012-12-29 20:56:56 +0000
+++ openlp/core/lib/dockwidget.py	2013-01-15 22:23:25 +0000
@@ -35,8 +35,7 @@
 
 from PyQt4 import QtGui
 
-from openlp.core.lib import build_icon
-from openlp.core.ui import ScreenList
+from openlp.core.lib import build_icon, ScreenList
 
 log = logging.getLogger(__name__)
 

=== modified file 'openlp/core/lib/formattingtags.py'
--- openlp/core/lib/formattingtags.py	2012-12-29 20:56:56 +0000
+++ openlp/core/lib/formattingtags.py	2013-01-15 22:23:25 +0000
@@ -164,7 +164,7 @@
         FormattingTags.add_html_tags(temporary_tags)
 
         # Formatting Tags were also known as display tags.
-        user_expands = Settings().value(u'displayTags/html_tags', u'')
+        user_expands = Settings().value(u'displayTags/html_tags')
         # cPickle only accepts str not unicode strings
         user_expands_string = str(user_expands)
         if user_expands_string:

=== modified file 'openlp/core/lib/imagemanager.py'
--- openlp/core/lib/imagemanager.py	2012-12-29 20:56:56 +0000
+++ openlp/core/lib/imagemanager.py	2013-01-15 22:23:25 +0000
@@ -39,8 +39,7 @@
 
 from PyQt4 import QtCore
 
-from openlp.core.lib import resize_image, image_to_byte, Receiver
-from openlp.core.ui import ScreenList
+from openlp.core.lib import resize_image, image_to_byte, Receiver, ScreenList
 
 log = logging.getLogger(__name__)
 

=== modified file 'openlp/core/lib/mediamanageritem.py'
--- openlp/core/lib/mediamanageritem.py	2012-12-29 20:56:56 +0000
+++ openlp/core/lib/mediamanageritem.py	2013-01-15 22:23:25 +0000
@@ -36,9 +36,10 @@
 from PyQt4 import QtCore, QtGui
 
 from openlp.core.lib import SettingsManager, OpenLPToolbar, ServiceItem, StringContent, build_icon, translate, \
-    Receiver, ListWidgetWithDnD, ServiceItemContext, Settings
+    Receiver, ListWidgetWithDnD, ServiceItemContext, Settings, UiStrings
 from openlp.core.lib.searchedit import SearchEdit
-from openlp.core.lib.ui import UiStrings, create_widget_action, critical_error_message_box
+from openlp.core.lib.ui import create_widget_action, critical_error_message_box
+
 
 log = logging.getLogger(__name__)
 
@@ -336,8 +337,7 @@
 
     def loadFile(self, files):
         """
-        Turn file from Drag and Drop into an array so the Validate code
-        can run it.
+        Turn file from Drag and Drop into an array so the Validate code can run it.
 
         ``files``
             The list of files to be loaded
@@ -444,7 +444,7 @@
         """
         Allows the list click action to be determined dynamically
         """
-        if Settings().value(u'advanced/double click live', False):
+        if Settings().value(u'advanced/double click live'):
             self.onLiveClick()
         else:
             self.onPreviewClick()
@@ -453,7 +453,7 @@
         """
         Allows the change of current item in the list to be actioned
         """
-        if Settings().value(u'advanced/single click preview', False) and self.quickPreviewAllowed \
+        if Settings().value(u'advanced/single click preview') and self.quickPreviewAllowed \
             and self.listView.selectedIndexes() and self.autoSelectId == -1:
             self.onPreviewClick(True)
 

=== modified file 'openlp/core/lib/plugin.py'
--- openlp/core/lib/plugin.py	2012-12-29 20:56:56 +0000
+++ openlp/core/lib/plugin.py	2013-01-15 22:23:25 +0000
@@ -33,8 +33,7 @@
 
 from PyQt4 import QtCore
 
-from openlp.core.lib import Receiver, Settings
-from openlp.core.lib.ui import UiStrings
+from openlp.core.lib import Receiver, Settings, UiStrings
 from openlp.core.utils import get_application_version
 
 log = logging.getLogger(__name__)
@@ -119,7 +118,7 @@
     """
     log.info(u'loaded')
 
-    def __init__(self, name, plugin_helpers=None, media_item_class=None,
+    def __init__(self, name, default_settings, plugin_helpers=None, media_item_class=None,
         settings_tab_class=None, version=None):
         """
         This is the constructor for the plugin object. This provides an easy
@@ -133,8 +132,8 @@
         ``name``
             Defaults to *None*. The name of the plugin.
 
-        ``version``
-            Defaults to *None*. The version of the plugin.
+        ``default_settings``
+            A dict containing the plugin's settings. The value to each key is the default value to be used.
 
         ``plugin_helpers``
             Defaults to *None*. A list of helper objects.
@@ -144,10 +143,14 @@
 
         ``settings_tab_class``
             The class name of the plugin's settings tab.
+
+        ``version``
+            Defaults to *None*, which means that the same version number is used as OpenLP's version number.
         """
         log.debug(u'Plugin %s initialised' % name)
         QtCore.QObject.__init__(self)
         self.name = name
+        Settings.extend_default_settings(default_settings)
         self.textStrings = {}
         self.setPluginTextStrings()
         self.nameStrings = self.textStrings[StringContent.Name]
@@ -190,7 +193,7 @@
         """
         Sets the status of the plugin
         """
-        self.status = Settings().value(self.settingsSection + u'/status', PluginStatus.Inactive)
+        self.status = Settings().value(self.settingsSection + u'/status')
 
     def toggleStatus(self, new_status):
         """

=== modified file 'openlp/core/lib/renderer.py'
--- openlp/core/lib/renderer.py	2012-12-29 20:56:56 +0000
+++ openlp/core/lib/renderer.py	2013-01-15 22:23:25 +0000
@@ -32,9 +32,9 @@
 from PyQt4 import QtGui, QtCore, QtWebKit
 
 from openlp.core.lib import ServiceItem, expand_tags, build_lyrics_format_css, build_lyrics_outline_css, Receiver, \
-    ItemCapabilities, FormattingTags, ImageSource
+    ItemCapabilities, FormattingTags, ImageSource, ScreenList
 from openlp.core.lib.theme import ThemeLevel
-from openlp.core.ui import MainDisplay, ScreenList
+from openlp.core.ui import MainDisplay
 
 log = logging.getLogger(__name__)
 
@@ -48,6 +48,7 @@
 VERSE_FOR_LINE_COUNT = u'\n'.join(map(unicode, xrange(50)))
 FOOTER = [u'Arky Arky (Unknown)', u'Public Domain', u'CCLI 123456']
 
+
 class Renderer(object):
     """
     Class to pull all Renderer interactions into one place. The plugins will

=== renamed file 'openlp/core/ui/screen.py' => 'openlp/core/lib/screen.py'
--- openlp/core/ui/screen.py	2012-12-29 20:56:56 +0000
+++ openlp/core/lib/screen.py	2013-01-15 22:23:25 +0000
@@ -35,10 +35,12 @@
 
 from PyQt4 import QtCore
 
-from openlp.core.lib import Receiver, translate, Settings
+from openlp.core.lib import Receiver, translate
+
 
 log = logging.getLogger(__name__)
 
+
 class ScreenList(object):
     """
     Wrapper to handle the parameters of the display screen.
@@ -241,15 +243,16 @@
         """
         Loads the screen size and the monitor number from the settings.
         """
+        from openlp.core.lib import Settings
         settings = Settings()
         settings.beginGroup(u'general')
-        self.set_current_display(settings.value(u'monitor', self.display_count - 1))
-        self.display = settings.value(u'display on monitor', True)
-        override_display = settings.value(u'override position', False)
-        x = settings.value(u'x position', self.current[u'size'].x())
-        y = settings.value(u'y position', self.current[u'size'].y())
-        width = settings.value(u'width', self.current[u'size'].width())
-        height = settings.value(u'height', self.current[u'size'].height())
+        self.set_current_display(settings.value(u'monitor'))
+        self.display = settings.value(u'display on monitor')
+        override_display = settings.value(u'override position')
+        x = settings.value(u'x position')
+        y = settings.value(u'y position')
+        width = settings.value(u'width')
+        height = settings.value(u'height')
         self.override[u'size'] = QtCore.QRect(x, y, width, height)
         self.override[u'primary'] = False
         settings.endGroup()

=== added file 'openlp/core/lib/settings.py'
--- openlp/core/lib/settings.py	1970-01-01 00:00:00 +0000
+++ openlp/core/lib/settings.py	2013-01-15 22:23:25 +0000
@@ -0,0 +1,311 @@
+# -*- coding: utf-8 -*-
+# vim: autoindent shiftwidth=4 expandtab textwidth=120 tabstop=4 softtabstop=4
+
+###############################################################################
+# OpenLP - Open Source Lyrics Projection                                      #
+# --------------------------------------------------------------------------- #
+# Copyright (c) 2008-2013 Raoul Snyman                                        #
+# Portions copyright (c) 2008-2013 Tim Bentley, Gerald Britton, Jonathan      #
+# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub,      #
+# Meinert Jordan, Armin Köhler, Erik Lundin, Edwin Lunando, Brian T. Meyer.   #
+# Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias Põldaru,          #
+# Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith,             #
+# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Dave Warnock,              #
+# Frode Woldsund, Martin Zibricky, Patrick Zimmermann                         #
+# --------------------------------------------------------------------------- #
+# This program is free software; you can redistribute it and/or modify it     #
+# under the terms of the GNU General Public License as published by the Free  #
+# Software Foundation; version 2 of the License.                              #
+#                                                                             #
+# This program is distributed in the hope that it will be useful, but WITHOUT #
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or       #
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for    #
+# more details.                                                               #
+#                                                                             #
+# You should have received a copy of the GNU General Public License along     #
+# with this program; if not, write to the Free Software Foundation, Inc., 59  #
+# Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
+###############################################################################
+"""
+This class contains the core default settings.
+"""
+import datetime
+import logging
+import os
+import sys
+
+from PyQt4 import QtCore, QtGui
+
+from openlp.core.lib import SlideLimits, ScreenList
+from openlp.core.lib.theme import ThemeLevel
+from openlp.core.lib import UiStrings
+
+
+log = logging.getLogger(__name__)
+
+
+# Fix for bug #1014422.
+X11_BYPASS_DEFAULT = True
+if sys.platform.startswith(u'linux'):
+    # Default to False on Gnome.
+    X11_BYPASS_DEFAULT = bool(not os.environ.get(u'GNOME_DESKTOP_SESSION_ID'))
+    # Default to False on Xfce.
+    if os.environ.get(u'DESKTOP_SESSION') == u'xfce':
+        X11_BYPASS_DEFAULT = False
+
+
+class Settings(QtCore.QSettings):
+    """
+    Class to wrap QSettings.
+
+    * Exposes all the methods of QSettings.
+    * Adds functionality for OpenLP Portable. If the ``defaultFormat`` is set to
+    ``IniFormat``, and the path to the Ini file is set using ``set_filename``,
+    then the Settings constructor (without any arguments) will create a Settings
+    object for accessing settings stored in that Ini file.
+
+    ``__default_settings__``
+        This dict contains all core settings with their default values.
+
+    ``__obsolete_settings__``
+        Put any settings whose key changes or is removed here. In the case that the key is completely removed just leave
+        the dict value for this key empty (empty string). If you renamed a key, but the old name first and the new name
+        as value for this key.
+    """
+    __default_settings__ = {
+        u'advanced/x11 bypass wm': X11_BYPASS_DEFAULT,
+        u'advanced/default service enabled': True,
+        u'advanced/enable exit confirmation': True,
+        u'advanced/save current plugin': False,
+        u'advanced/single click preview': False,
+        # 7 stands for now, 0 to 6 is Monday to Sunday.
+        u'advanced/default service day': 7,
+        u'advanced/max recent files': 20,
+        u'advanced/is portable': False,
+        u'advanced/hide mouse': True,
+        u'advanced/current media plugin': -1,
+        u'advanced/double click live': False,
+        u'advanced/default service hour': 11,
+        u'advanced/default color': u'#ffffff',
+        u'advanced/default image': u':/graphics/openlp-splash-screen.png',
+        u'advanced/expand service item': False,
+        u'advanced/recent file count': 4,
+        u'advanced/default service name': UiStrings().DefaultServiceName,
+        u'advanced/default service minute': 0,
+        u'advanced/slide limits': SlideLimits.End,
+        u'advanced/print slide text': False,
+        u'advanced/add page break': False,
+        u'advanced/print file meta data': False,
+        u'advanced/print notes': False,
+        u'advanced/display size': 0,
+        u'displayTags/html_tags': u'',
+        u'general/ccli number': u'',
+        u'general/has run wizard': False,
+        u'general/update check': True,
+        u'general/language': u'[en]',
+        u'general/songselect password': u'',
+        u'general/recent files': [],
+        u'general/save prompt': False,
+        u'general/auto preview': False,
+        u'general/override position': False,
+        u'general/view mode': u'default',
+        u'general/auto open': False,
+        u'general/enable slide loop': True,
+        u'general/show splash': True,
+        u'general/screen blank': False,
+        u'general/x position': 0, #ScreenList().current[u'size'].x()
+        u'general/y position': 0, # ScreenList().current[u'size'].y()
+        u'general/monitor': 0, # ScreenList().display_count - 1
+        u'general/height': 1024, # ScreenList().current[u'size'].height()
+        u'general/width': 1280, # ScreenList().current[u'size'].width()
+        u'general/loop delay': 5,
+        u'general/songselect username': u'',
+        u'general/audio repeat list': False,
+        u'general/auto unblank': False,
+        u'general/display on monitor': True,
+        u'general/audio start paused': True,
+        # This defaults to yesterday in order to force the update check to run when you've never run it before.
+        u'general/last version test': datetime.datetime.now().date() - datetime.timedelta(days=1),
+        u'general/blank warning': False,
+        u'players/background color': u'#000000',
+        u'servicemanager/service theme': u'',
+        u'shortcuts/viewPreviewPanel': [QtGui.QKeySequence(u'F11')],
+        u'shortcuts/settingsImportItem': [],
+        u'shortcuts/settingsPluginListItem': [QtGui.QKeySequence(u'Alt+F7')],
+        u'shortcuts/modeLiveItem': [],
+        u'shortcuts/songUsageStatus': [QtCore.Qt.Key_F4],
+        u'shortcuts/nextTrackItem': [],
+        u'shortcuts/makeLive': [QtCore.Qt.Key_Enter, QtCore.Qt.Key_Return],
+        u'shortcuts/webSiteItem': [],
+        u'shortcuts/shortcutAction_P': [QtGui.QKeySequence(u'P')],
+        u'shortcuts/previousItem_live': [QtCore.Qt.Key_Up, QtCore.Qt.Key_PageUp],
+        u'shortcuts/shortcutAction_V': [QtGui.QKeySequence(u'V')],
+        u'shortcuts/fileOpenItem': [QtGui.QKeySequence(u'Ctrl+O')],
+        u'shortcuts/viewMediaManagerItem': [QtGui.QKeySequence(u'F8')],
+        u'shortcuts/desktopScreen': [QtGui.QKeySequence(u'D')],
+        u'shortcuts/songExportItem': [],
+        u'shortcuts/modeDefaultItem': [],
+        u'shortcuts/audioPauseItem': [],
+        u'shortcuts/themeScreen': [QtGui.QKeySequence(u'T')],
+        u'shortcuts/expand': [QtCore.Qt.Key_Plus],
+        u'shortcuts/exportThemeItem': [],
+        u'shortcuts/viewThemeManagerItem': [QtGui.QKeySequence(u'F10')],
+        u'shortcuts/playSlidesLoop': [],
+        u'shortcuts/playSlidesOnce': [],
+        u'shortcuts/toolsReindexItem': [],
+        u'shortcuts/toolsAlertItem': [u'F7'],
+        u'shortcuts/printServiceItem': [QtGui.QKeySequence(u'Ctrl+P')],
+        u'shortcuts/moveUp': [QtCore.Qt.Key_PageUp],
+        u'shortcuts/settingsShortcutsItem': [],
+        u'shortcuts/nextItem_live': [QtCore.Qt.Key_Down, QtCore.Qt.Key_PageDown],
+        u'shortcuts/moveTop': [QtCore.Qt.Key_Home],
+        u'shortcuts/blankScreen': [QtCore.Qt.Key_Period],
+        u'shortcuts/settingsConfigureItem': [],
+        u'shortcuts/modeSetupItem': [],
+        u'shortcuts/songUsageDelete': [],
+        u'shortcuts/shortcutAction_C': [QtGui.QKeySequence(u'C')],
+        u'shortcuts/shortcutAction_B': [QtGui.QKeySequence(u'B')],
+        u'shortcuts/shortcutAction_E': [QtGui.QKeySequence(u'E')],
+        u'shortcuts/shortcutAction_I': [QtGui.QKeySequence(u'I')],
+        u'shortcuts/shortcutAction_O': [QtGui.QKeySequence(u'O')],
+        u'shortcuts/importBibleItem': [],
+        u'shortcuts/fileExitItem': [QtGui.QKeySequence(u'Alt+F4')],
+        u'shortcuts/fileSaveItem': [QtGui.QKeySequence(u'Ctrl+S')],
+        u'shortcuts/up': [QtCore.Qt.Key_Up],
+        u'shortcuts/nextService': [QtCore.Qt.Key_Right],
+        u'shortcuts/songImportItem': [],
+        u'shortcuts/toolsOpenDataFolder': [],
+        u'shortcuts/fileNewItem': [QtGui.QKeySequence(u'Ctrl+N')],
+        u'shortcuts/aboutItem': [QtGui.QKeySequence(u'Ctrl+F1')],
+        u'shortcuts/viewLivePanel': [QtGui.QKeySequence(u'F12')],
+        u'shortcuts/songUsageReport': [],
+        u'shortcuts/updateThemeImages': [],
+        u'shortcuts/toolsAddToolItem': [],
+        u'shortcuts/fileSaveAsItem': [QtGui.QKeySequence(u'Ctrl+Shift+S')],
+        u'shortcuts/settingsExportItem': [],
+        u'shortcuts/onlineHelpItem': [QtGui.QKeySequence(u'Alt+F1')],
+        u'shortcuts/escapeItem': [QtCore.Qt.Key_Escape],
+        u'shortcuts/displayTagItem': [],
+        u'shortcuts/moveBottom': [QtCore.Qt.Key_End],
+        u'shortcuts/toolsFirstTimeWizard': [],
+        u'shortcuts/moveDown': [QtCore.Qt.Key_PageDown],
+        u'shortcuts/collapse': [QtCore.Qt.Key_Minus],
+        u'shortcuts/viewServiceManagerItem': [QtGui.QKeySequence(u'F9')],
+        u'shortcuts/previousService': [QtCore.Qt.Key_Left],
+        u'shortcuts/importThemeItem': [],
+        u'shortcuts/down': [QtCore.Qt.Key_Down],
+        u'themes/theme level': ThemeLevel.Song,
+        u'themes/global theme': u'',
+        u'themes/last directory': u'',
+        u'user interface/main window position': QtCore.QPoint(0, 0),
+        u'user interface/preview panel': True,
+        u'user interface/live panel': True,
+        u'user interface/main window geometry': QtCore.QByteArray(),
+        u'user interface/preview splitter geometry': QtCore.QByteArray(),
+        u'user interface/lock panel': False,
+        u'user interface/mainwindow splitter geometry': QtCore.QByteArray(),
+        u'user interface/live splitter geometry': QtCore.QByteArray(),
+        u'user interface/main window state': QtCore.QByteArray(),
+
+        # HAS TO BE HERE. Should be FIXED.
+        u'media/players': u'webkit',
+        u'media/override player': QtCore.Qt.Unchecked,
+
+        u'images 1': u' '
+    }
+    __file_path__ = u''
+    __obsolete_settings__ = {
+        u'bibles/bookname language': u'bibles/book name language'
+    }
+
+    @staticmethod
+    def extend_default_settings(default_values):
+        """
+        Static method to merge the given ``default_values`` with the ``Settings.__default_settings__``.
+
+        ``default_values``
+            A dict with setting keys and their default values.
+        """
+        Settings.__default_settings__ = dict(default_values.items() + Settings.__default_settings__.items())
+
+    @staticmethod
+    def set_filename(iniFile):
+        """
+        Sets the complete path to an Ini file to be used by Settings objects.
+
+        Does not affect existing Settings objects.
+        """
+        Settings.__file_path__ = iniFile
+
+    @staticmethod
+    def set_up_default_values():
+        """
+        This static method is called on start up. It is used to perform any operation on the __default_settings__ dict.
+        """
+        # Make sure the string is translated (when building the dict the string is not translated because the translate
+        # function was not set up as this stage).
+        Settings.__default_settings__[u'advanced/default service name'] = UiStrings().DefaultServiceName
+
+    def __init__(self, *args):
+        if not args and Settings.__file_path__ and Settings.defaultFormat() == Settings.IniFormat:
+            QtCore.QSettings.__init__(self, Settings.__file_path__, Settings.IniFormat)
+        else:
+            QtCore.QSettings.__init__(self, *args)
+
+    def remove_obsolete_settings(self):
+        """
+        This method is only called to clean up the config. It does two things: First it completely remove old settings
+        (to do this, just leave the new_key empty). And it copies the value from old_key to new_key and then removes the
+        old_key.
+        """
+        for old_key, new_key in Settings.__obsolete_settings__.items():
+            if self.contains(old_key):
+                if new_key:
+                    # Copy the value from the old_key to the new_key.
+                    self.setValue(new_key, super(Settings, self).value(old_key))
+                self.remove(old_key)
+
+    def value(self, key, default_value=None):
+        """
+        Returns the value for the given ``key``. The returned ``value`` is of the same type as the default value in the
+        *Settings.__default_settings__* dict.
+
+        **Note**, this method only converts a few types and might need to be extended if a certain type is missing!
+
+        ``key``
+            The key to return the value from.
+
+        ``defaultValue``
+            **Note**, do **not** use this. It is *only* for dynamic keys such as ``something %d``.
+        """
+
+        if default_value is None:
+            # if group() is not empty the group has not been specified together with the key.
+            if self.group():
+                default_value = Settings.__default_settings__[self.group() + u'/' + key]
+            else:
+                default_value = Settings.__default_settings__[key]
+        setting = super(Settings, self).value(key, default_value)
+        # On OS X (and probably on other platforms too) empty value from QSettings is represented as type
+        # PyQt4.QtCore.QPyNullVariant. This type has to be converted to proper 'None' Python type.
+        if isinstance(setting, QtCore.QPyNullVariant) and setting.isNull():
+            setting = None
+        # Handle 'None' type (empty value) properly.
+        if setting is None:
+            # An empty string saved to the settings results in a None type being returned.
+            # Convert it to empty unicode string.
+            if isinstance(default_value, unicode):
+                return u''
+            # An empty list saved to the settings results in a None type being returned.
+            else:
+                return []
+        # Convert the setting to the correct type.
+        if isinstance(default_value, bool):
+            if isinstance(setting, bool):
+                return setting
+            # Sometimes setting is string instead of a boolean.
+            return setting == u'true'
+        if isinstance(default_value, int):
+            return int(setting)
+        return setting
+

=== modified file 'openlp/core/lib/settingsmanager.py'
--- openlp/core/lib/settingsmanager.py	2012-12-29 20:56:56 +0000
+++ openlp/core/lib/settingsmanager.py	2013-01-15 22:23:25 +0000
@@ -27,9 +27,8 @@
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
 """
-Provide handling for persisting OpenLP settings.  OpenLP uses QSettings to
-manage settings persistence.  QSettings provides a single API for saving and
-retrieving settings from the application but writes to disk in an OS dependant
+Provide handling for persisting OpenLP settings.  OpenLP uses QSettings to manage settings persistence.  QSettings
+provides a single API for saving and retrieving settings from the application but writes to disk in an OS dependant
 format.
 """
 import os
@@ -39,10 +38,10 @@
 from openlp.core.lib import Settings
 from openlp.core.utils import AppLocation
 
+
 class SettingsManager(object):
     """
-    Class to provide helper functions for the loading and saving of application
-    settings.
+    Class to provide helper functions for the loading and saving of application settings.
     """
 
     @staticmethod
@@ -51,8 +50,7 @@
         Read the last directory used for plugin.
 
         ``section``
-            The section of code calling the method. This is used in the
-            settings key.
+            The section of code calling the method. This is used in the settings key.
 
         ``num``
             Defaults to *None*. A further qualifier.
@@ -69,8 +67,7 @@
         Save the last directory used for plugin.
 
         ``section``
-            The section of code calling the method. This is used in the
-            settings key.
+            The section of code calling the method. This is used in the settings key.
 
         ``directory``
             The directory being stored in the settings.
@@ -85,7 +82,7 @@
         Settings().setValue(section + u'/' + name, directory)
 
     @staticmethod
-    def set_list(section, name, list):
+    def set_list(section, name, list_to_save):
         """
         Save a list to application settings.
 
@@ -95,16 +92,16 @@
         ``name``
             The name of the list to save.
 
-        ``list``
+        ``list_to_save``
             The list of values to save.
         """
         settings = Settings()
         settings.beginGroup(section)
         old_count = settings.value(u'%s count' % name, 0)
-        new_count = len(list)
+        new_count = len(list_to_save)
         settings.setValue(u'%s count' % name, new_count)
         for counter in range(new_count):
-            settings.setValue(u'%s %d' % (name, counter), list[counter - 1])
+            settings.setValue(u'%s %d' % (name, counter), list_to_save[counter - 1])
         if old_count > new_count:
             # Tidy up any old list items
             for counter in range(new_count, old_count):
@@ -125,14 +122,14 @@
         settings = Settings()
         settings.beginGroup(section)
         list_count = settings.value(u'%s count' % name, 0)
-        list = []
+        loaded_list = []
         if list_count:
             for counter in range(list_count):
                 item = settings.value(u'%s %d' % (name, counter), u'')
                 if item:
-                    list.append(item)
+                    loaded_list.append(item)
         settings.endGroup()
-        return list
+        return loaded_list
 
     @staticmethod
     def get_files(section=None, extension=None):
@@ -140,8 +137,7 @@
         Get a list of files from the data files path.
 
         ``section``
-            Defaults to *None*. The section of code getting the files - used
-            to load from a section's data subdirectory.
+            Defaults to *None*. The section of code getting the files - used to load from a section's data subdirectory.
 
         ``extension``
             Defaults to *None*. The extension to search for.
@@ -154,8 +150,7 @@
         except OSError:
             return []
         if extension:
-            return [filename for filename in files
-                if extension == os.path.splitext(filename)[1]]
+            return [filename for filename in files if extension == os.path.splitext(filename)[1]]
         else:
             # no filtering required
             return files

=== modified file 'openlp/core/lib/theme.py'
--- openlp/core/lib/theme.py	2012-12-29 20:56:56 +0000
+++ openlp/core/lib/theme.py	2013-01-15 22:23:25 +0000
@@ -36,7 +36,7 @@
 from xml.dom.minidom import Document
 from lxml import etree, objectify
 
-from openlp.core.lib import str_to_bool
+from openlp.core.lib import str_to_bool, ScreenList
 
 log = logging.getLogger(__name__)
 
@@ -380,8 +380,7 @@
         # Create italics name element
         self.child_element(background, u'italics', unicode(italics))
         # Create indentation name element
-        self.child_element(
-            background, u'line_adjustment', unicode(line_adjustment))
+        self.child_element(background, u'line_adjustment', unicode(line_adjustment))
         # Create Location element
         element = self.theme_xml.createElement(u'location')
         element.setAttribute(u'override', unicode(override))
@@ -451,7 +450,6 @@
         Set the header and footer size into the current primary screen.
         10 px on each side is removed to allow for a border.
         """
-        from openlp.core.ui import ScreenList
         current_screen = ScreenList().current
         self.font_main_y = 0
         self.font_main_width = current_screen[u'size'].width() - 20

=== modified file 'openlp/core/lib/ui.py'
--- openlp/core/lib/ui.py	2012-12-29 20:56:56 +0000
+++ openlp/core/lib/ui.py	2013-01-15 22:23:25 +0000
@@ -33,116 +33,12 @@
 
 from PyQt4 import QtCore, QtGui
 
-from openlp.core.lib import build_icon, Receiver, translate
+from openlp.core.lib import build_icon, translate, Receiver, UiStrings
 from openlp.core.utils.actions import ActionList
 
+
 log = logging.getLogger(__name__)
 
-class UiStrings(object):
-    """
-    Provide standard strings for objects to use.
-    """
-    __instance__ = None
-
-    def __new__(cls):
-        """
-        Override the default object creation method to return a single instance.
-        """
-        if not cls.__instance__:
-            cls.__instance__ = object.__new__(cls)
-        return cls.__instance__
-
-    def __init__(self):
-        """
-        These strings should need a good reason to be retranslated elsewhere.
-        Should some/more/less of these have an &amp; attached?
-        """
-        self.About = translate('OpenLP.Ui', 'About')
-        self.Add = translate('OpenLP.Ui', '&Add')
-        self.Advanced = translate('OpenLP.Ui', 'Advanced')
-        self.AllFiles = translate('OpenLP.Ui', 'All Files')
-        self.Automatic = translate('OpenLP.Ui', 'Automatic')
-        self.BackgroundColor = translate('OpenLP.Ui', 'Background Color')
-        self.Bottom = translate('OpenLP.Ui', 'Bottom')
-        self.Browse = translate('OpenLP.Ui', 'Browse...')
-        self.Cancel = translate('OpenLP.Ui', 'Cancel')
-        self.CCLINumberLabel = translate('OpenLP.Ui', 'CCLI number:')
-        self.CreateService = translate('OpenLP.Ui', 'Create a new service.')
-        self.ConfirmDelete = translate('OpenLP.Ui', 'Confirm Delete')
-        self.Continuous = translate('OpenLP.Ui', 'Continuous')
-        self.Default = translate('OpenLP.Ui', 'Default')
-        self.DefaultColor = translate('OpenLP.Ui', 'Default Color:')
-        self.Delete = translate('OpenLP.Ui', '&Delete')
-        self.DisplayStyle = translate('OpenLP.Ui', 'Display style:')
-        self.Duplicate = translate('OpenLP.Ui', 'Duplicate Error')
-        self.Edit = translate('OpenLP.Ui', '&Edit')
-        self.EmptyField = translate('OpenLP.Ui', 'Empty Field')
-        self.Error = translate('OpenLP.Ui', 'Error')
-        self.Export = translate('OpenLP.Ui', 'Export')
-        self.File = translate('OpenLP.Ui', 'File')
-        self.FontSizePtUnit = translate('OpenLP.Ui', 'pt', 'Abbreviated font pointsize unit')
-        self.Help = translate('OpenLP.Ui', 'Help')
-        self.Hours = translate('OpenLP.Ui', 'h', 'The abbreviated unit for hours')
-        self.IFdSs = translate('OpenLP.Ui', 'Invalid Folder Selected', 'Singular')
-        self.IFSs = translate('OpenLP.Ui', 'Invalid File Selected', 'Singular')
-        self.IFSp = translate('OpenLP.Ui', 'Invalid Files Selected', 'Plural')
-        self.Image = translate('OpenLP.Ui', 'Image')
-        self.Import = translate('OpenLP.Ui', 'Import')
-        self.LayoutStyle = translate('OpenLP.Ui', 'Layout style:')
-        self.Live = translate('OpenLP.Ui', 'Live')
-        self.LiveBGError = translate('OpenLP.Ui', 'Live Background Error')
-        self.LiveToolbar = translate('OpenLP.Ui', 'Live Toolbar')
-        self.Load = translate('OpenLP.Ui', 'Load')
-        self.Minutes = translate('OpenLP.Ui', 'm', 'The abbreviated unit for minutes')
-        self.Middle = translate('OpenLP.Ui', 'Middle')
-        self.New = translate('OpenLP.Ui', 'New')
-        self.NewService = translate('OpenLP.Ui', 'New Service')
-        self.NewTheme = translate('OpenLP.Ui', 'New Theme')
-        self.NextTrack = translate('OpenLP.Ui', 'Next Track')
-        self.NFdSs = translate('OpenLP.Ui', 'No Folder Selected', 'Singular')
-        self.NFSs = translate('OpenLP.Ui', 'No File Selected', 'Singular')
-        self.NFSp = translate('OpenLP.Ui', 'No Files Selected', 'Plural')
-        self.NISs = translate('OpenLP.Ui', 'No Item Selected', 'Singular')
-        self.NISp = translate('OpenLP.Ui', 'No Items Selected', 'Plural')
-        self.OLPV1 = translate('OpenLP.Ui', 'openlp.org 1.x')
-        self.OLPV2 = translate('OpenLP.Ui', 'OpenLP 2')
-        self.OLPV2x = translate('OpenLP.Ui', 'OpenLP 2.1')
-        self.OpenLPStart = translate('OpenLP.Ui', 'OpenLP is already running. Do you wish to continue?')
-        self.OpenService = translate('OpenLP.Ui', 'Open service.')
-        self.PlaySlidesInLoop = translate('OpenLP.Ui','Play Slides in Loop')
-        self.PlaySlidesToEnd = translate('OpenLP.Ui','Play Slides to End')
-        self.Preview = translate('OpenLP.Ui', 'Preview')
-        self.PrintService = translate('OpenLP.Ui', 'Print Service')
-        self.ReplaceBG = translate('OpenLP.Ui', 'Replace Background')
-        self.ReplaceLiveBG = translate('OpenLP.Ui', 'Replace live background.')
-        self.ResetBG = translate('OpenLP.Ui', 'Reset Background')
-        self.ResetLiveBG = translate('OpenLP.Ui', 'Reset live background.')
-        self.Seconds = translate('OpenLP.Ui', 's', 'The abbreviated unit for seconds')
-        self.SaveAndPreview = translate('OpenLP.Ui', 'Save && Preview')
-        self.Search = translate('OpenLP.Ui', 'Search')
-        self.SearchThemes = translate('OpenLP.Ui', 'Search Themes...', 'Search bar place holder text ')
-        self.SelectDelete = translate('OpenLP.Ui', 'You must select an item to delete.')
-        self.SelectEdit = translate('OpenLP.Ui', 'You must select an item to edit.')
-        self.Settings = translate('OpenLP.Ui', 'Settings')
-        self.SaveService = translate('OpenLP.Ui', 'Save Service')
-        self.Service = translate('OpenLP.Ui', 'Service')
-        self.Split = translate('OpenLP.Ui', 'Optional &Split')
-        self.SplitToolTip = translate('OpenLP.Ui',
-            'Split a slide into two only if it does not fit on the screen as one slide.')
-        self.StartTimeCode = translate('OpenLP.Ui', 'Start %s')
-        self.StopPlaySlidesInLoop = translate('OpenLP.Ui', 'Stop Play Slides in Loop')
-        self.StopPlaySlidesToEnd = translate('OpenLP.Ui', 'Stop Play Slides to End')
-        self.Theme = translate('OpenLP.Ui', 'Theme', 'Singular')
-        self.Themes = translate('OpenLP.Ui', 'Themes', 'Plural')
-        self.Tools = translate('OpenLP.Ui', 'Tools')
-        self.Top = translate('OpenLP.Ui', 'Top')
-        self.UnsupportedFile = translate('OpenLP.Ui', 'Unsupported File')
-        self.VersePerSlide = translate('OpenLP.Ui', 'Verse Per Slide')
-        self.VersePerLine = translate('OpenLP.Ui', 'Verse Per Line')
-        self.Version = translate('OpenLP.Ui', 'Version')
-        self.View = translate('OpenLP.Ui', 'View')
-        self.ViewMode = translate('OpenLP.Ui', 'View Mode')
-
 
 def add_welcome_page(parent, image):
     """

=== added file 'openlp/core/lib/uistrings.py'
--- openlp/core/lib/uistrings.py	1970-01-01 00:00:00 +0000
+++ openlp/core/lib/uistrings.py	2013-01-15 22:23:25 +0000
@@ -0,0 +1,147 @@
+# -*- coding: utf-8 -*-
+# vim: autoindent shiftwidth=4 expandtab textwidth=120 tabstop=4 softtabstop=4
+
+###############################################################################
+# OpenLP - Open Source Lyrics Projection                                      #
+# --------------------------------------------------------------------------- #
+# Copyright (c) 2008-2013 Raoul Snyman                                        #
+# Portions copyright (c) 2008-2013 Tim Bentley, Gerald Britton, Jonathan      #
+# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub,      #
+# Meinert Jordan, Armin Köhler, Erik Lundin, Edwin Lunando, Brian T. Meyer.   #
+# Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias Põldaru,          #
+# Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith,             #
+# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Dave Warnock,              #
+# Frode Woldsund, Martin Zibricky, Patrick Zimmermann                         #
+# --------------------------------------------------------------------------- #
+# This program is free software; you can redistribute it and/or modify it     #
+# under the terms of the GNU General Public License as published by the Free  #
+# Software Foundation; version 2 of the License.                              #
+#                                                                             #
+# This program is distributed in the hope that it will be useful, but WITHOUT #
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or       #
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for    #
+# more details.                                                               #
+#                                                                             #
+# You should have received a copy of the GNU General Public License along     #
+# with this program; if not, write to the Free Software Foundation, Inc., 59  #
+# Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
+###############################################################################
+"""
+The :mod:`uistrings` module provides standard strings for OpenLP.
+"""
+import logging
+
+from openlp.core.lib import translate
+
+
+log = logging.getLogger(__name__)
+
+
+class UiStrings(object):
+    """
+    Provide standard strings for objects to use.
+    """
+    __instance__ = None
+
+    def __new__(cls):
+        """
+        Override the default object creation method to return a single instance.
+        """
+        if not cls.__instance__:
+            cls.__instance__ = object.__new__(cls)
+        return cls.__instance__
+
+    def __init__(self):
+        """
+        These strings should need a good reason to be retranslated elsewhere.
+        Should some/more/less of these have an &amp; attached?
+        """
+        self.About = translate('OpenLP.Ui', 'About')
+        self.Add = translate('OpenLP.Ui', '&Add')
+        self.Advanced = translate('OpenLP.Ui', 'Advanced')
+        self.AllFiles = translate('OpenLP.Ui', 'All Files')
+        self.Automatic = translate('OpenLP.Ui', 'Automatic')
+        self.BackgroundColor = translate('OpenLP.Ui', 'Background Color')
+        self.Bottom = translate('OpenLP.Ui', 'Bottom')
+        self.Browse = translate('OpenLP.Ui', 'Browse...')
+        self.Cancel = translate('OpenLP.Ui', 'Cancel')
+        self.CCLINumberLabel = translate('OpenLP.Ui', 'CCLI number:')
+        self.CreateService = translate('OpenLP.Ui', 'Create a new service.')
+        self.ConfirmDelete = translate('OpenLP.Ui', 'Confirm Delete')
+        self.Continuous = translate('OpenLP.Ui', 'Continuous')
+        self.Default = translate('OpenLP.Ui', 'Default')
+        self.DefaultColor = translate('OpenLP.Ui', 'Default Color:')
+        self.DefaultServiceName = translate('OpenLP.AdvancedTab', 'Service %Y-%m-%d %H-%M',
+            'This may not contain any of the following characters: /\\?*|<>\[\]":+\n'
+            'See http://docs.python.org/library/datetime.html#strftime-strptime-behavior for more information.')
+        self.Delete = translate('OpenLP.Ui', '&Delete')
+        self.DisplayStyle = translate('OpenLP.Ui', 'Display style:')
+        self.Duplicate = translate('OpenLP.Ui', 'Duplicate Error')
+        self.Edit = translate('OpenLP.Ui', '&Edit')
+        self.EmptyField = translate('OpenLP.Ui', 'Empty Field')
+        self.Error = translate('OpenLP.Ui', 'Error')
+        self.Export = translate('OpenLP.Ui', 'Export')
+        self.File = translate('OpenLP.Ui', 'File')
+        self.FontSizePtUnit = translate('OpenLP.Ui', 'pt', 'Abbreviated font pointsize unit')
+        self.Help = translate('OpenLP.Ui', 'Help')
+        self.Hours = translate('OpenLP.Ui', 'h', 'The abbreviated unit for hours')
+        self.IFdSs = translate('OpenLP.Ui', 'Invalid Folder Selected', 'Singular')
+        self.IFSs = translate('OpenLP.Ui', 'Invalid File Selected', 'Singular')
+        self.IFSp = translate('OpenLP.Ui', 'Invalid Files Selected', 'Plural')
+        self.Image = translate('OpenLP.Ui', 'Image')
+        self.Import = translate('OpenLP.Ui', 'Import')
+        self.LayoutStyle = translate('OpenLP.Ui', 'Layout style:')
+        self.Live = translate('OpenLP.Ui', 'Live')
+        self.LiveBGError = translate('OpenLP.Ui', 'Live Background Error')
+        self.LiveToolbar = translate('OpenLP.Ui', 'Live Toolbar')
+        self.Load = translate('OpenLP.Ui', 'Load')
+        self.Minutes = translate('OpenLP.Ui', 'm', 'The abbreviated unit for minutes')
+        self.Middle = translate('OpenLP.Ui', 'Middle')
+        self.New = translate('OpenLP.Ui', 'New')
+        self.NewService = translate('OpenLP.Ui', 'New Service')
+        self.NewTheme = translate('OpenLP.Ui', 'New Theme')
+        self.NextTrack = translate('OpenLP.Ui', 'Next Track')
+        self.NFdSs = translate('OpenLP.Ui', 'No Folder Selected', 'Singular')
+        self.NFSs = translate('OpenLP.Ui', 'No File Selected', 'Singular')
+        self.NFSp = translate('OpenLP.Ui', 'No Files Selected', 'Plural')
+        self.NISs = translate('OpenLP.Ui', 'No Item Selected', 'Singular')
+        self.NISp = translate('OpenLP.Ui', 'No Items Selected', 'Plural')
+        self.OLPV1 = translate('OpenLP.Ui', 'openlp.org 1.x')
+        self.OLPV2 = translate('OpenLP.Ui', 'OpenLP 2')
+        self.OLPV2x = translate('OpenLP.Ui', 'OpenLP 2.1')
+        self.OpenLPStart = translate('OpenLP.Ui', 'OpenLP is already running. Do you wish to continue?')
+        self.OpenService = translate('OpenLP.Ui', 'Open service.')
+        self.PlaySlidesInLoop = translate('OpenLP.Ui','Play Slides in Loop')
+        self.PlaySlidesToEnd = translate('OpenLP.Ui','Play Slides to End')
+        self.Preview = translate('OpenLP.Ui', 'Preview')
+        self.PrintService = translate('OpenLP.Ui', 'Print Service')
+        self.ReplaceBG = translate('OpenLP.Ui', 'Replace Background')
+        self.ReplaceLiveBG = translate('OpenLP.Ui', 'Replace live background.')
+        self.ResetBG = translate('OpenLP.Ui', 'Reset Background')
+        self.ResetLiveBG = translate('OpenLP.Ui', 'Reset live background.')
+        self.Seconds = translate('OpenLP.Ui', 's', 'The abbreviated unit for seconds')
+        self.SaveAndPreview = translate('OpenLP.Ui', 'Save && Preview')
+        self.Search = translate('OpenLP.Ui', 'Search')
+        self.SearchThemes = translate('OpenLP.Ui', 'Search Themes...', 'Search bar place holder text ')
+        self.SelectDelete = translate('OpenLP.Ui', 'You must select an item to delete.')
+        self.SelectEdit = translate('OpenLP.Ui', 'You must select an item to edit.')
+        self.Settings = translate('OpenLP.Ui', 'Settings')
+        self.SaveService = translate('OpenLP.Ui', 'Save Service')
+        self.Service = translate('OpenLP.Ui', 'Service')
+        self.Split = translate('OpenLP.Ui', 'Optional &Split')
+        self.SplitToolTip = translate('OpenLP.Ui',
+            'Split a slide into two only if it does not fit on the screen as one slide.')
+        self.StartTimeCode = translate('OpenLP.Ui', 'Start %s')
+        self.StopPlaySlidesInLoop = translate('OpenLP.Ui', 'Stop Play Slides in Loop')
+        self.StopPlaySlidesToEnd = translate('OpenLP.Ui', 'Stop Play Slides to End')
+        self.Theme = translate('OpenLP.Ui', 'Theme', 'Singular')
+        self.Themes = translate('OpenLP.Ui', 'Themes', 'Plural')
+        self.Tools = translate('OpenLP.Ui', 'Tools')
+        self.Top = translate('OpenLP.Ui', 'Top')
+        self.UnsupportedFile = translate('OpenLP.Ui', 'Unsupported File')
+        self.VersePerSlide = translate('OpenLP.Ui', 'Verse Per Slide')
+        self.VersePerLine = translate('OpenLP.Ui', 'Verse Per Line')
+        self.Version = translate('OpenLP.Ui', 'Version')
+        self.View = translate('OpenLP.Ui', 'View')
+        self.ViewMode = translate('OpenLP.Ui', 'View Mode')
+

=== modified file 'openlp/core/ui/__init__.py'
--- openlp/core/ui/__init__.py	2012-12-29 20:56:56 +0000
+++ openlp/core/ui/__init__.py	2013-01-15 22:23:25 +0000
@@ -33,31 +33,29 @@
 
 from openlp.core.lib import translate
 
+
 class HideMode(object):
     """
-    This is an enumeration class which specifies the different modes of hiding
-    the display.
+    This is an enumeration class which specifies the different modes of hiding the display.
 
     ``Blank``
-        This mode is used to hide all output, specifically by covering the
-        display with a black screen.
+        This mode is used to hide all output, specifically by covering the display with a black screen.
 
     ``Theme``
-        This mode is used to hide all output, but covers the display with the
-        current theme background, as opposed to black.
+        This mode is used to hide all output, but covers the display with the current theme background, as opposed to
+        black.
 
     ``Desktop``
-        This mode hides all output by minimising the display, leaving the user's
-        desktop showing.
+        This mode hides all output by minimising the display, leaving the user's desktop showing.
     """
     Blank = 1
     Theme = 2
     Screen = 3
 
+
 class AlertLocation(object):
     """
-    This is an enumeration class which controls where Alerts are placed on the
-    screen.
+    This is an enumeration class which controls where Alerts are placed on the screen.
 
     ``Top``
         Place the text at the top of the screen.
@@ -72,10 +70,10 @@
     Middle = 1
     Bottom = 2
 
+
 class DisplayControllerType(object):
     """
-    This is an enumeration class which says where a display controller
-    originated from.
+    This is an enumeration class which says where a display controller originated from.
     """
     Live = 0
     Preview = 1
@@ -88,7 +86,6 @@
 from themeform import ThemeForm
 from filerenameform import FileRenameForm
 from starttimeform import StartTimeForm
-from screen import ScreenList
 from maindisplay import MainDisplay, Display
 from servicenoteform import ServiceNoteForm
 from serviceitemeditform import ServiceItemEditForm

=== modified file 'openlp/core/ui/aboutdialog.py'
--- openlp/core/ui/aboutdialog.py	2012-12-29 20:56:56 +0000
+++ openlp/core/ui/aboutdialog.py	2013-01-15 22:23:25 +0000
@@ -29,8 +29,9 @@
 
 from PyQt4 import QtGui
 
-from openlp.core.lib import build_icon, translate
-from openlp.core.lib.ui import UiStrings, create_button, create_button_box
+from openlp.core.lib import build_icon, translate, UiStrings
+from openlp.core.lib.ui import create_button, create_button_box
+
 
 class Ui_AboutDialog(object):
     def setupUi(self, aboutDialog):

=== modified file 'openlp/core/ui/advancedtab.py'
--- openlp/core/ui/advancedtab.py	2013-01-02 22:32:41 +0000
+++ openlp/core/ui/advancedtab.py	2013-01-15 22:23:25 +0000
@@ -36,13 +36,13 @@
 
 from PyQt4 import QtCore, QtGui
 
-from openlp.core.lib import SettingsTab, translate, build_icon,  Receiver, Settings
-from openlp.core.lib.ui import UiStrings
+from openlp.core.lib import SettingsTab, translate, build_icon,  Receiver, Settings, UiStrings
 from openlp.core.utils import get_images_filter, AppLocation, format_time
 from openlp.core.lib import SlideLimits
 
 log = logging.getLogger(__name__)
 
+
 class AdvancedTab(SettingsTab):
     """
     The :class:`AdvancedTab` manages the advanced settings tab including the UI
@@ -53,17 +53,6 @@
         Initialise the settings tab
         """
         self.displayChanged = False
-        # 7 stands for now, 0 to 6 is Monday to Sunday.
-        self.defaultServiceDay = 7
-        # 11 o'clock is the most popular time for morning service.
-        self.defaultServiceHour = 11
-        self.defaultServiceMinute = 0
-        self.defaultServiceName = translate('OpenLP.AdvancedTab',
-            'Service %Y-%m-%d %H-%M',
-            'This may not contain any of the following characters: '
-            '/\\?*|<>\[\]":+\n'
-            'See http://docs.python.org/library/datetime.html'
-            '#strftime-strptime-behavior for more information.')
         self.defaultImage = u':/graphics/openlp-splash-screen.png'
         self.defaultColor = u'#ffffff'
         self.dataExists = False
@@ -310,7 +299,7 @@
         self.serviceNameLabel.setText(translate('OpenLP.AdvancedTab', 'Name:'))
         self.serviceNameEdit.setToolTip(translate('OpenLP.AdvancedTab', 'Consult the OpenLP manual for usage.'))
         self.serviceNameRevertButton.setToolTip(
-            translate('OpenLP.AdvancedTab', 'Revert to the default service name "%s".') % self.defaultServiceName)
+            translate('OpenLP.AdvancedTab', 'Revert to the default service name "%s".') % UiStrings().DefaultServiceName)
         self.serviceNameExampleLabel.setText(translate('OpenLP.AdvancedTab', 'Example:'))
         self.hideMouseGroupBox.setTitle(translate('OpenLP.AdvancedTab', 'Mouse Cursor'))
         self.hideMouseCheckBox.setText(translate('OpenLP.AdvancedTab', 'Hide mouse cursor when over display window'))
@@ -352,36 +341,26 @@
         # The max recent files value does not have an interface and so never
         # gets actually stored in the settings therefore the default value of
         # 20 will always be used.
-        self.recentSpinBox.setMaximum(settings.value(u'max recent files', 20))
-        self.recentSpinBox.setValue(settings.value(u'recent file count', 4))
-        self.mediaPluginCheckBox.setChecked(settings.value(u'save current plugin', False))
-        self.doubleClickLiveCheckBox.setChecked(settings.value(u'double click live', False))
-        self.singleClickPreviewCheckBox.setChecked(settings.value(u'single click preview', False))
-        self.expandServiceItemCheckBox.setChecked(settings.value(u'expand service item', False))
-        self.enableAutoCloseCheckBox.setChecked(settings.value(u'enable exit confirmation', True))
-        self.hideMouseCheckBox.setChecked(settings.value(u'hide mouse', True))
-        self.serviceNameDay.setCurrentIndex(settings.value(u'default service day', self.defaultServiceDay))
-        self.serviceNameTime.setTime(QtCore.QTime(settings.value(u'default service hour', self.defaultServiceHour),
-            settings.value(u'default service minute',self.defaultServiceMinute)))
+        self.recentSpinBox.setMaximum(settings.value(u'max recent files'))
+        self.recentSpinBox.setValue(settings.value(u'recent file count'))
+        self.mediaPluginCheckBox.setChecked(settings.value(u'save current plugin'))
+        self.doubleClickLiveCheckBox.setChecked(settings.value(u'double click live'))
+        self.singleClickPreviewCheckBox.setChecked(settings.value(u'single click preview'))
+        self.expandServiceItemCheckBox.setChecked(settings.value(u'expand service item'))
+        self.enableAutoCloseCheckBox.setChecked(settings.value(u'enable exit confirmation'))
+        self.hideMouseCheckBox.setChecked(settings.value(u'hide mouse'))
+        self.serviceNameDay.setCurrentIndex(settings.value(u'default service day'))
+        self.serviceNameTime.setTime(QtCore.QTime(settings.value(u'default service hour'),
+            settings.value(u'default service minute')))
         self.shouldUpdateServiceNameExample = True
-        self.serviceNameEdit.setText(settings.value(u'default service name',
-            self.defaultServiceName))
-        default_service_enabled = settings.value(u'default service enabled', True)
+        self.serviceNameEdit.setText(settings.value(u'default service name'))
+        default_service_enabled = settings.value(u'default service enabled')
         self.serviceNameCheckBox.setChecked(default_service_enabled)
         self.serviceNameCheckBoxToggled(default_service_enabled)
-        # Fix for bug #1014422.
-        x11_bypass_default = True
-        if sys.platform.startswith(u'linux'):
-            # Default to False on Gnome.
-            x11_bypass_default = bool(not
-                os.environ.get(u'GNOME_DESKTOP_SESSION_ID'))
-            # Default to False on XFce
-            if os.environ.get(u'DESKTOP_SESSION') == u'xfce':
-                x11_bypass_default = False
-        self.x11BypassCheckBox.setChecked(settings.value(u'x11 bypass wm', x11_bypass_default))
-        self.defaultColor = settings.value(u'default color', u'#ffffff')
-        self.defaultFileEdit.setText(settings.value(u'default image', u':/graphics/openlp-splash-screen.png'))
-        self.slide_limits = settings.value(u'slide limits', SlideLimits.End)
+        self.x11BypassCheckBox.setChecked(settings.value(u'x11 bypass wm'))
+        self.defaultColor = settings.value(u'default color')
+        self.defaultFileEdit.setText(settings.value(u'default image'))
+        self.slide_limits = settings.value(u'slide limits')
         if self.slide_limits == SlideLimits.End:
             self.endSlideRadioButton.setChecked(True)
         elif self.slide_limits == SlideLimits.Wrap:
@@ -423,7 +402,7 @@
         self.dataDirectoryLabel.setText(os.path.abspath(self.currentDataPath))
         self.defaultColorButton.setStyleSheet(u'background-color: %s' % self.defaultColor)
         # Don't allow data directory move if running portable.
-        if settings.value(u'advanced/is portable', False):
+        if settings.value(u'advanced/is portable'):
             self.dataDirectoryGroupBox.hide()
 
     def save(self):
@@ -432,11 +411,10 @@
         """
         settings = Settings()
         settings.beginGroup(self.settingsSection)
-        settings.setValue(u'default service enabled',
-            self.serviceNameCheckBox.isChecked())
+        settings.setValue(u'default service enabled', self.serviceNameCheckBox.isChecked())
         service_name = self.serviceNameEdit.text()
         preset_is_valid = self.generateServiceNameExample()[0]
-        if service_name == self.defaultServiceName or not preset_is_valid:
+        if service_name == UiStrings().DefaultServiceName or not preset_is_valid:
             settings.remove(u'default service name')
             self.serviceNameEdit.setText(service_name)
         else:
@@ -503,7 +481,7 @@
         self.updateServiceNameExample(None)
 
     def onServiceNameRevertButtonClicked(self):
-        self.serviceNameEdit.setText(self.defaultServiceName)
+        self.serviceNameEdit.setText(UiStrings().DefaultServiceName)
         self.serviceNameEdit.setFocus()
 
     def onDefaultColorButtonClicked(self):

=== modified file 'openlp/core/ui/exceptionform.py'
--- openlp/core/ui/exceptionform.py	2012-12-29 20:56:56 +0000
+++ openlp/core/ui/exceptionform.py	2013-01-15 22:23:25 +0000
@@ -85,8 +85,7 @@
     WEBKIT_VERSION = u'-'
 
 
-from openlp.core.lib import translate, SettingsManager
-from openlp.core.lib.ui import UiStrings
+from openlp.core.lib import translate, SettingsManager, UiStrings
 from openlp.core.utils import get_application_version
 
 from exceptiondialog import Ui_ExceptionDialog

=== modified file 'openlp/core/ui/firsttimeform.py'
--- openlp/core/ui/firsttimeform.py	2012-12-29 20:56:56 +0000
+++ openlp/core/ui/firsttimeform.py	2013-01-15 22:23:25 +0000
@@ -116,7 +116,7 @@
             unicode(gettempdir(), get_filesystem_encoding()), u'openlp'))
         self.noInternetFinishButton.setVisible(False)
         # Check if this is a re-run of the wizard.
-        self.hasRunWizard = Settings().value(u'general/has run wizard', False)
+        self.hasRunWizard = Settings().value(u'general/has run wizard')
         # Sort out internet access for downloads
         if self.webAccess:
             songs = self.config.get(u'songs', u'languages')
@@ -202,7 +202,7 @@
                     index = self.themeComboBox.findText(theme)
                     if index == -1:
                         self.themeComboBox.addItem(theme)
-                default_theme = Settings().value(u'themes/global theme', u'')
+                default_theme = Settings().value(u'themes/global theme')
                 # Pre-select the current default theme.
                 index = self.themeComboBox.findText(default_theme)
                 self.themeComboBox.setCurrentIndex(index)

=== modified file 'openlp/core/ui/formattingtagdialog.py'
--- openlp/core/ui/formattingtagdialog.py	2012-12-29 20:56:56 +0000
+++ openlp/core/ui/formattingtagdialog.py	2013-01-15 22:23:25 +0000
@@ -29,8 +29,9 @@
 
 from PyQt4 import QtCore, QtGui
 
-from openlp.core.lib import translate
-from openlp.core.lib.ui import UiStrings, create_button_box
+from openlp.core.lib import translate, UiStrings
+from openlp.core.lib.ui import create_button_box
+
 
 class Ui_FormattingTagDialog(object):
 

=== modified file 'openlp/core/ui/generaltab.py'
--- openlp/core/ui/generaltab.py	2012-12-29 20:56:56 +0000
+++ openlp/core/ui/generaltab.py	2013-01-15 22:23:25 +0000
@@ -30,9 +30,7 @@
 
 from PyQt4 import QtCore, QtGui
 
-from openlp.core.lib import Receiver, Settings, SettingsTab, translate
-from openlp.core.lib.ui import UiStrings
-from openlp.core.ui import ScreenList
+from openlp.core.lib import Receiver, Settings, SettingsTab, translate, ScreenList, UiStrings
 
 log = logging.getLogger(__name__)
 
@@ -247,28 +245,28 @@
         settings.beginGroup(self.settingsSection)
         self.monitorComboBox.clear()
         self.monitorComboBox.addItems(self.screens.get_screen_list())
-        monitorNumber = settings.value(u'monitor', self.screens.display_count - 1)
+        monitorNumber = settings.value(u'monitor')
         self.monitorComboBox.setCurrentIndex(monitorNumber)
-        self.numberEdit.setText(settings.value(u'ccli number', u''))
-        self.usernameEdit.setText(settings.value(u'songselect username', u''))
-        self.passwordEdit.setText(settings.value(u'songselect password', u''))
-        self.saveCheckServiceCheckBox.setChecked(settings.value(u'save prompt', False))
-        self.autoUnblankCheckBox.setChecked(settings.value(u'auto unblank', False))
+        self.numberEdit.setText(settings.value(u'ccli number'))
+        self.usernameEdit.setText(settings.value(u'songselect username'))
+        self.passwordEdit.setText(settings.value(u'songselect password'))
+        self.saveCheckServiceCheckBox.setChecked(settings.value(u'save prompt'))
+        self.autoUnblankCheckBox.setChecked(settings.value(u'auto unblank'))
         self.displayOnMonitorCheck.setChecked(self.screens.display)
-        self.warningCheckBox.setChecked(settings.value(u'blank warning', False))
-        self.autoOpenCheckBox.setChecked(settings.value(u'auto open', False))
-        self.showSplashCheckBox.setChecked(settings.value(u'show splash', True))
-        self.checkForUpdatesCheckBox.setChecked(settings.value(u'update check', True))
-        self.autoPreviewCheckBox.setChecked(settings.value(u'auto preview', False))
-        self.timeoutSpinBox.setValue(settings.value(u'loop delay', 5))
-        self.monitorRadioButton.setChecked(not settings.value(u'override position', False))
-        self.overrideRadioButton.setChecked(settings.value(u'override position', False))
-        self.customXValueEdit.setValue(settings.value(u'x position', self.screens.current[u'size'].x()))
-        self.customYValueEdit.setValue(settings.value(u'y position', self.screens.current[u'size'].y()))
-        self.customHeightValueEdit.setValue(settings.value(u'height', self.screens.current[u'size'].height()))
-        self.customWidthValueEdit.setValue(settings.value(u'width', self.screens.current[u'size'].width()))
-        self.startPausedCheckBox.setChecked(settings.value(u'audio start paused', True))
-        self.repeatListCheckBox.setChecked(settings.value(u'audio repeat list', False))
+        self.warningCheckBox.setChecked(settings.value(u'blank warning'))
+        self.autoOpenCheckBox.setChecked(settings.value(u'auto open'))
+        self.showSplashCheckBox.setChecked(settings.value(u'show splash'))
+        self.checkForUpdatesCheckBox.setChecked(settings.value(u'update check'))
+        self.autoPreviewCheckBox.setChecked(settings.value(u'auto preview'))
+        self.timeoutSpinBox.setValue(settings.value(u'loop delay'))
+        self.monitorRadioButton.setChecked(not settings.value(u'override position',))
+        self.overrideRadioButton.setChecked(settings.value(u'override position'))
+        self.customXValueEdit.setValue(settings.value(u'x position'))
+        self.customYValueEdit.setValue(settings.value(u'y position'))
+        self.customHeightValueEdit.setValue(settings.value(u'height'))
+        self.customWidthValueEdit.setValue(settings.value(u'width'))
+        self.startPausedCheckBox.setChecked(settings.value(u'audio start paused'))
+        self.repeatListCheckBox.setChecked(settings.value(u'audio repeat list'))
         settings.endGroup()
         self.monitorComboBox.setDisabled(self.overrideRadioButton.isChecked())
         self.customXValueEdit.setEnabled(self.overrideRadioButton.isChecked())

=== modified file 'openlp/core/ui/maindisplay.py'
--- openlp/core/ui/maindisplay.py	2013-01-02 22:32:41 +0000
+++ openlp/core/ui/maindisplay.py	2013-01-15 22:23:25 +0000
@@ -42,7 +42,8 @@
     Settings, ImageSource
 from openlp.core.lib.theme import BackgroundType
 
-from openlp.core.ui import HideMode, ScreenList, AlertLocation
+from openlp.core.lib import ScreenList
+from openlp.core.ui import HideMode, AlertLocation
 
 log = logging.getLogger(__name__)
 
@@ -131,18 +132,8 @@
         self.firstTime = True
         self.webLoaded = True
         self.setStyleSheet(u'border: 0px; margin: 0px; padding: 0px;')
-        windowFlags = QtCore.Qt.FramelessWindowHint | QtCore.Qt.Tool | \
-            QtCore.Qt.WindowStaysOnTopHint
-        # Fix for bug #1014422.
-        x11_bypass_default = True
-        if sys.platform.startswith(u'linux'):
-            # Default to False on Gnome.
-            x11_bypass_default = bool(not
-                os.environ.get(u'GNOME_DESKTOP_SESSION_ID'))
-            # Default to False on XFce
-            if os.environ.get(u'DESKTOP_SESSION') == u'xfce':
-                x11_bypass_default = False
-        if Settings().value(u'advanced/x11 bypass wm', x11_bypass_default):
+        windowFlags = QtCore.Qt.FramelessWindowHint | QtCore.Qt.Tool | QtCore.Qt.WindowStaysOnTopHint
+        if Settings().value(u'advanced/x11 bypass wm'):
             windowFlags |= QtCore.Qt.X11BypassWindowManagerHint
         # TODO: The following combination of windowFlags works correctly
         # on Mac OS X. For next OpenLP version we should test it on other
@@ -204,10 +195,10 @@
         if self.isLive:
             # Build the initial frame.
             background_color = QtGui.QColor()
-            background_color.setNamedColor(Settings().value(u'advanced/default color', u'#ffffff'))
+            background_color.setNamedColor(Settings().value(u'advanced/default color'))
             if not background_color.isValid():
                 background_color = QtCore.Qt.white
-            image_file = Settings().value(u'advanced/default image', u':/graphics/openlp-splash-screen.png')
+            image_file = Settings().value(u'advanced/default image')
             splash_image = QtGui.QImage(image_file)
             self.initialFrame = QtGui.QImage(
                 self.screen[u'size'].width(),
@@ -364,7 +355,7 @@
                 # Single screen active
                 if self.screens.display_count == 1:
                     # Only make visible if setting enabled.
-                    if Settings().value(u'general/display on monitor', True):
+                    if Settings().value(u'general/display on monitor'):
                         self.setVisible(True)
                 else:
                     self.setVisible(True)
@@ -410,7 +401,7 @@
             self.footer(serviceItem.foot_text)
         # if was hidden keep it hidden
         if self.hideMode and self.isLive and not serviceItem.is_media():
-            if Settings().value(u'general/auto unblank', False):
+            if Settings().value(u'general/auto unblank'):
                 Receiver.send_message(u'slidecontroller_live_unblank')
             else:
                 self.hideDisplay(self.hideMode)
@@ -432,7 +423,7 @@
         log.debug(u'hideDisplay mode = %d', mode)
         if self.screens.display_count == 1:
             # Only make visible if setting enabled.
-            if not Settings().value(u'general/display on monitor', True):
+            if not Settings().value(u'general/display on monitor'):
                 return
         if mode == HideMode.Screen:
             self.frame.evaluateJavaScript(u'show_blank("desktop");')
@@ -456,7 +447,7 @@
         log.debug(u'showDisplay')
         if self.screens.display_count == 1:
             # Only make visible if setting enabled.
-            if not Settings().value(u'general/display on monitor', True):
+            if not Settings().value(u'general/display on monitor'):
                 return
         self.frame.evaluateJavaScript('show_blank("show");')
         if self.isHidden():
@@ -470,7 +461,7 @@
         """
         Hide mouse cursor when moved over display.
         """
-        if Settings().value(u'advanced/hide mouse', True):
+        if Settings().value(u'advanced/hide mouse'):
             self.setCursor(QtCore.Qt.BlankCursor)
             self.frame.evaluateJavaScript('document.body.style.cursor = "none"')
         else:

=== modified file 'openlp/core/ui/mainwindow.py'
--- openlp/core/ui/mainwindow.py	2013-01-02 22:32:41 +0000
+++ openlp/core/ui/mainwindow.py	2013-01-15 22:23:25 +0000
@@ -40,8 +40,8 @@
 from PyQt4 import QtCore, QtGui
 
 from openlp.core.lib import Renderer, build_icon, OpenLPDockWidget, PluginManager, Receiver, translate, ImageManager, \
-    PluginStatus
-from openlp.core.lib.ui import UiStrings, create_action
+    PluginStatus, ScreenList, UiStrings
+from openlp.core.lib.ui import create_action
 from openlp.core.lib import SlideLimits, Settings
 from openlp.core.ui import AboutForm, SettingsForm, ServiceManager, ThemeManager, SlideController, PluginForm, \
     MediaDockManager, ShortcutListForm, FormattingTagForm
@@ -50,7 +50,6 @@
     get_filesystem_encoding
 from openlp.core.utils.actions import ActionList, CategoryOrder
 from openlp.core.ui.firsttimeform import FirstTimeForm
-from openlp.core.ui import ScreenList
 
 log = logging.getLogger(__name__)
 
@@ -80,6 +79,7 @@
     }
 """
 
+
 class Ui_MainWindow(object):
     def setupUi(self, mainWindow):
         """
@@ -103,10 +103,10 @@
         # Create slide controllers
         self.previewController = SlideController(self)
         self.liveController = SlideController(self, True)
-        previewVisible = Settings().value(u'user interface/preview panel', True)
+        previewVisible = Settings().value(u'user interface/preview panel')
         self.previewController.panel.setVisible(previewVisible)
-        liveVisible = Settings().value(u'user interface/live panel', True)
-        panelLocked = Settings().value(u'user interface/lock panel', False)
+        liveVisible = Settings().value(u'user interface/live panel')
+        panelLocked = Settings().value(u'user interface/lock panel')
         self.liveController.panel.setVisible(liveVisible)
         # Create menu
         self.menuBar = QtGui.QMenuBar(mainWindow)
@@ -232,7 +232,7 @@
             checked=panelLocked, triggers=self.setLockPanel)
         action_list.add_category(UiStrings().ViewMode,
             CategoryOrder.standardMenu)
-        self.modeDefaultItem = create_action(mainWindow, u'modeDefaultItem',  checked=False,
+        self.modeDefaultItem = create_action(mainWindow, u'modeDefaultItem', checked=False,
             category=UiStrings().ViewMode)
         self.modeSetupItem = create_action(mainWindow, u'modeSetupItem', checked=False, category=UiStrings().ViewMode)
         self.modeLiveItem = create_action(mainWindow, u'modeLiveItem', checked=True, category=UiStrings().ViewMode)
@@ -471,6 +471,8 @@
         self.playersSettingsSection = u'players'
         self.displayTagsSection = u'displayTags'
         self.headerSection = u'SettingsImport'
+        Settings().set_up_default_values()
+        Settings().remove_obsolete_settings()
         self.serviceNotSaved = False
         self.aboutForm = AboutForm(self)
         self.mediaController = MediaController(self)
@@ -579,8 +581,8 @@
         self.previewController.screenSizeChanged()
         self.liveController.screenSizeChanged()
         log.info(u'Load data from Settings')
-        if Settings().value(u'advanced/save current plugin', False):
-            savedPlugin = Settings().value(u'advanced/current media plugin', -1)
+        if Settings().value(u'advanced/save current plugin'):
+            savedPlugin = Settings().value(u'advanced/current media plugin')
             if savedPlugin != -1:
                 self.mediaToolBox.setCurrentIndex(savedPlugin)
         self.settingsForm.postSetUp()
@@ -629,10 +631,9 @@
             if not isinstance(filename, unicode):
                 filename = unicode(filename, sys.getfilesystemencoding())
             self.serviceManagerContents.loadFile(filename)
-        elif Settings().value(
-            self.generalSettingsSection + u'/auto open', False):
+        elif Settings().value(self.generalSettingsSection + u'/auto open'):
             self.serviceManagerContents.loadLastFile()
-        view_mode = Settings().value(u'%s/view mode' % self.generalSettingsSection, u'default')
+        view_mode = Settings().value(u'%s/view mode' % self.generalSettingsSection)
         if view_mode == u'default':
             self.modeDefaultItem.setChecked(True)
         elif view_mode == u'setup':
@@ -710,10 +711,8 @@
         """
         settings = Settings()
         self.liveController.mainDisplaySetBackground()
-        if settings.value(u'%s/screen blank' % self.generalSettingsSection,
-            False):
-            if settings.value(u'%s/blank warning' % self.generalSettingsSection,
-                False):
+        if settings.value(u'%s/screen blank' % self.generalSettingsSection):
+            if settings.value(u'%s/blank warning' % self.generalSettingsSection):
                 QtGui.QMessageBox.question(self, translate('OpenLP.MainWindow', 'OpenLP Main Display Blanked'),
                     translate('OpenLP.MainWindow', 'The Main Display has been blanked out'))
 
@@ -837,7 +836,7 @@
         # Lets do a basic sanity check. If it contains this string we can
         # assume it was created by OpenLP and so we'll load what we can
         # from it, and just silently ignore anything we don't recognise
-        if import_settings.value(u'SettingsImport/type', u'') != u'OpenLP_settings_export':
+        if import_settings.value(u'SettingsImport/type') != u'OpenLP_settings_export':
             QtGui.QMessageBox.critical(self, translate('OpenLP.MainWindow', 'Import settings'),
                 translate('OpenLP.MainWindow', 'The file you have selected does not appear to be a valid OpenLP '
                     'settings file.\n\nProcessing has terminated and no changes have been made.'),
@@ -860,7 +859,7 @@
                 continue
         # We have a good file, import it.
         for section_key in import_keys:
-            value = import_settings.value(section_key, None)
+            value = import_settings.value(section_key)
             if value is not None:
                 settings.setValue(u'%s' % (section_key), value)
         now = datetime.now()
@@ -926,13 +925,12 @@
         export_settings.beginGroup(self.headerSection)
         export_settings.setValue(u'Make_Changes', u'At_Own_RISK')
         export_settings.setValue(u'type', u'OpenLP_settings_export')
-        export_settings.setValue(u'file_date_created',
-            now.strftime("%Y-%m-%d %H:%M"))
+        export_settings.setValue(u'file_date_created', now.strftime("%Y-%m-%d %H:%M"))
         export_settings.setValue(u'version', application_version[u'full'])
         export_settings.endGroup()
         # Write all the sections and keys.
         for section_key in keys:
-            key_value = settings.value(section_key, None)
+            key_value = settings.value(section_key)
             if key_value is not None:
                 export_settings.setValue(section_key, key_value)
         export_settings.sync()
@@ -940,11 +938,11 @@
         # Read the  temp file and output the user's CONF file with blanks to
         # make it more readable.
         temp_conf = open(temp_file, u'r')
-        export_conf = open(export_file_name,  u'w')
+        export_conf = open(export_file_name, u'w')
         for file_record in temp_conf:
             # Get rid of any invalid entries.
             if file_record.find(u'@Invalid()') == -1:
-                file_record = file_record.replace(u'%20',  u' ')
+                file_record = file_record.replace(u'%20', u' ')
                 export_conf.write(file_record)
         temp_conf.close()
         export_conf.close()
@@ -1025,7 +1023,7 @@
             else:
                 event.ignore()
         else:
-            if Settings().value(u'advanced/enable exit confirmation', True):
+            if Settings().value(u'advanced/enable exit confirmation'):
                 ret = QtGui.QMessageBox.question(self, translate('OpenLP.MainWindow', 'Close OpenLP'),
                         translate('OpenLP.MainWindow', 'Are you sure you want to close OpenLP?'),
                     QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Yes | QtGui.QMessageBox.No),
@@ -1052,7 +1050,7 @@
         # Clean temporary files used by services
         self.serviceManagerContents.cleanUp()
         if save_settings:
-            if Settings().value(u'advanced/save current plugin', False):
+            if Settings().value(u'advanced/save current plugin'):
                 Settings().setValue(u'advanced/current media plugin', self.mediaToolBox.currentIndex())
         # Call the cleanup method to shutdown plugins.
         log.info(u'cleanup plugins')
@@ -1183,7 +1181,7 @@
         log.debug(u'Loading QSettings')
        # Migrate Wrap Settings to Slide Limits Settings
         if Settings().contains(self.generalSettingsSection + u'/enable slide loop'):
-            if Settings().value(self.generalSettingsSection + u'/enable slide loop', True):
+            if Settings().value(self.generalSettingsSection + u'/enable slide loop'):
                 Settings().setValue(self.advancedSettingsSection + u'/slide limits', SlideLimits.Wrap)
             else:
                 Settings().setValue(self.advancedSettingsSection + u'/slide limits', SlideLimits.End)
@@ -1194,15 +1192,15 @@
         settings.remove(u'custom slide')
         settings.remove(u'service')
         settings.beginGroup(self.generalSettingsSection)
-        self.recentFiles = settings.value(u'recent files', self.recentFiles)
+        self.recentFiles = settings.value(u'recent files')
         settings.endGroup()
         settings.beginGroup(self.uiSettingsSection)
-        self.move(settings.value(u'main window position', QtCore.QPoint(0, 0)))
-        self.restoreGeometry(settings.value(u'main window geometry', QtCore.QByteArray()))
-        self.restoreState(settings.value(u'main window state', QtCore.QByteArray()))
-        self.liveController.splitter.restoreState(settings.value(u'live splitter geometry', QtCore.QByteArray()))
-        self.previewController.splitter.restoreState(settings.value(u'preview splitter geometry', QtCore.QByteArray()))
-        self.controlSplitter.restoreState(settings.value(u'mainwindow splitter geometry', QtCore.QByteArray()))
+        self.move(settings.value(u'main window position'))
+        self.restoreGeometry(settings.value(u'main window geometry'))
+        self.restoreState(settings.value(u'main window state'))
+        self.liveController.splitter.restoreState(settings.value(u'live splitter geometry'))
+        self.previewController.splitter.restoreState(settings.value(u'preview splitter geometry'))
+        self.controlSplitter.restoreState(settings.value(u'mainwindow splitter geometry'))
         settings.endGroup()
 
     def saveSettings(self):
@@ -1231,7 +1229,7 @@
         Updates the recent file menu with the latest list of service files
         accessed.
         """
-        recentFileCount = Settings().value(u'advanced/recent file count', 4)
+        recentFileCount = Settings().value(u'advanced/recent file count')
         existingRecentFiles = [recentFile for recentFile in self.recentFiles
             if os.path.isfile(unicode(recentFile))]
         recentFilesToDisplay = existingRecentFiles[0:recentFileCount]
@@ -1261,7 +1259,7 @@
         # The maxRecentFiles value does not have an interface and so never gets
         # actually stored in the settings therefore the default value of 20 will
         # always be used.
-        maxRecentFiles = Settings().value(u'advanced/max recent files', 20)
+        maxRecentFiles = Settings().value(u'advanced/max recent files')
         if filename:
             # Add some cleanup to reduce duplication in the recent file list
             filename = os.path.abspath(filename)
@@ -1332,7 +1330,7 @@
                     '- Please wait for copy to finish').replace('%s', self.newDataPath))
                 dir_util.copy_tree(old_data_path, self.newDataPath)
                 log.info(u'Copy sucessful')
-            except (IOError, os.error, DistutilsFileError),  why:
+            except (IOError, os.error, DistutilsFileError), why:
                 Receiver.send_message(u'cursor_normal')
                 log.exception(u'Data copy failed %s' % unicode(why))
                 QtGui.QMessageBox.critical(self, translate('OpenLP.MainWindow', 'New Data Directory Error'),

=== modified file 'openlp/core/ui/media/__init__.py'
--- openlp/core/ui/media/__init__.py	2012-12-29 20:56:56 +0000
+++ openlp/core/ui/media/__init__.py	2013-01-15 22:23:25 +0000
@@ -76,10 +76,9 @@
     from the settings.
     """
     log.debug(u'get_media_players')
-    saved_players = Settings().value(u'media/players', u'webkit')
+    saved_players = Settings().value(u'media/players')
     reg_ex = QtCore.QRegExp(".*\[(.*)\].*")
-    if Settings().value(u'media/override player',
-        QtCore.Qt.Unchecked)== QtCore.Qt.Checked:
+    if Settings().value(u'media/override player') == QtCore.Qt.Checked:
         if reg_ex.exactMatch(saved_players):
             overridden_player = u'%s' % reg_ex.cap(1)
         else:

=== modified file 'openlp/core/ui/media/mediacontroller.py'
--- openlp/core/ui/media/mediacontroller.py	2013-01-02 22:32:41 +0000
+++ openlp/core/ui/media/mediacontroller.py	2013-01-15 22:23:25 +0000
@@ -32,8 +32,8 @@
 import sys
 from PyQt4 import QtCore, QtGui
 
-from openlp.core.lib import OpenLPToolbar, Receiver, translate, Settings
-from openlp.core.lib.ui import UiStrings, critical_error_message_box
+from openlp.core.lib import OpenLPToolbar, Receiver, translate, Settings, UiStrings
+from openlp.core.lib.ui import critical_error_message_box
 from openlp.core.ui.media import MediaState, MediaInfo, MediaType, \
     get_media_players, set_media_players
 from openlp.core.ui.media.mediaplayer import MediaPlayer
@@ -382,7 +382,7 @@
         elif not hidden or controller.media_info.is_background or serviceItem.will_auto_start:
             autoplay = True
         # Unblank on load set
-        elif Settings().value(u'general/auto unblank', False):
+        elif Settings().value(u'general/auto unblank'):
             autoplay = True
         if autoplay:
             if not self.media_play(controller):

=== modified file 'openlp/core/ui/media/phononplayer.py'
--- openlp/core/ui/media/phononplayer.py	2012-12-29 20:56:56 +0000
+++ openlp/core/ui/media/phononplayer.py	2013-01-15 22:23:25 +0000
@@ -222,7 +222,7 @@
         """
         Add css style sheets to htmlbuilder
         """
-        background = QtGui.QColor(Settings().value(u'players/background color', u'#000000')).name()
+        background = QtGui.QColor(Settings().value(u'players/background color')).name()
         return VIDEO_CSS % (background,background,background)
 
     def get_info(self):

=== modified file 'openlp/core/ui/media/playertab.py'
--- openlp/core/ui/media/playertab.py	2012-12-29 20:56:56 +0000
+++ openlp/core/ui/media/playertab.py	2013-01-15 22:23:25 +0000
@@ -29,8 +29,8 @@
 
 from PyQt4 import QtCore, QtGui
 
-from openlp.core.lib import SettingsTab, translate, Receiver, Settings
-from openlp.core.lib.ui import UiStrings, create_button
+from openlp.core.lib import SettingsTab, translate, Receiver, Settings, UiStrings
+from openlp.core.lib.ui import create_button
 from openlp.core.ui.media import get_media_players, set_media_players
 
 class MediaQCheckBox(QtGui.QCheckBox):
@@ -177,7 +177,7 @@
         settings = Settings()
         settings.beginGroup(self.settingsSection)
         self.updatePlayerList()
-        self.bg_color = settings.value(u'background color', u'#000000')
+        self.bg_color = settings.value(u'background color')
         self.initial_color = self.bg_color
         settings.endGroup()
         self.backgroundColorButton.setStyleSheet(u'background-color: %s' % self.bg_color)

=== modified file 'openlp/core/ui/media/vlcplayer.py'
--- openlp/core/ui/media/vlcplayer.py	2012-12-29 20:56:56 +0000
+++ openlp/core/ui/media/vlcplayer.py	2013-01-15 22:23:25 +0000
@@ -113,7 +113,7 @@
         command_line_options = u'--no-video-title-show'
         if not display.hasAudio:
             command_line_options += u' --no-audio --no-video-title-show'
-        if Settings().value(u'advanced/hide mouse', True) and display.controller.isLive:
+        if Settings().value(u'advanced/hide mouse') and display.controller.isLive:
             command_line_options += u' --mouse-hide-timeout=0'
         display.vlcInstance = vlc.Instance(command_line_options)
         display.vlcInstance.set_log_verbosity(2)

=== modified file 'openlp/core/ui/media/webkitplayer.py'
--- openlp/core/ui/media/webkitplayer.py	2012-12-29 20:56:56 +0000
+++ openlp/core/ui/media/webkitplayer.py	2013-01-15 22:23:25 +0000
@@ -253,7 +253,7 @@
         , u'*.mp4'
         , u'*.ogv'
         , u'*.webm'
-        , u'*.mpg', u'*.wmv',  u'*.mpeg', u'*.avi'
+        , u'*.mpg', u'*.wmv', u'*.mpeg', u'*.avi'
         , u'*.swf'
     ]
 
@@ -282,7 +282,7 @@
         """
         Add css style sheets to htmlbuilder
         """
-        background = QtGui.QColor(Settings().value(u'players/background color', u'#000000')).name()
+        background = QtGui.QColor(Settings().value(u'players/background color')).name()
         css = VIDEO_CSS % (background,background,background)
         return css + FLASH_CSS
 

=== modified file 'openlp/core/ui/plugindialog.py'
--- openlp/core/ui/plugindialog.py	2012-12-29 20:56:56 +0000
+++ openlp/core/ui/plugindialog.py	2013-01-15 22:23:25 +0000
@@ -29,8 +29,9 @@
 
 from PyQt4 import QtCore, QtGui
 
-from openlp.core.lib import translate
-from openlp.core.lib.ui import UiStrings, create_button_box
+from openlp.core.lib import translate, UiStrings
+from openlp.core.lib.ui import create_button_box
+
 
 class Ui_PluginViewDialog(object):
     def setupUi(self, pluginViewDialog):

=== modified file 'openlp/core/ui/printservicedialog.py'
--- openlp/core/ui/printservicedialog.py	2012-12-29 20:56:56 +0000
+++ openlp/core/ui/printservicedialog.py	2013-01-15 22:23:25 +0000
@@ -29,8 +29,7 @@
 
 from PyQt4 import QtCore, QtGui
 
-from openlp.core.lib import build_icon, translate, SpellTextEdit
-from openlp.core.lib.ui import UiStrings
+from openlp.core.lib import build_icon, translate, SpellTextEdit, UiStrings
 
 class ZoomSize(object):
     """

=== modified file 'openlp/core/ui/printserviceform.py'
--- openlp/core/ui/printserviceform.py	2012-12-29 20:56:56 +0000
+++ openlp/core/ui/printserviceform.py	2013-01-15 22:23:25 +0000
@@ -33,8 +33,7 @@
 from PyQt4 import QtCore, QtGui
 from lxml import html
 
-from openlp.core.lib import translate, get_text_file_string, Receiver, Settings
-from openlp.core.lib.ui import UiStrings
+from openlp.core.lib import translate, get_text_file_string, Receiver, Settings, UiStrings
 from openlp.core.ui.printservicedialog import Ui_PrintServiceDialog, ZoomSize
 from openlp.core.utils import AppLocation
 
@@ -124,13 +123,13 @@
         # Load the settings for the dialog.
         settings = Settings()
         settings.beginGroup(u'advanced')
-        self.slideTextCheckBox.setChecked(settings.value(u'print slide text', False))
-        self.pageBreakAfterText.setChecked(settings.value(u'add page break', False))
+        self.slideTextCheckBox.setChecked(settings.value(u'print slide text'))
+        self.pageBreakAfterText.setChecked(settings.value(u'add page break'))
         if not self.slideTextCheckBox.isChecked():
             self.pageBreakAfterText.setDisabled(True)
-        self.metaDataCheckBox.setChecked(settings.value(u'print file meta data', False))
-        self.notesCheckBox.setChecked(settings.value(u'print notes', False))
-        self.zoomComboBox.setCurrentIndex(settings.value(u'display size', 0))
+        self.metaDataCheckBox.setChecked(settings.value(u'print file meta data'))
+        self.notesCheckBox.setChecked(settings.value(u'print notes'))
+        self.zoomComboBox.setCurrentIndex(settings.value(u'display size'))
         settings.endGroup()
         # Signals
         QtCore.QObject.connect(self.printButton, QtCore.SIGNAL(u'triggered()'), self.printServiceOrder)

=== modified file 'openlp/core/ui/servicemanager.py'
--- openlp/core/ui/servicemanager.py	2013-01-02 21:31:11 +0000
+++ openlp/core/ui/servicemanager.py	2013-01-15 22:23:25 +0000
@@ -40,9 +40,9 @@
 from PyQt4 import QtCore, QtGui
 
 from openlp.core.lib import OpenLPToolbar, ServiceItem, Receiver, build_icon, ItemCapabilities, SettingsManager, \
-    translate, str_to_bool, check_directory_exists, Settings, PluginStatus
+    translate, str_to_bool, check_directory_exists, Settings, PluginStatus, UiStrings
 from openlp.core.lib.theme import ThemeLevel
-from openlp.core.lib.ui import UiStrings, critical_error_message_box, create_widget_action, find_and_set_in_combo_box
+from openlp.core.lib.ui import critical_error_message_box, create_widget_action, find_and_set_in_combo_box
 from openlp.core.ui import ServiceNoteForm, ServiceItemEditForm, StartTimeForm
 from openlp.core.ui.printserviceform import PrintServiceForm
 from openlp.core.utils import AppLocation, delete_file, split_filename, format_time
@@ -230,7 +230,7 @@
         QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'theme_update_global'), self.themeChange)
         QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'service_item_update'), self.serviceItemUpdate)
         # Last little bits of setting up
-        self.service_theme = Settings().value(self.mainwindow.serviceManagerSettingsSection + u'/service theme', u'')
+        self.service_theme = Settings().value(self.mainwindow.serviceManagerSettingsSection + u'/service theme')
         self.servicePath = AppLocation.get_section_data_path(u'servicemanager')
         # build the drag and drop context menu
         self.dndMenu = QtGui.QMenu()
@@ -245,7 +245,7 @@
         self.maintainAction = create_widget_action(self.menu, text=translate('OpenLP.ServiceManager', '&Reorder Item'),
             icon=u':/general/general_edit.png', triggers=self.onServiceItemEditForm)
         self.notesAction = create_widget_action(self.menu, text=translate('OpenLP.ServiceManager', '&Notes'),
-            icon=u':/services/service_notes.png',  triggers=self.onServiceItemNoteForm)
+            icon=u':/services/service_notes.png', triggers=self.onServiceItemNoteForm)
         self.timeAction = create_widget_action(self.menu, text=translate('OpenLP.ServiceManager', '&Start Time'),
             icon=u':/media/media_time.png', triggers=self.onStartTimeForm)
         self.autoStartAction = create_widget_action(self.menu, text=u'',
@@ -319,7 +319,7 @@
         """
         Triggered when Config dialog is updated.
         """
-        self.expandTabs = Settings().value(u'advanced/expand service item', False)
+        self.expandTabs = Settings().value(u'advanced/expand service item')
 
     def resetSupportedSuffixes(self):
         """
@@ -594,25 +594,21 @@
         Get a file name and then call :func:`ServiceManager.saveFile` to
         save the file.
         """
-        default_service_enabled = Settings().value(u'advanced/default service enabled', True)
+        default_service_enabled = Settings().value(u'advanced/default service enabled')
         if default_service_enabled:
-            service_day = Settings().value(u'advanced/default service day', 7)
+            service_day = Settings().value(u'advanced/default service day')
             if service_day == 7:
                 local_time = datetime.now()
             else:
-                service_hour = Settings().value(u'advanced/default service hour', 11)
-                service_minute = Settings().value(u'advanced/default service minute', 0)
+                service_hour = Settings().value(u'advanced/default service hour')
+                service_minute = Settings().value(u'advanced/default service minute')
                 now = datetime.now()
                 day_delta = service_day - now.weekday()
                 if day_delta < 0:
                     day_delta += 7
                 time = now + timedelta(days=day_delta)
                 local_time = time.replace(hour=service_hour, minute=service_minute)
-            default_pattern = Settings().value(u'advanced/default service name',
-                translate('OpenLP.AdvancedTab', 'Service %Y-%m-%d %H-%M',
-                    'This may not contain any of the following characters: '
-                    '/\\?*|<>\[\]":+\nSee http://docs.python.org/library/'
-                    'datetime.html#strftime-strptime-behavior for more information.'))
+            default_pattern = Settings().value(u'advanced/default service name')
             default_filename = format_time(default_pattern, local_time)
         else:
             default_filename = u''
@@ -740,7 +736,7 @@
         service was last closed. Can be blank if there was no service
         present.
         """
-        fileName = Settings().value(u'servicemanager/last file', u'')
+        fileName = Settings().value(u'servicemanager/last file')
         if fileName:
             self.loadFile(fileName)
 
@@ -1294,7 +1290,7 @@
         if self.serviceItems[item][u'service_item'].is_valid:
             self.mainwindow.liveController.addServiceManagerItem(
                 self.serviceItems[item][u'service_item'], child)
-            if Settings().value(self.mainwindow.generalSettingsSection + u'/auto preview', False):
+            if Settings().value(self.mainwindow.generalSettingsSection + u'/auto preview'):
                 item += 1
                 if self.serviceItems and item < len(self.serviceItems) and \
                         self.serviceItems[item][u'service_item'].is_capable(ItemCapabilities.CanPreview):

=== modified file 'openlp/core/ui/shortcutlistform.py'
--- openlp/core/ui/shortcutlistform.py	2012-12-29 20:56:56 +0000
+++ openlp/core/ui/shortcutlistform.py	2013-01-15 22:23:25 +0000
@@ -41,6 +41,7 @@
 
 log = logging.getLogger(__name__)
 
+
 class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog):
     """
     The shortcut list dialog

=== modified file 'openlp/core/ui/slidecontroller.py'
--- openlp/core/ui/slidecontroller.py	2013-01-11 17:08:44 +0000
+++ openlp/core/ui/slidecontroller.py	2013-01-15 22:23:25 +0000
@@ -34,14 +34,11 @@
 
 from PyQt4 import QtCore, QtGui
 
-from openlp.core.lib import OpenLPToolbar, Receiver, ItemCapabilities, \
-    translate, build_icon, build_html, PluginManager, ServiceItem, \
-    ImageSource, SlideLimits, ServiceItemAction, Settings
-from openlp.core.ui import HideMode, MainDisplay, Display, ScreenList
-from openlp.core.lib.ui import UiStrings, create_action
+from openlp.core.lib import OpenLPToolbar, Receiver, ItemCapabilities, translate, build_icon, build_html, \
+    PluginManager, ServiceItem, ImageSource, SlideLimits, ServiceItemAction, Settings, ScreenList, UiStrings
+from openlp.core.lib.ui import create_action
 from openlp.core.lib import SlideLimits, ServiceItemAction
-from openlp.core.ui import HideMode, MainDisplay, Display, ScreenList, \
-    DisplayControllerType
+from openlp.core.ui import HideMode, MainDisplay, Display, DisplayControllerType
 from openlp.core.utils.actions import ActionList, CategoryOrder
 
 log = logging.getLogger(__name__)
@@ -211,7 +208,7 @@
             self.playSlidesOnce = create_action(self, u'playSlidesOnce', text=UiStrings().PlaySlidesToEnd,
                 icon=u':/media/media_time.png', checked=False, shortcuts=[],
                 category=self.category, triggers=self.onPlaySlidesOnce)
-            if Settings().value(self.parent().generalSettingsSection + u'/enable slide loop', True):
+            if Settings().value(self.parent().generalSettingsSection + u'/enable slide loop'):
                 self.playSlidesMenu.setDefaultAction(self.playSlidesLoop)
             else:
                 self.playSlidesMenu.setDefaultAction(self.playSlidesOnce)
@@ -585,7 +582,7 @@
         """
         Updates the Slide Limits variable from the settings.
         """
-        self.slide_limits = Settings().value(self.parent().advancedSettingsSection + u'/slide limits', SlideLimits.End)
+        self.slide_limits = Settings().value(self.parent().advancedSettingsSection + u'/slide limits')
 
     def enableToolBar(self, item):
         """
@@ -613,7 +610,7 @@
         self.playSlidesLoop.setChecked(False)
         self.playSlidesLoop.setIcon(build_icon(u':/media/media_time.png'))
         if item.is_text():
-            if Settings().value(self.parent().songsSettingsSection + u'/display songbar', True) and self.slideList:
+            if Settings().value(self.parent().songsSettingsSection + u'/display songbar') and self.slideList:
                 self.songMenu.show()
         if item.is_capable(ItemCapabilities.CanLoop) and len(item.get_frames()) > 1:
             self.toolbar.setWidgetVisible(self.loopList)
@@ -727,8 +724,8 @@
                     action.setData(counter)
                     QtCore.QObject.connect(action, QtCore.SIGNAL(u'triggered(bool)'), self.onTrackTriggered)
                 self.display.audioPlayer.repeat = Settings().value(
-                    self.parent().generalSettingsSection + u'/audio repeat list', False)
-                if Settings().value(self.parent().generalSettingsSection + u'/audio start paused', True):
+                    self.parent().generalSettingsSection + u'/audio repeat list')
+                if Settings().value(self.parent().generalSettingsSection + u'/audio start paused'):
                     self.audioPauseItem.setChecked(True)
                     self.display.audioPlayer.pause()
                 else:
@@ -837,8 +834,7 @@
         Allow the main display to blank the main display at startup time
         """
         log.debug(u'mainDisplaySetBackground live = %s' % self.isLive)
-        display_type = Settings().value(self.parent().generalSettingsSection + u'/screen blank',
-            u'')
+        display_type = Settings().value(self.parent().generalSettingsSection + u'/screen blank')
         if self.screens.which_screen(self.window()) != self.screens.which_screen(self.display):
             # Order done to handle initial conversion
             if display_type == u'themed':
@@ -1193,7 +1189,7 @@
         """
         triggered by clicking the Preview slide items
         """
-        if Settings().value(u'advanced/double click live', False):
+        if Settings().value(u'advanced/double click live'):
             # Live and Preview have issues if we have video or presentations
             # playing in both at the same time.
             if self.serviceItem.is_command():

=== modified file 'openlp/core/ui/starttimedialog.py'
--- openlp/core/ui/starttimedialog.py	2012-12-29 20:56:56 +0000
+++ openlp/core/ui/starttimedialog.py	2013-01-15 22:23:25 +0000
@@ -29,8 +29,9 @@
 
 from PyQt4 import QtCore, QtGui
 
-from openlp.core.lib import translate
-from openlp.core.lib.ui import UiStrings, create_button_box
+from openlp.core.lib import translate, UiStrings
+from openlp.core.lib.ui import create_button_box
+
 
 class Ui_StartTimeDialog(object):
     def setupUi(self, StartTimeDialog):

=== modified file 'openlp/core/ui/starttimeform.py'
--- openlp/core/ui/starttimeform.py	2012-12-29 20:56:56 +0000
+++ openlp/core/ui/starttimeform.py	2013-01-15 22:23:25 +0000
@@ -31,8 +31,8 @@
 
 from starttimedialog import Ui_StartTimeDialog
 
-from openlp.core.lib import translate
-from openlp.core.lib.ui import UiStrings, critical_error_message_box
+from openlp.core.lib import translate, UiStrings
+from openlp.core.lib.ui import critical_error_message_box
 
 class StartTimeForm(QtGui.QDialog, Ui_StartTimeDialog):
     """

=== modified file 'openlp/core/ui/themeform.py'
--- openlp/core/ui/themeform.py	2012-12-29 20:56:56 +0000
+++ openlp/core/ui/themeform.py	2013-01-15 22:23:25 +0000
@@ -32,9 +32,9 @@
 
 from PyQt4 import QtCore, QtGui
 
-from openlp.core.lib import Receiver, translate
+from openlp.core.lib import Receiver, translate, UiStrings
 from openlp.core.lib.theme import BackgroundType, BackgroundGradientType
-from openlp.core.lib.ui import UiStrings, critical_error_message_box
+from openlp.core.lib.ui import critical_error_message_box
 from openlp.core.ui import ThemeLayoutForm
 from openlp.core.utils import get_images_filter
 from themewizard import Ui_ThemeWizard
@@ -72,7 +72,7 @@
             self.onGradientStartButtonClicked)
         QtCore.QObject.connect(self.gradientEndButton, QtCore.SIGNAL(u'clicked()'), self.onGradientEndButtonClicked)
         QtCore.QObject.connect(self.imageBrowseButton, QtCore.SIGNAL(u'clicked()'), self.onImageBrowseButtonClicked)
-        QtCore.QObject.connect(self.mainColorButton,   QtCore.SIGNAL(u'clicked()'), self.onMainColorButtonClicked)
+        QtCore.QObject.connect(self.mainColorButton,  QtCore.SIGNAL(u'clicked()'), self.onMainColorButtonClicked)
         QtCore.QObject.connect(self.outlineColorButton, QtCore.SIGNAL(u'clicked()'), self.onOutlineColorButtonClicked)
         QtCore.QObject.connect(self.shadowColorButton, QtCore.SIGNAL(u'clicked()'), self.onShadowColorButtonClicked)
         QtCore.QObject.connect(self.outlineCheckBox, QtCore.SIGNAL(u'stateChanged(int)'),

=== modified file 'openlp/core/ui/thememanager.py'
--- openlp/core/ui/thememanager.py	2012-12-29 20:56:56 +0000
+++ openlp/core/ui/thememanager.py	2013-01-15 22:23:25 +0000
@@ -37,9 +37,9 @@
 from PyQt4 import QtCore, QtGui
 
 from openlp.core.lib import OpenLPToolbar, get_text_file_string, build_icon, Receiver, SettingsManager, translate, \
-    check_item_selected, check_directory_exists, create_thumb, validate_thumb, ImageSource, Settings
+    check_item_selected, check_directory_exists, create_thumb, validate_thumb, ImageSource, Settings, UiStrings
 from openlp.core.lib.theme import ThemeXML, BackgroundType, VerticalType, BackgroundGradientType
-from openlp.core.lib.ui import UiStrings, critical_error_message_box, create_widget_action
+from openlp.core.lib.ui import critical_error_message_box, create_widget_action
 from openlp.core.theme import Theme
 from openlp.core.ui import FileRenameForm, ThemeForm
 from openlp.core.utils import AppLocation, delete_file, locale_compare, get_filesystem_encoding
@@ -158,7 +158,7 @@
         """
         Triggered when Config dialog is updated.
         """
-        self.global_theme = Settings().value(self.settingsSection + u'/global theme', u'')
+        self.global_theme = Settings().value(self.settingsSection + u'/global theme')
 
     def checkListState(self, item):
         """
@@ -429,7 +429,7 @@
                 Settings().setValue(self.settingsSection + u'/global theme', theme.theme_name)
                 self.configUpdated()
                 files = SettingsManager.get_files(self.settingsSection, u'.png')
-        # Sort the themes by its name considering language specific 
+        # Sort the themes by its name considering language specific
         files.sort(key=lambda file_name: unicode(file_name),
            cmp=locale_compare)
         # now process the file list of png files
@@ -729,8 +729,7 @@
         Check to see if theme has been selected and the destructive action
         is allowed.
         """
-        self.global_theme = Settings().value(
-            self.settingsSection + u'/global theme', u'')
+        self.global_theme = Settings().value(self.settingsSection + u'/global theme')
         if check_item_selected(self.themeListWidget, select_text):
             item = self.themeListWidget.currentItem()
             theme = item.text()

=== modified file 'openlp/core/ui/themestab.py'
--- openlp/core/ui/themestab.py	2012-12-29 20:56:56 +0000
+++ openlp/core/ui/themestab.py	2013-01-15 22:23:25 +0000
@@ -29,9 +29,10 @@
 
 from PyQt4 import QtCore, QtGui
 
-from openlp.core.lib import Receiver, Settings, SettingsTab, translate
+from openlp.core.lib import Receiver, Settings, SettingsTab, translate, UiStrings
 from openlp.core.lib.theme import ThemeLevel
-from openlp.core.lib.ui import UiStrings, find_and_set_in_combo_box
+from openlp.core.lib.ui import find_and_set_in_combo_box
+
 
 class ThemesTab(SettingsTab):
     """
@@ -118,8 +119,8 @@
     def load(self):
         settings = Settings()
         settings.beginGroup(self.settingsSection)
-        self.theme_level = settings.value(u'theme level', ThemeLevel.Song)
-        self.global_theme = settings.value(u'global theme', u'')
+        self.theme_level = settings.value(u'theme level')
+        self.global_theme = settings.value(u'global theme')
         settings.endGroup()
         if self.theme_level == ThemeLevel.Global:
             self.GlobalLevelRadioButton.setChecked(True)
@@ -165,7 +166,7 @@
                 [u'Bible Theme', u'Song Theme']
         """
         # Reload as may have been triggered by the ThemeManager.
-        self.global_theme = Settings().value(self.settingsSection + u'/global theme', u'')
+        self.global_theme = Settings().value(self.settingsSection + u'/global theme')
         self.DefaultComboBox.clear()
         self.DefaultComboBox.addItems(theme_list)
         find_and_set_in_combo_box(self.DefaultComboBox, self.global_theme)

=== modified file 'openlp/core/ui/themewizard.py'
--- openlp/core/ui/themewizard.py	2012-12-29 20:56:56 +0000
+++ openlp/core/ui/themewizard.py	2013-01-15 22:23:25 +0000
@@ -29,9 +29,9 @@
 
 from PyQt4 import QtCore, QtGui
 
-from openlp.core.lib import translate, build_icon
+from openlp.core.lib import translate, build_icon, UiStrings
 from openlp.core.lib.theme import HorizontalType, BackgroundType, BackgroundGradientType
-from openlp.core.lib.ui import UiStrings, add_welcome_page, create_valign_selection_widgets
+from openlp.core.lib.ui import add_welcome_page, create_valign_selection_widgets
 
 class Ui_ThemeWizard(object):
     def setupUi(self, themeWizard):

=== modified file 'openlp/core/ui/wizard.py'
--- openlp/core/ui/wizard.py	2012-12-29 20:56:56 +0000
+++ openlp/core/ui/wizard.py	2013-01-15 22:23:25 +0000
@@ -34,8 +34,8 @@
 
 from PyQt4 import QtCore, QtGui
 
-from openlp.core.lib import build_icon, Receiver, SettingsManager, translate
-from openlp.core.lib.ui import UiStrings, add_welcome_page
+from openlp.core.lib import build_icon, Receiver, SettingsManager, translate, UiStrings
+from openlp.core.lib.ui import add_welcome_page
 
 log = logging.getLogger(__name__)
 

=== modified file 'openlp/core/utils/__init__.py'
--- openlp/core/utils/__init__.py	2013-01-15 21:52:26 +0000
+++ openlp/core/utils/__init__.py	2013-01-15 22:23:25 +0000
@@ -127,7 +127,7 @@
         """
         # Check if we have a different data location.
         if Settings().contains(u'advanced/data path'):
-            path = Settings().value(u'advanced/data path', u'')
+            path = Settings().value(u'advanced/data path')
         else:
             path = AppLocation.get_directory(AppLocation.DataDir)
             check_directory_exists(path)
@@ -288,8 +288,7 @@
     # set to prod in the distribution config file.
     settings = Settings()
     settings.beginGroup(u'general')
-    # This defaults to yesterday in order to force the update check to run when you've never run it before.
-    last_test = settings.value(u'last version test', datetime.now().date() - timedelta(days=1))
+    last_test = settings.value(u'last version test')
     this_test = datetime.now().date()
     settings.setValue(u'last version test', this_test)
     settings.endGroup()
@@ -333,8 +332,7 @@
 
 def get_filesystem_encoding():
     """
-    Returns the name of the encoding used to convert Unicode filenames into
-    system file names.
+    Returns the name of the encoding used to convert Unicode filenames into system file names.
     """
     encoding = sys.getfilesystemencoding()
     if encoding is None:
@@ -344,8 +342,7 @@
 
 def get_images_filter():
     """
-    Returns a filter string for a file dialog containing all the supported
-    image formats.
+    Returns a filter string for a file dialog containing all the supported image formats.
     """
     global IMAGES_FILTER
     if not IMAGES_FILTER:
@@ -473,6 +470,7 @@
 
     ``text``
         The text to be processed.
+
     ``local_time``
         The time to be used to add to the string.  This is a time object
     """
@@ -489,8 +487,7 @@
     or 0, depending on whether string1 collates before or after string2 or
     is equal to it. Comparison is case insensitive.
     """
-    # Function locale.strcoll() from standard Python library does not work
-    # properly on Windows.
+    # Function locale.strcoll() from standard Python library does not work properly on Windows.
     return locale.strcoll(string1.lower(), string2.lower())
 
 

=== modified file 'openlp/core/utils/actions.py'
--- openlp/core/utils/actions.py	2012-12-29 20:56:56 +0000
+++ openlp/core/utils/actions.py	2013-01-15 22:23:25 +0000
@@ -233,7 +233,7 @@
         # Load the shortcut from the config.
         settings = Settings()
         settings.beginGroup(u'shortcuts')
-        shortcuts = settings.value(action.objectName(), action.shortcuts())
+        shortcuts = settings.value(action.objectName())
         settings.endGroup()
         if not shortcuts:
             action.setShortcuts([])

=== modified file 'openlp/core/utils/languagemanager.py'
--- openlp/core/utils/languagemanager.py	2012-12-29 20:56:56 +0000
+++ openlp/core/utils/languagemanager.py	2013-01-15 22:23:25 +0000
@@ -98,7 +98,7 @@
         """
         Retrieve a saved language to use from settings
         """
-        language = Settings().value(u'general/language', u'[en]')
+        language = Settings().value(u'general/language')
         language = str(language)
         log.info(u'Language file: \'%s\' Loaded from conf file' % language)
         if re.match(r'[[].*[]]', language):

=== modified file 'openlp/plugins/alerts/alertsplugin.py'
--- openlp/plugins/alerts/alertsplugin.py	2013-01-02 22:05:42 +0000
+++ openlp/plugins/alerts/alertsplugin.py	2013-01-15 22:23:25 +0000
@@ -29,12 +29,13 @@
 
 import logging
 
-from PyQt4 import QtCore
+from PyQt4 import QtCore, QtGui
 
-from openlp.core.lib import Plugin, StringContent, build_icon, translate, Settings
+from openlp.core.lib import Plugin, StringContent, build_icon, translate, Settings, PluginStatus
 from openlp.core.lib.db import Manager
 from openlp.core.lib.ui import create_action, UiStrings
 from openlp.core.lib.theme import VerticalType
+from openlp.core.ui import AlertLocation
 from openlp.core.utils.actions import ActionList
 from openlp.plugins.alerts.lib import AlertsManager, AlertsTab
 from openlp.plugins.alerts.lib.db import init_schema
@@ -113,11 +114,23 @@
     <div id="alert" style="visibility:hidden"></div>
 """
 
+__default_settings__ = {
+        u'alerts/font face': QtGui.QFont().family(),
+        u'alerts/font size': 40,
+        u'alerts/status': PluginStatus.Inactive,
+        u'alerts/db type': u'sqlite',
+        u'alerts/location': AlertLocation.Bottom,
+        u'alerts/background color': u'#660000',
+        u'alerts/font color': u'#ffffff',
+        u'alerts/timeout': 5
+    }
+
+
 class AlertsPlugin(Plugin):
     log.info(u'Alerts Plugin loaded')
 
     def __init__(self, plugin_helpers):
-        Plugin.__init__(self, u'alerts', plugin_helpers, settings_tab_class=AlertsTab)
+        Plugin.__init__(self, u'alerts', __default_settings__, plugin_helpers, settings_tab_class=AlertsTab)
         self.weight = -3
         self.iconPath = u':/plugins/plugin_alerts.png'
         self.icon = build_icon(self.iconPath)

=== modified file 'openlp/plugins/alerts/lib/alertstab.py'
--- openlp/plugins/alerts/lib/alertstab.py	2013-01-01 16:33:41 +0000
+++ openlp/plugins/alerts/lib/alertstab.py	2013-01-15 22:23:25 +0000
@@ -29,9 +29,9 @@
 
 from PyQt4 import QtCore, QtGui
 
-from openlp.core.lib import SettingsTab, translate, Receiver, Settings
+from openlp.core.lib import SettingsTab, translate, Receiver, Settings, UiStrings
 from openlp.core.ui import AlertLocation
-from openlp.core.lib.ui import UiStrings, create_valign_selection_widgets
+from openlp.core.lib.ui import create_valign_selection_widgets
 
 class AlertsTab(SettingsTab):
     """
@@ -141,12 +141,12 @@
     def load(self):
         settings = Settings()
         settings.beginGroup(self.settingsSection)
-        self.timeout = settings.value(u'timeout', 5)
-        self.font_color = settings.value(u'font color', u'#ffffff')
-        self.font_size = settings.value(u'font size', 40)
-        self.bg_color = settings.value(u'background color', u'#660000')
-        self.font_face = settings.value(u'font face', QtGui.QFont().family())
-        self.location = settings.value(u'location', AlertLocation.Bottom)
+        self.timeout = settings.value(u'timeout')
+        self.font_color = settings.value(u'font color')
+        self.font_size = settings.value(u'font size')
+        self.bg_color = settings.value(u'background color')
+        self.font_face = settings.value(u'font face')
+        self.location = settings.value(u'location')
         settings.endGroup()
         self.fontSizeSpinBox.setValue(self.font_size)
         self.timeoutSpinBox.setValue(self.timeout)
@@ -163,7 +163,7 @@
         settings = Settings()
         settings.beginGroup(self.settingsSection)
         # Check value has changed as no event handles this field
-        if settings.value(u'location', 1) != self.verticalComboBox.currentIndex():
+        if settings.value(u'location') != self.verticalComboBox.currentIndex():
             self.changed = True
         settings.setValue(u'background color', self.bg_color)
         settings.setValue(u'font color', self.font_color)

=== modified file 'openlp/plugins/bibles/bibleplugin.py'
--- openlp/plugins/bibles/bibleplugin.py	2013-01-01 16:33:41 +0000
+++ openlp/plugins/bibles/bibleplugin.py	2013-01-15 22:23:25 +0000
@@ -31,19 +31,45 @@
 
 from PyQt4 import QtCore, QtGui
 
-from openlp.core.lib import Plugin, StringContent, build_icon, translate, Settings
+from openlp.core.lib import Plugin, StringContent, build_icon, translate, Settings, PluginStatus
 from openlp.core.lib.ui import create_action, UiStrings
 from openlp.core.utils.actions import ActionList
-from openlp.plugins.bibles.lib import BibleManager, BiblesTab, BibleMediaItem
+from openlp.plugins.bibles.lib import BibleManager, BiblesTab, BibleMediaItem, LayoutStyle, DisplayStyle, \
+    LanguageSelection
+from openlp.plugins.bibles.lib.mediaitem import BibleSearch
 from openlp.plugins.bibles.forms import BibleUpgradeForm
 
 log = logging.getLogger(__name__)
 
+
+__default_settings__ = {
+        u'bibles/db type': u'sqlite',
+        u'bibles/status': PluginStatus.Inactive,
+        u'bibles/last search type': BibleSearch.Reference,
+        u'bibles/verse layout style': LayoutStyle.VersePerSlide,
+        u'bibles/book name language': LanguageSelection.Bible,
+        u'bibles/display brackets': DisplayStyle.NoBrackets,
+        u'bibles/display new chapter': False,
+        u'bibles/second bibles': True,
+        u'bibles/advanced bible': u'',
+        u'bibles/quick bible': u'',
+        u'bibles/proxy name': u'',
+        u'bibles/proxy address': u'',
+        u'bibles/proxy username': u'',
+        u'bibles/proxy password': u'',
+        u'bibles/bible theme': u'',
+        u'bibles/verse separator': u'',
+        u'bibles/range separator': u'',
+        u'bibles/list separator': u'',
+        u'bibles/end separator': u''
+    }
+
+
 class BiblePlugin(Plugin):
     log.info(u'Bible Plugin loaded')
 
     def __init__(self, plugin_helpers):
-        Plugin.__init__(self, u'bibles', plugin_helpers, BibleMediaItem, BiblesTab)
+        Plugin.__init__(self, u'bibles', __default_settings__, plugin_helpers, BibleMediaItem, BiblesTab)
         self.weight = -9
         self.iconPath = u':/plugins/plugin_bibles.png'
         self.icon = build_icon(self.iconPath)
@@ -88,12 +114,6 @@
                 QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Yes | QtGui.QMessageBox.No)) == \
                     QtGui.QMessageBox.Yes:
                 self.onToolsUpgradeItemTriggered()
-        settings = Settings()
-        settings.beginGroup(self.settingsSection)
-        if settings.contains(u'bookname language'):
-            settings.setValue(u'book name language', settings.value(u'bookname language', 0))
-            settings.remove(u'bookname language')
-        settings.endGroup()
 
     def addImportMenuItem(self, import_menu):
         self.importBibleItem = create_action(import_menu, u'importBibleItem',

=== modified file 'openlp/plugins/bibles/forms/bibleimportform.py'
--- openlp/plugins/bibles/forms/bibleimportform.py	2013-01-01 16:33:41 +0000
+++ openlp/plugins/bibles/forms/bibleimportform.py	2013-01-15 22:23:25 +0000
@@ -34,9 +34,9 @@
 
 from PyQt4 import QtCore, QtGui
 
-from openlp.core.lib import Receiver, translate, Settings
+from openlp.core.lib import Receiver, translate, Settings, UiStrings
 from openlp.core.lib.db import delete_database
-from openlp.core.lib.ui import UiStrings, critical_error_message_box
+from openlp.core.lib.ui import critical_error_message_box
 from openlp.core.ui.wizard import OpenLPWizard, WizardStrings
 from openlp.core.utils import AppLocation, locale_compare
 from openlp.plugins.bibles.lib.manager import BibleFormat
@@ -533,9 +533,9 @@
         self.setField(u'opensong_file', '')
         self.setField(u'web_location', WebDownload.Crosswalk)
         self.setField(u'web_biblename', self.webTranslationComboBox.currentIndex())
-        self.setField(u'proxy_server', settings.value(u'proxy address', u''))
-        self.setField(u'proxy_username', settings.value(u'proxy username', u''))
-        self.setField(u'proxy_password', settings.value(u'proxy password', u''))
+        self.setField(u'proxy_server', settings.value(u'proxy address'))
+        self.setField(u'proxy_username', settings.value(u'proxy username'))
+        self.setField(u'proxy_password', settings.value(u'proxy password'))
         self.setField(u'openlp1_location', '')
         self.setField(u'license_version', self.versionNameEdit.text())
         self.setField(u'license_copyright', self.copyrightEdit.text())

=== modified file 'openlp/plugins/bibles/forms/bibleupgradeform.py'
--- openlp/plugins/bibles/forms/bibleupgradeform.py	2013-01-01 16:33:41 +0000
+++ openlp/plugins/bibles/forms/bibleupgradeform.py	2013-01-15 22:23:25 +0000
@@ -36,8 +36,8 @@
 
 from PyQt4 import QtCore, QtGui
 
-from openlp.core.lib import Receiver, SettingsManager, translate, check_directory_exists, Settings
-from openlp.core.lib.ui import UiStrings, critical_error_message_box
+from openlp.core.lib import Receiver, SettingsManager, translate, check_directory_exists, Settings, UiStrings
+from openlp.core.lib.ui import critical_error_message_box
 from openlp.core.ui.wizard import OpenLPWizard, WizardStrings
 from openlp.core.utils import AppLocation, delete_file, get_filesystem_encoding
 from openlp.plugins.bibles.lib.db import BibleDB, BibleMeta, OldBibleDB, BiblesResourcesDB

=== modified file 'openlp/plugins/bibles/forms/editbibleform.py'
--- openlp/plugins/bibles/forms/editbibleform.py	2013-01-01 16:33:41 +0000
+++ openlp/plugins/bibles/forms/editbibleform.py	2013-01-15 22:23:25 +0000
@@ -32,8 +32,8 @@
 
 from PyQt4 import QtGui
 
-from openlp.core.lib import Receiver, translate
-from openlp.core.lib.ui import UiStrings, critical_error_message_box
+from openlp.core.lib import Receiver, translate, UiStrings
+from openlp.core.lib.ui import critical_error_message_box
 from editbibledialog import Ui_EditBibleDialog
 from openlp.plugins.bibles.lib import BibleStrings
 from openlp.plugins.bibles.lib.db import BiblesResourcesDB

=== modified file 'openlp/plugins/bibles/lib/__init__.py'
--- openlp/plugins/bibles/lib/__init__.py	2013-01-01 16:33:41 +0000
+++ openlp/plugins/bibles/lib/__init__.py	2013-01-15 22:23:25 +0000
@@ -187,10 +187,10 @@
     settings = Settings()
     settings.beginGroup(u'bibles')
     custom_separators = [
-        settings.value(u'verse separator', u''),
-        settings.value(u'range separator', u''),
-        settings.value(u'list separator', u''),
-        settings.value(u'end separator', u'')]
+        settings.value(u'verse separator'),
+        settings.value(u'range separator'),
+        settings.value(u'list separator'),
+        settings.value(u'end separator')]
     settings.endGroup()
     for index, role in enumerate([u'v', u'r', u'l', u'e']):
         if custom_separators[index].strip(u'|') == u'':

=== modified file 'openlp/plugins/bibles/lib/biblestab.py'
--- openlp/plugins/bibles/lib/biblestab.py	2013-01-01 16:33:41 +0000
+++ openlp/plugins/bibles/lib/biblestab.py	2013-01-15 22:23:25 +0000
@@ -31,8 +31,8 @@
 
 from PyQt4 import QtCore, QtGui
 
-from openlp.core.lib import Receiver, SettingsTab, translate, Settings
-from openlp.core.lib.ui import UiStrings, find_and_set_in_combo_box
+from openlp.core.lib import Receiver, SettingsTab, translate, Settings, UiStrings
+from openlp.core.lib.ui import find_and_set_in_combo_box
 from openlp.plugins.bibles.lib import LayoutStyle, DisplayStyle, update_reference_separators, \
     get_reference_separator, LanguageSelection
 
@@ -331,16 +331,16 @@
     def load(self):
         settings = Settings()
         settings.beginGroup(self.settingsSection)
-        self.show_new_chapters = settings.value(u'display new chapter', False)
-        self.display_style = settings.value(u'display brackets', 0)
-        self.layout_style = settings.value(u'verse layout style', 0)
-        self.bible_theme = settings.value(u'bible theme', u'')
-        self.second_bibles = settings.value(u'second bibles', True)
+        self.show_new_chapters = settings.value(u'display new chapter')
+        self.display_style = settings.value(u'display brackets')
+        self.layout_style = settings.value(u'verse layout style')
+        self.bible_theme = settings.value(u'bible theme')
+        self.second_bibles = settings.value(u'second bibles')
         self.newChaptersCheckBox.setChecked(self.show_new_chapters)
         self.displayStyleComboBox.setCurrentIndex(self.display_style)
         self.layoutStyleComboBox.setCurrentIndex(self.layout_style)
         self.bibleSecondCheckBox.setChecked(self.second_bibles)
-        verse_separator = settings.value(u'verse separator', u'')
+        verse_separator = settings.value(u'verse separator')
         if (verse_separator.strip(u'|') == u'') or (verse_separator == get_reference_separator(u'sep_v_default')):
             self.verseSeparatorLineEdit.setText(get_reference_separator(u'sep_v_default'))
             self.verseSeparatorLineEdit.setPalette(self.getGreyTextPalette(True))
@@ -349,7 +349,7 @@
             self.verseSeparatorLineEdit.setText(verse_separator)
             self.verseSeparatorLineEdit.setPalette(self.getGreyTextPalette(False))
             self.verseSeparatorCheckBox.setChecked(True)
-        range_separator = settings.value(u'range separator', u'')
+        range_separator = settings.value(u'range separator')
         if (range_separator.strip(u'|') == u'') or (range_separator == get_reference_separator(u'sep_r_default')):
             self.rangeSeparatorLineEdit.setText(get_reference_separator(u'sep_r_default'))
             self.rangeSeparatorLineEdit.setPalette(self.getGreyTextPalette(True))
@@ -358,7 +358,7 @@
             self.rangeSeparatorLineEdit.setText(range_separator)
             self.rangeSeparatorLineEdit.setPalette(self.getGreyTextPalette(False))
             self.rangeSeparatorCheckBox.setChecked(True)
-        list_separator = settings.value(u'list separator', u'')
+        list_separator = settings.value(u'list separator')
         if (list_separator.strip(u'|') == u'') or (list_separator == get_reference_separator(u'sep_l_default')):
             self.listSeparatorLineEdit.setText(get_reference_separator(u'sep_l_default'))
             self.listSeparatorLineEdit.setPalette(self.getGreyTextPalette(True))
@@ -367,7 +367,7 @@
             self.listSeparatorLineEdit.setText(list_separator)
             self.listSeparatorLineEdit.setPalette(self.getGreyTextPalette(False))
             self.listSeparatorCheckBox.setChecked(True)
-        end_separator = settings.value(u'end separator', u'')
+        end_separator = settings.value(u'end separator')
         if (end_separator.strip(u'|') == u'') or (end_separator == get_reference_separator(u'sep_e_default')):
             self.endSeparatorLineEdit.setText(get_reference_separator(u'sep_e_default'))
             self.endSeparatorLineEdit.setPalette(self.getGreyTextPalette(True))
@@ -376,7 +376,7 @@
             self.endSeparatorLineEdit.setText(end_separator)
             self.endSeparatorLineEdit.setPalette(self.getGreyTextPalette(False))
             self.endSeparatorCheckBox.setChecked(True)
-        self.language_selection = settings.value(u'book name language', 0)
+        self.language_selection = settings.value(u'book name language')
         self.languageSelectionComboBox.setCurrentIndex(self.language_selection)
         settings.endGroup()
 

=== modified file 'openlp/plugins/bibles/lib/db.py'
--- openlp/plugins/bibles/lib/db.py	2013-01-01 16:33:41 +0000
+++ openlp/plugins/bibles/lib/db.py	2013-01-15 22:23:25 +0000
@@ -778,7 +778,7 @@
             The source of the webbible.
         """
         log.debug(u'BiblesResourcesDB.get_webbibles("%s")', source)
-        if not isinstance(source,  unicode):
+        if not isinstance(source, unicode):
             source = unicode(source)
         source = BiblesResourcesDB.get_download_source(source)
         bibles = BiblesResourcesDB.run_sql(u'SELECT id, name, abbreviation, '
@@ -953,7 +953,7 @@
         return cursor.fetchall()
 
     @staticmethod
-    def get_book_reference_id(name,  language_id=None):
+    def get_book_reference_id(name, language_id=None):
         """
         Return a book_reference_id if the name matches.
 

=== modified file 'openlp/plugins/bibles/lib/http.py'
--- openlp/plugins/bibles/lib/http.py	2013-01-01 16:33:41 +0000
+++ openlp/plugins/bibles/lib/http.py	2013-01-15 22:23:25 +0000
@@ -526,7 +526,7 @@
         books = handler.get_books_from_http(self.download_name)
         if not books:
             log.exception(u'Importing books from %s - download name: "%s" '\
-                'failed' % (self.download_source,  self.download_name))
+                'failed' % (self.download_source, self.download_name))
             return False
         self.wizard.progressBar.setMaximum(len(books)+2)
         self.wizard.incrementProgressBar(translate(
@@ -552,7 +552,7 @@
                 language_id)
             if not book_ref_id:
                 log.exception(u'Importing books from %s - download name: "%s" '\
-                    'failed' % (self.download_source,  self.download_name))
+                    'failed' % (self.download_source, self.download_name))
                 return False
             book_details = BiblesResourcesDB.get_book_by_id(book_ref_id)
             log.debug(u'Book details: Name:%s; id:%s; testament_id:%s',

=== modified file 'openlp/plugins/bibles/lib/manager.py'
--- openlp/plugins/bibles/lib/manager.py	2013-01-01 16:33:41 +0000
+++ openlp/plugins/bibles/lib/manager.py	2013-01-15 22:23:25 +0000
@@ -126,7 +126,7 @@
         self.web = u'Web'
         self.db_cache = None
         self.path = AppLocation.get_section_data_path(self.settingsSection)
-        self.proxy_name = Settings().value(self.settingsSection + u'/proxy name', u'')
+        self.proxy_name = Settings().value(self.settingsSection + u'/proxy name')
         self.suffix = u'.sqlite'
         self.import_wizard = None
         self.reload_bibles()
@@ -358,7 +358,7 @@
         if not language_selection or language_selection.value == "None" or language_selection.value == "-1":
             # If None is returned, it's not the singleton object but a
             # BibleMeta object with the value "None"
-            language_selection = Settings().value(self.settingsSection + u'/book name language', 0)
+            language_selection = Settings().value(self.settingsSection + u'/book name language')
         else:
             language_selection = language_selection.value
         try:

=== modified file 'openlp/plugins/bibles/lib/mediaitem.py'
--- openlp/plugins/bibles/lib/mediaitem.py	2013-01-01 16:33:41 +0000
+++ openlp/plugins/bibles/lib/mediaitem.py	2013-01-15 22:23:25 +0000
@@ -31,10 +31,10 @@
 
 from PyQt4 import QtCore, QtGui
 
-from openlp.core.lib import MediaManagerItem, Receiver, ItemCapabilities, \
-    translate, create_separated_list, ServiceItemContext, Settings
+from openlp.core.lib import MediaManagerItem, Receiver, ItemCapabilities, translate, create_separated_list, \
+    ServiceItemContext, Settings, UiStrings
 from openlp.core.lib.searchedit import SearchEdit
-from openlp.core.lib.ui import UiStrings, set_case_insensitive_completer, create_horizontal_adjusting_combo_box, \
+from openlp.core.lib.ui import set_case_insensitive_completer, create_horizontal_adjusting_combo_box, \
     critical_error_message_box, find_and_set_in_combo_box, build_icon
 from openlp.core.utils import locale_compare
 from openlp.plugins.bibles.forms import BibleImportForm, EditBibleForm
@@ -228,7 +228,7 @@
         self.addSearchFields(u'advanced', UiStrings().Advanced)
         # Combo Boxes
         QtCore.QObject.connect(self.quickVersionComboBox, QtCore.SIGNAL(u'activated(int)'), self.updateAutoCompleter)
-        QtCore.QObject.connect(self.quickSecondComboBox,  QtCore.SIGNAL(u'activated(int)'), self.updateAutoCompleter)
+        QtCore.QObject.connect(self.quickSecondComboBox, QtCore.SIGNAL(u'activated(int)'), self.updateAutoCompleter)
         QtCore.QObject.connect(self.advancedVersionComboBox,QtCore.SIGNAL(u'activated(int)'),
             self.onAdvancedVersionComboBox)
         QtCore.QObject.connect(self.advancedSecondComboBox, QtCore.SIGNAL(u'activated(int)'),
@@ -260,7 +260,7 @@
 
     def configUpdated(self):
         log.debug(u'configUpdated')
-        if Settings().value(self.settingsSection + u'/second bibles', True):
+        if Settings().value(self.settingsSection + u'/second bibles'):
             self.advancedSecondLabel.setVisible(True)
             self.advancedSecondComboBox.setVisible(True)
             self.quickSecondLabel.setVisible(True)
@@ -312,8 +312,7 @@
                 translate('BiblesPlugin.MediaItem', 'Text Search'),
                 translate('BiblesPlugin.MediaItem', 'Search Text...'))
         ])
-        self.quickSearchEdit.setCurrentSearchType(Settings().value(u'%s/last search type' % self.settingsSection,
-            BibleSearch.Reference))
+        self.quickSearchEdit.setCurrentSearchType(Settings().value(u'%s/last search type' % self.settingsSection))
         self.configUpdated()
         log.debug(u'bible manager initialise complete')
 
@@ -335,13 +334,14 @@
         self.advancedVersionComboBox.addItems(bibles)
         self.advancedSecondComboBox.addItems(bibles)
         # set the default value
-        bible = Settings().value(self.settingsSection + u'/advanced bible', u'')
+        bible = Settings().value(self.settingsSection + u'/advanced bible')
         if bible in bibles:
             find_and_set_in_combo_box(self.advancedVersionComboBox, bible)
             self.initialiseAdvancedBible(unicode(bible))
         elif bibles:
             self.initialiseAdvancedBible(bibles[0])
-        bible = Settings().value(self.settingsSection + u'/quick bible', self.quickVersionComboBox.currentText())
+        # Check: causes crashes?
+        bible = Settings().value(self.settingsSection + u'/quick bible')
         find_and_set_in_combo_box(self.quickVersionComboBox, bible)
 
     def reloadBibles(self, process=False):

=== modified file 'openlp/plugins/custom/customplugin.py'
--- openlp/plugins/custom/customplugin.py	2013-01-05 22:17:30 +0000
+++ openlp/plugins/custom/customplugin.py	2013-01-15 22:23:25 +0000
@@ -29,13 +29,23 @@
 
 import logging
 
-from openlp.core.lib import Plugin, StringContent, build_icon, translate
+from openlp.core.lib import Plugin, StringContent, build_icon, translate, PluginStatus
 from openlp.core.lib.db import Manager
 from openlp.plugins.custom.lib import CustomMediaItem, CustomTab
 from openlp.plugins.custom.lib.db import CustomSlide, init_schema
+from openlp.plugins.custom.lib.mediaitem import CustomSearch
 
 log = logging.getLogger(__name__)
 
+__default_settings__ = {
+        u'custom/db type': u'sqlite',
+        u'custom/status': PluginStatus.Inactive,
+        u'custom/last search type':  CustomSearch.Titles,
+        u'custom/display footer': True,
+        u'custom/add custom from service': True
+    }
+
+
 class CustomPlugin(Plugin):
     """
     This plugin enables the user to create, edit and display
@@ -48,7 +58,7 @@
     log.info(u'Custom Plugin loaded')
 
     def __init__(self, plugin_helpers):
-        Plugin.__init__(self, u'custom', plugin_helpers, CustomMediaItem, CustomTab)
+        Plugin.__init__(self, u'custom', __default_settings__, plugin_helpers, CustomMediaItem, CustomTab)
         self.weight = -5
         self.manager = Manager(u'custom', init_schema)
         self.iconPath = u':/plugins/plugin_custom.png'

=== modified file 'openlp/plugins/custom/forms/editcustomdialog.py'
--- openlp/plugins/custom/forms/editcustomdialog.py	2013-01-05 22:17:30 +0000
+++ openlp/plugins/custom/forms/editcustomdialog.py	2013-01-15 22:23:25 +0000
@@ -29,8 +29,8 @@
 
 from PyQt4 import QtGui
 
-from openlp.core.lib import build_icon, translate
-from openlp.core.lib.ui import UiStrings, create_button_box, create_button
+from openlp.core.lib import build_icon, translate, UiStrings
+from openlp.core.lib.ui import create_button_box, create_button
 
 class Ui_CustomEditDialog(object):
     def setupUi(self, customEditDialog):

=== modified file 'openlp/plugins/custom/forms/editcustomslidedialog.py'
--- openlp/plugins/custom/forms/editcustomslidedialog.py	2013-01-05 22:17:30 +0000
+++ openlp/plugins/custom/forms/editcustomslidedialog.py	2013-01-15 22:23:25 +0000
@@ -29,8 +29,8 @@
 
 from PyQt4 import QtGui
 
-from openlp.core.lib import translate, SpellTextEdit, build_icon
-from openlp.core.lib.ui import UiStrings, create_button, create_button_box
+from openlp.core.lib import translate, SpellTextEdit, build_icon, UiStrings
+from openlp.core.lib.ui import create_button, create_button_box
 
 class Ui_CustomSlideEditDialog(object):
     def setupUi(self, customSlideEditDialog):

=== modified file 'openlp/plugins/custom/lib/customtab.py'
--- openlp/plugins/custom/lib/customtab.py	2013-01-05 22:17:30 +0000
+++ openlp/plugins/custom/lib/customtab.py	2013-01-15 22:23:25 +0000
@@ -77,8 +77,8 @@
     def load(self):
         settings = Settings()
         settings.beginGroup(self.settingsSection)
-        self.displayFooter = settings.value(u'display footer', True)
-        self.update_load = settings.value(u'add custom from service', True)
+        self.displayFooter = settings.value(u'display footer')
+        self.update_load = settings.value(u'add custom from service')
         self.displayFooterCheckBox.setChecked(self.displayFooter)
         self.add_from_service_checkbox.setChecked(self.update_load)
         settings.endGroup()

=== modified file 'openlp/plugins/custom/lib/mediaitem.py'
--- openlp/plugins/custom/lib/mediaitem.py	2013-01-05 22:17:30 +0000
+++ openlp/plugins/custom/lib/mediaitem.py	2013-01-15 22:23:25 +0000
@@ -33,8 +33,7 @@
 from sqlalchemy.sql import or_, func, and_
 
 from openlp.core.lib import MediaManagerItem, Receiver, ItemCapabilities, check_item_selected, translate, \
-    ServiceItemContext, Settings, PluginStatus
-from openlp.core.lib.ui import UiStrings
+    ServiceItemContext, Settings, PluginStatus, UiStrings
 from openlp.plugins.custom.forms import EditCustomForm
 from openlp.plugins.custom.lib import CustomXMLParser, CustomXMLBuilder
 from openlp.plugins.custom.lib.db import CustomSlide
@@ -83,7 +82,7 @@
             self.create_from_service_item)
 
     def config_updated(self):
-        self.add_custom_from_service = Settings().value(self.settingsSection + u'/add custom from service', True)
+        self.add_custom_from_service = Settings().value(self.settingsSection + u'/add custom from service')
 
     def retranslateUi(self):
         self.searchTextLabel.setText(u'%s:' % UiStrings().Search)
@@ -97,8 +96,7 @@
             (CustomSearch.Themes, u':/slides/slide_theme.png', UiStrings().Themes, UiStrings().SearchThemes)
         ])
         self.loadList(self.manager.get_all_objects(CustomSlide, order_by_ref=CustomSlide.title))
-        self.searchTextEdit.setCurrentSearchType(Settings().value( u'%s/last search type' % self.settingsSection,
-            CustomSearch.Titles))
+        self.searchTextEdit.setCurrentSearchType(Settings().value( u'%s/last search type' % self.settingsSection))
         self.config_updated()
 
     def loadList(self, custom_slides):
@@ -208,7 +206,7 @@
         service_item.title = title
         for slide in raw_slides:
             service_item.add_from_text(slide)
-        if Settings().value(self.settingsSection + u'/display footer', True) or credit:
+        if Settings().value(self.settingsSection + u'/display footer') or credit:
             service_item.raw_footer.append(u' '.join([title, credit]))
         else:
             service_item.raw_footer.append(u'')

=== modified file 'openlp/plugins/images/imageplugin.py'
--- openlp/plugins/images/imageplugin.py	2013-01-01 16:33:41 +0000
+++ openlp/plugins/images/imageplugin.py	2013-01-15 22:23:25 +0000
@@ -31,16 +31,23 @@
 
 import logging
 
-from openlp.core.lib import Plugin, StringContent, build_icon, translate, Receiver, ImageSource, Settings
+from openlp.core.lib import Plugin, StringContent, build_icon, translate, Receiver, ImageSource, Settings, PluginStatus
 from openlp.plugins.images.lib import ImageMediaItem, ImageTab
 
 log = logging.getLogger(__name__)
 
+__default_settings__ = {
+        u'images/images count': 0,
+        u'images/background color': u'#000000',
+        u'images/status': PluginStatus.Inactive
+    }
+
+
 class ImagePlugin(Plugin):
     log.info(u'Image Plugin loaded')
 
     def __init__(self, plugin_helpers):
-        Plugin.__init__(self, u'images', plugin_helpers, ImageMediaItem, ImageTab)
+        Plugin.__init__(self, u'images', __default_settings__, plugin_helpers, ImageMediaItem, ImageTab)
         self.weight = -7
         self.iconPath = u':/plugins/plugin_images.png'
         self.icon = build_icon(self.iconPath)
@@ -91,5 +98,5 @@
         image manager to require updates.  Actual update is triggered by the
         last part of saving the config.
         """
-        background = QtGui.QColor(Settings().value(self.settingsSection + u'/background color', u'#000000'))
+        background = QtGui.QColor(Settings().value(self.settingsSection + u'/background color'))
         self.liveController.imageManager.updateImagesBorder(ImageSource.ImagePlugin, background)

=== modified file 'openlp/plugins/images/lib/imagetab.py'
--- openlp/plugins/images/lib/imagetab.py	2013-01-01 16:33:41 +0000
+++ openlp/plugins/images/lib/imagetab.py	2013-01-15 22:23:25 +0000
@@ -29,8 +29,7 @@
 
 from PyQt4 import QtCore, QtGui
 
-from openlp.core.lib import SettingsTab, translate, Receiver, Settings
-from openlp.core.lib.ui import UiStrings
+from openlp.core.lib import SettingsTab, translate, Receiver, Settings, UiStrings
 
 class ImageTab(SettingsTab):
     """
@@ -81,7 +80,7 @@
     def load(self):
         settings = Settings()
         settings.beginGroup(self.settingsSection)
-        self.bg_color = settings.value(u'background color', u'#000000')
+        self.bg_color = settings.value(u'background color')
         self.initial_color = self.bg_color
         settings.endGroup()
         self.backgroundColorButton.setStyleSheet(u'background-color: %s' % self.bg_color)

=== modified file 'openlp/plugins/images/lib/mediaitem.py'
--- openlp/plugins/images/lib/mediaitem.py	2013-01-01 16:33:41 +0000
+++ openlp/plugins/images/lib/mediaitem.py	2013-01-15 22:23:25 +0000
@@ -33,8 +33,9 @@
 from PyQt4 import QtCore, QtGui
 
 from openlp.core.lib import MediaManagerItem, build_icon, ItemCapabilities, SettingsManager, translate, \
-    check_item_selected, check_directory_exists, Receiver, create_thumb, validate_thumb, ServiceItemContext, Settings
-from openlp.core.lib.ui import UiStrings, critical_error_message_box
+    check_item_selected, check_directory_exists, Receiver, create_thumb, validate_thumb, ServiceItemContext, Settings, \
+    UiStrings
+from openlp.core.lib.ui import critical_error_message_box
 from openlp.core.utils import AppLocation, delete_file, locale_compare, get_images_filter
 
 log = logging.getLogger(__name__)
@@ -141,7 +142,7 @@
 
     def generateSlideData(self, service_item, item=None, xmlVersion=False,
         remote=False, context=ServiceItemContext.Service):
-        background = QtGui.QColor(Settings().value(self.settingsSection + u'/background color', u'#000000'))
+        background = QtGui.QColor(Settings().value(self.settingsSection + u'/background color'))
         if item:
             items = [item]
         else:
@@ -205,7 +206,7 @@
         """
         if check_item_selected(self.listView,
                 translate('ImagePlugin.MediaItem', 'You must select an image to replace the background with.')):
-            background = QtGui.QColor(Settings().value(self.settingsSection + u'/background color', u'#000000'))
+            background = QtGui.QColor(Settings().value(self.settingsSection + u'/background color'))
             item = self.listView.selectedIndexes()[0]
             bitem = self.listView.item(item.row())
             filename = bitem.data(QtCore.Qt.UserRole)

=== modified file 'openlp/plugins/media/lib/mediaitem.py'
--- openlp/plugins/media/lib/mediaitem.py	2012-12-29 20:56:56 +0000
+++ openlp/plugins/media/lib/mediaitem.py	2013-01-15 22:23:25 +0000
@@ -33,8 +33,8 @@
 from PyQt4 import QtCore, QtGui
 
 from openlp.core.lib import MediaManagerItem, build_icon, ItemCapabilities, SettingsManager, translate, \
-    check_item_selected, Receiver, MediaType, ServiceItem, build_html, ServiceItemContext, Settings
-from openlp.core.lib.ui import UiStrings, critical_error_message_box, create_horizontal_adjusting_combo_box
+    check_item_selected, Receiver, MediaType, ServiceItem, build_html, ServiceItemContext, Settings, UiStrings
+from openlp.core.lib.ui import critical_error_message_box, create_horizontal_adjusting_combo_box
 from openlp.core.ui import DisplayController, Display, DisplayControllerType
 from openlp.core.ui.media import get_media_players, set_media_players
 from openlp.core.utils import locale_compare
@@ -192,7 +192,7 @@
         service_item.add_capability(ItemCapabilities.CanAutoStartForLive)
         service_item.add_capability(ItemCapabilities.RequiresMedia)
         service_item.add_capability(ItemCapabilities.HasDetailedTitleDisplay)
-        if Settings().value(self.settingsSection + u'/media auto start', QtCore.Qt.Unchecked) == QtCore.Qt.Checked:
+        if Settings().value(self.settingsSection + u'/media auto start') == QtCore.Qt.Checked:
             service_item.will_auto_start = True
             # force a non-existent theme
         service_item.theme = -1

=== modified file 'openlp/plugins/media/lib/mediatab.py'
--- openlp/plugins/media/lib/mediatab.py	2012-12-29 20:56:56 +0000
+++ openlp/plugins/media/lib/mediatab.py	2013-01-15 22:23:25 +0000
@@ -29,8 +29,8 @@
 
 from PyQt4 import QtCore, QtGui
 
-from openlp.core.lib import Receiver, Settings, SettingsTab, translate
-from openlp.core.lib.ui import UiStrings, create_button
+from openlp.core.lib import Receiver, Settings, SettingsTab, translate, UiStrings
+from openlp.core.lib.ui import create_button
 from openlp.core.ui.media import get_media_players, set_media_players
 
 class MediaQCheckBox(QtGui.QCheckBox):
@@ -72,19 +72,17 @@
         self.autoStartCheckBox.setText(translate('MediaPlugin.MediaTab', 'Start Live items automatically'))
 
     def load(self):
-        self.overridePlayerCheckBox.setChecked(Settings().value(self.settingsSection + u'/override player',
-            QtCore.Qt.Unchecked))
-        self.autoStartCheckBox.setChecked(Settings().value(self.settingsSection + u'/media auto start',
-            QtCore.Qt.Unchecked))
+        self.overridePlayerCheckBox.setChecked(Settings().value(self.settingsSection + u'/override player'))
+        self.autoStartCheckBox.setChecked(Settings().value(self.settingsSection + u'/media auto start'))
 
     def save(self):
         override_changed = False
         setting_key = self.settingsSection + u'/override player'
-        if Settings().value(setting_key, QtCore.Qt.Unchecked) != self.overridePlayerCheckBox.checkState():
+        if Settings().value(setting_key) != self.overridePlayerCheckBox.checkState():
             Settings().setValue(setting_key, self.overridePlayerCheckBox.checkState())
             override_changed = True
         setting_key = self.settingsSection + u'/media auto start'
-        if Settings().value(setting_key, QtCore.Qt.Unchecked) != self.autoStartCheckBox.checkState():
+        if Settings().value(setting_key) != self.autoStartCheckBox.checkState():
             Settings().setValue(setting_key, self.autoStartCheckBox.checkState())
         if override_changed:
             self.parent.resetSupportedSuffixes()

=== modified file 'openlp/plugins/media/mediaplugin.py'
--- openlp/plugins/media/mediaplugin.py	2012-12-29 20:56:56 +0000
+++ openlp/plugins/media/mediaplugin.py	2013-01-15 22:23:25 +0000
@@ -31,17 +31,23 @@
 
 from PyQt4 import QtCore
 
-from openlp.core.lib import Plugin, StringContent, build_icon, translate, \
-    Settings
+from openlp.core.lib import Plugin, StringContent, build_icon, translate, Settings, PluginStatus
 from openlp.plugins.media.lib import MediaMediaItem, MediaTab
 
 log = logging.getLogger(__name__)
 
+__default_settings__ = {
+        u'media/media count': 0,
+        u'media/media auto start': QtCore.Qt.Unchecked,
+        u'media/status': PluginStatus.Inactive
+    }
+
+
 class MediaPlugin(Plugin):
     log.info(u'%s MediaPlugin loaded', __name__)
 
     def __init__(self, plugin_helpers):
-        Plugin.__init__(self, u'media', plugin_helpers, MediaMediaItem)
+        Plugin.__init__(self, u'media', __default_settings__, plugin_helpers, MediaMediaItem)
         self.weight = -6
         self.iconPath = u':/plugins/plugin_media.png'
         self.icon = build_icon(self.iconPath)

=== modified file 'openlp/plugins/presentations/lib/mediaitem.py'
--- openlp/plugins/presentations/lib/mediaitem.py	2013-01-05 22:17:30 +0000
+++ openlp/plugins/presentations/lib/mediaitem.py	2013-01-15 22:23:25 +0000
@@ -33,8 +33,8 @@
 from PyQt4 import QtCore, QtGui
 
 from openlp.core.lib import MediaManagerItem, build_icon, SettingsManager, translate, check_item_selected, Receiver, \
-    ItemCapabilities, create_thumb, validate_thumb, ServiceItemContext, Settings
-from openlp.core.lib.ui import UiStrings, critical_error_message_box, create_horizontal_adjusting_combo_box
+    ItemCapabilities, create_thumb, validate_thumb, ServiceItemContext, Settings, UiStrings
+from openlp.core.lib.ui import critical_error_message_box, create_horizontal_adjusting_combo_box
 from openlp.core.utils import locale_compare
 from openlp.plugins.presentations.lib import MessageListener
 
@@ -137,8 +137,7 @@
         if self.displayTypeComboBox.count() > 1:
             self.displayTypeComboBox.insertItem(0, self.Automatic)
             self.displayTypeComboBox.setCurrentIndex(0)
-        if Settings().value(self.settingsSection + u'/override app',
-            QtCore.Qt.Unchecked) == QtCore.Qt.Checked:
+        if Settings().value(self.settingsSection + u'/override app') == QtCore.Qt.Checked:
             self.presentationWidget.show()
         else:
             self.presentationWidget.hide()

=== modified file 'openlp/plugins/presentations/lib/presentationcontroller.py'
--- openlp/plugins/presentations/lib/presentationcontroller.py	2013-01-05 22:17:30 +0000
+++ openlp/plugins/presentations/lib/presentationcontroller.py	2013-01-15 22:23:25 +0000
@@ -387,7 +387,7 @@
         """
         Return whether the controller is currently enabled
         """
-        if Settings().value(self.settings_section + u'/' + self.name, QtCore.Qt.Checked) == QtCore.Qt.Checked:
+        if Settings().value(self.settings_section + u'/' + self.name) == QtCore.Qt.Checked:
             return self.is_available()
         else:
             return False

=== modified file 'openlp/plugins/presentations/lib/presentationtab.py'
--- openlp/plugins/presentations/lib/presentationtab.py	2013-01-05 22:17:30 +0000
+++ openlp/plugins/presentations/lib/presentationtab.py	2013-01-15 22:23:25 +0000
@@ -29,8 +29,7 @@
 
 from PyQt4 import QtCore, QtGui
 
-from openlp.core.lib import Receiver, Settings, SettingsTab, translate
-from openlp.core.lib.ui import UiStrings
+from openlp.core.lib import Receiver, Settings, SettingsTab, translate, UiStrings
 
 class PresentationTab(SettingsTab):
     """
@@ -101,9 +100,8 @@
         for key in self.controllers:
             controller = self.controllers[key]
             checkbox = self.PresenterCheckboxes[controller.name]
-            checkbox.setChecked(Settings().value(self.settingsSection + u'/' + controller.name, QtCore.Qt.Checked))
-        self.OverrideAppCheckBox.setChecked(Settings().value(self.settingsSection + u'/override app',
-            QtCore.Qt.Unchecked))
+            checkbox.setChecked(Settings().value(self.settingsSection + u'/' + controller.name))
+        self.OverrideAppCheckBox.setChecked(Settings().value(self.settingsSection + u'/override app'))
 
     def save(self):
         """
@@ -119,7 +117,7 @@
             if controller.is_available():
                 checkbox = self.PresenterCheckboxes[controller.name]
                 setting_key = self.settingsSection + u'/' + controller.name
-                if Settings().value(setting_key, QtCore.Qt.Checked) != checkbox.checkState():
+                if Settings().value(setting_key) != checkbox.checkState():
                     changed = True
                     Settings().setValue(setting_key, checkbox.checkState())
                     if checkbox.isChecked():
@@ -127,7 +125,7 @@
                     else:
                         controller.kill()
         setting_key = self.settingsSection + u'/override app'
-        if Settings().value(setting_key, QtCore.Qt.Checked) != self.OverrideAppCheckBox.checkState():
+        if Settings().value(setting_key) != self.OverrideAppCheckBox.checkState():
             Settings().setValue(setting_key, self.OverrideAppCheckBox.checkState())
             changed = True
         if changed:

=== modified file 'openlp/plugins/presentations/presentationplugin.py'
--- openlp/plugins/presentations/presentationplugin.py	2013-01-05 22:17:30 +0000
+++ openlp/plugins/presentations/presentationplugin.py	2013-01-15 22:23:25 +0000
@@ -33,13 +33,25 @@
 import os
 import logging
 
-from openlp.core.lib import Plugin, StringContent, build_icon, translate
+from PyQt4 import QtCore
+
+from openlp.core.lib import Plugin, StringContent, build_icon, translate, PluginStatus
 from openlp.core.utils import AppLocation
 from openlp.plugins.presentations.lib import PresentationController, \
     PresentationMediaItem, PresentationTab
 
 log = logging.getLogger(__name__)
 
+__default_settings__ = {
+        u'presentations/Impress': 2,
+        u'presentations/override app': QtCore.Qt.Unchecked,
+        u'presentations/presentations count': 0,
+        u'presentations/Powerpoint': 2,
+        u'presentations/status': PluginStatus.Inactive,
+        u'presentations/Powerpoint Viewer': 2
+    }
+
+
 class PresentationPlugin(Plugin):
     """
     This plugin allowed a Presentation to be opened, controlled and displayed
@@ -54,7 +66,7 @@
         """
         log.debug(u'Initialised')
         self.controllers = {}
-        Plugin.__init__(self, u'presentations', plugin_helpers)
+        Plugin.__init__(self, u'presentations', __default_settings__, plugin_helpers, __default_settings__)
         self.weight = -8
         self.iconPath = u':/plugins/plugin_presentations.png'
         self.icon = build_icon(self.iconPath)

=== modified file 'openlp/plugins/remotes/lib/httpserver.py'
--- openlp/plugins/remotes/lib/httpserver.py	2013-01-05 22:17:30 +0000
+++ openlp/plugins/remotes/lib/httpserver.py	2013-01-15 22:23:25 +0000
@@ -169,8 +169,8 @@
         clients. Listen out for socket connections.
         """
         log.debug(u'Start TCP server')
-        port = Settings().value(self.plugin.settingsSection + u'/port', 4316)
-        address = Settings().value(self.plugin.settingsSection + u'/ip address', u'0.0.0.0')
+        port = Settings().value(self.plugin.settingsSection + u'/port')
+        address = Settings().value(self.plugin.settingsSection + u'/ip address')
         self.server = QtNetwork.QTcpServer()
         self.server.listen(QtNetwork.QHostAddress(address), port)
         QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'slidecontroller_live_changed'),
@@ -389,7 +389,7 @@
             u'service': self.parent.plugin.serviceManager.serviceId,
             u'slide': self.parent.current_slide or 0,
             u'item': self.parent.current_item._uuid if self.parent.current_item else u'',
-            u'twelve':Settings().value(u'remotes/twelve hour', True),
+            u'twelve':Settings().value(u'remotes/twelve hour'),
             u'blank': self.parent.plugin.liveController.blankScreen.isChecked(),
             u'theme': self.parent.plugin.liveController.themeScreen.isChecked(),
             u'display': self.parent.plugin.liveController.desktopScreen.isChecked()

=== modified file 'openlp/plugins/remotes/lib/remotetab.py'
--- openlp/plugins/remotes/lib/remotetab.py	2013-01-05 22:17:30 +0000
+++ openlp/plugins/remotes/lib/remotetab.py	2013-01-15 22:23:25 +0000
@@ -31,7 +31,6 @@
 
 from openlp.core.lib import Settings, SettingsTab, translate, Receiver
 
-ZERO_URL = u'0.0.0.0'
 
 class RemoteTab(SettingsTab):
     """
@@ -115,7 +114,7 @@
 
     def setUrls(self):
         ipAddress = u'localhost'
-        if self.addressEdit.text() == ZERO_URL:
+        if self.addressEdit.text() == Settings().value(self.settingsSection + u'/ip address'):
             ifaces = QtNetwork.QNetworkInterface.allInterfaces()
             for iface in ifaces:
                 if not iface.isValid():
@@ -135,16 +134,16 @@
         self.stageUrl.setText(u'<a href="%s">%s</a>' % (url, url))
 
     def load(self):
-        self.portSpinBox.setValue(Settings().value(self.settingsSection + u'/port', 4316))
-        self.addressEdit.setText(Settings().value(self.settingsSection + u'/ip address', ZERO_URL))
-        self.twelveHour = Settings().value(self.settingsSection + u'/twelve hour', True)
+        self.portSpinBox.setValue(Settings().value(self.settingsSection + u'/port'))
+        self.addressEdit.setText(Settings().value(self.settingsSection + u'/ip address'))
+        self.twelveHour = Settings().value(self.settingsSection + u'/twelve hour')
         self.twelveHourCheckBox.setChecked(self.twelveHour)
         self.setUrls()
 
     def save(self):
         changed = False
-        if Settings().value(self.settingsSection + u'/ip address', ZERO_URL != self.addressEdit.text() or
-                Settings().value(self.settingsSection + u'/port', 4316) != self.portSpinBox.value()):
+        if Settings().value(self.settingsSection + u'/ip address') != self.addressEdit.text() or \
+                Settings().value(self.settingsSection + u'/port') != self.portSpinBox.value():
             changed = True
         Settings().setValue(self.settingsSection + u'/port', self.portSpinBox.value())
         Settings().setValue(self.settingsSection + u'/ip address', self.addressEdit.text())

=== modified file 'openlp/plugins/remotes/remoteplugin.py'
--- openlp/plugins/remotes/remoteplugin.py	2013-01-05 22:17:30 +0000
+++ openlp/plugins/remotes/remoteplugin.py	2013-01-15 22:23:25 +0000
@@ -29,11 +29,19 @@
 
 import logging
 
-from openlp.core.lib import Plugin, StringContent, translate, build_icon
+from openlp.core.lib import Plugin, StringContent, translate, build_icon, PluginStatus
 from openlp.plugins.remotes.lib import RemoteTab, HttpServer
 
 log = logging.getLogger(__name__)
 
+__default_settings__ = {
+        u'remotes/twelve hour': True,
+        u'remotes/status': PluginStatus.Inactive,
+        u'remotes/port': 4316,
+        u'remotes/ip address': u'0.0.0.0'
+    }
+
+
 class RemotesPlugin(Plugin):
     log.info(u'Remote Plugin loaded')
 
@@ -41,7 +49,7 @@
         """
         remotes constructor
         """
-        Plugin.__init__(self, u'remotes', plugin_helpers, settings_tab_class=RemoteTab)
+        Plugin.__init__(self, u'remotes', __default_settings__, plugin_helpers, settings_tab_class=RemoteTab)
         self.iconPath = u':/plugins/plugin_remote.png'
         self.icon = build_icon(self.iconPath)
         self.weight = -1

=== modified file 'openlp/plugins/songs/forms/editsongdialog.py'
--- openlp/plugins/songs/forms/editsongdialog.py	2013-01-05 22:17:30 +0000
+++ openlp/plugins/songs/forms/editsongdialog.py	2013-01-15 22:23:25 +0000
@@ -29,8 +29,8 @@
 
 from PyQt4 import QtCore, QtGui
 
-from openlp.core.lib import build_icon, translate
-from openlp.core.lib.ui import UiStrings, create_button_box, create_button
+from openlp.core.lib import build_icon, translate, UiStrings
+from openlp.core.lib.ui import create_button_box, create_button
 from openlp.plugins.songs.lib.ui import SongStrings
 
 class Ui_EditSongDialog(object):

=== modified file 'openlp/plugins/songs/forms/editsongform.py'
--- openlp/plugins/songs/forms/editsongform.py	2013-01-05 22:17:30 +0000
+++ openlp/plugins/songs/forms/editsongform.py	2013-01-15 22:23:25 +0000
@@ -34,8 +34,9 @@
 
 from PyQt4 import QtCore, QtGui
 
-from openlp.core.lib import PluginStatus, Receiver, MediaType, translate, create_separated_list, check_directory_exists
-from openlp.core.lib.ui import UiStrings, set_case_insensitive_completer, critical_error_message_box, \
+from openlp.core.lib import PluginStatus, Receiver, MediaType, translate, create_separated_list, \
+    check_directory_exists, UiStrings
+from openlp.core.lib.ui import set_case_insensitive_completer, critical_error_message_box, \
     find_and_set_in_combo_box
 from openlp.core.utils import AppLocation
 from openlp.plugins.songs.forms import EditVerseForm, MediaFilesForm

=== modified file 'openlp/plugins/songs/forms/songexportform.py'
--- openlp/plugins/songs/forms/songexportform.py	2013-01-05 22:17:30 +0000
+++ openlp/plugins/songs/forms/songexportform.py	2013-01-15 22:23:25 +0000
@@ -34,8 +34,8 @@
 
 from PyQt4 import QtCore, QtGui
 
-from openlp.core.lib import build_icon, Receiver, translate, create_separated_list
-from openlp.core.lib.ui import UiStrings, critical_error_message_box
+from openlp.core.lib import build_icon, Receiver, translate, create_separated_list, UiStrings
+from openlp.core.lib.ui import critical_error_message_box
 from openlp.core.ui.wizard import OpenLPWizard, WizardStrings
 from openlp.plugins.songs.lib import natcmp
 from openlp.plugins.songs.lib.db import Song

=== modified file 'openlp/plugins/songs/forms/songimportform.py'
--- openlp/plugins/songs/forms/songimportform.py	2013-01-05 22:17:30 +0000
+++ openlp/plugins/songs/forms/songimportform.py	2013-01-15 22:23:25 +0000
@@ -35,8 +35,8 @@
 
 from PyQt4 import QtCore, QtGui
 
-from openlp.core.lib import Receiver, Settings, SettingsManager, translate
-from openlp.core.lib.ui import UiStrings, critical_error_message_box
+from openlp.core.lib import Receiver, Settings, SettingsManager, translate, UiStrings
+from openlp.core.lib.ui import critical_error_message_box
 from openlp.core.ui.wizard import OpenLPWizard, WizardStrings
 from openlp.plugins.songs.lib.importer import SongFormat, SongFormatSelect
 
@@ -306,7 +306,7 @@
         self.restart()
         self.finishButton.setVisible(False)
         self.cancelButton.setVisible(True)
-        last_import_type = Settings().value(u'songs/last import type', SongFormat.OpenLyrics)
+        last_import_type = Settings().value(u'songs/last import type')
         if last_import_type < 0 or last_import_type >= self.formatComboBox.count():
             last_import_type = 0
         self.formatComboBox.setCurrentIndex(last_import_type)

=== modified file 'openlp/plugins/songs/forms/songmaintenancedialog.py'
--- openlp/plugins/songs/forms/songmaintenancedialog.py	2013-01-06 17:25:49 +0000
+++ openlp/plugins/songs/forms/songmaintenancedialog.py	2013-01-15 22:23:25 +0000
@@ -29,8 +29,8 @@
 
 from PyQt4 import QtCore, QtGui
 
-from openlp.core.lib import build_icon
-from openlp.core.lib.ui import UiStrings, create_button_box
+from openlp.core.lib import build_icon, UiStrings
+from openlp.core.lib.ui import create_button_box
 from openlp.plugins.songs.lib.ui import SongStrings
 
 class Ui_SongMaintenanceDialog(object):

=== modified file 'openlp/plugins/songs/forms/songmaintenanceform.py'
--- openlp/plugins/songs/forms/songmaintenanceform.py	2013-01-06 17:25:49 +0000
+++ openlp/plugins/songs/forms/songmaintenanceform.py	2013-01-15 22:23:25 +0000
@@ -31,8 +31,8 @@
 from PyQt4 import QtGui, QtCore
 from sqlalchemy.sql import and_
 
-from openlp.core.lib import Receiver, translate
-from openlp.core.lib.ui import UiStrings, critical_error_message_box
+from openlp.core.lib import Receiver, translate, UiStrings
+from openlp.core.lib.ui import critical_error_message_box
 from openlp.plugins.songs.forms import AuthorsForm, TopicsForm, SongBookForm
 from openlp.plugins.songs.lib.db import Author, Book, Topic, Song
 from songmaintenancedialog import Ui_SongMaintenanceDialog

=== modified file 'openlp/plugins/songs/lib/importer.py'
--- openlp/plugins/songs/lib/importer.py	2013-01-06 17:25:49 +0000
+++ openlp/plugins/songs/lib/importer.py	2013-01-15 22:23:25 +0000
@@ -32,8 +32,7 @@
 import os
 import logging
 
-from openlp.core.lib import translate
-from openlp.core.lib.ui import UiStrings
+from openlp.core.lib import translate, UiStrings
 from openlp.core.ui.wizard import WizardStrings
 from opensongimport import OpenSongImport
 from easyslidesimport import EasySlidesImport

=== modified file 'openlp/plugins/songs/lib/mediaitem.py'
--- openlp/plugins/songs/lib/mediaitem.py	2013-01-06 17:25:49 +0000
+++ openlp/plugins/songs/lib/mediaitem.py	2013-01-15 22:23:25 +0000
@@ -37,8 +37,8 @@
 
 from openlp.core.lib import MediaManagerItem, Receiver, ItemCapabilities, \
     translate, check_item_selected, PluginStatus, create_separated_list, \
-    check_directory_exists, ServiceItemContext, Settings
-from openlp.core.lib.ui import UiStrings, create_widget_action
+    check_directory_exists, ServiceItemContext, Settings, UiStrings
+from openlp.core.lib.ui import create_widget_action
 from openlp.core.utils import AppLocation
 from openlp.plugins.songs.forms import EditSongForm, SongMaintenanceForm, \
     SongImportForm, SongExportForm
@@ -122,9 +122,9 @@
         self.searchTextEdit.setFocus()
 
     def configUpdated(self):
-        self.searchAsYouType = Settings().value(self.settingsSection + u'/search as type', False)
-        self.updateServiceOnEdit = Settings().value(self.settingsSection + u'/update service on edit', False)
-        self.addSongFromService = Settings().value(self.settingsSection + u'/add song from service', True)
+        self.searchAsYouType = Settings().value(self.settingsSection + u'/search as type')
+        self.updateServiceOnEdit = Settings().value(self.settingsSection + u'/update service on edit')
+        self.addSongFromService = Settings().value(self.settingsSection + u'/add song from service',)
 
     def retranslateUi(self):
         self.searchTextLabel.setText(u'%s:' % UiStrings().Search)
@@ -151,8 +151,7 @@
             (SongSearch.Themes, u':/slides/slide_theme.png',
             UiStrings().Themes, UiStrings().SearchThemes)
         ])
-        self.searchTextEdit.setCurrentSearchType(Settings().value(
-            u'%s/last search type' % self.settingsSection, SongSearch.Entire))
+        self.searchTextEdit.setCurrentSearchType(Settings().value(u'%s/last search type' % self.settingsSection))
         self.configUpdated()
 
     def onSearchTextButtonClicked(self):
@@ -470,9 +469,9 @@
         service_item.raw_footer.append(song.title)
         service_item.raw_footer.append(create_separated_list(author_list))
         service_item.raw_footer.append(song.copyright)
-        if Settings().value(u'general/ccli number', u''):
+        if Settings().value(u'general/ccli number'):
             service_item.raw_footer.append(translate('SongsPlugin.MediaItem', 'CCLI License: ') +
-                Settings().value(u'general/ccli number', u''))
+                Settings().value(u'general/ccli number'))
         service_item.audit = [
             song.title, author_list, song.copyright, unicode(song.ccli_number)
         ]

=== modified file 'openlp/plugins/songs/lib/songstab.py'
--- openlp/plugins/songs/lib/songstab.py	2013-01-06 17:25:49 +0000
+++ openlp/plugins/songs/lib/songstab.py	2013-01-15 22:23:25 +0000
@@ -80,36 +80,24 @@
             'Import missing songs from service files'))
 
     def onSearchAsTypeCheckBoxChanged(self, check_state):
-        self.song_search = False
-        # we have a set value convert to True/False
-        if check_state == QtCore.Qt.Checked:
-            self.song_search = True
+        self.song_search = (check_state == QtCore.Qt.Checked)
 
     def onToolBarActiveCheckBoxChanged(self, check_state):
-        self.tool_bar = False
-        # we have a set value convert to True/False
-        if check_state == QtCore.Qt.Checked:
-            self.tool_bar = True
+        self.tool_bar = (check_state == QtCore.Qt.Checked)
 
     def onUpdateOnEditCheckBoxChanged(self, check_state):
-        self.update_edit = False
-        # we have a set value convert to True/False
-        if check_state == QtCore.Qt.Checked:
-            self.update_edit = True
+        self.update_edit = (check_state == QtCore.Qt.Checked)
 
     def onAddFromServiceCheckBoxChanged(self, check_state):
-        self.update_load = False
-        # we have a set value convert to True/False
-        if check_state == QtCore.Qt.Checked:
-            self.update_load = True
+        self.update_load = (check_state == QtCore.Qt.Checked)
 
     def load(self):
         settings = Settings()
         settings.beginGroup(self.settingsSection)
-        self.song_search = settings.value(u'search as type', False)
-        self.tool_bar = settings.value(u'display songbar', True)
-        self.update_edit = settings.value(u'update service on edit', False)
-        self.update_load = settings.value(u'add song from service', True)
+        self.song_search = settings.value(u'search as type')
+        self.tool_bar = settings.value(u'display songbar')
+        self.update_edit = settings.value(u'update service on edit')
+        self.update_load = settings.value(u'add song from service')
         self.searchAsTypeCheckBox.setChecked(self.song_search)
         self.toolBarActiveCheckBox.setChecked(self.tool_bar)
         self.updateOnEditCheckBox.setChecked(self.update_edit)

=== modified file 'openlp/plugins/songs/songsplugin.py'
--- openlp/plugins/songs/songsplugin.py	2013-01-05 22:17:30 +0000
+++ openlp/plugins/songs/songsplugin.py	2013-01-15 22:23:25 +0000
@@ -34,17 +34,28 @@
 
 from PyQt4 import QtCore, QtGui
 
-from openlp.core.lib import Plugin, StringContent, build_icon, translate, Receiver
+from openlp.core.lib import Plugin, StringContent, build_icon, translate, Receiver, PluginStatus, UiStrings
 from openlp.core.lib.db import Manager
-from openlp.core.lib.ui import UiStrings, create_action
+from openlp.core.lib.ui import create_action
 from openlp.core.utils import get_filesystem_encoding
 from openlp.core.utils.actions import ActionList
 from openlp.plugins.songs.lib import clean_song, upgrade, SongMediaItem, SongsTab
 from openlp.plugins.songs.lib.db import init_schema, Song
+from openlp.plugins.songs.lib.mediaitem import SongSearch
 from openlp.plugins.songs.lib.importer import SongFormat
 from openlp.plugins.songs.lib.olpimport import OpenLPSongImport
 
 log = logging.getLogger(__name__)
+__default_settings__ = {
+        u'songs/db type': u'sqlite',
+        u'songs/status': PluginStatus.Inactive,
+        u'songs/last search type': SongSearch.Entire,
+        u'songs/last import type': SongFormat.OpenLyrics,
+        u'songs/update service on edit': False,
+        u'songs/search as type': False,
+        u'songs/add song from service': True,
+        u'songs/display songbar': True
+    }
 
 class SongsPlugin(Plugin):
     """
@@ -60,7 +71,7 @@
         """
         Create and set up the Songs plugin.
         """
-        Plugin.__init__(self, u'songs', plugin_helpers, SongMediaItem, SongsTab)
+        Plugin.__init__(self, u'songs', __default_settings__, plugin_helpers, SongMediaItem, SongsTab)
         self.manager = Manager(u'songs', init_schema, upgrade_mod=upgrade)
         self.weight = -10
         self.iconPath = u':/plugins/plugin_songs.png'

=== modified file 'openlp/plugins/songusage/forms/songusagedetailform.py'
--- openlp/plugins/songusage/forms/songusagedetailform.py	2013-01-01 16:33:41 +0000
+++ openlp/plugins/songusage/forms/songusagedetailform.py	2013-01-15 22:23:25 +0000
@@ -58,11 +58,8 @@
         """
         We need to set up the screen
         """
-        year = QtCore.QDate().currentDate().year()
-        if QtCore.QDate().currentDate().month() < 9:
-            year -= 1
-        toDate = Settings().value(self.plugin.settingsSection + u'/to date', QtCore.QDate(year, 8, 31))
-        fromDate = Settings().value(self.plugin.settingsSection + u'/from date', QtCore.QDate(year - 1, 9, 1))
+        toDate = Settings().value(self.plugin.settingsSection + u'/to date')
+        fromDate = Settings().value(self.plugin.settingsSection + u'/from date')
         self.fromDate.setSelectedDate(fromDate)
         self.toDate.setSelectedDate(toDate)
         self.fileLineEdit.setText(SettingsManager.get_last_dir(self.plugin.settingsSection, 1))

=== modified file 'openlp/plugins/songusage/songusageplugin.py'
--- openlp/plugins/songusage/songusageplugin.py	2013-01-01 16:33:41 +0000
+++ openlp/plugins/songusage/songusageplugin.py	2013-01-15 22:23:25 +0000
@@ -32,7 +32,7 @@
 
 from PyQt4 import QtCore, QtGui
 
-from openlp.core.lib import build_icon, Plugin, Receiver, Settings, StringContent, translate
+from openlp.core.lib import build_icon, Plugin, Receiver, Settings, StringContent, translate, PluginStatus
 from openlp.core.lib.db import Manager
 from openlp.core.lib.ui import create_action
 from openlp.core.utils.actions import ActionList
@@ -42,11 +42,20 @@
 
 log = logging.getLogger(__name__)
 
+__default_settings__ = {
+        u'songusage/db type': u'sqlite',
+        u'songusage/status': PluginStatus.Inactive,
+        u'songusage/active': False,
+        u'songusage/to date':  QtCore.QDate.currentDate(),
+        u'songusage/from date': QtCore.QDate.currentDate().addYears(-1)
+    }
+
+
 class SongUsagePlugin(Plugin):
     log.info(u'SongUsage Plugin loaded')
 
     def __init__(self, plugin_helpers):
-        Plugin.__init__(self, u'songusage', plugin_helpers)
+        Plugin.__init__(self, u'songusage', __default_settings__, plugin_helpers)
         self.manager = Manager(u'songusage', init_schema, upgrade_mod=upgrade)
         self.weight = -4
         self.icon = build_icon(u':/plugins/plugin_songusage.png')
@@ -112,7 +121,7 @@
             self.displaySongUsage)
         QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'print_service_started'),
             self.printSongUsage)
-        self.songUsageActive = Settings().value(self.settingsSection + u'/active', False)
+        self.songUsageActive = Settings().value(self.settingsSection + u'/active')
         # Set the button and checkbox state
         self.setButtonState()
         action_list = ActionList.get_instance()

=== added file 'tests/functional/openlp_core_lib/test_settings.py'
--- tests/functional/openlp_core_lib/test_settings.py	1970-01-01 00:00:00 +0000
+++ tests/functional/openlp_core_lib/test_settings.py	2013-01-15 22:23:25 +0000
@@ -0,0 +1,16 @@
+"""
+Package to test our customised Settings class.
+"""
+from unittest import TestCase
+
+from mock import MagicMock, patch
+
+from openlp.core.lib import Settings
+
+
+class TestSettings(TestCase):
+
+    def value_test(self):
+        #assert not(default_value is not None and key in Settings.__default_settings__)
+        pass
+


Follow ups