<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>options/newprofile.xml</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -1,3 +1,4 @@
+&lt;?xml version=&quot;1.0&quot;?&gt;
 &lt;!DOCTYPE psi&gt;
 &lt;!--
 	CONVENTIONS / RULES
@@ -12,10 +13,10 @@
 	Comments: please add a &quot;comment&quot; attribute to every option you add, describing its use and, if appropriate, possible values.
 	
 	--&gt;
-&lt;psi version=&quot;defaults&quot; &gt;
+&lt;psi version=&quot;defaults&quot;&gt;
 	&lt;options comment=&quot;Client options&quot;&gt;
 		&lt;account comment=&quot;Default account options&quot;&gt;
-			&lt;domain comment=&quot;Always use the same domain to register with. Leave this empty to allow the user to choose his server.&quot; type=&quot;QString&quot; /&gt;
+			&lt;domain comment=&quot;Always use the same domain to register with. Leave this empty to allow the user to choose his server.&quot; type=&quot;QString&quot;/&gt;
 		&lt;/account&gt;
 		&lt;enable-multicast comment=&quot;Enable multicasting messages to multiple recipients&quot; type=&quot;bool&quot;&gt;false&lt;/enable-multicast&gt;
 		&lt;html comment=&quot;Hypertext markup options&quot;&gt;
@@ -44,6 +45,7 @@
 				&lt;seconds comment=&quot;The maximum number of context seconds that should be sent when entering a room. Use a negative number for an unlimited amount.&quot; type=&quot;int&quot;&gt;-1&lt;/seconds&gt;
 			&lt;/context&gt;
 			&lt;recent-joins&gt;
+				&lt;jids type=&quot;QStringList&quot; /&gt;
 				&lt;maximum comment=&quot;The maximum number of recently joined rooms that should be remembered&quot; type=&quot;int&quot;&gt;10&lt;/maximum&gt;
 			&lt;/recent-joins&gt;
 		&lt;/muc&gt; 
@@ -73,6 +75,13 @@
 			&lt;/account&gt;
 			&lt;message comment=&quot;Message options&quot;&gt;
 				&lt;enabled comment=&quot;Enable message (i.e. non-chat) functionality&quot; type=&quot;bool&quot;&gt;true&lt;/enabled&gt;
+				&lt;auto-grab-urls-from-clipboard type=&quot;bool&quot;&gt;false&lt;/auto-grab-urls-from-clipboard&gt;
+				&lt;auto-popup type=&quot;bool&quot;&gt;false&lt;/auto-popup&gt;
+				&lt;auto-popup-headlines type=&quot;bool&quot;&gt;false&lt;/auto-popup-headlines&gt;
+				&lt;show-character-count type=&quot;bool&quot;&gt;false&lt;/show-character-count&gt;
+				&lt;show-subjects type=&quot;bool&quot;&gt;true&lt;/show-subjects&gt;
+				&lt;use-jid-auto-completion type=&quot;bool&quot;&gt;true&lt;/use-jid-auto-completion&gt;
+				&lt;size type=&quot;QString&quot;&gt;&lt;/size&gt; &lt;!-- will be invalid when converted to QSize so we can detect first load --&gt;
 			&lt;/message&gt;
 			&lt;chat comment=&quot;Chat dialog options&quot;&gt;
 				&lt;central-toolbar comment=&quot;Have a central toolbar&quot; type=&quot;bool&quot;&gt;false&lt;/central-toolbar&gt;
@@ -86,6 +95,13 @@
 					&lt;size comment=&quot;Maximum size of the avatar&quot; type=&quot;int&quot;&gt;32&lt;/size&gt;
 					&lt;show comment=&quot;Show avatars in the chat dialog&quot; type=&quot;bool&quot;&gt;true&lt;/show&gt;
 				&lt;/avatars&gt;
+				&lt;alert-for-already-open-chats type=&quot;bool&quot;&gt;true&lt;/alert-for-already-open-chats&gt;
+				&lt;auto-popup type=&quot;bool&quot;&gt;false&lt;/auto-popup&gt;
+				&lt;delete-contents-after type=&quot;QString&quot;&gt;hour&lt;/delete-contents-after&gt;
+				&lt;raise-chat-windows-on-new-messages type=&quot;bool&quot;&gt;false&lt;/raise-chat-windows-on-new-messages&gt;
+				&lt;use-chat-says-style type=&quot;bool&quot;&gt;false&lt;/use-chat-says-style&gt;
+				&lt;use-expanding-line-edit type=&quot;bool&quot;&gt;true&lt;/use-expanding-line-edit&gt;
+				&lt;use-small-chats type=&quot;bool&quot;&gt;false&lt;/use-small-chats&gt;
 			&lt;/chat&gt;
 			&lt;contactlist comment=&quot;Contact list options&quot;&gt;
 				&lt;auto-delete-unlisted comment=&quot;Automatically remove an unlisted contact from the contact list if it does not have any pending messages anymore&quot; type=&quot;bool&quot;&gt;false&lt;/auto-delete-unlisted&gt;
@@ -101,6 +117,36 @@
 					&lt;pgp comment=&quot;Display PGP information&quot; type=&quot;bool&quot;&gt;true&lt;/pgp&gt;
 				&lt;/tooltip&gt;
 				&lt;temp-no-roster-animation comment=&quot;Disable animated icons. This option will be removed as soon as the contactlist code is optimized enough&quot; type=&quot;bool&quot;&gt;false&lt;/temp-no-roster-animation&gt;
+				&lt;account-sort-style type=&quot;QString&quot;&gt;alpha&lt;/account-sort-style&gt;
+				&lt;always-on-top type=&quot;bool&quot;&gt;false&lt;/always-on-top&gt;
+				&lt;automatically-resize-roster type=&quot;bool&quot;&gt;false&lt;/automatically-resize-roster&gt;
+				&lt;grow-roster-upwards type=&quot;bool&quot;&gt;true&lt;/grow-roster-upwards&gt;
+				&lt;contact-sort-style type=&quot;QString&quot;&gt;status&lt;/contact-sort-style&gt;
+				&lt;disable-service-discovery type=&quot;bool&quot;&gt;false&lt;/disable-service-discovery&gt;
+				&lt;ensure-contact-visible-on-event type=&quot;bool&quot;&gt;true&lt;/ensure-contact-visible-on-event&gt;
+				&lt;group-sort-style type=&quot;QString&quot;&gt;alpha&lt;/group-sort-style&gt;
+				&lt;lockdown-roster type=&quot;bool&quot;&gt;false&lt;/lockdown-roster&gt;
+				&lt;raise-on-new-event type=&quot;bool&quot;&gt;false&lt;/raise-on-new-event&gt;
+				&lt;show&gt;
+					&lt;agent-contacts type=&quot;bool&quot;&gt;true&lt;/agent-contacts&gt;
+					&lt;away-contacts type=&quot;bool&quot;&gt;true&lt;/away-contacts&gt;
+					&lt;hidden-contacts-group type=&quot;bool&quot;&gt;true&lt;/hidden-contacts-group&gt;
+					&lt;offline-contacts type=&quot;bool&quot;&gt;true&lt;/offline-contacts&gt;
+					&lt;self-contact type=&quot;bool&quot;&gt;true&lt;/self-contact&gt;
+				&lt;/show&gt;
+				&lt;show-group-counts type=&quot;bool&quot;&gt;true&lt;/show-group-counts&gt;
+				&lt;show-menubar type=&quot;bool&quot;&gt;true&lt;/show-menubar&gt;
+				&lt;toolbars&gt;&lt;/toolbars&gt;
+				&lt;use-left-click type=&quot;bool&quot;&gt;false&lt;/use-left-click&gt;
+				&lt;use-single-click type=&quot;bool&quot;&gt;false&lt;/use-single-click&gt;
+				&lt;use-status-change-animation type=&quot;bool&quot;&gt;true&lt;/use-status-change-animation&gt;
+				&lt;use-transport-icons type=&quot;bool&quot;&gt;false&lt;/use-transport-icons&gt;
+				&lt;saved-window-geometry type=&quot;QRect&quot; &gt;
+					&lt;x&gt;64&lt;/x&gt;
+					&lt;y&gt;64&lt;/y&gt;
+					&lt;width&gt;150&lt;/width&gt;
+					&lt;height&gt;360&lt;/height&gt;
+				&lt;/saved-window-geometry&gt;
 			&lt;/contactlist&gt;
 			&lt;menu comment=&quot;Options for the menu&quot;&gt;
 				&lt;account comment=&quot;Options for the account-specific menu&quot;&gt;
@@ -124,10 +170,12 @@
 				&lt;/view&gt;
 			&lt;/menu&gt;
 			&lt;muc comment=&quot;Multi-User Chat options&quot;&gt;
+				&lt;highlight-words type=&quot;QStringList&quot; /&gt;
 				&lt;size comment=&quot;Remembered window size&quot; type=&quot;QSize&quot;&gt;
 					&lt;width&gt;580&lt;/width&gt;
 					&lt;height&gt;420&lt;/height&gt;
 				&lt;/size&gt;
+				&lt;use-highlighting type=&quot;bool&quot;&gt;true&lt;/use-highlighting&gt;&lt;use-nick-coloring type=&quot;bool&quot;&gt;true&lt;/use-nick-coloring&gt;
 			&lt;/muc&gt;
 			&lt;show-deprecated comment=&quot;Deprecated functionality or protocols&quot;&gt;
 				&lt;service-discovery comment=&quot;Service discovery dialog&quot;&gt;
@@ -139,12 +187,126 @@
 			&lt;/spell-check&gt;
 			&lt;systemtray comment=&quot;Options related to the system tray&quot;&gt;
 				&lt;use-old comment=&quot;Use the old system tray code (deprecated)&quot; type=&quot;bool&quot;&gt;false&lt;/use-old&gt;
+				&lt;enable type=&quot;bool&quot;&gt;true&lt;/enable&gt;
+				&lt;use-double-click type=&quot;bool&quot;&gt;false&lt;/use-double-click&gt;
 			&lt;/systemtray&gt;
 			&lt;tip comment=&quot;Tip of the day options&quot;&gt;
 				&lt;show comment=&quot;Show the tip of the day upon startup&quot; type=&quot;bool&quot;&gt;true&lt;/show&gt;
 				&lt;number comment=&quot;The next tip to show&quot; type=&quot;int&quot;&gt;0&lt;/number&gt;
 			&lt;/tip&gt;
 			&lt;flash-windows comment=&quot;Allow windows to flash upon activity&quot; type=&quot;bool&quot;&gt;true&lt;/flash-windows&gt;
+			&lt;automatically-copy-selected-text type=&quot;bool&quot;&gt;false&lt;/automatically-copy-selected-text&gt;
+			&lt;emoticons&gt;
+				&lt;use-emoticons type=&quot;bool&quot;&gt;false&lt;/use-emoticons&gt;
+			&lt;/emoticons&gt;
+			&lt;file-transfer&gt;
+				&lt;auto-popup type=&quot;bool&quot;&gt;false&lt;/auto-popup&gt;
+			&lt;/file-transfer&gt;
+			&lt;last-used-open-path type=&quot;QString&quot;&gt;/home/martin&lt;/last-used-open-path&gt;
+			&lt;last-used-save-path type=&quot;QString&quot;&gt;/home/martin&lt;/last-used-save-path&gt;
+			&lt;look&gt;
+				&lt;colors&gt;
+					&lt;contactlist&gt;
+						&lt;background type=&quot;QColor&quot;&gt;#ffffff&lt;/background&gt;
+						&lt;grouping&gt;
+							&lt;header-background type=&quot;QColor&quot;&gt;#f0f0f0&lt;/header-background&gt;
+							&lt;header-foreground type=&quot;QColor&quot;&gt;#5a5a5a&lt;/header-foreground&gt;
+						&lt;/grouping&gt;
+						&lt;profile&gt;
+							&lt;header-background type=&quot;QColor&quot;&gt;#969696&lt;/header-background&gt;
+							&lt;header-foreground type=&quot;QColor&quot;&gt;#ffffff&lt;/header-foreground&gt;
+						&lt;/profile&gt;
+						&lt;status&gt;
+							&lt;away type=&quot;QColor&quot;&gt;#004bb4&lt;/away&gt;
+							&lt;do-no-disturb type=&quot;QColor&quot;&gt;#7e0000&lt;/do-no-disturb&gt;
+							&lt;offline type=&quot;QColor&quot;&gt;#646464&lt;/offline&gt;
+							&lt;online type=&quot;QColor&quot;&gt;#000000&lt;/online&gt;
+						&lt;/status&gt;
+						&lt;status-messages type=&quot;QColor&quot;&gt;#808080&lt;/status-messages&gt;
+					&lt;/contactlist&gt;
+					&lt;muc&gt;
+						&lt;nick-colors type=&quot;QStringList&quot; &gt;
+							&lt;item&gt;Blue&lt;/item&gt;
+							&lt;item&gt;Green&lt;/item&gt;
+							&lt;item&gt;Orange&lt;/item&gt;
+							&lt;item&gt;Purple&lt;/item&gt;
+							&lt;item&gt;Red&lt;/item&gt;
+						&lt;/nick-colors&gt;
+					&lt;/muc&gt;
+					&lt;passive-popup&gt;
+						&lt;border type=&quot;QColor&quot;&gt;#5297f9&lt;/border&gt;
+					&lt;/passive-popup&gt;
+				&lt;/colors&gt;
+				&lt;contactlist&gt;
+					&lt;status-change-animation&gt;
+						&lt;color1 type=&quot;QColor&quot;&gt;#000000&lt;/color1&gt;
+						&lt;color2 type=&quot;QColor&quot;&gt;#969696&lt;/color2&gt;
+					&lt;/status-change-animation&gt;
+					&lt;use-outlined-group-headings type=&quot;bool&quot;&gt;false&lt;/use-outlined-group-headings&gt;
+					&lt;use-slim-group-headings type=&quot;bool&quot;&gt;false&lt;/use-slim-group-headings&gt;
+				&lt;/contactlist&gt;
+				&lt;font&gt;
+					&lt;chat type=&quot;QString&quot;&gt;Sans Serif,9,-1,5,50,0,0,0,0,0&lt;/chat&gt;
+					&lt;contactlist type=&quot;QString&quot;&gt;Sans Serif,9,-1,5,50,0,0,0,0,0&lt;/contactlist&gt;
+					&lt;message type=&quot;QString&quot;&gt;Sans Serif,9,-1,5,50,0,0,0,0,0&lt;/message&gt;
+					&lt;passive-popup type=&quot;QString&quot;&gt;Sans Serif,7,-1,5,50,0,0,0,0,0&lt;/passive-popup&gt;
+				&lt;/font&gt;
+			&lt;/look&gt;
+			&lt;mac&gt;
+				&lt;use-brushed-metal-windows type=&quot;bool&quot;&gt;false&lt;/use-brushed-metal-windows&gt;
+			&lt;/mac&gt;
+			&lt;notifications&gt;
+				&lt;alert-style type=&quot;QString&quot;&gt;animate&lt;/alert-style&gt;
+				&lt;bounce-dock type=&quot;QString&quot;&gt;forever&lt;/bounce-dock&gt;
+				&lt;passive-popups&gt;
+					&lt;duration type=&quot;int&quot;&gt;10000&lt;/duration&gt;
+					&lt;enabled type=&quot;bool&quot;&gt;false&lt;/enabled&gt;
+					&lt;incoming-chat type=&quot;bool&quot;&gt;true&lt;/incoming-chat&gt;
+					&lt;incoming-file-transfer type=&quot;bool&quot;&gt;true&lt;/incoming-file-transfer&gt;
+					&lt;incoming-headline type=&quot;bool&quot;&gt;true&lt;/incoming-headline&gt;
+					&lt;incoming-message type=&quot;bool&quot;&gt;true&lt;/incoming-message&gt;
+					&lt;maximum-jid-length type=&quot;int&quot;&gt;25&lt;/maximum-jid-length&gt;
+					&lt;maximum-text-length type=&quot;int&quot;&gt;300&lt;/maximum-text-length&gt;
+					&lt;maximum-status-length type=&quot;int&quot;&gt;-1&lt;/maximum-status-length&gt;
+					&lt;status&gt;
+						&lt;offline type=&quot;bool&quot;&gt;true&lt;/offline&gt;
+						&lt;online type=&quot;bool&quot;&gt;true&lt;/online&gt;
+						&lt;other-changes type=&quot;bool&quot;&gt;false&lt;/other-changes&gt;
+					&lt;/status&gt;
+				&lt;/passive-popups&gt;
+				&lt;popup-dialogs&gt;
+					&lt;suppress-when-not-on-roster type=&quot;bool&quot;&gt;false&lt;/suppress-when-not-on-roster&gt;
+					&lt;suppress-while-away type=&quot;bool&quot;&gt;false&lt;/suppress-while-away&gt;
+				&lt;/popup-dialogs&gt;
+				&lt;sounds&gt;
+					&lt;chat-message type=&quot;QString&quot;&gt;sound/chat2.wav&lt;/chat-message&gt;
+					&lt;completed-file-transfer type=&quot;QString&quot;&gt;sound/ft_complete.wav&lt;/completed-file-transfer&gt;
+					&lt;contact-offline type=&quot;QString&quot;&gt;sound/offline.wav&lt;/contact-offline&gt;
+					&lt;contact-online type=&quot;QString&quot;&gt;sound/online.wav&lt;/contact-online&gt;
+					&lt;enable type=&quot;bool&quot;&gt;true&lt;/enable&gt;
+					&lt;incoming-file-transfer type=&quot;QString&quot;&gt;sound/ft_incoming.wav&lt;/incoming-file-transfer&gt;
+					&lt;incoming-headline type=&quot;QString&quot;&gt;sound/chat2.wav&lt;/incoming-headline&gt;
+					&lt;incoming-message type=&quot;QString&quot;&gt;sound/chat2.wav&lt;/incoming-message&gt;
+					&lt;new-chat type=&quot;QString&quot;&gt;sound/chat1.wav&lt;/new-chat&gt;
+					&lt;notify-every-muc-message type=&quot;bool&quot;&gt;false&lt;/notify-every-muc-message&gt;
+					&lt;outgoing-chat type=&quot;QString&quot;&gt;sound/send.wav&lt;/outgoing-chat&gt;
+					&lt;silent-while-away type=&quot;bool&quot;&gt;false&lt;/silent-while-away&gt;
+					&lt;system-message type=&quot;QString&quot;&gt;sound/chat2.wav&lt;/system-message&gt;
+					&lt;unix-sound-player type=&quot;QString&quot;/&gt;
+				&lt;/sounds&gt;
+				&lt;successful-subscription type=&quot;bool&quot;&gt;false&lt;/successful-subscription&gt;
+			&lt;/notifications&gt;
+			&lt;remember-window-sizes type=&quot;bool&quot;&gt;true&lt;/remember-window-sizes&gt;
+			&lt;service-discovery&gt;
+				&lt;automatically-browse-into type=&quot;bool&quot;&gt;true&lt;/automatically-browse-into&gt;
+				&lt;automatically-get-items type=&quot;bool&quot;&gt;false&lt;/automatically-get-items&gt;
+				&lt;recent-jids type=&quot;QStringList&quot; /&gt;
+			&lt;/service-discovery&gt;
+			&lt;tabs&gt;
+				&lt;put-tabs-at-bottom type=&quot;bool&quot;&gt;false&lt;/put-tabs-at-bottom&gt;
+				&lt;use-tabs type=&quot;bool&quot;&gt;false&lt;/use-tabs&gt;
+				&lt;size type=&quot;QString&quot;&gt;&lt;/size&gt; &lt;!-- will be invalid when converted to QSize so we can detect first load --&gt;
+			&lt;/tabs&gt;
 		&lt;/ui&gt;
 		&lt;shortcuts comment=&quot;Shortcuts&quot;&gt;
 			&lt;chat comment=&quot;Shortcuts in the chat dialog&quot;&gt;
@@ -161,11 +323,11 @@
 					&lt;item type=&quot;QKeySequence&quot;&gt;Return&lt;/item&gt;
 					&lt;item type=&quot;QKeySequence&quot;&gt;Enter&lt;/item&gt;
 				&lt;/send&gt;
-				&lt;clear type=&quot;QKeySequence&quot; comment=&quot;Clear the text&quot; /&gt;
+				&lt;clear type=&quot;QKeySequence&quot; comment=&quot;Clear the text&quot;/&gt;
 			&lt;/chat&gt;
-			&lt;contactlist comment=&quot;Shortcuts in the contactlist&quot; &gt;
-				&lt;assign-custom-avatar type=&quot;QKeySequence&quot; comment=&quot;Assign a custom avatar to the selected contact&quot; /&gt;
-				&lt;clear-custom-avatar type=&quot;QKeySequence&quot; comment=&quot;Remove custom avatar from the selected contact&quot; /&gt;
+			&lt;contactlist comment=&quot;Shortcuts in the contactlist&quot;&gt;
+				&lt;assign-custom-avatar type=&quot;QKeySequence&quot; comment=&quot;Assign a custom avatar to the selected contact&quot;/&gt;
+				&lt;clear-custom-avatar type=&quot;QKeySequence&quot; comment=&quot;Remove custom avatar from the selected contact&quot;/&gt;
 				&lt;delete type=&quot;QKeySequence&quot; comment=&quot;Delete the selected contact&quot;&gt;Del&lt;/delete&gt;
 				&lt;chat type=&quot;QKeySequence&quot; comment=&quot;Open a chat to the selected contact&quot;&gt;Ctrl+C&lt;/chat&gt;
 				&lt;message type=&quot;QKeySequence&quot; comment=&quot;Send a message to the selected contact&quot;&gt;Ctrl+M&lt;/message&gt;
@@ -173,7 +335,7 @@
 				&lt;rename type=&quot;QKeySequence&quot; comment=&quot;Rename the selected contact&quot;&gt;F2&lt;/rename&gt;
 				&lt;login-transport type=&quot;QKeySequence&quot; comment=&quot;Log on to the selected transport&quot;&gt;Ctrl+L&lt;/login-transport&gt;
 			&lt;/contactlist&gt;
-			&lt;common comment=&quot;Common actions&quot; &gt;
+			&lt;common comment=&quot;Common actions&quot;&gt;
 				&lt;scroll-up type=&quot;QKeySequence&quot; comment=&quot;Scroll up&quot;&gt;Shift+PgUp&lt;/scroll-up&gt;
 				&lt;scroll-down type=&quot;QKeySequence&quot; comment=&quot;Scroll down&quot;&gt;Shift+PgDown&lt;/scroll-down&gt;
 				&lt;close type=&quot;QVariantList&quot; comment=&quot;Close the current window/tab&quot;&gt;
@@ -184,10 +346,10 @@
 				&lt;user-info type=&quot;QKeySequence&quot; comment=&quot;Show the user info of the contact&quot;&gt;Ctrl+I&lt;/user-info&gt;
 			&lt;/common&gt;
 			&lt;global comment=&quot;Shortcuts available from outside of the application&quot;&gt;
-				&lt;event type=&quot;QKeySequence&quot; comment=&quot;Receive incoming event&quot; /&gt;
-				&lt;toggle-visibility type=&quot;QKeySequence&quot; comment=&quot;Show/hide the application&quot; /&gt;
-				&lt;bring-to-front type=&quot;QKeySequence&quot; comment=&quot;Bring the application to front&quot; /&gt;
-				&lt;new-blank-message type=&quot;QKeySequence&quot; comment=&quot;Send new message&quot; /&gt;
+				&lt;event type=&quot;QKeySequence&quot; comment=&quot;Receive incoming event&quot;/&gt;
+				&lt;toggle-visibility type=&quot;QKeySequence&quot; comment=&quot;Show/hide the application&quot;/&gt;
+				&lt;bring-to-front type=&quot;QKeySequence&quot; comment=&quot;Bring the application to front&quot;/&gt;
+				&lt;new-blank-message type=&quot;QKeySequence&quot; comment=&quot;Send new message&quot;/&gt;
 			&lt;/global&gt;
 			&lt;message comment=&quot;Shortcuts in the message dialog&quot;&gt;
 				&lt;send type=&quot;QVariantList&quot; comment=&quot;Send the message&quot;&gt;
@@ -207,7 +369,69 @@
 			&lt;/status&gt;
 			&lt;service-discovery comment=&quot;Shortcuts in the service discovery dialog&quot;/&gt;
 		&lt;/shortcuts&gt;
+		&lt;contactlist&gt;
+			&lt;hide-on-start type=&quot;bool&quot;&gt;false&lt;/hide-on-start&gt;
+			&lt;resolve-nicks-on-contact-add type=&quot;bool&quot;&gt;false&lt;/resolve-nicks-on-contact-add&gt;
+			&lt;use-toolwindow type=&quot;bool&quot;&gt;false&lt;/use-toolwindow&gt;
+		&lt;/contactlist&gt;
+		&lt;external-control&gt;
+			&lt;adhoc-remote-control&gt;
+				&lt;enable type=&quot;bool&quot;&gt;false&lt;/enable&gt;
+			&lt;/adhoc-remote-control&gt;
+		&lt;/external-control&gt;
+		&lt;iconsets&gt;
+			&lt;service-status&gt;
+			&lt;/service-status&gt;
+			&lt;emoticons type=&quot;QStringList&quot; &gt;
+				&lt;item&gt;default&lt;/item&gt;
+			&lt;/emoticons&gt;
+			&lt;status type=&quot;QString&quot;&gt;default&lt;/status&gt;
+			&lt;system type=&quot;QString&quot;&gt;default&lt;/system&gt;
+		&lt;/iconsets&gt;
+		&lt;messages&gt;
+			&lt;default-outgoing-message-type type=&quot;QString&quot;&gt;chat&lt;/default-outgoing-message-type&gt;
+			&lt;exclude-muc-from-ignore type=&quot;bool&quot;&gt;true&lt;/exclude-muc-from-ignore&gt;
+			&lt;force-incoming-message-type type=&quot;QString&quot;&gt;no&lt;/force-incoming-message-type&gt;
+			&lt;ignore-headlines type=&quot;bool&quot;&gt;false&lt;/ignore-headlines&gt;
+			&lt;ignore-non-roster-contacts type=&quot;bool&quot;&gt;false&lt;/ignore-non-roster-contacts&gt;
+			&lt;send-composing-events type=&quot;bool&quot;&gt;true&lt;/send-composing-events&gt;
+			&lt;send-inactivity-events type=&quot;bool&quot;&gt;false&lt;/send-inactivity-events&gt;
+		&lt;/messages&gt;
+		&lt;p2p&gt;
+			&lt;bytestreams&gt;
+				&lt;external-address type=&quot;QString&quot;/&gt;
+				&lt;listen-port type=&quot;int&quot;&gt;8010&lt;/listen-port&gt;
+			&lt;/bytestreams&gt;
+		&lt;/p2p&gt;
+		&lt;service-discovery&gt;
+			&lt;enable-entity-capabilities type=&quot;bool&quot;&gt;true&lt;/enable-entity-capabilities&gt;
+		&lt;/service-discovery&gt;
+		&lt;status&gt;
+			&lt;ask-for-message-on-offline type=&quot;bool&quot;&gt;false&lt;/ask-for-message-on-offline&gt;
+			&lt;ask-for-message-on-online type=&quot;bool&quot;&gt;false&lt;/ask-for-message-on-online&gt;
+			&lt;auto-away&gt;
+				&lt;away-after type=&quot;int&quot;&gt;10&lt;/away-after&gt;
+				&lt;message type=&quot;QString&quot;&gt;Auto Status (idle)&lt;/message&gt;
+				&lt;not-availible-after type=&quot;int&quot;&gt;30&lt;/not-availible-after&gt;
+				&lt;offline-after type=&quot;int&quot;&gt;0&lt;/offline-after&gt;
+				&lt;use-away type=&quot;bool&quot;&gt;true&lt;/use-away&gt;
+				&lt;use-not-availible type=&quot;bool&quot;&gt;true&lt;/use-not-availible&gt;
+				&lt;use-offline type=&quot;bool&quot;&gt;false&lt;/use-offline&gt;
+			&lt;/auto-away&gt;
+			&lt;last-message type=&quot;QString&quot;/&gt;
+			&lt;presets&gt;
+			&lt;/presets&gt;
+		&lt;/status&gt;
+		&lt;subscriptions&gt;
+			&lt;automatically-allow-authorisation type=&quot;bool&quot;&gt;false&lt;/automatically-allow-authorisation&gt;
+		&lt;/subscriptions&gt;
+		&lt;vcard&gt;
+			&lt;query-own-vcard-on-login type=&quot;bool&quot;&gt;true&lt;/query-own-vcard-on-login&gt;
+		&lt;/vcard&gt;
+		&lt;xml-console&gt;
+			&lt;enable-at-login type=&quot;bool&quot;&gt;false&lt;/enable-at-login&gt;
+		&lt;/xml-console&gt;
 	&lt;/options&gt;
-	&lt;accounts comment=&quot;Account definitions and options&quot;&gt;&lt;/accounts&gt;
-	&lt;plugins comment=&quot;Plugin options&quot;&gt;&lt;/plugins&gt;
+	&lt;accounts comment=&quot;Account definitions and options&quot;/&gt;
+	&lt;plugins comment=&quot;Plugin options&quot;/&gt;
 &lt;/psi&gt;</diff>
      <filename>options/default.xml</filename>
    </modified>
    <modified>
      <diff>@@ -6,5 +6,6 @@
 		&lt;file&gt;options/default.xml&lt;/file&gt;
 		&lt;file&gt;options/windows.xml&lt;/file&gt;
 		&lt;file&gt;options/macosx.xml&lt;/file&gt;
+		&lt;file&gt;options/newprofile.xml&lt;/file&gt;
 	&lt;/qresource&gt;
 &lt;/RCC&gt;</diff>
      <filename>psi.qrc</filename>
    </modified>
    <modified>
      <diff>@@ -103,7 +103,7 @@ void AccountAddDlg::add()
 		int port = w-&gt;port();
 		bool legacy_ssl_probe = w-&gt;legacySSLProbe();
 		UserAccount::SSLFlag ssl = w-&gt;ssl();
-		int proxy = w-&gt;proxy();
+		QString proxy = w-&gt;proxy();
 
 		delete w;
 </diff>
      <filename>src/accountadddlg.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -179,7 +179,7 @@ void AccountRemoveDlg::remove()
 	Jid j = d-&gt;acc.jid;
 	QString pass = le_pass-&gt;text();
 	j.setResource(d-&gt;acc.resource);
-	client-&gt;connectToServer(j, d-&gt;acc.legacy_ssl_probe, d-&gt;acc.ssl == UserAccount::SSL_Legacy, d-&gt;acc.ssl == UserAccount::SSL_Yes, d-&gt;acc.opt_host ? d-&gt;acc.host : QString(), d-&gt;acc.port, d-&gt;proxyman, d-&gt;acc.proxy_index, &amp;pass);
+	client-&gt;connectToServer(j, d-&gt;acc.legacy_ssl_probe, d-&gt;acc.ssl == UserAccount::SSL_Legacy, d-&gt;acc.ssl == UserAccount::SSL_Yes, d-&gt;acc.opt_host ? d-&gt;acc.host : QString(), d-&gt;acc.port, d-&gt;proxyman, d-&gt;acc.proxyID, &amp;pass);
 }
 
 void AccountRemoveDlg::client_handshaken()</diff>
      <filename>src/accountmanagedlg.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -27,7 +27,6 @@
 #include &quot;iconset.h&quot;
 #include &quot;psioptions.h&quot;
 #include &quot;jidutil.h&quot;
-#include &quot;profiles.h&quot;
 #include &quot;psicon.h&quot;
 #include &quot;proxy.h&quot;
 #include &quot;privacymanager.h&quot;
@@ -152,7 +151,7 @@ void AccountModifyDlg::init()
 
 	pc = psi-&gt;proxy()-&gt;createProxyChooser(tab_connection);
 	replaceWidget(lb_proxychooser, pc);
-	pc-&gt;setCurrentItem(acc.proxy_index);
+	pc-&gt;setCurrentItem(acc.proxyID);
 	
 	// Security level
 	cb_security_level-&gt;addItem(tr(&quot;None&quot;),QCA::SL_None);
@@ -528,7 +527,7 @@ void AccountModifyDlg::save()
 
 	acc.pgpSecretKey = key;
 
-	acc.proxy_index = pc-&gt;currentItem();
+	acc.proxyID = pc-&gt;currentItem();
 
 	if(pa &amp;&amp; pa-&gt;isActive()) {
 		QMessageBox::information(this, tr(&quot;Warning&quot;), tr(&quot;This account is currently active, so certain changes may not take effect until the next login.&quot;));</diff>
      <filename>src/accountmodifydlg.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -55,7 +55,7 @@ public:
 	int port() const { return port_; }
 	bool legacySSLProbe() { return legacy_ssl_probe_; }
 	UserAccount::SSLFlag ssl() const { return ssl_; }
-	int proxy() const { return proxy_; }
+	QString proxy() const { return proxy_; }
 
 public slots:
 	void done(int);
@@ -100,7 +100,7 @@ private:
 	QString host_;
 	int port_;
 	QString pass_;
-	int proxy_;
+	QString proxy_;
 };
 
 #endif</diff>
      <filename>src/accountregdlg.h</filename>
    </modified>
    <modified>
      <diff>@@ -21,7 +21,6 @@
 #include &lt;qdir.h&gt;
 #include &lt;qfileinfo.h&gt;
 
-#include &quot;common.h&quot;
 #include &quot;psiaccount.h&quot;
 #include &quot;adhoc_fileserver.h&quot;
 #include &quot;xmpp_xdata.h&quot;</diff>
      <filename>src/adhoc_fileserver.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -19,7 +19,7 @@
  */
 
 #include &quot;alerticon.h&quot;
-#include &quot;common.h&quot;
+#include &quot;psioptions.h&quot;
 #include &lt;qtimer.h&gt;
 #include &lt;qapplication.h&gt;
 //Added by qt3to4:
@@ -148,7 +148,7 @@ void AlertIcon::Private::init()
 	connect(metaAlertIcon, SIGNAL(update()), SLOT(update()));
 	connect(real, SIGNAL(iconModified()), SLOT(pixmapChanged()));
 
-	if ( option.alertStyle == 2 &amp;&amp; real-&gt;isAnimated() )
+	if ( PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.alert-style&quot;).toString() == &quot;animate&quot; &amp;&amp; real-&gt;isAnimated() )
 		impix = real-&gt;frameImpix();
 	else
 		impix = real-&gt;impix();
@@ -162,14 +162,14 @@ void AlertIcon::Private::update()
 
 void AlertIcon::Private::activated(bool playSound)
 {
-	if ( option.alertStyle == 2 &amp;&amp; real-&gt;isAnimated() ) {
+	if ( PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.alert-style&quot;).toString() == &quot;animate&quot; &amp;&amp; real-&gt;isAnimated() ) {
 		if ( !isActivated ) {
 			connect(real, SIGNAL(pixmapChanged()), SLOT(pixmapChanged()));
 			real-&gt;activated(playSound);
 			isActivated = true;
 		}
 	}
-	else if ( option.alertStyle == 1 || (option.alertStyle == 2 &amp;&amp; !real-&gt;isAnimated()) ) {
+	else if ( PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.alert-style&quot;).toString() == &quot;blink&quot; || (PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.alert-style&quot;).toString() == &quot;animate&quot; &amp;&amp; !real-&gt;isAnimated()) ) {
 		connect(metaAlertIcon, SIGNAL(updateFrame(int)), SLOT(updateFrame(int)));
 	}
 	else {
@@ -266,10 +266,10 @@ const Impix &amp;AlertIcon::impix() const
 
 int AlertIcon::frameNumber() const
 {
-	if ( option.alertStyle == 2 &amp;&amp; d-&gt;real-&gt;isAnimated() ) {
+	if ( PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.alert-style&quot;).toString() == &quot;animate&quot; &amp;&amp; d-&gt;real-&gt;isAnimated() ) {
 		return d-&gt;real-&gt;frameNumber();
 	}
-	else if ( option.alertStyle == 1 || (option.alertStyle == 2 &amp;&amp; !d-&gt;real-&gt;isAnimated()) ) {
+	else if ( PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.alert-style&quot;).toString() == &quot;blink&quot; || (PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.alert-style&quot;).toString() == &quot;animate&quot; &amp;&amp; !d-&gt;real-&gt;isAnimated()) ) {
 		return metaAlertIcon-&gt;framenumber();
 	}
 </diff>
      <filename>src/alerticon.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -60,7 +60,7 @@ using namespace QCA;
 
 static QByteArray scaleAvatar(const QByteArray&amp; b)
 {
-	//int maxSize = (option.avatarsSize &gt; MAX_AVATAR_SIZE ? MAX_AVATAR_SIZE : option.avatarsSize);
+	//int maxSize = (LEGOPTS.avatarsSize &gt; MAX_AVATAR_SIZE ? MAX_AVATAR_SIZE : LEGOPTS.avatarsSize);
 	int maxSize = AvatarFactory::maxAvatarSize();
 	QImage i(b);
 	if (i.isNull()) {</diff>
      <filename>src/avatars.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -48,9 +48,7 @@
 #include &lt;QDragEnterEvent&gt;
 #include &lt;QTextDocument&gt; // for Qt::escape()
 
-#include &quot;profiles.h&quot;
 #include &quot;psiaccount.h&quot;
-#include &quot;common.h&quot;
 #include &quot;userlist.h&quot;
 #include &quot;stretchwidget.h&quot;
 #include &quot;psiiconset.h&quot;
@@ -92,7 +90,7 @@ ChatDlg::ChatDlg(const Jid&amp; jid, PsiAccount* pa, TabManager* tabManager)
 	: TabbableWidget(jid, pa, tabManager)
 	, highlightersInstalled_(false)
 {
-	if (option.brushedMetal) {
+	if (PsiOptions::instance()-&gt;getOption(&quot;options.ui.mac.use-brushed-metal-windows&quot;).toBool()) {
 		setAttribute(Qt::WA_MacMetalStyle);
 	}
 
@@ -187,7 +185,7 @@ void ChatDlg::setShortcuts()
 	act_scrollup_-&gt;setShortcuts(ShortcutManager::instance()-&gt;shortcuts(&quot;common.scroll-up&quot;));
 	act_scrolldown_-&gt;setShortcuts(ShortcutManager::instance()-&gt;shortcuts(&quot;common.scroll-down&quot;));
 
-	//if(!option.useTabs) {
+	//if(!PsiOptions::instance()-&gt;getOption(&quot;options.ui.tabs.use-tabs&quot;).toBool()) {
 	//	act_close_-&gt;setShortcuts(ShortcutManager::instance()-&gt;shortcuts(&quot;common.close&quot;));
 	//}
 }
@@ -208,7 +206,7 @@ void ChatDlg::scrollDown()
 void ChatDlg::keyPressEvent(QKeyEvent *e)
 {
 	QKeySequence key = e-&gt;key() + (e-&gt;modifiers() &amp; ~Qt::KeypadModifier);
-	if (!option.useTabs &amp;&amp; ShortcutManager::instance()-&gt;shortcuts(&quot;common.close&quot;).contains(key)) {
+	if (!PsiOptions::instance()-&gt;getOption(&quot;options.ui.tabs.use-tabs&quot;).toBool() &amp;&amp; ShortcutManager::instance()-&gt;shortcuts(&quot;common.close&quot;).contains(key)) {
 		close();
 	}
 	else if (ShortcutManager::instance()-&gt;shortcuts(&quot;chat.send&quot;).contains(key)) {
@@ -227,7 +225,7 @@ void ChatDlg::keyPressEvent(QKeyEvent *e)
 
 void ChatDlg::resizeEvent(QResizeEvent *e)
 {
-	if (option.keepSizes) {
+	if (PsiOptions::instance()-&gt;getOption(&quot;options.ui.remember-window-sizes&quot;).toBool()) {
 		PsiOptions::instance()-&gt;setOption(&quot;options.ui.chat.size&quot;, e-&gt;size());
 	}
 }
@@ -262,14 +260,14 @@ bool ChatDlg::readyToHide()
 	}
 
 	// destroy the dialog if delChats is dcClose
-	if (option.delChats == dcClose) {
+	if (PsiOptions::instance()-&gt;getOption(&quot;options.ui.chat.delete-contents-after&quot;).toString() == &quot;instant&quot;) {
 		setAttribute(Qt::WA_DeleteOnClose);
 	}
 	else {
-		if (option.delChats == dcHour) {
+		if (PsiOptions::instance()-&gt;getOption(&quot;options.ui.chat.delete-contents-after&quot;).toString() == &quot;hour&quot;) {
 			setSelfDestruct(60);
 		}
-		else if (option.delChats == dcDay) {
+		else if (PsiOptions::instance()-&gt;getOption(&quot;options.ui.chat.delete-contents-after&quot;).toString() == &quot;day&quot;) {
 			setSelfDestruct(60 * 24);
 		}
 	}
@@ -470,7 +468,7 @@ void ChatDlg::updateContact(const Jid &amp;j, bool fromPresence)
 				QString msg = tr(&quot;%1 is %2&quot;).arg(Qt::escape(dispNick_)).arg(status2txt(status_));
 				if (!statusString_.isEmpty()) {
 					QString ss = TextUtil::linkify(TextUtil::plain2rich(statusString_));
-					if (option.useEmoticons) {
+					if (PsiOptions::instance()-&gt;getOption(&quot;options.ui.emoticons.use-emoticons&quot;).toBool()) {
 						ss = TextUtil::emoticonify(ss);
 					}
 					if (PsiOptions::instance()-&gt;getOption(&quot;options.ui.chat.legacy-formatting&quot;).toBool()) {
@@ -516,7 +514,7 @@ void ChatDlg::setLooks()
 {
 	// update the font
 	QFont f;
-	f.fromString(option.font[fChat]);
+	f.fromString(PsiOptions::instance()-&gt;getOption(&quot;options.ui.look.font.chat&quot;).toString());
 	chatView()-&gt;setFont(f);
 	chatEdit()-&gt;setFont(f);
 
@@ -530,7 +528,7 @@ void ChatDlg::setLooks()
 #endif
 
 	/*QBrush brush;
-	brush.setPixmap( QPixmap( option.chatBgImage ) );
+	brush.setPixmap( QPixmap( LEGOPTS.chatBgImage ) );
 	chatView()-&gt;setPaper(brush);
 	chatView()-&gt;setStaticBackground(true);*/
 
@@ -543,15 +541,15 @@ void ChatDlg::optionsUpdate()
 	setShortcuts();
 
 	if (isHidden()) {
-		if (option.delChats == dcClose) {
+		if (PsiOptions::instance()-&gt;getOption(&quot;options.ui.chat.delete-contents-after&quot;).toString() == &quot;instant&quot;) {
 			deleteLater();
 			return;
 		}
 		else {
-			if (option.delChats == dcHour) {
+			if (PsiOptions::instance()-&gt;getOption(&quot;options.ui.chat.delete-contents-after&quot;).toString() == &quot;hour&quot;) {
 				setSelfDestruct(60);
 			}
-			else if (option.delChats == dcDay) {
+			else if (PsiOptions::instance()-&gt;getOption(&quot;options.ui.chat.delete-contents-after&quot;).toString() == &quot;day&quot;) {
 				setSelfDestruct(60 * 24);
 			}
 			else {
@@ -686,7 +684,7 @@ void ChatDlg::doSend()
 	m_ = m;
 
 	// Request events
-	if (option.messageEvents) {
+	if (PsiOptions::instance()-&gt;getOption(&quot;options.messages.send-composing-events&quot;).toBool()) {
 		// Only request more events when really necessary
 		if (sendComposingEvents_) {
 			m.addEvent(ComposingEvent);
@@ -846,8 +844,8 @@ void ChatDlg::appendMessage(const Message &amp;m, bool local)
 		if (PsiOptions::instance()-&gt;getOption(&quot;options.ui.flash-windows&quot;).toBool()) {
 			doFlash(true);
 		}
-		if (option.raiseChatWindow) {
-			if (option.useTabs) {
+		if (PsiOptions::instance()-&gt;getOption(&quot;options.ui.chat.raise-chat-windows-on-new-messages&quot;).toBool()) {
+			if (PsiOptions::instance()-&gt;getOption(&quot;options.ui.tabs.use-tabs&quot;).toBool()) {
 				TabDlg* tabSet = getManagingTabDlg();
 				tabSet-&gt;selectTab(this);
 				::bringToFront(tabSet, false);
@@ -884,7 +882,7 @@ void ChatDlg::updateIsComposing(bool b)
 
 void ChatDlg::setChatState(ChatState state)
 {
-	if (option.messageEvents &amp;&amp; (sendComposingEvents_ || (contactChatState_ != XMPP::StateNone))) {
+	if (PsiOptions::instance()-&gt;getOption(&quot;options.messages.send-composing-events&quot;).toBool() &amp;&amp; (sendComposingEvents_ || (contactChatState_ != XMPP::StateNone))) {
 		// Don't send to offline resource
 		QList&lt;UserListItem*&gt; ul = account()-&gt;findRelevant(jid());
 		if (ul.isEmpty()) {
@@ -901,7 +899,7 @@ void ChatDlg::setChatState(ChatState state)
 		}
 
 		// Transform to more privacy-enabled chat states if necessary
-		if (!option.inactiveEvents &amp;&amp; (state == XMPP::StateGone || state == XMPP::StateInactive)) {
+		if (!PsiOptions::instance()-&gt;getOption(&quot;options.messages.send-inactivity-events&quot;).toBool() &amp;&amp; (state == XMPP::StateGone || state == XMPP::StateInactive)) {
 			state = XMPP::StatePaused;
 		}
 
@@ -1076,7 +1074,7 @@ QString ChatDlg::messageText(const XMPP::Message&amp; m)
 		// qWarning(&quot;regular body:\n%s\n&quot;,qPrintable(txt));
 	}
 
-	if (option.useEmoticons)
+	if (PsiOptions::instance()-&gt;getOption(&quot;options.ui.emoticons.use-emoticons&quot;).toBool())
 		txt = TextUtil::emoticonify(txt);
 	if (PsiOptions::instance()-&gt;getOption(&quot;options.ui.chat.legacy-formatting&quot;).toBool())
 		txt = TextUtil::legacyFormat(txt);</diff>
      <filename>src/chatdlg.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -24,7 +24,6 @@
 
 #include &quot;msgmle.h&quot;
 #include &quot;psioptions.h&quot;
-#include &quot;common.h&quot;
 
 ChatEditProxy::ChatEditProxy(QWidget* parent)
 	: QWidget(parent)
@@ -112,10 +111,10 @@ void ChatEditProxy::updateLayout()
 
 /**
  * Update ChatEdit widget according to current options.
- * FIXME: When option.chatLineEdit finally makes it to PsiOptions, make this slot
+ * FIXME: When PsiOptions::instance()-&gt;getOption(&quot;options.ui.chat.use-expanding-line-edit&quot;).toBool() finally makes it to PsiOptions, make this slot
  *        private.
  */
 void ChatEditProxy::optionsChanged()
 {
-	setLineEditEnabled(option.chatLineEdit);
+	setLineEditEnabled(PsiOptions::instance()-&gt;getOption(&quot;options.ui.chat.use-expanding-line-edit&quot;).toBool());
 }</diff>
      <filename>src/chateditproxy.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -25,7 +25,6 @@
 #include &lt;QChildEvent&gt;
 
 #include &quot;psioptions.h&quot;
-#include &quot;common.h&quot;
 
 /**
  * Handy widget that masquerades itself as QSplitter, and could work
@@ -135,10 +134,10 @@ void ChatSplitter::updateLayout()
 
 /**
  * Updates layout according to current options.
- * FIXME: When option.chatLineEdit finally makes it to PsiOptions, make this slot
+ * FIXME: When PsiOptions::instance()-&gt;getOption(&quot;options.ui.chat.use-expanding-line-edit&quot;).toBool() finally makes it to PsiOptions, make this slot
  *        private.
  */
 void ChatSplitter::optionsChanged()
 {
-	setSplitterEnabled(!option.chatLineEdit);
+	setSplitterEnabled(!PsiOptions::instance()-&gt;getOption(&quot;options.ui.chat.use-expanding-line-edit&quot;).toBool());
 }</diff>
      <filename>src/chatsplitter.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -24,6 +24,7 @@
 #include &quot;psievent.h&quot;
 #include &quot;psiiconset.h&quot;
 #include &quot;applicationinfo.h&quot;
+#include &quot;psioptions.h&quot;
 
 #include &lt;QUrl&gt;
 #include &lt;QProcess&gt;
@@ -56,7 +57,11 @@
 
 Qt::WFlags psi_dialog_flags = (Qt::WindowSystemMenuHint | Qt::WindowMinMaxButtonsHint);
 
-Options option;
+// used to be part of the global options struct. 
+// FIXME find it a new home!
+int common_smallFontSize=0;
+
+
 bool useSound;
 
 
@@ -225,12 +230,30 @@ bool fileCopy(const QString &amp;src, const QString &amp;dest)
 }
 
 
-void soundPlay(const QString &amp;str)
+/** Detect default player helper on unix like systems
+ */
+QString soundDetectPlayer()
 {
+	// prefer ALSA on linux
+	if (QFile(&quot;/proc/asound&quot;).exists()) {
+		return &quot;aplay&quot;;
+	}
+	// fallback to &quot;play&quot;
+	return &quot;play&quot;;
+	
+}
+
+void soundPlay(const QString &amp;s)
+{
+	QString str = s;
 	if(str == &quot;!beep&quot;) {
 		QApplication::beep();
 		return;
 	}
+	
+	if (QDir::isRelativePath(str)) {
+		str = ApplicationInfo::resourcesDir() + &quot;/&quot; + str;
+	}
 
 	if(!QFile::exists(str))
 		return;
@@ -238,13 +261,13 @@ void soundPlay(const QString &amp;str)
 #if defined(Q_WS_WIN) || defined(Q_WS_MAC)
 	QSound::play(str);
 #else
-	if(!option.player.isEmpty()) {
-		QStringList args;
-		args = QStringList::split(' ', option.player);
-		args += str;
-		QString prog = args.takeFirst();
-		QProcess::startDetached(prog, args);
-	}
+	QString player = PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.sounds.unix-sound-player&quot;).toString();
+	if (player == &quot;&quot;) player = soundDetectPlayer();
+	QStringList args;
+	args = QStringList::split(' ', player);
+	args += str;
+	QString prog = args.takeFirst();
+	QProcess::startDetached(prog, args);
 #endif
 }
 </diff>
      <filename>src/common.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -34,162 +34,45 @@
 // Options
 // -----------------------------------------------------------------------------
 
-enum { 
-	cOnline, 
-	cOffline, 
-	cAway, 
-	cDND, 
-	cProfileFore, 
-	cProfileBack, 
-	cGroupFore, 
-	cGroupBack, 
-	cListBack, 
-	cAnimFront, 
-	cAnimBack,
-	cStatus,
-	cNumColors // A guard to store the number of colors
-};
-enum { fRoster, fMessage, fChat, fPopup };
-enum { eMessage, eChat1, eChat2, eHeadline, eSystem, eOnline, eOffline, eSend, eIncomingFT, eFTComplete };
 enum { dcClose, dcHour, dcDay, dcNever };
 
-struct Options
-{
-	QColor color[cNumColors];
-	QString font[4];
-	int smallFontSize; // do not modify or save/load this value! it is calculated at run time!
-	int alertStyle;
-
-	QString systemIconset;
-	QStringList emoticons;
-	QString defaultRosterIconset;
-	QMap&lt;QString, QString&gt; serviceRosterIconset;
-	QMap&lt;QString, QString&gt; customRosterIconset;
-
-	bool useleft, singleclick, hideMenubar, askOnline, askOffline, popupMsgs, popupChats, popupHeadlines, popupFiles, raise;
-	bool alwaysOnTop, noAwaySound, noAwayPopup, noUnlistedPopup, rosterAnim, autoVCardOnLogin, xmlConsoleOnLogin;
-	bool useDock, dockDCstyle, dockHideMW, dockToolMW;
-	bool smallChats, chatLineEdit, useTabs, putTabsAtBottom, usePerTabCloseButton, autoRosterSize, autoRosterSizeGrowTop, autoResolveNicksOnAdd, brushedMetal;
-
-	bool autoCopy; // although this setting is ignored under linux,
-	               // it is preserved in case user uses the same config file on different platforms
-	bool useCaps;
-
-	bool oldSmallChats; //Filthy hack, see chat code.
-	int delChats, browser;
-	
-	bool useRC;
-
-	int defaultAction;
-	int incomingAs;
-	QStringList recentStatus; //recent status messages
-	QMap&lt;QString,StatusPreset&gt; sp; // Status message presets.
 
-	int asAway, asXa, asOffline;
-	bool use_asAway, use_asXa, use_asOffline;
-	QString asMessage;
-	QString onevent[10];
+struct ToolbarPrefs {
+	bool dirty;
 
-	// Added by Kiko 020621: points to the directory where the trusted
-	// certificates used in validating the server's certificate are kept
-	QString trustCertStoreDir;
+	QString name;
+	bool on;
+	bool locked;
+	bool stretchable;
+	QStringList keys;
 
-	QString player;
+	Qt::Dock dock;
+	int index;
+	bool nl;
+	int extraOffset;
+};
 
-	bool ignoreHeadline, ignoreNonRoster, excludeGroupChatsFromIgnore, scrollTo, keepSizes, useEmoticons, alertOpenChats;
-	bool raiseChatWindow, showSubjects, showCounter, chatSays, showGroupCounts;
 
-	QSize sizeEventDlg, sizeChatDlg, sizeTabDlg;
-	bool jidComplete, grabUrls, noGCSound;
+struct lateMigrationOptions
+{
 
-	struct ToolbarPrefs {
-		bool dirty;
+	QMap&lt;QString, QString&gt; serviceRosterIconset;
+	QMap&lt;QString, QString&gt; customRosterIconset;
 
-		QString name;
-		bool on;
-		bool locked;
-		bool stretchable;
-		QStringList keys;
+	QMap&lt;QString,StatusPreset&gt; sp; // Status message presets.
 
-		Qt::Dock dock;
-		int index;
-		bool nl;
-		int extraOffset;
-	};
 	QMap&lt; QString, QList&lt;ToolbarPrefs&gt; &gt; toolbars;
-
-	// groupchat highlighting/nick colouring
-	bool gcHighlighting, gcNickColoring;
-	QStringList gcHighlights, gcNickColors;
-
-	bool clNewHeadings;
-	bool outlineHeadings;
-
-	// passive popups
-	bool ppIsOn;
-	bool ppMessage, ppHeadline, ppChat, ppOnline, ppStatus, ppOffline, ppFile;
-	int  ppJidClip, ppStatusClip, ppTextClip, ppHideTime;
-	QColor ppBorderColor;
-
-	// Bouncing of the dock (Mac OS X)
-	typedef enum { NoBounce, BounceOnce, BounceForever } BounceDockSetting;
-	BounceDockSetting bounceDock;
-
-	struct {
-		bool roster, services;
-	} lockdown;
-
-	bool useTransportIconsForContacts;
-
-	// roster sorting styles
-	typedef enum Roster_ContactSortStyle {
-		ContactSortStyle_Status = 0,
-		ContactSortStyle_Alpha
-	};
-	Roster_ContactSortStyle rosterContactSortStyle;
-
-	typedef enum Roster_GroupSortStyle {
-		GroupSortStyle_Alpha = 0,
-		GroupSortStyle_Rank
-	};
-	Roster_GroupSortStyle rosterGroupSortStyle;
-
-	typedef enum Roster_AccountSortStyle {
-		AccountSortStyle_Alpha = 0,
-		AccountSortStyle_Rank
-	};
-	Roster_AccountSortStyle rosterAccountSortStyle;
-
-	bool discoItems, discoInfo;
-
-	bool autoAuth, notifyAuth;
-
-	// event priority
-	enum { EventPriorityDontCare = -1 };
-	int eventPriorityHeadline;
-	int eventPriorityChat;
-	int eventPriorityMessage;
-	int eventPriorityAuth;
-	int eventPriorityFile;
-	int eventPriorityRosterExchange;
-
-	// Message events
-	bool messageEvents;
-	bool inactiveEvents;
-
-	int dtPort;
-	QString dtExternal;
-
-	// Last used path remembering
-	QString lastPath;
-	QString lastSavePath;
-
-	//background images
-	QString chatBgImage, rosterBgImage;
 };
 
-extern
-Options option;
+// used to be part of the global options struct. 
+// do not modify or save/load this value! it is calculated at run time!
+// FIXME find it a new home!
+extern int common_smallFontSize;
+
+// used to be part of the global options struct. 
+// FIXME find it a new home!
+enum { EventPriorityDontCare = -1 };
+
 
 // -----------------------------------------------------------------------------
 // Status
@@ -252,9 +135,11 @@ bool operator!=(const QMap&lt;QString, QString&gt; &amp;, const QMap&lt;QString, QString&gt; &amp;);
 
 bool fileCopy(const QString &amp;src, const QString &amp;dest);
 
+
+// used in option migration
+QString soundDetectPlayer();
 void soundPlay(const QString &amp;);
 
 extern Qt::WFlags psi_dialog_flags;
-extern bool useSound;
 
 #endif</diff>
      <filename>src/common.h</filename>
    </modified>
    <modified>
      <diff>@@ -641,7 +641,7 @@ void ContactProfile::setAlert(const Jid &amp;j, const PsiIcon *anim)
 		for(ContactViewItem *i; (i = it.current()); ++it)
 			i-&gt;setAlert(anim);
 
-		if(option.scrollTo)
+		if(PsiOptions::instance()-&gt;getOption(&quot;options.ui.contactlist.ensure-contact-visible-on-event&quot;).toBool())
 			ensureVisible(e);
 	}
 }
@@ -811,10 +811,10 @@ void ContactProfile::updateGroupInfo(ContactViewItem *group)
 		else {
 			total = group-&gt;childCount();
 		}
-		if (option.showGroupCounts)
+		if (PsiOptions::instance()-&gt;getOption(&quot;options.ui.contactlist.show-group-counts&quot;).toBool())
 			group-&gt;setGroupInfo(QString(&quot;(%1/%2)&quot;).arg(online).arg(total));
 	}
-	else if (option.showGroupCounts) {
+	else if (PsiOptions::instance()-&gt;getOption(&quot;options.ui.contactlist.show-group-counts&quot;).toBool()) {
 		int inGroup = contactSizeFromCVGroup(group);
 		group-&gt;setGroupInfo(QString(&quot;(%1)&quot;).arg(inGroup));
 	}
@@ -865,7 +865,7 @@ void ContactProfile::updateGroups()
 			if(e-&gt;u.isAvailable())
 				++totalOnline;
 		}
-		if(d-&gt;cvi &amp;&amp; option.showGroupCounts)
+		if(d-&gt;cvi &amp;&amp; PsiOptions::instance()-&gt;getOption(&quot;options.ui.contactlist.show-group-counts&quot;).toBool())
 			d-&gt;cvi-&gt;setGroupInfo(QString(&quot;(%1/%2)&quot;).arg(totalOnline).arg(d-&gt;roster.count()));
 	}
 
@@ -1027,7 +1027,7 @@ void ContactProfile::doContextMenu(ContactViewItem *i, const QPoint &amp;pos)
 
 		if (PsiOptions::instance()-&gt;getOption(&quot;options.ui.message.enabled&quot;).toBool())
 			pm.insertItem(IconsetFactory::icon(&quot;psi/sendMessage&quot;).icon(), tr(&quot;Send message to group&quot;), 0);
-		if(!option.lockdown.roster) {
+		if(!PsiOptions::instance()-&gt;getOption(&quot;options.ui.contactlist.lockdown-roster&quot;).toBool()) {
 			// disable if it's not a user group
 			if(!online || i-&gt;groupType() != ContactViewItem::gUser || gname == ContactView::tr(&quot;Hidden&quot;)) {
 				d-&gt;cv-&gt;qa_ren-&gt;setEnabled(false);
@@ -1051,7 +1051,7 @@ void ContactProfile::doContextMenu(ContactViewItem *i, const QPoint &amp;pos)
 		int x = pm.exec(pos);
 
 		// restore actions
-		if(option.lockdown.roster)
+		if(PsiOptions::instance()-&gt;getOption(&quot;options.ui.contactlist.lockdown-roster&quot;).toBool())
 			d-&gt;cv-&gt;qa_ren-&gt;setEnabled(false);
 		else
 			d-&gt;cv-&gt;qa_ren-&gt;setEnabled(true);
@@ -1122,7 +1122,7 @@ void ContactProfile::doContextMenu(ContactViewItem *i, const QPoint &amp;pos)
 
 		Q3PopupMenu pm;
 
-		if(!self &amp;&amp; !inList &amp;&amp; !isPrivate &amp;&amp; !option.lockdown.roster) {
+		if(!self &amp;&amp; !inList &amp;&amp; !isPrivate &amp;&amp; !PsiOptions::instance()-&gt;getOption(&quot;options.ui.contactlist.lockdown-roster&quot;).toBool()) {
 			pm.insertItem(IconsetFactory::icon(&quot;psi/addContact&quot;).icon(), tr(&quot;Add/Authorize to contact list&quot;), 10);
 			if(!online)
 				pm.setItemEnabled(10, false);
@@ -1266,14 +1266,14 @@ void ContactProfile::doContextMenu(ContactViewItem *i, const QPoint &amp;pos)
 
 		if(!self) {
 			if(inList) {
-				if(!option.lockdown.roster) {
+				if(!PsiOptions::instance()-&gt;getOption(&quot;options.ui.contactlist.lockdown-roster&quot;).toBool()) {
 					d-&gt;cv-&gt;qa_ren-&gt;setEnabled(online);
 					d-&gt;cv-&gt;qa_ren-&gt;addTo(&amp;pm);
 				}
 			}
 
 			if(!isAgent) {
-				if(inList &amp;&amp; !option.lockdown.roster) {
+				if(inList &amp;&amp; !PsiOptions::instance()-&gt;getOption(&quot;options.ui.contactlist.lockdown-roster&quot;).toBool()) {
 					Q3PopupMenu *gm = new Q3PopupMenu(&amp;pm);
 
 					gm-&gt;setCheckable(true);
@@ -1328,7 +1328,7 @@ void ContactProfile::doContextMenu(ContactViewItem *i, const QPoint &amp;pos)
 			}
 		}
 
-		if(inList &amp;&amp; !option.lockdown.roster) {
+		if(inList &amp;&amp; !PsiOptions::instance()-&gt;getOption(&quot;options.ui.contactlist.lockdown-roster&quot;).toBool()) {
 			Q3PopupMenu *authm = new Q3PopupMenu (&amp;pm);
 
 			authm-&gt;insertItem(tr(&quot;Resend authorization to&quot;), 6);
@@ -1341,7 +1341,7 @@ void ContactProfile::doContextMenu(ContactViewItem *i, const QPoint &amp;pos)
 		}
 
 		if(!self) {
-			if(!option.lockdown.roster) {
+			if(!PsiOptions::instance()-&gt;getOption(&quot;options.ui.contactlist.lockdown-roster&quot;).toBool()) {
 				if(online || !inList)
 					d-&gt;cv-&gt;qa_rem-&gt;setEnabled(true);
 				else
@@ -1382,7 +1382,7 @@ void ContactProfile::doContextMenu(ContactViewItem *i, const QPoint &amp;pos)
 		int x = pm.exec(pos);
 
 		// restore actions
-		if(option.lockdown.roster) {
+		if(PsiOptions::instance()-&gt;getOption(&quot;options.ui.contactlist.lockdown-roster&quot;).toBool()) {
 			d-&gt;cv-&gt;qa_ren-&gt;setEnabled(false);
 			d-&gt;cv-&gt;qa_rem-&gt;setEnabled(false);
 		}
@@ -1868,7 +1868,7 @@ public slots:
 				autoRosterResizeInProgress = true;
 
 				QRect desktop = qApp-&gt;desktop()-&gt;availableGeometry( (QWidget *)topParent );
-				if ( option.autoRosterSizeGrowTop ) {
+				if ( PsiOptions::instance()-&gt;getOption(&quot;options.ui.contactlist.grow-roster-upwards&quot;).toBool() ) {
 					int newy = topParent-&gt;y() - dh;
 
 					// check, if we need to move roster lower
@@ -1909,8 +1909,8 @@ public slots:
 		int top_offs    = abs( desktop.top()    - topParent-&gt;frameGeometry().top() );
 		int bottom_offs = abs( desktop.bottom() - topParent-&gt;frameGeometry().bottom() );
 
-		option.autoRosterSizeGrowTop = bottom_offs &lt; top_offs;
-		//qWarning(&quot;growTop = %d&quot;, option.autoRosterSizeGrowTop);
+		PsiOptions::instance()-&gt;setOption(&quot;options.ui.contactlist.grow-roster-upwards&quot;, (bool) bottom_offs &lt; top_offs);
+		//qWarning(&quot;growTop = %d&quot;, PsiOptions::instance()-&gt;getOption(&quot;options.ui.contactlist.automatically-resize-roster&quot;).toBool()GrowTop);
 	}
 	
 	/*
@@ -1971,13 +1971,14 @@ ContactView::ContactView(QWidget *parent, const char *name)
 	connect(this, SIGNAL(doubleClicked(Q3ListViewItem *)),SLOT(qlv_doubleclick(Q3ListViewItem *)) );
 	connect(this, SIGNAL(contextMenuRequested(Q3ListViewItem *, const QPoint &amp;, int)), SLOT(qlv_contextMenuRequested(Q3ListViewItem *, const QPoint &amp;, int)));
 
-	v_showOffline = true;
-	v_showAway = true;
-	v_showHidden = true;
-	v_showAgents = true;
-	v_showSelf = true;
+	v_showOffline = PsiOptions::instance()-&gt;getOption(&quot;options.ui.contactlist.show.offline-contacts&quot;).toBool();
+	v_showAway = PsiOptions::instance()-&gt;getOption(&quot;options.ui.contactlist.show.away-contacts&quot;).toBool();
+	v_showHidden = PsiOptions::instance()-&gt;getOption(&quot;options.ui.contactlist.show.hidden-contacts-group&quot;).toBool();
+	v_showAgents = PsiOptions::instance()-&gt;getOption(&quot;options.ui.contactlist.show.agent-contacts&quot;).toBool();
+	v_showSelf = PsiOptions::instance()-&gt;getOption(&quot;options.ui.contactlist.show.self-contact&quot;).toBool();
 	v_showStatusMsg = PsiOptions::instance()-&gt;getOption(&quot;options.ui.contactlist.status-messages.show&quot;).toBool();
 
+
 	d-&gt;lastSize = QSize( 0, 0 );
 
 	// animation timer
@@ -2013,7 +2014,7 @@ ContactView::ContactView(QWidget *parent, const char *name)
 	qa_vcard = new IconAction(&quot;&quot;, &quot;psi/vCard&quot;, tr(&quot;User &amp;Info&quot;), 0, this);
 	connect(qa_vcard, SIGNAL(activated()), SLOT(doVCard()));
 
-	if(option.lockdown.roster) {
+	if(PsiOptions::instance()-&gt;getOption(&quot;options.ui.contactlist.lockdown-roster&quot;).toBool()) {
 		qa_ren-&gt;setEnabled(false);
 		qa_rem-&gt;setEnabled(false);
 	}
@@ -2175,6 +2176,8 @@ void ContactView::setShowOffline(bool x)
 {
 	bool oldstate = v_showOffline;
 	v_showOffline = x;
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.contactlist.show.offline-contacts&quot;, x);
+
 
 	if(v_showOffline != oldstate) {
 		showOffline(v_showOffline);
@@ -2193,7 +2196,8 @@ void ContactView::setShowAway(bool x)
 {
 	bool oldstate = v_showAway;
 	v_showAway = x;
-
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.contactlist.show.away-contacts&quot;, x);
+		
 	if(v_showAway != oldstate) {
 		showAway(v_showAway);
 
@@ -2211,6 +2215,7 @@ void ContactView::setShowHidden(bool x)
 {
 	bool oldstate = v_showHidden;
 	v_showHidden = x;
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.contactlist.show.hidden-contacts-group&quot;, x);
 
 	if(v_showHidden != oldstate) {
 		showHidden(v_showHidden);
@@ -2250,6 +2255,7 @@ void ContactView::setShowSelf(bool x)
 {
 	if (v_showSelf != x) {
 		v_showSelf = x;
+		PsiOptions::instance()-&gt;setOption(&quot;options.ui.contactlist.show.self-contact&quot;, x);
 		showSelf(v_showSelf);
 
 		Q3PtrListIterator&lt;ContactProfile&gt; it(d-&gt;profiles);
@@ -2288,6 +2294,7 @@ void ContactView::setShowAgents(bool x)
 {
 	bool oldstate = v_showAgents;
 	v_showAgents = x;
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.contactlist.show.agent-contacts&quot;, x);
 
 	if(v_showAgents != oldstate) {
 		showAgents(v_showAgents);
@@ -2305,7 +2312,7 @@ void ContactView::setShowAgents(bool x)
 // right-click context menu
 void ContactView::qlv_contextMenuRequested(Q3ListViewItem *lvi, const QPoint &amp;pos, int c)
 {
-	if(option.useleft)
+	if(PsiOptions::instance()-&gt;getOption(&quot;options.ui.contactlist.use-left-click&quot;).toBool())
 		return;
 
 	qlv_contextPopup(lvi, pos, c);
@@ -2339,9 +2346,9 @@ void ContactView::qlv_singleclick(int button, Q3ListViewItem *i, const QPoint &amp;p
 		if (button == Qt::LeftButton &amp;&amp; item-&gt;type() == ContactViewItem::Group &amp;&amp; pix &amp;&amp; viewport()-&gt;mapFromGlobal(pos).x() &lt;= pix-&gt;width() + treeStepSize()) {
 			setOpen(item, !item-&gt;isOpen());
 		}
-		else if(option.useleft) {
+		else if(PsiOptions::instance()-&gt;getOption(&quot;options.ui.contactlist.use-left-click&quot;).toBool()) {
 			if(button == Qt::LeftButton) {
-				if(option.singleclick) {
+				if(PsiOptions::instance()-&gt;getOption(&quot;options.ui.contactlist.use-single-click&quot;).toBool()) {
 					qlv_contextPopup(i, pos, c);
 				}
 				else {
@@ -2351,7 +2358,7 @@ void ContactView::qlv_singleclick(int button, Q3ListViewItem *i, const QPoint &amp;p
 					QTimer::singleShot(QApplication::doubleClickInterval()/2, this, SLOT(leftClickTimeOut()));
 				}
 			}
-			else if(option.singleclick &amp;&amp; button == Qt::RightButton) {
+			else if(PsiOptions::instance()-&gt;getOption(&quot;options.ui.contactlist.use-single-click&quot;).toBool() &amp;&amp; button == Qt::RightButton) {
 				if(item-&gt;type() == ContactViewItem::Contact)
 					item-&gt;contactProfile()-&gt;scActionDefault(item);
 			}
@@ -2360,7 +2367,7 @@ void ContactView::qlv_singleclick(int button, Q3ListViewItem *i, const QPoint &amp;p
 			//if(button == QListView::RightButton) {
 			//	qlv_contextPopup(i, pos, c);
 			//}
-			/*else*/if(button == Qt::LeftButton &amp;&amp; option.singleclick) {
+			/*else*/if(button == Qt::LeftButton &amp;&amp; PsiOptions::instance()-&gt;getOption(&quot;options.ui.contactlist.use-single-click&quot;).toBool()) {
 				if(item-&gt;type() == ContactViewItem::Contact)
 					item-&gt;contactProfile()-&gt;scActionDefault(item);
 			}
@@ -2377,7 +2384,7 @@ void ContactView::qlv_doubleclick(Q3ListViewItem *i)
 	if(!i)
 		return;
 
-	if(option.singleclick)
+	if(PsiOptions::instance()-&gt;getOption(&quot;options.ui.contactlist.use-single-click&quot;).toBool())
 		return;
 
 	ContactViewItem *item = (ContactViewItem *)i;
@@ -2404,13 +2411,13 @@ void ContactView::optionsUpdate()
 {
 	// set the font
 	QFont f;
-	f.fromString(option.font[fRoster]);
+	f.fromString(PsiOptions::instance()-&gt;getOption(&quot;options.ui.look.font.contactlist&quot;).toString());
 	Q3ListView::setFont(f);
 
 	// set the text and background colors
 	QPalette mypal = Q3ListView::palette();
-	mypal.setColor(QColorGroup::Text, option.color[cOnline]);
-	mypal.setColor(QColorGroup::Base, option.color[cListBack]);
+	mypal.setColor(QColorGroup::Text, PsiOptions::instance()-&gt;getOption(&quot;options.ui.look.colors.contactlist.status.online&quot;).value&lt;QColor&gt;());
+	mypal.setColor(QColorGroup::Base, PsiOptions::instance()-&gt;getOption(&quot;options.ui.look.colors.contactlist.background&quot;).value&lt;QColor&gt;());
 	Q3ListView::setPalette(mypal);
 
 	// reload the icons
@@ -2425,7 +2432,7 @@ void ContactView::optionsUpdate()
 	setShortcuts();
 
 	// resize if necessary
-	if (option.autoRosterSize)
+	if (PsiOptions::instance()-&gt;getOption(&quot;options.ui.contactlist.automatically-resize-roster&quot;).toBool())
 		recalculateSize();
 
 	update();
@@ -2581,7 +2588,7 @@ Q3DragObject *ContactView::dragObject()
 
 bool ContactView::allowResize() const
 {
-	if ( !option.autoRosterSize )
+	if ( !PsiOptions::instance()-&gt;getOption(&quot;options.ui.contactlist.automatically-resize-roster&quot;).toBool() )
 		return false;
 
 	if ( window()-&gt;isMaximized() )
@@ -3075,15 +3082,15 @@ void ContactViewItem::paintCell(QPainter *p, const QColorGroup &amp; cg, int column,
 		QColorGroup xcg = cg;
 
 		if(d-&gt;status == STATUS_AWAY || d-&gt;status == STATUS_XA)
-			xcg.setColor(QColorGroup::Text, option.color[cAway]);
+			xcg.setColor(QColorGroup::Text, PsiOptions::instance()-&gt;getOption(&quot;options.ui.look.colors.contactlist.status.away&quot;).value&lt;QColor&gt;());
 		else if(d-&gt;status == STATUS_DND)
-			xcg.setColor(QColorGroup::Text, option.color[cDND]);
+			xcg.setColor(QColorGroup::Text, PsiOptions::instance()-&gt;getOption(&quot;options.ui.look.colors.contactlist.status.do-no-disturb&quot;).value&lt;QColor&gt;());
 		else if(d-&gt;status == STATUS_OFFLINE)
-			xcg.setColor(QColorGroup::Text, option.color[cOffline]);
+			xcg.setColor(QColorGroup::Text, PsiOptions::instance()-&gt;getOption(&quot;options.ui.look.colors.contactlist.status.offline&quot;).value&lt;QColor&gt;());
 
 		if(d-&gt;animatingNick) {
-			xcg.setColor(QColorGroup::Text, d-&gt;animateNickColor ? option.color[cAnimFront] : option.color[cAnimBack]);
-			xcg.setColor(QColorGroup::HighlightedText, d-&gt;animateNickColor ? option.color[cAnimFront] : option.color[cAnimBack]);
+			xcg.setColor(QColorGroup::Text, d-&gt;animateNickColor ? PsiOptions::instance()-&gt;getOption(&quot;options.ui.look.contactlist.status-change-animation.color1&quot;).value&lt;QColor&gt;() : PsiOptions::instance()-&gt;getOption(&quot;options.ui.look.contactlist.status-change-animation.color2&quot;).value&lt;QColor&gt;());
+			xcg.setColor(QColorGroup::HighlightedText, d-&gt;animateNickColor ? PsiOptions::instance()-&gt;getOption(&quot;options.ui.look.contactlist.status-change-animation.color1&quot;).value&lt;QColor&gt;() : PsiOptions::instance()-&gt;getOption(&quot;options.ui.look.contactlist.status-change-animation.color2&quot;).value&lt;QColor&gt;());
 		}
 
 		RichListViewItem::paintCell(p, xcg, column, width, alignment);
@@ -3113,24 +3120,24 @@ void ContactViewItem::paintCell(QPainter *p, const QColorGroup &amp; cg, int column,
 		QColorGroup xcg = cg;
 
 		if(type_ == Profile) {
- 			xcg.setColor(QColorGroup::Text, option.color[cProfileFore]);
+ 			xcg.setColor(QColorGroup::Text, PsiOptions::instance()-&gt;getOption(&quot;options.ui.look.colors.contactlist.profile.header-foreground&quot;).value&lt;QColor&gt;());
 			#if QT_VERSION &lt; 0x040301
-				xcg.setColor(QColorGroup::Background, option.color[cProfileBack]);
+				xcg.setColor(QColorGroup::Background, PsiOptions::instance()-&gt;getOption(&quot;options.ui.look.colors.contactlist.profile.header-background&quot;).value&lt;QColor&gt;());
 			#else
- 				xcg.setColor(QColorGroup::Base, option.color[cProfileBack]);
+ 				xcg.setColor(QColorGroup::Base, PsiOptions::instance()-&gt;getOption(&quot;options.ui.look.colors.contactlist.profile.header-background&quot;).value&lt;QColor&gt;());
  			#endif
 			
 		}
 		else if(type_ == Group) {
 			QFont f = p-&gt;font();
-			f.setPointSize(option.smallFontSize);
+			f.setPointSize(common_smallFontSize);
 			p-&gt;setFont(f);
-			xcg.setColor(QColorGroup::Text, option.color[cGroupFore]);
-			if (!option.clNewHeadings) {
+			xcg.setColor(QColorGroup::Text, PsiOptions::instance()-&gt;getOption(&quot;options.ui.look.colors.contactlist.grouping.header-foreground&quot;).value&lt;QColor&gt;());
+			if (!PsiOptions::instance()-&gt;getOption(&quot;options.ui.look.contactlist.use-slim-group-headings&quot;).toBool()) {
  				#if QT_VERSION &lt; 0x040301
-					xcg.setColor(QColorGroup::Background, option.color[cGroupBack]);
+					xcg.setColor(QColorGroup::Background, PsiOptions::instance()-&gt;getOption(&quot;options.ui.look.colors.contactlist.grouping.header-background&quot;).value&lt;QColor&gt;());
 				#else
- 					xcg.setColor(QColorGroup::Base, option.color[cGroupBack]);
+ 					xcg.setColor(QColorGroup::Base, PsiOptions::instance()-&gt;getOption(&quot;options.ui.look.colors.contactlist.grouping.header-background&quot;).value&lt;QColor&gt;());
 				#endif
 			}
 		} 
@@ -3154,7 +3161,7 @@ void ContactViewItem::paintCell(QPainter *p, const QColorGroup &amp; cg, int column,
 			p-&gt;setPen(xcg.text());
 
 		QFont f_info = p-&gt;font();
-		f_info.setPointSize(option.smallFontSize);
+		f_info.setPointSize(common_smallFontSize);
 		p-&gt;setFont(f_info);
 		QFontMetrics fm_info(p-&gt;font());
 		//int info_x = width - fm_info.width(d-&gt;groupInfo) - 8;
@@ -3162,23 +3169,23 @@ void ContactViewItem::paintCell(QPainter *p, const QColorGroup &amp; cg, int column,
 		int info_y = ((height() - fm_info.height()) / 2) + fm_info.ascent();
 		p-&gt;drawText((info_x &gt; x ? info_x : x), info_y, d-&gt;groupInfo);
 
-		if(type_ == Group &amp;&amp; option.clNewHeadings &amp;&amp; !isSelected()) {
+		if(type_ == Group &amp;&amp; PsiOptions::instance()-&gt;getOption(&quot;options.ui.look.contactlist.use-slim-group-headings&quot;).toBool() &amp;&amp; !isSelected()) {
 			x += fm.width(d-&gt;groupInfo) + 8;
 			if(x &lt; width - 8) {
 				int h = (height() / 2) - 1;
-				p-&gt;setPen(QPen(option.color[cGroupBack]));
+				p-&gt;setPen(QPen(PsiOptions::instance()-&gt;getOption(&quot;options.ui.look.colors.contactlist.grouping.header-background&quot;).value&lt;QColor&gt;()));
 				p-&gt;drawLine(x, h, width - 8, h);
 				h++;
-				p-&gt;setPen(QPen(option.color[cGroupFore]));
+				p-&gt;setPen(QPen(PsiOptions::instance()-&gt;getOption(&quot;options.ui.look.colors.contactlist.grouping.header-foreground&quot;).value&lt;QColor&gt;()));
 				/*int h = height() / 2;
 
-				p-&gt;setPen(QPen(option.color[cGroupBack], 2));*/
+				p-&gt;setPen(QPen(PsiOptions::instance()-&gt;getOption(&quot;options.ui.look.colors.contactlist.grouping.header-background&quot;).value&lt;QColor&gt;(), 2));*/
 				p-&gt;drawLine(x, h, width - 8, h);
 			}
 		} 
 		else {
-			if (option.outlineHeadings) {
-				p-&gt;setPen(QPen(option.color[cGroupFore]));
+			if (PsiOptions::instance()-&gt;getOption(&quot;options.ui.look.contactlist.use-outlined-group-headings&quot;).toBool()) {
+				p-&gt;setPen(QPen(PsiOptions::instance()-&gt;getOption(&quot;options.ui.look.colors.contactlist.grouping.header-foreground&quot;).value&lt;QColor&gt;()));
 				p-&gt;drawRect(0, 0, width, height());
 			}
 		}
@@ -3248,7 +3255,7 @@ int ContactViewItem::compare(Q3ListViewItem *lvi, int, bool) const
 		if(i-&gt;type() == Group)
 			ret = -1;
 		else {
-			if ( option.rosterContactSortStyle == Options::ContactSortStyle_Status ) {
+			if ( PsiOptions::instance()-&gt;getOption(&quot;options.ui.contactlist.contact-sort-style&quot;).toString() == &quot;status&quot; ) {
 				ret = rankStatus(d-&gt;status) - rankStatus(i-&gt;status());
 				if(ret == 0)
 					ret = text(0).lower().localeAwareCompare(i-&gt;text(0).lower());
@@ -3263,7 +3270,7 @@ int ContactViewItem::compare(Q3ListViewItem *lvi, int, bool) const
 		if(i-&gt;type() == Contact)
 			ret = 1;
 		else if(i-&gt;type() == Group) {
-			if ( option.rosterGroupSortStyle == Options::GroupSortStyle_Rank ) {
+			if ( PsiOptions::instance()-&gt;getOption(&quot;options.ui.contactlist.group-sort-style&quot;).toString() == &quot;rank&quot;) {
 				int ourRank   = d-&gt;groupData().rank;
 				int theirRank = i-&gt;d-&gt;groupData().rank;
 
@@ -3276,7 +3283,7 @@ int ContactViewItem::compare(Q3ListViewItem *lvi, int, bool) const
 			}
 		}
 		else if(i-&gt;type() == Profile) {
-			if ( option.rosterAccountSortStyle == Options::AccountSortStyle_Rank ) {
+			if ( PsiOptions::instance()-&gt;getOption(&quot;options.ui.contactlist.account-sort-style&quot;).toString() == &quot;rank&quot; ) {
 				int ourRank = d-&gt;groupData().rank;
 				int theirRank = i-&gt;d-&gt;groupData().rank;
 
@@ -3365,7 +3372,7 @@ void ContactViewItem::resetName(bool forceNoStatusMsg)
 				statusMsg.replace(&quot;&gt;&quot;,&quot;&amp;gt;&quot;);
 				statusMsg = statusMsg.simplifyWhiteSpace();
 				if (!statusMsg.isEmpty())
-					s += &quot;&lt;br&gt;&lt;font size=-1 color='&quot; + option.color[cStatus].name() + &quot;'&gt;&lt;nobr&gt;&quot; + statusMsg + &quot;&lt;/nobr&gt;&lt;/font&gt;&quot;;
+					s += &quot;&lt;br&gt;&lt;font size=-1 color='&quot; + PsiOptions::instance()-&gt;getOption(&quot;options.ui.look.colors.contactlist.status-messages&quot;).value&lt;QColor&gt;().name() + &quot;'&gt;&lt;nobr&gt;&quot; + statusMsg + &quot;&lt;/nobr&gt;&lt;/font&gt;&quot;;
 			}
 			else {
 				statusMsg.replace('\n',&quot; &quot;);</diff>
      <filename>src/contactview.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -202,7 +202,7 @@ public:
 	bool isShowHidden() const { return v_showHidden; }
 	bool isShowSelf() const { return v_showSelf; }
 	bool isShowStatusMsg() const { return v_showStatusMsg; }
-
+	
 	bool filterContact(ContactViewItem *item, bool refineSearch = false);
 	bool filterGroup(ContactViewItem *item, bool refineSearch = false);
 	void setFilter(QString const &amp;text);</diff>
      <filename>src/contactview.h</filename>
    </modified>
    <modified>
      <diff>@@ -45,7 +45,6 @@
 #include &quot;psiaccount.h&quot;
 #include &quot;psicon.h&quot;
 #include &quot;busywidget.h&quot;
-#include &quot;common.h&quot;
 #include &quot;iconaction.h&quot;
 #include &quot;psiiconset.h&quot;
 #include &quot;psitooltip.h&quot;
@@ -1432,8 +1431,8 @@ DiscoDlg::DiscoDlg(PsiAccount *pa, const Jid &amp;jid, const QString &amp;node)
 	setAttribute(Qt::WA_DeleteOnClose);
   	setupUi(this);
 	// restore options
-	ck_autoItems-&gt;setChecked(option.discoItems);
-	ck_autoInfo-&gt;setChecked(option.discoInfo);
+	ck_autoItems-&gt;setChecked(PsiOptions::instance()-&gt;getOption(&quot;options.ui.service-discovery.automatically-get-items&quot;).toBool());
+	ck_autoInfo-&gt;setChecked(PsiOptions::instance()-&gt;getOption(&quot;options.ui.service-discovery.automatically-browse-into&quot;).toBool());
 
 	// initialize
 	d = new Private(this, pa);
@@ -1470,8 +1469,8 @@ DiscoDlg::~DiscoDlg()
 	delete d;
 
 	// save options
-	option.discoItems = ck_autoItems-&gt;isChecked();
-	option.discoInfo  = ck_autoInfo-&gt;isChecked();
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.service-discovery.automatically-get-items&quot;, (bool) ck_autoItems-&gt;isChecked());
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.service-discovery.automatically-browse-into&quot;, (bool) ck_autoInfo-&gt;isChecked());
 }
 
 void DiscoDlg::doDisco(QString host, QString node)</diff>
      <filename>src/discodlg.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -29,7 +29,7 @@
 #include &lt;qtimer.h&gt;
 #include &lt;qtextstream.h&gt;
 
-#include &quot;profiles.h&quot;
+#include &quot;common.h&quot;
 #include &quot;applicationinfo.h&quot;
 #include &quot;psievent.h&quot;
 #include &quot;jidutil.h&quot;</diff>
      <filename>src/eventdb.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -450,7 +450,7 @@ void AttachView::addUrlList(const UrlList &amp;list)
 AddUrlDlg::AddUrlDlg(QWidget *parent)
 :QDialog(parent)
 {
-	if ( option.brushedMetal )
+	if ( PsiOptions::instance()-&gt;getOption(&quot;options.ui.mac.use-brushed-metal-windows&quot;).toBool() )
 		setAttribute(Qt::WA_MacMetalStyle);
 	setupUi(this);
 #ifndef Q_WS_MAC
@@ -580,7 +580,7 @@ EventDlg::EventDlg(const QString &amp;to, PsiCon *psi, PsiAccount *pa)
 	: AdvancedWidget&lt;QWidget&gt;(0)
 {
 	setAttribute(Qt::WA_DeleteOnClose);
-  	if ( option.brushedMetal )
+  	if ( PsiOptions::instance()-&gt;getOption(&quot;options.ui.mac.use-brushed-metal-windows&quot;).toBool() )
 		setAttribute(Qt::WA_MacMetalStyle);	
 	d = new Private(this);
 	d-&gt;composing = true;
@@ -605,7 +605,7 @@ EventDlg::EventDlg(const QString &amp;to, PsiCon *psi, PsiAccount *pa)
 	d-&gt;le_to-&gt;setText(expandAddresses(to, false));
 	d-&gt;le_to-&gt;setCursorPosition(0);
 
-	if(option.grabUrls) {
+	if(PsiOptions::instance()-&gt;getOption(&quot;options.ui.message.auto-grab-urls-from-clipboard&quot;).toBool()) {
 		// url in clipboard?
 		QClipboard *cb = QApplication::clipboard();
 		QString text = cb-&gt;text(QClipboard::Clipboard);
@@ -813,7 +813,7 @@ void EventDlg::init()
 	QHBoxLayout *hb3 = new QHBoxLayout(vb1);
 
 //	if(d-&gt;composing /* &amp;&amp; config-&gt;showsubject */) {
-	if(option.showSubjects) {
+	if(PsiOptions::instance()-&gt;getOption(&quot;options.ui.message.show-subjects&quot;).toBool()) {
 		// third row
 		l = new QLabel(tr(&quot;Subject:&quot;), this);
 		hb3-&gt;addWidget(l);
@@ -991,7 +991,11 @@ void EventDlg::init()
 	connect(d-&gt;pa, SIGNAL(pgpKeyChanged()), SLOT(updatePGP()));
 	connect(d-&gt;pa, SIGNAL(encryptedMessageSent(int, bool, int)), SLOT(encryptedMessageSent(int, bool, int)));
 
-	resize(option.sizeEventDlg);
+	if (PsiOptions::instance()-&gt;getOption(&quot;options.ui.message.size&quot;).toSize().isValid()) {
+		resize(PsiOptions::instance()-&gt;getOption(&quot;options.ui.message.size&quot;).toSize());
+	} else {
+		resize(defaultSize());
+	}
 	optionsUpdate();
 
 	//ShortcutManager::connect(&quot;common.close&quot;, this, SLOT(close()));
@@ -1199,7 +1203,7 @@ void EventDlg::to_changeResource(const QString &amp;r)
 
 void EventDlg::to_tryComplete()
 {
-	if(!option.jidComplete)
+	if(!PsiOptions::instance()-&gt;getOption(&quot;options.ui.message.use-jid-auto-completion&quot;).toBool())
 		return;
 
 	QString str = d-&gt;le_to-&gt;text();
@@ -1336,18 +1340,18 @@ void EventDlg::optionsUpdate()
 {
 	// update the font
 	QFont f;
-	f.fromString(option.font[fMessage]);
+	f.fromString(PsiOptions::instance()-&gt;getOption(&quot;options.ui.look.font.message&quot;).toString());
 	d-&gt;mle-&gt;setFont(f);
 
 	// update status icon
 	doWhois(true);
 
-	if ( option.showCounter &amp;&amp; d-&gt;composing )
+	if ( PsiOptions::instance()-&gt;getOption(&quot;options.ui.message.show-character-count&quot;).toBool() &amp;&amp; d-&gt;composing )
 		d-&gt;lb_count-&gt;show();
 	else
 		d-&gt;lb_count-&gt;hide();
 
-	if ( option.useEmoticons )
+	if ( PsiOptions::instance()-&gt;getOption(&quot;options.ui.emoticons.use-emoticons&quot;).toBool() )
 		d-&gt;tb_icon-&gt;show();
 	else
 		d-&gt;tb_icon-&gt;hide();
@@ -1398,8 +1402,8 @@ void EventDlg::showEvent(QShowEvent *e)
 
 void EventDlg::resizeEvent(QResizeEvent *e)
 {
-	if(option.keepSizes)
-		option.sizeEventDlg = e-&gt;size();
+	if(PsiOptions::instance()-&gt;getOption(&quot;options.ui.remember-window-sizes&quot;).toBool())
+		PsiOptions::instance()-&gt;getOption(&quot;options.ui.message.size&quot;).toSize() = e-&gt;size();
 }
 
 void EventDlg::keyPressEvent(QKeyEvent *e)
@@ -1857,11 +1861,11 @@ void EventDlg::updateEvent(PsiEvent *e)
 		QString txt = xhtml ? m.html().toString(&quot;div&quot;) : TextUtil::plain2rich(m.body());
 
 		// show subject line if the incoming message has one
-		if(m.subject() != &quot;&quot; &amp;&amp; !option.showSubjects)
+		if(m.subject() != &quot;&quot; &amp;&amp; !PsiOptions::instance()-&gt;getOption(&quot;options.ui.message.show-subjects&quot;).toBool())
 			txt = &quot;&lt;p&gt;&lt;font color=\&quot;red\&quot;&gt;&lt;b&gt;&quot; + tr(&quot;Subject:&quot;) + &quot; &quot; + TextUtil::plain2rich(m.subject()) + &quot;&lt;/b&gt;&lt;/font&gt;&lt;/p&gt;&quot; + (xhtml? &quot;&quot; : &quot;&lt;br&gt;&quot;) + txt;
 
 		if (!xhtml) {
-			if(option.useEmoticons)
+			if(PsiOptions::instance()-&gt;getOption(&quot;options.ui.emoticons.use-emoticons&quot;).toBool())
 				txt = TextUtil::emoticonify(txt);
 			if( PsiOptions::instance()-&gt;getOption(&quot;options.ui.chat.legacy-formatting&quot;).toBool() )
 				txt = TextUtil::legacyFormat(txt);</diff>
      <filename>src/eventdlg.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -26,19 +26,18 @@
 #include &quot;psicon.h&quot;
 #include &quot;psiaccount.h&quot;
 #include &quot;userlist.h&quot;
-#include &quot;common.h&quot;
 #include &quot;iconwidget.h&quot;
 #include &quot;s5b.h&quot;
 #include &quot;busywidget.h&quot;
 #include &quot;filetransfer.h&quot;
 #include &quot;accountscombobox.h&quot;
-#include &quot;profiles.h&quot;
 #include &quot;psiiconset.h&quot;
 #include &quot;msgmle.h&quot;
 #include &quot;jidutil.h&quot;
 #include &quot;psitooltip.h&quot;
 #include &quot;psicontactlist.h&quot;
 #include &quot;accountlabel.h&quot;
+#include &quot;psioptions.h&quot;
 
 typedef Q_UINT64 LARGE_TYPE;
 
@@ -586,7 +585,7 @@ FileRequestDlg::FileRequestDlg(const Jid &amp;jid, PsiCon *psi, PsiAccount *pa, cons
 			return;
 		}
 		
-		option.lastPath = fi.dirPath();
+		PsiOptions::instance()-&gt;getOption(&quot;options.ui.last-used-open-path&quot;).toString() = fi.dirPath();
 		le_fname-&gt;setText(QDir::convertSeparators(fi.filePath()));
 		lb_size-&gt;setText(tr(&quot;%1 byte(s)&quot;).arg(fi.size())); // TODO: large file support
 	}
@@ -754,16 +753,16 @@ void FileRequestDlg::unblockWidgets()
 void FileRequestDlg::chooseFile()
 {
 	while(1) {
-		if(option.lastPath.isEmpty())
-			option.lastPath = QDir::homeDirPath();
-		QString str = QFileDialog::getOpenFileName(this, tr(&quot;Choose a file&quot;), option.lastPath, tr(&quot;All files (*)&quot;));
+		if(PsiOptions::instance()-&gt;getOption(&quot;options.ui.last-used-open-path&quot;).toString().isEmpty())
+			PsiOptions::instance()-&gt;getOption(&quot;options.ui.last-used-open-path&quot;).toString() = QDir::homeDirPath();
+		QString str = QFileDialog::getOpenFileName(this, tr(&quot;Choose a file&quot;), PsiOptions::instance()-&gt;getOption(&quot;options.ui.last-used-open-path&quot;).toString(), tr(&quot;All files (*)&quot;));
 		if(!str.isEmpty()) {
 			QFileInfo fi(str);
 			if(!fi.exists()) {
 				QMessageBox::information(this, tr(&quot;Error&quot;), tr(&quot;The file specified does not exist.&quot;));
 				continue;
 			}
-			option.lastPath = fi.dirPath();
+			PsiOptions::instance()-&gt;getOption(&quot;options.ui.last-used-open-path&quot;).toString() = fi.dirPath();
 			le_fname-&gt;setText(QDir::convertSeparators(fi.filePath()));
 			lb_size-&gt;setText(tr(&quot;%1 byte(s)&quot;).arg(fi.size())); // TODO: large file support
 		}
@@ -808,13 +807,13 @@ void FileRequestDlg::doStart()
 	}
 	else {
 		QString fname, savename;
-		if(option.lastSavePath.isEmpty())
-			option.lastSavePath = QDir::homeDirPath();
-		fname = QFileDialog::getSaveFileName(this, tr(&quot;Save As&quot;), QDir(option.lastSavePath).filePath(d-&gt;fileName), tr(&quot;All files (*)&quot;));
+		if(PsiOptions::instance()-&gt;getOption(&quot;options.ui.last-used-save-path&quot;).toString().isEmpty())
+			PsiOptions::instance()-&gt;getOption(&quot;options.ui.last-used-save-path&quot;).toString() = QDir::homeDirPath();
+		fname = QFileDialog::getSaveFileName(this, tr(&quot;Save As&quot;), QDir(PsiOptions::instance()-&gt;getOption(&quot;options.ui.last-used-save-path&quot;).toString()).filePath(d-&gt;fileName), tr(&quot;All files (*)&quot;));
 		if(fname.isEmpty())
 			return;
 		QFileInfo fi(fname);
-		option.lastSavePath = fi.dirPath();
+		PsiOptions::instance()-&gt;getOption(&quot;options.ui.last-used-save-path&quot;).toString() = fi.dirPath();
 		savename = fname + &quot;.part&quot;;
 		fname = fi.fileName();
 
@@ -1533,7 +1532,7 @@ public:
 				}
 			}
 
-			pa-&gt;playSound(option.onevent[eFTComplete]);
+			pa-&gt;playSound(PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.sounds.completed-file-transfer&quot;).toString());
 		}
 	}
 };</diff>
      <filename>src/filetransdlg.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -32,6 +32,7 @@
 #include &quot;psiiconset.h&quot;
 #include &quot;groupchatdlg.h&quot;
 #include &quot;common.h&quot;
+#include &quot;psioptions.h&quot;
 
 static bool caseInsensitiveLessThan(const QString &amp;s1, const QString &amp;s2)
 {
@@ -74,26 +75,26 @@ void GCUserViewGroupItem::paintCell(QPainter *p, const QColorGroup &amp; cg, int col
 {
 	QColorGroup xcg = cg;
 	QFont f = p-&gt;font();
-	f.setPointSize(option.smallFontSize);
+	f.setPointSize(common_smallFontSize);
 	p-&gt;setFont(f);
-	xcg.setColor(QColorGroup::Text, option.color[cGroupFore]);
-	if (!option.clNewHeadings) {
+	xcg.setColor(QColorGroup::Text, PsiOptions::instance()-&gt;getOption(&quot;options.ui.look.colors.contactlist.grouping.header-foreground&quot;).value&lt;QColor&gt;());
+	if (!PsiOptions::instance()-&gt;getOption(&quot;options.ui.look.contactlist.use-slim-group-headings&quot;).toBool()) {
 		#if QT_VERSION &lt; 0x040301
-			xcg.setColor(QColorGroup::Background, option.color[cGroupBack]);
+			xcg.setColor(QColorGroup::Background, PsiOptions::instance()-&gt;getOption(&quot;options.ui.look.colors.contactlist.grouping.header-background&quot;).value&lt;QColor&gt;());
 		#else
-			xcg.setColor(QColorGroup::Base, option.color[cGroupBack]);
+			xcg.setColor(QColorGroup::Base, PsiOptions::instance()-&gt;getOption(&quot;options.ui.look.colors.contactlist.grouping.header-background&quot;).value&lt;QColor&gt;());
 		#endif
 	}
 	Q3ListViewItem::paintCell(p, xcg, column, width, alignment);
-	if (option.clNewHeadings &amp;&amp; !isSelected()) {
+	if (PsiOptions::instance()-&gt;getOption(&quot;options.ui.look.contactlist.use-slim-group-headings&quot;).toBool() &amp;&amp; !isSelected()) {
 		QFontMetrics fm(p-&gt;font());
 		int x = fm.width(text(column)) + 8;
 		if(x &lt; width - 8) {
 			int h = (height() / 2) - 1;
-			p-&gt;setPen(QPen(option.color[cGroupBack]));
+			p-&gt;setPen(QPen(PsiOptions::instance()-&gt;getOption(&quot;options.ui.look.colors.contactlist.grouping.header-background&quot;).value&lt;QColor&gt;()));
 			p-&gt;drawLine(x, h, width - 8, h);
 			h++;
-			p-&gt;setPen(QPen(option.color[cGroupFore]));
+			p-&gt;setPen(QPen(PsiOptions::instance()-&gt;getOption(&quot;options.ui.look.colors.contactlist.grouping.header-foreground&quot;).value&lt;QColor&gt;()));
 			p-&gt;drawLine(x, h, width - 8, h);
 		}
 	}
@@ -310,7 +311,7 @@ void GCUserView::qlv_doubleClicked(Q3ListViewItem *i)
 		return;
 
 	GCUserViewItem *lvi = (GCUserViewItem *)i;
-	if(option.defaultAction == 0)
+	if(PsiOptions::instance()-&gt;getOption(&quot;options.messages.default-outgoing-message-type&quot;).toString() == &quot;message&quot;)
 		action(lvi-&gt;text(0), lvi-&gt;s, 0);
 	else
 		action(lvi-&gt;text(0), lvi-&gt;s, 1);</diff>
      <filename>src/gcuserview.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -65,11 +65,9 @@
 #include &quot;stretchwidget.h&quot;
 #include &quot;mucmanager.h&quot;
 #include &quot;busywidget.h&quot;
-#include &quot;common.h&quot;
 #include &quot;msgmle.h&quot;
 #include &quot;iconwidget.h&quot;
 #include &quot;iconselect.h&quot;
-#include &quot;psitoolbar.h&quot;
 #include &quot;iconaction.h&quot;
 #include &quot;psitooltip.h&quot;
 #include &quot;psioptions.h&quot;
@@ -455,7 +453,7 @@ GCMainDlg::GCMainDlg(PsiAccount *pa, const Jid &amp;j, TabManager *tabManager)
 	: TabbableWidget(j.userHost(), pa, tabManager)
 {
 	setAttribute(Qt::WA_DeleteOnClose);
-  	if ( option.brushedMetal )
+  	if ( PsiOptions::instance()-&gt;getOption(&quot;options.ui.mac.use-brushed-metal-windows&quot;).toBool() )
 		setAttribute(Qt::WA_MacMetalStyle);
 	nicknumber=0;
 	d = new Private(this);
@@ -613,7 +611,7 @@ void GCMainDlg::scrollDown() {
 void GCMainDlg::keyPressEvent(QKeyEvent *e)
 {
 	QKeySequence key = e-&gt;key() + ( e-&gt;modifiers() &amp; ~Qt::KeypadModifier);
-	if(!option.useTabs &amp;&amp; ShortcutManager::instance()-&gt;shortcuts(&quot;common.close&quot;).contains(key))
+	if(!PsiOptions::instance()-&gt;getOption(&quot;options.ui.tabs.use-tabs&quot;).toBool() &amp;&amp; ShortcutManager::instance()-&gt;shortcuts(&quot;common.close&quot;).contains(key))
 		close();
 	else if(ShortcutManager::instance()-&gt;shortcuts(&quot;chat.send&quot;).contains(key))
 		mle_returnPressed();
@@ -632,7 +630,7 @@ void GCMainDlg::closeEvent(QCloseEvent *e)
 
 void GCMainDlg::resizeEvent(QResizeEvent* e)
 {
-	if (option.keepSizes)
+	if (PsiOptions::instance()-&gt;getOption(&quot;options.ui.remember-window-sizes&quot;).toBool())
 		PsiOptions::instance()-&gt;setOption(&quot;options.ui.muc.size&quot;, e-&gt;size());
 }
 
@@ -1168,8 +1166,8 @@ void GCMainDlg::message(const Message &amp;_m)
 	if (m.body().left(d-&gt;self.length()) == d-&gt;self)
 		d-&gt;lastReferrer = m.from().resource();
 
-	if(option.gcHighlighting) {
-		for(QStringList::Iterator it=option.gcHighlights.begin();it!=option.gcHighlights.end();it++) {
+	if(PsiOptions::instance()-&gt;getOption(&quot;options.ui.muc.use-highlighting&quot;).toBool()) {
+		for(QStringList::Iterator it=PsiOptions::instance()-&gt;getOption(&quot;options.ui.muc.highlight-words&quot;).toStringList().begin();it!=PsiOptions::instance()-&gt;getOption(&quot;options.ui.muc.highlight-words&quot;).toStringList().end();it++) {
 			if(m.body().contains((*it), Qt::CaseInsensitive)) {
 				alert = true;
 			}
@@ -1179,11 +1177,11 @@ void GCMainDlg::message(const Message &amp;_m)
 	// play sound?
 	if(from == d-&gt;self) {
 		if(!m.spooled())
-			account()-&gt;playSound(option.onevent[eSend]);
+			account()-&gt;playSound(PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.sounds.outgoing-chat&quot;).toString());
 	}
 	else {
-		if(alert || (!option.noGCSound &amp;&amp; !m.spooled() &amp;&amp; !from.isEmpty()) )
-			account()-&gt;playSound(option.onevent[eChat2]);
+		if(alert || (PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.sounds.notify-every-muc-message&quot;).toBool() &amp;&amp; !m.spooled() &amp;&amp; !from.isEmpty()) )
+			account()-&gt;playSound(PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.sounds.chat-message&quot;).toString());
 	}
 
 	if(from.isEmpty())
@@ -1219,7 +1217,7 @@ void GCMainDlg::appendSysMsg(const QString &amp;str, bool alert, const QDateTime &amp;ts
 	if (d-&gt;trackBar)
 	 	d-&gt;doTrackBar();
 
-	if (!option.gcHighlighting)
+	if (!PsiOptions::instance()-&gt;getOption(&quot;options.ui.muc.use-highlighting&quot;).toBool())
 		alert=false;
 
 	QDateTime time = QDateTime::currentDateTime();
@@ -1247,22 +1245,22 @@ QString GCMainDlg::getNickColor(QString nick)
 		sender=nicks[nick];
 	}
 
-	if(!option.gcNickColoring || option.gcNickColors.empty()) {
+	if(!PsiOptions::instance()-&gt;getOption(&quot;options.ui.muc.use-nick-coloring&quot;).toBool() || PsiOptions::instance()-&gt;getOption(&quot;options.ui.look.colors.muc.nick-colors&quot;).toStringList().empty()) {
 		return &quot;#000000&quot;;
 	}
-	else if(sender == -1 || option.gcNickColors.size() == 1) {
-		return option.gcNickColors[option.gcNickColors.size()-1];
+	else if(sender == -1 || PsiOptions::instance()-&gt;getOption(&quot;options.ui.look.colors.muc.nick-colors&quot;).toStringList().size() == 1) {
+		return PsiOptions::instance()-&gt;getOption(&quot;options.ui.look.colors.muc.nick-colors&quot;).toStringList()[PsiOptions::instance()-&gt;getOption(&quot;options.ui.look.colors.muc.nick-colors&quot;).toStringList().size()-1];
 	}
 	else {
-		int n = sender % (option.gcNickColors.size()-1);
-		return option.gcNickColors[n];
+		int n = sender % (PsiOptions::instance()-&gt;getOption(&quot;options.ui.look.colors.muc.nick-colors&quot;).toStringList().size()-1);
+		return PsiOptions::instance()-&gt;getOption(&quot;options.ui.look.colors.muc.nick-colors&quot;).toStringList()[n];
 	}
 }
 
 void GCMainDlg::appendMessage(const Message &amp;m, bool alert)
 {
 	//QString who, color;
-	if (!option.gcHighlighting)
+	if (!PsiOptions::instance()-&gt;getOption(&quot;options.ui.muc.use-highlighting&quot;).toBool())
 		alert=false;
 	QString who, textcolor, nickcolor,alerttagso,alerttagsc;
 
@@ -1299,7 +1297,7 @@ void GCMainDlg::appendMessage(const Message &amp;m, bool alert)
 
 	txt = TextUtil::linkify(txt);
 
-	if(option.useEmoticons)
+	if(PsiOptions::instance()-&gt;getOption(&quot;options.ui.emoticons.use-emoticons&quot;).toBool())
 		txt = TextUtil::emoticonify(txt);
 	if( PsiOptions::instance()-&gt;getOption(&quot;options.ui.chat.legacy-formatting&quot;).toBool() )
 		txt = TextUtil::legacyFormat(txt);
@@ -1309,7 +1307,7 @@ void GCMainDlg::appendMessage(const Message &amp;m, bool alert)
 		ui_.log-&gt;appendText(QString(&quot;&lt;font color=\&quot;%1\&quot;&gt;&quot;).arg(nickcolor) + QString(&quot;[%1]&quot;).arg(timestr) + QString(&quot; *%1 &quot;).arg(Qt::escape(who)) + alerttagso + txt + alerttagsc + &quot;&lt;/font&gt;&quot;);
 	}
 	else {
-		if(option.chatSays) {
+		if(PsiOptions::instance()-&gt;getOption(&quot;options.ui.chat.use-chat-says-style&quot;).toBool()) {
 			//ui_.log-&gt;append(QString(&quot;&lt;font color=\&quot;%1\&quot;&gt;&quot;).arg(color) + QString(&quot;[%1] &quot;).arg(timestr) + QString(&quot;%1 says:&quot;).arg(Qt::escape(who)) + &quot;&lt;/font&gt;&lt;br&gt;&quot; + txt);
 			ui_.log-&gt;appendText(QString(&quot;&lt;font color=\&quot;%1\&quot;&gt;&quot;).arg(nickcolor) + QString(&quot;[%1] &quot;).arg(timestr) + QString(&quot;%1 says:&quot;).arg(Qt::escape(who)) + &quot;&lt;/font&gt;&lt;br&gt;&quot; + QString(&quot;&lt;font color=\&quot;%1\&quot;&gt;&quot;).arg(textcolor) + alerttagso + txt + alerttagsc + &quot;&lt;/font&gt;&quot;);
 		}
@@ -1370,11 +1368,11 @@ void GCMainDlg::setLooks()
 
 	// update the fonts
 	QFont f;
-	f.fromString(option.font[fChat]);
+	f.fromString(PsiOptions::instance()-&gt;getOption(&quot;options.ui.look.font.chat&quot;).toString());
 	ui_.log-&gt;setFont(f);
 	ui_.mle-&gt;chatEdit()-&gt;setFont(f);
 
-	f.fromString(option.font[fRoster]);
+	f.fromString(PsiOptions::instance()-&gt;getOption(&quot;options.ui.look.font.contactlist&quot;).toString());
 	ui_.lv_users-&gt;Q3ListView::setFont(f);
 
 	if (PsiOptions::instance()-&gt;getOption(&quot;options.ui.chat.central-toolbar&quot;).toBool()) {
@@ -1384,7 +1382,7 @@ void GCMainDlg::setLooks()
 	}
 	else {
 		ui_.toolbar-&gt;hide();
-		ui_.tb_emoticons-&gt;setVisible(option.useEmoticons);
+		ui_.tb_emoticons-&gt;setVisible(PsiOptions::instance()-&gt;getOption(&quot;options.ui.emoticons.use-emoticons&quot;).toBool());
 		ui_.tb_actions-&gt;show();
 	}
 </diff>
      <filename>src/groupchatdlg.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -48,6 +48,7 @@
 #include &quot;textutil.h&quot;
 #include &quot;jidutil.h&quot;
 #include &quot;userlist.h&quot;
+#include &quot;psioptions.h&quot;
 
 static QString getNext(QString *str)
 {
@@ -130,7 +131,7 @@ HistoryDlg::HistoryDlg(const Jid &amp;jid, PsiAccount *pa)
 	: QWidget(0, 0)
 {
 	setAttribute(Qt::WA_DeleteOnClose);
-  	if ( option.brushedMetal )
+  	if ( PsiOptions::instance()-&gt;getOption(&quot;options.ui.mac.use-brushed-metal-windows&quot;).toBool() )
 		setAttribute(Qt::WA_MacMetalStyle);
 	d = new Private;
 	d-&gt;pa = pa;
@@ -287,19 +288,19 @@ void HistoryDlg::doNext()
 
 void HistoryDlg::doSave()
 {
-	if(option.lastSavePath.isEmpty()) {
-		option.lastSavePath = QDir::homeDirPath();
+	if(PsiOptions::instance()-&gt;getOption(&quot;options.ui.last-used-save-path&quot;).toString().isEmpty()) {
+		PsiOptions::instance()-&gt;getOption(&quot;options.ui.last-used-save-path&quot;).toString() = QDir::homeDirPath();
 	}
 
 	UserListItem *u = d-&gt;pa-&gt;findFirstRelevant(d-&gt;jid);
 	QString them = JIDUtil::nickOrJid(u-&gt;name(), u-&gt;jid().full());
 	QString s = JIDUtil::encode(them).toLower();
 
-	QString str = option.lastSavePath + &quot;/&quot; + s + &quot;.txt&quot;;
+	QString str = PsiOptions::instance()-&gt;getOption(&quot;options.ui.last-used-save-path&quot;).toString() + &quot;/&quot; + s + &quot;.txt&quot;;
 	str = QFileDialog::getSaveFileName(this, tr(&quot;Export message history&quot;), str, tr(&quot;Text files (*.txt);;All files (*.*)&quot;));
 	if(!str.isEmpty()) {
 		QFileInfo fi(str);
-		option.lastSavePath = fi.dirPath();
+		PsiOptions::instance()-&gt;getOption(&quot;options.ui.last-used-save-path&quot;).toString() = fi.dirPath();
 		exportHistory(str);
 	}
 }</diff>
      <filename>src/historydlg.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -43,6 +43,8 @@
 #include &quot;iconwidget.h&quot;
 #include &quot;contactview.h&quot;
 #include &quot;psirichtext.h&quot;
+#include &quot;psioptions.h&quot;
+#include &quot;psioptions.h&quot;
 
 
 using namespace XMPP;
@@ -69,7 +71,7 @@ InfoDlg::InfoDlg(int type, const Jid &amp;j, const VCard &amp;vcard, PsiAccount *pa, QWi
 	: QDialog(parent)
 {
 	setAttribute(Qt::WA_DeleteOnClose);
-  	if ( option.brushedMetal )
+  	if ( PsiOptions::instance()-&gt;getOption(&quot;options.ui.mac.use-brushed-metal-windows&quot;).toBool() )
 		setAttribute(Qt::WA_MacMetalStyle);
 	ui_.setupUi(this);
 	d = new Private;
@@ -496,16 +498,16 @@ void InfoDlg::textChanged()
 void InfoDlg::selectPhoto()
 {
 	while(1) {
-		if(option.lastPath.isEmpty())
-			option.lastPath = QDir::homeDirPath();
-		QString str = QFileDialog::getOpenFileName(this, tr(&quot;Choose a file&quot;), option.lastPath, tr(&quot;Images (*.png *.xpm *.jpg *.PNG *.XPM *.JPG)&quot;));
+		if(PsiOptions::instance()-&gt;getOption(&quot;options.ui.last-used-open-path&quot;).toString().isEmpty())
+			PsiOptions::instance()-&gt;getOption(&quot;options.ui.last-used-open-path&quot;).toString() = QDir::homeDirPath();
+		QString str = QFileDialog::getOpenFileName(this, tr(&quot;Choose a file&quot;), PsiOptions::instance()-&gt;getOption(&quot;options.ui.last-used-open-path&quot;).toString(), tr(&quot;Images (*.png *.xpm *.jpg *.PNG *.XPM *.JPG)&quot;));
 		if(!str.isEmpty()) {
 			QFileInfo fi(str);
 			if(!fi.exists()) {
 				QMessageBox::information(this, tr(&quot;Error&quot;), tr(&quot;The file specified does not exist.&quot;));
 				continue;
 			}
-			option.lastPath = fi.dirPath();
+			PsiOptions::instance()-&gt;getOption(&quot;options.ui.last-used-open-path&quot;).toString() = fi.dirPath();
 			//printf(QDir::convertSeparators(fi.filePath()));
 			
 			// put the image in the preview box</diff>
      <filename>src/infodlg.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -36,7 +36,6 @@
 
 #include &lt;stdlib.h&gt;
 #include &lt;time.h&gt;
-#include &quot;profiles.h&quot;
 #include &quot;profiledlg.h&quot;
 #include &quot;activeprofiles.h&quot;
 </diff>
      <filename>src/main.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -238,7 +238,7 @@ MainWin::MainWin(bool _onTop, bool _asTool, PsiCon *psi, const char *name)
 {
 	setObjectName(name);
 	setAttribute(Qt::WA_AlwaysShowToolTips);
-  	if ( option.brushedMetal ) {
+  	if ( PsiOptions::instance()-&gt;getOption(&quot;options.ui.mac.use-brushed-metal-windows&quot;).toBool() ) {
 		setAttribute(Qt::WA_MacMetalStyle);
 	}
 	d = new Private(psi, this);
@@ -382,7 +382,7 @@ MainWin::MainWin(bool _onTop, bool _asTool, PsiCon *psi, const char *name)
 	d-&gt;getAction(&quot;help_psi_muc&quot;)-&gt;addTo (helpMenu);
 	d-&gt;getAction(&quot;help_report_bug&quot;)-&gt;addTo (helpMenu);
 #else
-	if (option.hideMenubar)  {
+	if (!PsiOptions::instance()-&gt;getOption(&quot;options.ui.contactlist.show-menubar&quot;).toBool())  {
 		mainMenuBar()-&gt;hide();
 	}
 	//else 
@@ -391,7 +391,7 @@ MainWin::MainWin(bool _onTop, bool _asTool, PsiCon *psi, const char *name)
 	d-&gt;optionsButton-&gt;setMenu( d-&gt;optionsMenu );
 	d-&gt;statusButton-&gt;setMenu( d-&gt;statusMenu );
 	
-	buildToolbars();
+	buildinitialToolbars();
 	
 	setWindowOpacity(double(qMax(MINIMUM_OPACITY,PsiOptions::instance()-&gt;getOption(&quot;options.ui.contactlist.opacity&quot;).toInt()))/100);
 
@@ -488,7 +488,7 @@ void MainWin::registerAction( IconAction *action )
 
 			// special cases
 			if ( aName == &quot;menu_play_sounds&quot; ) {
-				action-&gt;setChecked( useSound );
+				action-&gt;setChecked(PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.sounds.enable&quot;).toBool());
 			}
 			//else if ( aName == &quot;foobar&quot; )
 			//	;
@@ -500,14 +500,15 @@ void MainWin::registerAction( IconAction *action )
 		QObject *sender;
 		const char *signal;
 		const char *slot;
+		bool checked;
 	} reverseactionlist[] = {
-		{ &quot;show_away&quot;,    cvlist, SIGNAL( showAway(bool) ), setChecked },
-		{ &quot;show_hidden&quot;,  cvlist, SIGNAL( showHidden(bool) ), setChecked },
-		{ &quot;show_offline&quot;, cvlist, SIGNAL( showOffline(bool) ), setChecked },
-		{ &quot;show_self&quot;,    cvlist, SIGNAL( showSelf(bool) ), setChecked },
-		{ &quot;show_agents&quot;,  cvlist, SIGNAL( showAgents(bool) ), setChecked },
-		{ &quot;show_statusmsg&quot;, cvlist, SIGNAL( showStatusMsg(bool) ), setChecked },
-		{ &quot;&quot;, 0, 0, 0 }
+		{ &quot;show_away&quot;,    cvlist, SIGNAL( showAway(bool) ), setChecked, cvlist-&gt;isShowAway()},
+		{ &quot;show_hidden&quot;,  cvlist, SIGNAL( showHidden(bool) ), setChecked, cvlist-&gt;isShowHidden()},
+		{ &quot;show_offline&quot;, cvlist, SIGNAL( showOffline(bool) ), setChecked, cvlist-&gt;isShowOffline()},
+		{ &quot;show_self&quot;,    cvlist, SIGNAL( showSelf(bool) ), setChecked, cvlist-&gt;isShowSelf()},
+		{ &quot;show_agents&quot;,  cvlist, SIGNAL( showAgents(bool) ), setChecked, cvlist-&gt;isShowAgents()},
+		{ &quot;show_statusmsg&quot;, cvlist, SIGNAL( showStatusMsg(bool) ), setChecked, cvlist-&gt;isShowStatusMsg()},
+		{ &quot;&quot;, 0, 0, 0, false }
 	};
 
 	for ( i = 0; !(aName = QString(reverseactionlist[i].name)).isEmpty(); i++ ) {
@@ -519,7 +520,7 @@ void MainWin::registerAction( IconAction *action )
 				action-&gt;setChecked( PsiOptions::instance()-&gt;getOption(&quot;options.ui.contactlist.status-messages.show&quot;).toBool() );
 			}
 			else
-				action-&gt;setChecked( true );
+				action-&gt;setChecked( reverseactionlist[i].checked );
 		}
 	}
 }
@@ -629,51 +630,35 @@ QMenuBar* MainWin::mainMenuBar() const
 #endif
 }
 
-void MainWin::buildToolbars()
+void MainWin::addToolbar(const QString &amp;base)
 {
-	while ( option.toolbars[&quot;mainWin&quot;].count() &lt; toolbars.count() &amp;&amp; toolbars.count() ) {
-		PsiToolBar *tb = toolbars.last();
-		toolbars.removeLast();
-		delete tb;
-	}
-
-	for (int i = 0; i &lt; option.toolbars[&quot;mainWin&quot;].count(); i++) {
-		PsiToolBar *tb = 0;
-		if ( i &lt; toolbars.count() ) {
-			tb = toolbars.at(i);
-		}
-
-		Options::ToolbarPrefs &amp;tbPref = option.toolbars[&quot;mainWin&quot;][i];
-		if ( tb &amp;&amp; !tbPref.dirty ) {
-			continue;
-		}
-
-		if ( tb ) {
-			delete tb;
-		}
-
-		tb = new PsiToolBar(tbPref.name, this, d-&gt;psi);
-		moveDockWindow ( tb, tbPref.dock, tbPref.nl, tbPref.index, tbPref. extraOffset );
+	PsiToolBar *tb = PsiToolBar::fromOptions(base, this, d-&gt;psi, PsiActionList::Actions_MainWin);
+	
+	//connect( tb, SIGNAL( registerAction( IconAction * ) ), SLOT( registerAction( IconAction * ) ) );
+	
+	toolbars &lt;&lt; tb;
+}
 
-		tb-&gt;setGroup( &quot;mainWin&quot;, i );
-		tb-&gt;setType( PsiActionList::Actions_MainWin );
-		//connect( tb, SIGNAL( registerAction( IconAction * ) ), SLOT( registerAction( IconAction * ) ) );
-		tb-&gt;initialize( tbPref, false );
 
-		if ( i &lt; toolbars.count() ) {
-			toolbars.removeAt(i);
-		}
-		toolbars.insert(i, tb);
+void MainWin::buildinitialToolbars()
+{
+	QStringList bases = PsiOptions::instance()-&gt;getChildOptionNames(&quot;options.ui.contactlist.toolbars&quot;, true, true);
+	foreach(QString base, bases) {
+		addToolbar(base);
 	}
 }
 
+
 void MainWin::saveToolbarsPositions()
 {
+/*
+	LEGOPTFIXME
 	for (int i = 0; i &lt; toolbars.count(); i++) {
-		Options::ToolbarPrefs &amp;tbPref = option.toolbars[&quot;mainWin&quot;][i];
+		Options::ToolbarPrefs &amp;tbPref = LEGOPTS.toolbars[&quot;mainWin&quot;][i];
 		getLocation ( toolbars.at(i), tbPref.dock, tbPref.index, tbPref.nl, tbPref.extraOffset );
 		tbPref.on = toolbars.at(i)-&gt;isVisible();
 	}
+*/
 }
 
 bool MainWin::showDockMenu(const QPoint &amp;)
@@ -818,7 +803,7 @@ void MainWin::actAboutQtActivated ()
 
 void MainWin::actPlaySoundsActivated (bool state)
 {
-	useSound = state;
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.notifications.sounds.enable&quot;, state);
 }
 
 void MainWin::actPublishTuneActivated (bool state)
@@ -888,7 +873,7 @@ void MainWin::decorateButton(int status)
 
 	if(status == -1) {
 		d-&gt;statusButton-&gt;setText(tr(&quot;Connecting&quot;));
-		if (option.alertStyle != 0) {
+		if (PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.alert-style&quot;).toString() != &quot;no&quot;) {
 			d-&gt;statusButton-&gt;setAlert(IconsetFactory::iconPtr(&quot;psi/connect&quot;));
 			d-&gt;statusGroup-&gt;setPsiIcon(IconsetFactory::iconPtr(&quot;psi/connect&quot;));
 		}
@@ -1020,7 +1005,7 @@ void MainWin::optionsUpdate()
 	decorateButton(status);
 
 #ifndef Q_WS_MAC
-	if (option.hideMenubar) {
+	if (!PsiOptions::instance()-&gt;getOption(&quot;options.ui.contactlist.show-menubar&quot;).toBool()) {
 		mainMenuBar()-&gt;hide();
 	}
 	else {
@@ -1068,7 +1053,7 @@ void MainWin::setTrayToolTip(const Status &amp;status, bool)
 
 void MainWin::trayClicked(const QPoint &amp;, int button)
 {
-	if(option.dockDCstyle) {
+	if(PsiOptions::instance()-&gt;getOption(&quot;options.ui.systemtray.use-double-click&quot;).toBool()) {
 		return;
 	}
 
@@ -1087,7 +1072,7 @@ void MainWin::trayClicked(const QPoint &amp;, int button)
 
 void MainWin::trayDoubleClicked()
 {
-	if(!option.dockDCstyle) {
+	if(!PsiOptions::instance()-&gt;getOption(&quot;options.ui.systemtray.use-double-click&quot;).toBool()) {
 		return;
 	}
 </diff>
      <filename>src/mainwin.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -61,9 +61,8 @@ public:
 	QMap&lt;QString, QAction*&gt; actions;
 
 	ContactView *cvlist;
-	QList&lt;PsiToolBar*&gt; toolbars;
+	void addToolbar(const QString &amp;base);
 
-	void buildToolbars();
 	void saveToolbarsPositions();
 	PsiCon *psiCon() const;
 
@@ -154,6 +153,7 @@ public slots:
 
 private:
 	void buildGeneralMenu(QMenu *);
+	void buildinitialToolbars();
 	QString numEventsString(int) const;
 
 	bool askQuit();
@@ -165,6 +165,7 @@ private:
 	class Private;
 	Private *d;
 	friend class Private;
+	QList&lt;PsiToolBar*&gt; toolbars;
 };
 
 #endif</diff>
      <filename>src/mainwin.h</filename>
    </modified>
    <modified>
      <diff>@@ -18,7 +18,6 @@
  *
  */
 
-#include &quot;common.h&quot;
 #include &quot;mainwin_p.h&quot;
 
 #include &lt;qapplication.h&gt;</diff>
      <filename>src/mainwin_p.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -62,7 +62,7 @@ void MiniClient::reset()
 	conn = 0;
 }
 
-void MiniClient::connectToServer(const Jid &amp;jid, bool legacy_ssl_probe, bool legacy_ssl, bool forcessl, const QString &amp;_host, int _port, ProxyManager *pm, int proxy, QString *_pass)
+void MiniClient::connectToServer(const Jid &amp;jid, bool legacy_ssl_probe, bool legacy_ssl, bool forcessl, const QString &amp;_host, int _port, ProxyManager *pm, QString proxy, QString *_pass)
 {
 	j = jid;
 
@@ -77,8 +77,8 @@ void MiniClient::connectToServer(const Jid &amp;jid, bool legacy_ssl_probe, bool leg
 	}
 
 	AdvancedConnector::Proxy p;
-	if(proxy &gt; 0) {
-		const ProxyItem &amp;pi = pm-&gt;getItem(proxy-1);
+	if(proxy != &quot;&quot;) {
+		const ProxyItem &amp;pi = pm-&gt;getItem(proxy);
 		if(pi.type == &quot;http&quot;) // HTTP Connect
 			p.setHttpConnect(pi.settings.host, pi.settings.port);
 		else if(pi.type == &quot;socks&quot;) // SOCKS</diff>
      <filename>src/miniclient.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -46,7 +46,7 @@ public:
 	~MiniClient();
 
 	void reset();
-	void connectToServer(const XMPP::Jid &amp;j, bool legacy_ssl_probe, bool legacy_ssl, bool force_ssl, const QString &amp;host, int port, ProxyManager *pm, int proxy, QString *pass = NULL);
+	void connectToServer(const XMPP::Jid &amp;j, bool legacy_ssl_probe, bool legacy_ssl, bool force_ssl, const QString &amp;host, int port, ProxyManager *pm, QString proxy, QString *pass = NULL);
 	void close();
 	XMPP::Client *client();
 	void setErrorOnDisconnect(bool);</diff>
      <filename>src/miniclient.h</filename>
    </modified>
    <modified>
      <diff>@@ -32,7 +32,6 @@
 #include &lt;QTextDocument&gt;
 #include &lt;QTimer&gt;
 
-#include &quot;common.h&quot;
 #include &quot;msgmle.h&quot;
 #include &quot;shortcutmanager.h&quot;
 #include &quot;spellhighlighter.h&quot;
@@ -128,7 +127,7 @@ void ChatView::keyPressEvent(QKeyEvent *e)
  */
 void ChatView::autoCopy()
 {
-	if (isReadOnly() &amp;&amp; option.autoCopy) {
+	if (isReadOnly() &amp;&amp; PsiOptions::instance()-&gt;getOption(&quot;options.ui.automatically-copy-selected-text&quot;).toBool()) {
 		copy();
 	}
 }
@@ -285,7 +284,7 @@ void ChatEdit::keyPressEvent(QKeyEvent *e)
 		e-&gt;ignore();
 	else*/ if(e-&gt;key() == Qt::Key_U &amp;&amp; (e-&gt;modifiers() &amp; Qt::ControlModifier))
 		setText(&quot;&quot;);
-/*	else if((e-&gt;key() == Qt::Key_Return || e-&gt;key() == Qt::Key_Enter) &amp;&amp; !((e-&gt;modifiers() &amp; Qt::ShiftModifier) || (e-&gt;modifiers() &amp; Qt::AltModifier)) &amp;&amp; option.chatSoftReturn)
+/*	else if((e-&gt;key() == Qt::Key_Return || e-&gt;key() == Qt::Key_Enter) &amp;&amp; !((e-&gt;modifiers() &amp; Qt::ShiftModifier) || (e-&gt;modifiers() &amp; Qt::AltModifier)) &amp;&amp; LEGOPTS.chatSoftReturn)
 		e-&gt;ignore();
 	else if((e-&gt;key() == Qt::Key_PageUp || e-&gt;key() == Qt::Key_PageDown) &amp;&amp; (e-&gt;modifiers() &amp; Qt::ShiftModifier))
 		e-&gt;ignore();</diff>
      <filename>src/msgmle.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -72,6 +72,11 @@ QWidget *OptionsTabAdvanced::widget()
 		&quot;&lt;P&gt;&lt;B&gt;Normal&lt;/B&gt; - messages come as messages, chats come as chats.&lt;/P&gt;&quot;
 		&quot;&lt;P&gt;&lt;B&gt;Messages&lt;/B&gt; - All messages/chats come as messages, no matter what their original form was.&lt;/P&gt;&quot;
 		&quot;&lt;P&gt;&lt;B&gt;Chats&lt;/B&gt; - All messages/chats come as chats, no matter what their original form was.&lt;/P&gt;&quot;));
+	
+	d-&gt;cb_incomingAs-&gt;setItemData(0, &quot;no&quot;);
+	d-&gt;cb_incomingAs-&gt;setItemData(1, &quot;message&quot;);
+	d-&gt;cb_incomingAs-&gt;setItemData(2, &quot;chat&quot;);
+	d-&gt;cb_incomingAs-&gt;setItemData(3, &quot;current-open&quot;);
 	QWhatsThis::add(d-&gt;ck_showSubjects,
 		tr(&quot;Makes Psi show separate subject line in messages. Uncheck this if you want to save some screen space.&quot;));
 	QWhatsThis::add(d-&gt;ck_showCounter,
@@ -92,56 +97,56 @@ QWidget *OptionsTabAdvanced::widget()
 	return w;
 }
 
-void OptionsTabAdvanced::applyOptions(Options *opt)
+void OptionsTabAdvanced::applyOptions()
 {
 	if ( !w )
 		return;
 
 	OptAdvancedUI *d = (OptAdvancedUI *)w;
 
-	opt-&gt;messageEvents = d-&gt;ck_messageevents-&gt;isChecked();
-	opt-&gt;inactiveEvents = d-&gt;ck_inactiveevents-&gt;isChecked();
-	opt-&gt;useRC = d-&gt;ck_rc-&gt;isChecked();
+	PsiOptions::instance()-&gt;setOption(&quot;options.messages.send-composing-events&quot;, d-&gt;ck_messageevents-&gt;isChecked());
+	PsiOptions::instance()-&gt;setOption(&quot;options.messages.send-inactivity-events&quot;, d-&gt;ck_inactiveevents-&gt;isChecked());
+	PsiOptions::instance()-&gt;setOption(&quot;options.external-control.adhoc-remote-control.enable&quot;, d-&gt;ck_rc-&gt;isChecked());
 	if ( SpellChecker::instance()-&gt;available() )
 		PsiOptions::instance()-&gt;setOption(&quot;options.ui.spell-check.enabled&quot;,d-&gt;ck_spell-&gt;isChecked());
 	PsiOptions::instance()-&gt;setOption(&quot;options.html.chat.render&quot;, d-&gt;ck_contactsMessageFormatting-&gt;isChecked());
-	opt-&gt;autoCopy = d-&gt;ck_autocopy-&gt;isChecked();
-	opt-&gt;singleclick = d-&gt;ck_singleclick-&gt;isChecked();
-	opt-&gt;jidComplete = d-&gt;ck_jidComplete-&gt;isChecked();
-	opt-&gt;grabUrls    = d-&gt;ck_grabUrls-&gt;isChecked();
-	opt-&gt;incomingAs = d-&gt;cb_incomingAs-&gt;currentItem();
-	opt-&gt;showSubjects = d-&gt;ck_showSubjects-&gt;isChecked();
-	opt-&gt;showCounter = d-&gt;ck_showCounter-&gt;isChecked();
-	opt-&gt;autoVCardOnLogin = d-&gt;ck_autoVCardOnLogin-&gt;isChecked();
-	opt-&gt;rosterAnim = d-&gt;ck_rosterAnim-&gt;isChecked();
-	opt-&gt;scrollTo = d-&gt;ck_scrollTo-&gt;isChecked();
-	opt-&gt;ignoreHeadline = d-&gt;ck_ignoreHeadline-&gt;isChecked();
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.automatically-copy-selected-text&quot;, d-&gt;ck_autocopy-&gt;isChecked());
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.contactlist.use-single-click&quot;, d-&gt;ck_singleclick-&gt;isChecked());
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.message.use-jid-auto-completion&quot;, d-&gt;ck_jidComplete-&gt;isChecked());
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.message.auto-grab-urls-from-clipboard&quot;, d-&gt;ck_grabUrls-&gt;isChecked());
+	PsiOptions::instance()-&gt;setOption(&quot;options.messages.force-incoming-message-type&quot;, d-&gt;cb_incomingAs-&gt;itemData(d-&gt;cb_incomingAs-&gt;currentItem()));
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.message.show-subjects&quot;, d-&gt;ck_showSubjects-&gt;isChecked());
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.message.show-character-count&quot;, d-&gt;ck_showCounter-&gt;isChecked());
+	PsiOptions::instance()-&gt;setOption(&quot;options.vcard.query-own-vcard-on-login&quot;, d-&gt;ck_autoVCardOnLogin-&gt;isChecked());
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.contactlist.use-status-change-animation&quot;, d-&gt;ck_rosterAnim-&gt;isChecked());
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.contactlist.ensure-contact-visible-on-event&quot;, d-&gt;ck_scrollTo-&gt;isChecked());
+	PsiOptions::instance()-&gt;setOption(&quot;options.messages.ignore-headlines&quot;, d-&gt;ck_ignoreHeadline-&gt;isChecked());
 }
 
-void OptionsTabAdvanced::restoreOptions(const Options *opt)
+void OptionsTabAdvanced::restoreOptions()
 {
 	if ( !w )
 		return;
 
 	OptAdvancedUI *d = (OptAdvancedUI *)w;
 
-	d-&gt;ck_messageevents-&gt;setChecked( opt-&gt;messageEvents );
-	d-&gt;ck_inactiveevents-&gt;setChecked( opt-&gt;inactiveEvents );
-	d-&gt;ck_rc-&gt;setChecked( opt-&gt;useRC );
+	d-&gt;ck_messageevents-&gt;setChecked( PsiOptions::instance()-&gt;getOption(&quot;options.messages.send-composing-events&quot;).toBool() );
+	d-&gt;ck_inactiveevents-&gt;setChecked( PsiOptions::instance()-&gt;getOption(&quot;options.messages.send-inactivity-events&quot;).toBool() );
+	d-&gt;ck_rc-&gt;setChecked( PsiOptions::instance()-&gt;getOption(&quot;options.external-control.adhoc-remote-control.enable&quot;).toBool() );
 	if ( !SpellChecker::instance()-&gt;available() )
 		d-&gt;ck_spell-&gt;setChecked(false);
 	else
 		d-&gt;ck_spell-&gt;setChecked(PsiOptions::instance()-&gt;getOption(&quot;options.ui.spell-check.enabled&quot;).toBool());
 	d-&gt;ck_contactsMessageFormatting-&gt;setChecked(PsiOptions::instance()-&gt;getOption(&quot;options.html.chat.render&quot;).toBool());
-	d-&gt;ck_autocopy-&gt;setChecked( opt-&gt;autoCopy );
-	d-&gt;ck_singleclick-&gt;setChecked( opt-&gt;singleclick );
-	d-&gt;ck_jidComplete-&gt;setChecked( opt-&gt;jidComplete );
-	d-&gt;ck_grabUrls-&gt;setChecked( opt-&gt;grabUrls );
-	d-&gt;cb_incomingAs-&gt;setCurrentItem( opt-&gt;incomingAs );
-	d-&gt;ck_showSubjects-&gt;setChecked( opt-&gt;showSubjects );
-	d-&gt;ck_showCounter-&gt;setChecked( opt-&gt;showCounter );
-	d-&gt;ck_autoVCardOnLogin-&gt;setChecked( opt-&gt;autoVCardOnLogin );
-	d-&gt;ck_rosterAnim-&gt;setChecked( opt-&gt;rosterAnim );
-	d-&gt;ck_scrollTo-&gt;setChecked( opt-&gt;scrollTo );
-	d-&gt;ck_ignoreHeadline-&gt;setChecked( opt-&gt;ignoreHeadline );
+	d-&gt;ck_autocopy-&gt;setChecked( PsiOptions::instance()-&gt;getOption(&quot;options.ui.automatically-copy-selected-text&quot;).toBool() );
+	d-&gt;ck_singleclick-&gt;setChecked( PsiOptions::instance()-&gt;getOption(&quot;options.ui.contactlist.use-single-click&quot;).toBool() );
+	d-&gt;ck_jidComplete-&gt;setChecked( PsiOptions::instance()-&gt;getOption(&quot;options.ui.message.use-jid-auto-completion&quot;).toBool() );
+	d-&gt;ck_grabUrls-&gt;setChecked( PsiOptions::instance()-&gt;getOption(&quot;options.ui.message.auto-grab-urls-from-clipboard&quot;).toBool() );
+	d-&gt;cb_incomingAs-&gt;setCurrentItem(d-&gt;cb_incomingAs-&gt;findData( PsiOptions::instance()-&gt;getOption(&quot;options.messages.force-incoming-message-type&quot;).toString()));
+	d-&gt;ck_showSubjects-&gt;setChecked( PsiOptions::instance()-&gt;getOption(&quot;options.ui.message.show-subjects&quot;).toBool() );
+	d-&gt;ck_showCounter-&gt;setChecked( PsiOptions::instance()-&gt;getOption(&quot;options.ui.message.show-character-count&quot;).toBool() );
+	d-&gt;ck_autoVCardOnLogin-&gt;setChecked( PsiOptions::instance()-&gt;getOption(&quot;options.vcard.query-own-vcard-on-login&quot;).toBool() );
+	d-&gt;ck_rosterAnim-&gt;setChecked( PsiOptions::instance()-&gt;getOption(&quot;options.ui.contactlist.use-status-change-animation&quot;).toBool() );
+	d-&gt;ck_scrollTo-&gt;setChecked( PsiOptions::instance()-&gt;getOption(&quot;options.ui.contactlist.ensure-contact-visible-on-event&quot;).toBool() );
+	d-&gt;ck_ignoreHeadline-&gt;setChecked( PsiOptions::instance()-&gt;getOption(&quot;options.messages.ignore-headlines&quot;).toBool() );
 }</diff>
      <filename>src/options/opt_advanced.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -4,7 +4,6 @@
 #include &quot;optionstab.h&quot;
 
 class QWidget;
-struct Options;
 
 class OptionsTabAdvanced : public OptionsTab
 {
@@ -14,8 +13,8 @@ public:
 	~OptionsTabAdvanced();
 
 	QWidget *widget();
-	void applyOptions(Options *opt);
-	void restoreOptions(const Options *opt);
+	void applyOptions();
+	void restoreOptions();
 
 private:
 	QWidget *w;</diff>
      <filename>src/options/opt_advanced.h</filename>
    </modified>
    <modified>
      <diff>@@ -86,12 +86,10 @@ OptionsTabAppearanceMisc::OptionsTabAppearanceMisc(QObject *parent)
 : OptionsTab(parent, &quot;appearance_misc&quot;, &quot;&quot;, tr(&quot;Misc.&quot;), tr(&quot;Miscellaneous Settings&quot;))
 {
 	w = 0;
-	o = new Options;
 }
 
 OptionsTabAppearanceMisc::~OptionsTabAppearanceMisc()
 {
-	delete o;
 }
 
 QWidget *OptionsTabAppearanceMisc::widget()
@@ -104,31 +102,31 @@ QWidget *OptionsTabAppearanceMisc::widget()
 	return w;
 }
 
-void OptionsTabAppearanceMisc::applyOptions(Options *opt)
+void OptionsTabAppearanceMisc::applyOptions()
 {
 	if ( !w )
 		return;
 
 	OptAppearanceMiscUI *d = (OptAppearanceMiscUI *)w;
 
-	opt-&gt;clNewHeadings = d-&gt;ck_newHeadings-&gt;isChecked();	
-	opt-&gt;outlineHeadings = d-&gt;ck_outlineHeadings-&gt;isChecked();	
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.look.contactlist.use-slim-group-headings&quot;, d-&gt;ck_newHeadings-&gt;isChecked());
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.look.contactlist.use-outlined-group-headings&quot;, d-&gt;ck_outlineHeadings-&gt;isChecked());
 	PsiOptions::instance()-&gt;setOption(&quot;options.ui.contactlist.opacity&quot;, d-&gt;sl_rosterop-&gt;value());
 	PsiOptions::instance()-&gt;setOption(&quot;options.ui.chat.opacity&quot;, d-&gt;sl_chatdlgop-&gt;value());
 }
 
-void OptionsTabAppearanceMisc::restoreOptions(const Options *opt)
+void OptionsTabAppearanceMisc::restoreOptions()
 {
 	if ( !w )
 		return;
 
 	OptAppearanceMiscUI *d = (OptAppearanceMiscUI *)w;
 
-	d-&gt;ck_newHeadings-&gt;setChecked( opt-&gt;clNewHeadings );
-	d-&gt;ck_outlineHeadings-&gt;setChecked( opt-&gt;outlineHeadings );
+	d-&gt;ck_newHeadings-&gt;setChecked(PsiOptions::instance()-&gt;getOption(&quot;options.ui.look.contactlist.use-slim-group-headings&quot;).toBool());
+	d-&gt;ck_outlineHeadings-&gt;setChecked(PsiOptions::instance()-&gt;getOption(&quot;options.ui.look.contactlist.use-outlined-group-headings&quot;).toBool());
 	
-	d-&gt;sl_rosterop-&gt;setValue( PsiOptions::instance()-&gt;getOption(&quot;options.ui.contactlist.opacity&quot;).toInt() );
-	d-&gt;sl_chatdlgop-&gt;setValue( PsiOptions::instance()-&gt;getOption(&quot;options.ui.chat.opacity&quot;).toInt() );
+	d-&gt;sl_rosterop-&gt;setValue(PsiOptions::instance()-&gt;getOption(&quot;options.ui.contactlist.opacity&quot;).toInt());
+	d-&gt;sl_chatdlgop-&gt;setValue(PsiOptions::instance()-&gt;getOption(&quot;options.ui.chat.opacity&quot;).toInt());
 }
 
 void OptionsTabAppearanceMisc::setData(PsiCon *, QWidget *parentDialog)
@@ -146,7 +144,6 @@ OptionsTabAppearanceGeneral::OptionsTabAppearanceGeneral(QObject *parent)
 	w = 0;
 	bg_font = 0;
 	bg_color = 0;
-	o = new Options;
 }
 
 OptionsTabAppearanceGeneral::~OptionsTabAppearanceGeneral()
@@ -155,12 +152,10 @@ OptionsTabAppearanceGeneral::~OptionsTabAppearanceGeneral()
 		delete bg_font;
 	if ( bg_color )
 		delete bg_color;
-	delete o;
 }
 
-static QPixmap name2color(QString name) // taken from opt_general.cpp
+static QPixmap color2pixmap(QColor c) // taken from opt_general.cpp
 {
-	QColor c(name);
 	QPixmap pix(16, 16);
 	QPainter p(&amp;pix);
 
@@ -256,38 +251,71 @@ QWidget *OptionsTabAppearanceGeneral::widget()
 	return w;
 }
 
-void OptionsTabAppearanceGeneral::applyOptions(Options *opt)
+
+static QColor getColor(QToolButton *button)
+{
+	return button-&gt;property(&quot;psi_color&quot;).value&lt;QColor&gt;();
+}
+
+void OptionsTabAppearanceGeneral::applyOptions()
 {
 	if ( !w )
 		return;
 
-	//OptAppearanceUI *d = (OptAppearanceUI *)w;
-	//opt-&gt;avatarsChatdlgEnabled = d-&gt;ck_avatarsChatdlg-&gt;isChecked(); // Avatars
+	OptAppearanceUI *d = (OptAppearanceUI *)w;
+	//LEGOPTS.avatarsChatdlgEnabled = d-&gt;ck_avatarsChatdlg-&gt;isChecked(); // Avatars
 
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.look.font.contactlist&quot;, d-&gt;le_fRoster-&gt;fontName());
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.look.font.message&quot;, d-&gt;le_fMessage-&gt;fontName());
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.look.font.chat&quot;, d-&gt;le_fChat-&gt;fontName());
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.look.font.passive-popup&quot;, d-&gt;le_fPopup-&gt;fontName());
 	int n;
-	for (n = 0; n &lt; 4; ++n)
-		opt-&gt;font[n] = le_font[n]-&gt;fontName();
 
-	for (n = 0; n &lt; cNumColors; ++n)
-		opt-&gt;color[n] = o-&gt;color[n];
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.look.colors.contactlist.status.online&quot;, getColor(d-&gt;pb_cOnline));
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.look.colors.contactlist.status.offline&quot;, getColor(d-&gt;pb_cOffline));
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.look.colors.contactlist.status.away&quot;, getColor(d-&gt;pb_cAway));
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.look.colors.contactlist.status.do-no-disturb&quot;, getColor(d-&gt;pb_cDND));
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.look.colors.contactlist.profile.header-foreground&quot;, getColor(d-&gt;pb_cProfileFore));
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.look.colors.contactlist.profile.header-background&quot;, getColor(d-&gt;pb_cProfileBack));
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.look.colors.contactlist.grouping.header-foreground&quot;, getColor(d-&gt;pb_cGroupFore));
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.look.colors.contactlist.grouping.header-background&quot;, getColor(d-&gt;pb_cGroupBack));
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.look.colors.contactlist.background&quot;, getColor(d-&gt;pb_cListBack));
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.look.contactlist.status-change-animation.color1&quot;, getColor(d-&gt;pb_cAnimFront));
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.look.contactlist.status-change-animation.color2&quot;, getColor(d-&gt;pb_cAnimBack));
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.look.colors.contactlist.status-messages&quot;, getColor(d-&gt;pb_cStatus));
 }
 
-void OptionsTabAppearanceGeneral::restoreOptions(const Options *opt)
+static void restoreColor(QToolButton *button, QColor c)
+{
+	button-&gt;setProperty(&quot;psi_color&quot;, c);
+	button-&gt;setPixmap(color2pixmap(c));
+}
+
+void OptionsTabAppearanceGeneral::restoreOptions()
 {
 	if ( !w )
 		return;
 
-	//OptAppearanceUI *d = (OptAppearanceUI *)w;
-	//d-&gt;ck_avatarsChatdlg-&gt;setChecked( opt-&gt;avatarsChatdlgEnabled ); // Avatars
-
-	int n;
-	for (n = 0; n &lt; 4; ++n)
-		le_font[n]-&gt;setFont(opt-&gt;font[n]);
-
-	for (n = 0; n &lt; cNumColors; ++n) {
-		o-&gt;color[n] = opt-&gt;color[n];
-		((QPushButton*) (bg_color-&gt;buttons()[n]))-&gt;setPixmap(name2color(opt-&gt;color[n].name()));
-	}
+	OptAppearanceUI *d = (OptAppearanceUI *)w;
+	//d-&gt;ck_avatarsChatdlg-&gt;setChecked( LEGOPTS.avatarsChatdlgEnabled ); // Avatars
+
+	d-&gt;le_fRoster-&gt;setFont(PsiOptions::instance()-&gt;getOption(&quot;options.ui.look.font.contactlist&quot;).toString());
+	d-&gt;le_fMessage-&gt;setFont(PsiOptions::instance()-&gt;getOption(&quot;options.ui.look.font.message&quot;).toString());
+	d-&gt;le_fChat-&gt;setFont(PsiOptions::instance()-&gt;getOption(&quot;options.ui.look.font.chat&quot;).toString());
+	d-&gt;le_fPopup-&gt;setFont(PsiOptions::instance()-&gt;getOption(&quot;options.ui.look.font.passive-popup&quot;).toString());
+
+	restoreColor(d-&gt;pb_cOnline, PsiOptions::instance()-&gt;getOption(&quot;options.ui.look.colors.contactlist.status.online&quot;).value&lt;QColor&gt;());
+	restoreColor(d-&gt;pb_cOffline, PsiOptions::instance()-&gt;getOption(&quot;options.ui.look.colors.contactlist.status.offline&quot;).value&lt;QColor&gt;());
+	restoreColor(d-&gt;pb_cAway, PsiOptions::instance()-&gt;getOption(&quot;options.ui.look.colors.contactlist.status.away&quot;).value&lt;QColor&gt;());
+	restoreColor(d-&gt;pb_cDND, PsiOptions::instance()-&gt;getOption(&quot;options.ui.look.colors.contactlist.status.do-no-disturb&quot;).value&lt;QColor&gt;());
+	restoreColor(d-&gt;pb_cProfileFore, PsiOptions::instance()-&gt;getOption(&quot;options.ui.look.colors.contactlist.profile.header-foreground&quot;).value&lt;QColor&gt;());
+	restoreColor(d-&gt;pb_cProfileBack, PsiOptions::instance()-&gt;getOption(&quot;options.ui.look.colors.contactlist.profile.header-background&quot;).value&lt;QColor&gt;());
+	restoreColor(d-&gt;pb_cGroupFore, PsiOptions::instance()-&gt;getOption(&quot;options.ui.look.colors.contactlist.grouping.header-foreground&quot;).value&lt;QColor&gt;());
+	restoreColor(d-&gt;pb_cGroupBack, PsiOptions::instance()-&gt;getOption(&quot;options.ui.look.colors.contactlist.grouping.header-background&quot;).value&lt;QColor&gt;());
+	restoreColor(d-&gt;pb_cListBack, PsiOptions::instance()-&gt;getOption(&quot;options.ui.look.colors.contactlist.background&quot;).value&lt;QColor&gt;());
+	restoreColor(d-&gt;pb_cAnimFront, PsiOptions::instance()-&gt;getOption(&quot;options.ui.look.contactlist.status-change-animation.color1&quot;).value&lt;QColor&gt;());
+	restoreColor(d-&gt;pb_cAnimBack, PsiOptions::instance()-&gt;getOption(&quot;options.ui.look.contactlist.status-change-animation.color2&quot;).value&lt;QColor&gt;());
+	restoreColor(d-&gt;pb_cStatus, PsiOptions::instance()-&gt;getOption(&quot;options.ui.look.colors.contactlist.status-messages&quot;).value&lt;QColor&gt;());
 }
 
 void OptionsTabAppearanceGeneral::setData(PsiCon *, QWidget *parentDialog)
@@ -312,14 +340,15 @@ void OptionsTabAppearanceGeneral::chooseFont(QAbstractButton* button)
 void OptionsTabAppearanceGeneral::chooseColor(QAbstractButton* button)
 {
 	QColor c;
-	int x = (bg_color-&gt;buttons()).indexOf(button);
+	//int x = (bg_color-&gt;buttons()).indexOf(button);
 
-	c = o-&gt;color[x];
+	c = button-&gt;property(&quot;psi_color&quot;).value&lt;QColor&gt;();
 
 	c = QColorDialog::getColor(c, parentWidget);
 	if(c.isValid()) {
-		o-&gt;color[x] = c;
-		((QPushButton*) bg_color-&gt;buttons()[x])-&gt;setPixmap(name2color(o-&gt;color[x].name()));
+		button-&gt;setProperty(&quot;psi_color&quot;, c);
+		//((QPushButton*) bg_color-&gt;buttons()[x])-&gt;setPixmap(name2color(o-&gt;color[x].name()));
+		button-&gt;setPixmap(color2pixmap(c));
 
 		emit dataChanged();
 	}</diff>
      <filename>src/options/opt_appearance.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -23,7 +23,6 @@ private:
 };
 
 class QWidget;
-struct Options;
 class QButtonGroup;
 class QLineEdit;
 
@@ -42,15 +41,14 @@ public:
 	~OptionsTabAppearanceMisc();
 
 	QWidget *widget();
-	void applyOptions(Options *opt);
-	void restoreOptions(const Options *opt);
+	void applyOptions();
+	void restoreOptions();
 
 private slots:
 	void setData(PsiCon *, QWidget *);
 
 private:
 	QWidget *w, *parentWidget;
-	Options *o;
 };
 
 class OptionsTabAppearanceGeneral : public OptionsTab
@@ -61,8 +59,8 @@ public:
 	~OptionsTabAppearanceGeneral();
 
 	QWidget *widget();
-	void applyOptions(Options *opt);
-	void restoreOptions(const Options *opt);
+	void applyOptions();
+	void restoreOptions();
 
 private slots:
 	void setData(PsiCon *, QWidget *);
@@ -74,7 +72,6 @@ private:
 	QButtonGroup *bg_color;
 	FontLabel *le_font[4];
 	QButtonGroup *bg_font;
-	Options *o;
 };
 
 #endif</diff>
      <filename>src/options/opt_appearance.h</filename>
    </modified>
    <modified>
      <diff>@@ -1,6 +1,7 @@
 #include &quot;opt_application.h&quot;
 #include &quot;common.h&quot;
 #include &quot;iconwidget.h&quot;
+#include &quot;psioptions.h&quot;
 
 #include &lt;qcheckbox.h&gt;
 #include &lt;qcombobox.h&gt;
@@ -72,50 +73,50 @@ QWidget *OptionsTabApplication::widget()
 	return w;
 }
 
-void OptionsTabApplication::applyOptions(Options *opt)
+void OptionsTabApplication::applyOptions()
 {
 	if ( !w )
 		return;
 
 	OptApplicationUI *d = (OptApplicationUI *)w;
 
-	opt-&gt;alwaysOnTop = d-&gt;ck_alwaysOnTop-&gt;isChecked();
-	opt-&gt;autoRosterSize = d-&gt;ck_autoRosterSize-&gt;isChecked();
-	opt-&gt;keepSizes   = d-&gt;ck_keepSizes-&gt;isChecked();
-	opt-&gt;useleft = d-&gt;ck_useleft-&gt;isChecked();
-	opt-&gt;hideMenubar = !d-&gt;ck_showMenubar-&gt;isChecked();
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.contactlist.always-on-top&quot;, d-&gt;ck_alwaysOnTop-&gt;isChecked());
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.contactlist.automatically-resize-roster&quot;, d-&gt;ck_autoRosterSize-&gt;isChecked());
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.remember-window-sizes&quot;,d-&gt;ck_keepSizes-&gt;isChecked());
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.contactlist.use-left-click&quot;, d-&gt;ck_useleft-&gt;isChecked());
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.contactlist.show-menubar&quot;, d-&gt;ck_showMenubar-&gt;isChecked());
 
 	// docklet
-	opt-&gt;useDock = d-&gt;ck_docklet-&gt;isChecked();
-	opt-&gt;dockDCstyle = d-&gt;ck_dockDCstyle-&gt;isChecked();
-	opt-&gt;dockHideMW = d-&gt;ck_dockHideMW-&gt;isChecked();
-	opt-&gt;dockToolMW = d-&gt;ck_dockToolMW-&gt;isChecked();
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.systemtray.enable&quot;, d-&gt;ck_docklet-&gt;isChecked());
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.systemtray.use-double-click&quot;, d-&gt;ck_dockDCstyle-&gt;isChecked());
+	PsiOptions::instance()-&gt;setOption(&quot;options.contactlist.hide-on-start&quot;, d-&gt;ck_dockHideMW-&gt;isChecked());
+	PsiOptions::instance()-&gt;setOption(&quot;options.contactlist.use-toolwindow&quot;, d-&gt;ck_dockToolMW-&gt;isChecked());
 
 	// data transfer
-	opt-&gt;dtPort = d-&gt;le_dtPort-&gt;text().toInt();
-	opt-&gt;dtExternal = d-&gt;le_dtExternal-&gt;text().trimmed();
+	PsiOptions::instance()-&gt;setOption(&quot;options.p2p.bytestreams.listen-port&quot;, d-&gt;le_dtPort-&gt;text().toInt());
+	PsiOptions::instance()-&gt;setOption(&quot;options.p2p.bytestreams.external-address&quot;, d-&gt;le_dtExternal-&gt;text().trimmed());
 }
 
-void OptionsTabApplication::restoreOptions(const Options *opt)
+void OptionsTabApplication::restoreOptions()
 {
 	if ( !w )
 		return;
 
 	OptApplicationUI *d = (OptApplicationUI *)w;
 
-	d-&gt;ck_alwaysOnTop-&gt;setChecked( opt-&gt;alwaysOnTop );
-	d-&gt;ck_autoRosterSize-&gt;setChecked( opt-&gt;autoRosterSize );
-	d-&gt;ck_keepSizes-&gt;setChecked( opt-&gt;keepSizes );
-	d-&gt;ck_showMenubar-&gt;setChecked( !opt-&gt;hideMenubar );
-	d-&gt;ck_useleft-&gt;setChecked( opt-&gt;useleft );
+	d-&gt;ck_alwaysOnTop-&gt;setChecked( PsiOptions::instance()-&gt;getOption(&quot;options.ui.contactlist.always-on-top&quot;).toBool() );
+	d-&gt;ck_autoRosterSize-&gt;setChecked( PsiOptions::instance()-&gt;getOption(&quot;options.ui.contactlist.automatically-resize-roster&quot;).toBool() );
+	d-&gt;ck_keepSizes-&gt;setChecked( PsiOptions::instance()-&gt;getOption(&quot;options.ui.remember-window-sizes&quot;).toBool() );
+	d-&gt;ck_showMenubar-&gt;setChecked( PsiOptions::instance()-&gt;getOption(&quot;options.ui.contactlist.show-menubar&quot;).toBool() );
+	d-&gt;ck_useleft-&gt;setChecked( PsiOptions::instance()-&gt;getOption(&quot;options.ui.contactlist.use-left-click&quot;).toBool() );
 
 	// docklet
-	d-&gt;ck_docklet-&gt;setChecked( opt-&gt;useDock );
-	d-&gt;ck_dockDCstyle-&gt;setChecked( opt-&gt;dockDCstyle );
-	d-&gt;ck_dockHideMW-&gt;setChecked( opt-&gt;dockHideMW );
-	d-&gt;ck_dockToolMW-&gt;setChecked( opt-&gt;dockToolMW );
+	d-&gt;ck_docklet-&gt;setChecked( PsiOptions::instance()-&gt;getOption(&quot;options.ui.systemtray.enable&quot;).toBool() );
+	d-&gt;ck_dockDCstyle-&gt;setChecked( PsiOptions::instance()-&gt;getOption(&quot;options.ui.systemtray.use-double-click&quot;).toBool() );
+	d-&gt;ck_dockHideMW-&gt;setChecked( PsiOptions::instance()-&gt;getOption(&quot;options.contactlist.hide-on-start&quot;).toBool() );
+	d-&gt;ck_dockToolMW-&gt;setChecked( PsiOptions::instance()-&gt;getOption(&quot;options.contactlist.use-toolwindow&quot;).toBool() );
 
 	// data transfer
-	d-&gt;le_dtPort-&gt;setText( QString::number(opt-&gt;dtPort) );
-	d-&gt;le_dtExternal-&gt;setText( opt-&gt;dtExternal );
+	d-&gt;le_dtPort-&gt;setText( QString::number(PsiOptions::instance()-&gt;getOption(&quot;options.p2p.bytestreams.listen-port&quot;).toInt()) );
+	d-&gt;le_dtExternal-&gt;setText( PsiOptions::instance()-&gt;getOption(&quot;options.p2p.bytestreams.external-address&quot;).toString() );
 }</diff>
      <filename>src/options/opt_application.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -4,7 +4,6 @@
 #include &quot;optionstab.h&quot;
 
 class QWidget;
-struct Options;
 class QButtonGroup;
 
 class OptionsTabApplication : public OptionsTab
@@ -15,8 +14,8 @@ public:
 	~OptionsTabApplication();
 
 	QWidget *widget();
-	void applyOptions(Options *opt);
-	void restoreOptions(const Options *opt);
+	void applyOptions();
+	void restoreOptions();
 
 private:
 	QWidget *w;</diff>
      <filename>src/options/opt_application.h</filename>
    </modified>
    <modified>
      <diff>@@ -90,21 +90,36 @@ QWidget *OptionsTabChat::widget()
 	return w;
 }
 
-void OptionsTabChat::applyOptions(Options *opt)
+void OptionsTabChat::applyOptions()
 {
 	if ( !w )
 		return;
 
 	OptChatUI *d = (OptChatUI *)w;
 
-	opt-&gt;defaultAction   = bg_defAct-&gt;buttons().indexOf(bg_defAct-&gt;checkedButton());
-	opt-&gt;alertOpenChats  = d-&gt;ck_alertOpenChats-&gt;isChecked();
-	opt-&gt;raiseChatWindow = d-&gt;ck_raiseChatWindow-&gt;isChecked();
-	opt-&gt;oldSmallChats 	 = opt-&gt;smallChats;
-	opt-&gt;smallChats      = d-&gt;ck_smallChats-&gt;isChecked();
-	opt-&gt;delChats        = bg_delChats-&gt;buttons().indexOf( bg_delChats-&gt;checkedButton() );
-	opt-&gt;useTabs		 = d-&gt;ck_tabChats-&gt;isChecked();
-	opt-&gt;chatLineEdit    = d-&gt;ck_autoResize-&gt;isChecked();
+	PsiOptions::instance()-&gt;setOption(&quot;options.messages.default-outgoing-message-type&quot;, bg_defAct-&gt;buttons().indexOf(bg_defAct-&gt;checkedButton()) ? &quot;message&quot; : &quot;chat&quot;);
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.chat.alert-for-already-open-chats&quot;, d-&gt;ck_alertOpenChats-&gt;isChecked());
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.chat.raise-chat-windows-on-new-messages&quot;, d-&gt;ck_raiseChatWindow-&gt;isChecked());
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.chat.use-small-chats&quot;, d-&gt;ck_smallChats-&gt;isChecked());
+	
+	QString delafter;
+	switch (bg_delChats-&gt;buttons().indexOf( bg_delChats-&gt;checkedButton() )) {
+		case 0:
+			delafter = &quot;instant&quot;;
+			break;
+		case 1:
+			delafter = &quot;hour&quot;;
+			break;
+		case 2:
+			delafter = &quot;day&quot;;
+			break;
+		case 3:
+			delafter = &quot;never&quot;;
+			break;
+	}
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.chat.delete-contents-after&quot;, delafter);
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.tabs.use-tabs&quot;, d-&gt;ck_tabChats-&gt;isChecked());
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.chat.use-expanding-line-edit&quot;, d-&gt;ck_autoResize-&gt;isChecked());
 	
 	// Soft return.
 	// Only update this if the value actually changed, or else custom presets
@@ -122,20 +137,28 @@ void OptionsTabChat::applyOptions(Options *opt)
 	}
 }
 
-void OptionsTabChat::restoreOptions(const Options *opt)
+void OptionsTabChat::restoreOptions()
 {
 	if ( !w )
 		return;
 
 	OptChatUI *d = (OptChatUI *)w;
 
-	bg_defAct-&gt;buttons()[opt-&gt;defaultAction]-&gt;setChecked(true);
-	d-&gt;ck_alertOpenChats-&gt;setChecked( opt-&gt;alertOpenChats );
-	d-&gt;ck_raiseChatWindow-&gt;setChecked( opt-&gt;raiseChatWindow );
-	d-&gt;ck_smallChats-&gt;setChecked( opt-&gt;smallChats );
-	d-&gt;ck_tabChats-&gt;setChecked( opt-&gt;useTabs );
-	d-&gt;ck_autoResize-&gt;setChecked( opt-&gt;chatLineEdit );
-	bg_delChats-&gt;buttons()[opt-&gt;delChats]-&gt;setChecked(true);
+	bg_defAct-&gt;buttons()[PsiOptions::instance()-&gt;getOption(&quot;options.messages.default-outgoing-message-type&quot;).toString() == &quot;message&quot; ? 0 : 1]-&gt;setChecked(true);
+	d-&gt;ck_alertOpenChats-&gt;setChecked( PsiOptions::instance()-&gt;getOption(&quot;options.ui.chat.alert-for-already-open-chats&quot;).toBool() );
+	d-&gt;ck_raiseChatWindow-&gt;setChecked( PsiOptions::instance()-&gt;getOption(&quot;options.ui.chat.raise-chat-windows-on-new-messages&quot;).toBool() );
+	d-&gt;ck_smallChats-&gt;setChecked( PsiOptions::instance()-&gt;getOption(&quot;options.ui.chat.use-small-chats&quot;).toBool() );
+	d-&gt;ck_tabChats-&gt;setChecked( PsiOptions::instance()-&gt;getOption(&quot;options.ui.tabs.use-tabs&quot;).toBool() );
+	d-&gt;ck_autoResize-&gt;setChecked( PsiOptions::instance()-&gt;getOption(&quot;options.ui.chat.use-expanding-line-edit&quot;).toBool() );
+	QString delafter = PsiOptions::instance()-&gt;getOption(&quot;options.ui.chat.delete-contents-after&quot;).toString();
+	if (delafter == &quot;instant&quot;) {
+		d-&gt;rb_delChatsClose-&gt;setChecked(true);
+	} else if (delafter == &quot;hour&quot;) {
+		d-&gt;rb_delChatsHour-&gt;setChecked(true);
+	} else if (delafter == &quot;day&quot;) {
+		d-&gt;rb_delChatsDay-&gt;setChecked(true);
+	} else if (delafter == &quot;never&quot;) {
+		d-&gt;rb_delChatsNever-&gt;setChecked(true);
+	}
 	d-&gt;ck_chatSoftReturn-&gt;setChecked(ShortcutManager::instance()-&gt;shortcuts(&quot;chat.send&quot;).contains(QKeySequence(Qt::Key_Return)));
-	
 }</diff>
      <filename>src/options/opt_chat.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -4,7 +4,6 @@
 #include &quot;optionstab.h&quot;
 
 class QWidget;
-struct Options;
 class QButtonGroup;
 
 class OptionsTabChat : public OptionsTab
@@ -15,8 +14,8 @@ public:
 	~OptionsTabChat();
 
 	QWidget *widget();
-	void applyOptions(Options *opt);
-	void restoreOptions(const Options *opt);
+	void applyOptions();
+	void restoreOptions();
 
 private:
 	QWidget *w;</diff>
      <filename>src/options/opt_chat.h</filename>
    </modified>
    <modified>
      <diff>@@ -8,6 +8,7 @@
 #include &lt;qlabel.h&gt;
 #include &lt;qcombobox.h&gt;
 #include &lt;qlineedit.h&gt;
+#include &quot;psioptions.h&quot;
 
 #include &quot;ui_opt_events.h&quot;
 
@@ -54,6 +55,10 @@ QWidget *OptionsTabEvents::widget()
 		&quot; not already in your list of contacts.&quot;));
 	QWhatsThis::add(d-&gt;cb_animation,
 		tr(&quot;What kind of animation should psi use for incoming event icons on the main window?&quot;));
+	
+	d-&gt;cb_animation-&gt;setItemData ( 0, &quot;no&quot;);
+	d-&gt;cb_animation-&gt;setItemData ( 1, &quot;blink&quot;);
+	d-&gt;cb_animation-&gt;setItemData ( 2, &quot;animate&quot;);
 /*	QWhatsThis::add(d-&gt;rb_aSolid,
 		tr(&quot;Does not animate or blink incoming event icons on the main window as they are received.&quot;));
 	QWhatsThis::add(d-&gt;rb_aBlink,
@@ -65,6 +70,11 @@ QWidget *OptionsTabEvents::widget()
 	QWhatsThis::add(d-&gt;ck_notifyAuth,
 		tr(&quot;Makes Psi notify you when your authorization request was approved.&quot;));
 
+	
+	d-&gt;cb_bounce-&gt;setItemData(0, &quot;never&quot;);
+	d-&gt;cb_bounce-&gt;setItemData(1, &quot;once&quot;);
+	d-&gt;cb_bounce-&gt;setItemData(2, &quot;forever&quot;);
+	
 #ifndef Q_WS_MAC
 	d-&gt;cb_bounce-&gt;hide();
 	d-&gt;lb_bounce-&gt;hide();
@@ -77,58 +87,58 @@ QWidget *OptionsTabEvents::widget()
 	return w;
 }
 
-void OptionsTabEvents::applyOptions(Options *opt)
+void OptionsTabEvents::applyOptions()
 {
 	if ( !w )
 		return;
 
 	OptEventsUI *d = (OptEventsUI *)w;
-	opt-&gt;popupMsgs  = d-&gt;ck_popupMsgs-&gt;isChecked();
-	opt-&gt;popupChats = d-&gt;ck_popupMsgs-&gt;isChecked();
-	opt-&gt;popupHeadlines = d-&gt;ck_popupHeadlines-&gt;isChecked();
-	opt-&gt;popupFiles = d-&gt;ck_popupFiles-&gt;isChecked();
-	opt-&gt;noAwayPopup = !d-&gt;ck_allowAwayPopup-&gt;isChecked();
-	opt-&gt;noUnlistedPopup = !d-&gt;ck_allowUnlistedPopup-&gt;isChecked();
-	opt-&gt;raise = d-&gt;ck_raise-&gt;isChecked();
-	opt-&gt;ignoreNonRoster = d-&gt;ck_ignoreNonRoster-&gt;isChecked();
-	opt-&gt;alertStyle = d-&gt;cb_animation-&gt;currentIndex();
-	opt-&gt;autoAuth = d-&gt;ck_autoAuth-&gt;isChecked();
-	opt-&gt;notifyAuth = d-&gt;ck_notifyAuth-&gt;isChecked();
-	opt-&gt;bounceDock = (Options::BounceDockSetting) d-&gt;cb_bounce-&gt;currentItem();
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.message.auto-popup&quot;, d-&gt;ck_popupMsgs-&gt;isChecked());
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.chat.auto-popup&quot;, d-&gt;ck_popupMsgs-&gt;isChecked());
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.message.auto-popup-headlines&quot;, d-&gt;ck_popupHeadlines-&gt;isChecked());
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.file-transfer.auto-popup&quot;, d-&gt;ck_popupFiles-&gt;isChecked());
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.notifications.popup-dialogs.suppress-while-away&quot;, !d-&gt;ck_allowAwayPopup-&gt;isChecked());
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.notifications.popup-dialogs.suppress-when-not-on-roster&quot;, !d-&gt;ck_allowUnlistedPopup-&gt;isChecked());
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.contactlist.raise-on-new-event&quot;, d-&gt;ck_raise-&gt;isChecked());
+	PsiOptions::instance()-&gt;setOption(&quot;options.messages.ignore-non-roster-contacts&quot;, d-&gt;ck_ignoreNonRoster-&gt;isChecked());
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.notifications.alert-style&quot;, d-&gt;cb_animation-&gt;itemData(d-&gt;cb_animation-&gt;currentIndex()));
+	PsiOptions::instance()-&gt;setOption(&quot;options.subscriptions.automatically-allow-authorisation&quot;, d-&gt;ck_autoAuth-&gt;isChecked());
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.notifications.successful-subscription&quot;, d-&gt;ck_notifyAuth-&gt;isChecked());
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.notifications.bounce-dock&quot;, d-&gt;cb_bounce-&gt;itemData( d-&gt;cb_bounce-&gt;currentItem()));
 
-	opt-&gt;ppIsOn = d-&gt;ck_popupOn-&gt;isChecked();
-	opt-&gt;ppMessage = d-&gt;ck_popupOnMessage-&gt;isChecked();
-	opt-&gt;ppChat    = d-&gt;ck_popupOnMessage-&gt;isChecked();
-	opt-&gt;ppHeadline = d-&gt;ck_popupOnHeadline-&gt;isChecked();
-	opt-&gt;ppFile    = d-&gt;ck_popupOnFile-&gt;isChecked();
-	opt-&gt;ppOnline  = d-&gt;ck_popupOnOnline-&gt;isChecked();
-	opt-&gt;ppOffline = d-&gt;ck_popupOnOffline-&gt;isChecked();
-	opt-&gt;ppStatus  = d-&gt;ck_popupOnStatus-&gt;isChecked();
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.notifications.passive-popups.enabled&quot;, d-&gt;ck_popupOn-&gt;isChecked());
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.notifications.passive-popups.incoming-message&quot;, d-&gt;ck_popupOnMessage-&gt;isChecked());
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.notifications.passive-popups.incoming-chat&quot;, d-&gt;ck_popupOnMessage-&gt;isChecked());
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.notifications.passive-popups.incoming-headline&quot;, d-&gt;ck_popupOnHeadline-&gt;isChecked());
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.notifications.passive-popups.incoming-file-transfer&quot;, d-&gt;ck_popupOnFile-&gt;isChecked());
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.notifications.passive-popups.status.online&quot;, d-&gt;ck_popupOnOnline-&gt;isChecked());
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.notifications.passive-popups.status.offline&quot;, d-&gt;ck_popupOnOffline-&gt;isChecked());
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.notifications.passive-popups.status.other-changes&quot;, d-&gt;ck_popupOnStatus-&gt;isChecked());
 }
 
-void OptionsTabEvents::restoreOptions(const Options *opt)
+void OptionsTabEvents::restoreOptions()
 {
 	if ( !w )
 		return;
 
 	OptEventsUI *d = (OptEventsUI *)w;
-	d-&gt;ck_popupMsgs-&gt;setChecked( opt-&gt;popupMsgs || opt-&gt;popupChats );
-	d-&gt;ck_popupHeadlines-&gt;setChecked( opt-&gt;popupHeadlines );
-	d-&gt;ck_popupFiles-&gt;setChecked( opt-&gt;popupFiles );
-	d-&gt;ck_allowAwayPopup-&gt;setChecked( !opt-&gt;noAwayPopup );
-	d-&gt;ck_allowUnlistedPopup-&gt;setChecked( !opt-&gt;noUnlistedPopup );
-	d-&gt;ck_raise-&gt;setChecked( opt-&gt;raise );
-	d-&gt;ck_ignoreNonRoster-&gt;setChecked( opt-&gt;ignoreNonRoster );
-	d-&gt;cb_animation-&gt;setCurrentItem(opt-&gt;alertStyle);
-	d-&gt;ck_autoAuth-&gt;setChecked( opt-&gt;autoAuth );
-	d-&gt;ck_notifyAuth-&gt;setChecked( opt-&gt;notifyAuth );
-	d-&gt;cb_bounce-&gt;setCurrentItem( opt-&gt;bounceDock );
+	d-&gt;ck_popupMsgs-&gt;setChecked( PsiOptions::instance()-&gt;getOption(&quot;options.ui.message.auto-popup&quot;).toBool() || PsiOptions::instance()-&gt;getOption(&quot;options.ui.chat.auto-popup&quot;).toBool() );
+	d-&gt;ck_popupHeadlines-&gt;setChecked( PsiOptions::instance()-&gt;getOption(&quot;options.ui.message.auto-popup-headlines&quot;).toBool() );
+	d-&gt;ck_popupFiles-&gt;setChecked( PsiOptions::instance()-&gt;getOption(&quot;options.ui.file-transfer.auto-popup&quot;).toBool() );
+	d-&gt;ck_allowAwayPopup-&gt;setChecked( !PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.popup-dialogs.suppress-while-away&quot;).toBool() );
+	d-&gt;ck_allowUnlistedPopup-&gt;setChecked( !PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.popup-dialogs.suppress-when-not-on-roster&quot;).toBool() );
+	d-&gt;ck_raise-&gt;setChecked( PsiOptions::instance()-&gt;getOption(&quot;options.ui.contactlist.raise-on-new-event&quot;).toBool() );
+	d-&gt;ck_ignoreNonRoster-&gt;setChecked( PsiOptions::instance()-&gt;getOption(&quot;options.messages.ignore-non-roster-contacts&quot;).toBool() );
+	d-&gt;cb_animation-&gt;setCurrentItem(d-&gt;cb_animation-&gt;findData(PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.alert-style&quot;).toInt()));
+	d-&gt;ck_autoAuth-&gt;setChecked( PsiOptions::instance()-&gt;getOption(&quot;options.subscriptions.automatically-allow-authorisation&quot;).toBool() );
+	d-&gt;ck_notifyAuth-&gt;setChecked( PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.successful-subscription&quot;).toBool() );
+	d-&gt;cb_bounce-&gt;setCurrentItem( d-&gt;cb_bounce-&gt;findData(PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.bounce-dock&quot;).toString()) );
 
-	d-&gt;ck_popupOn-&gt;setChecked( opt-&gt;ppIsOn );
-	d-&gt;ck_popupOnMessage-&gt;setChecked( opt-&gt;ppMessage || opt-&gt;ppChat );
-	d-&gt;ck_popupOnHeadline-&gt;setChecked( opt-&gt;ppHeadline );
-	d-&gt;ck_popupOnFile-&gt;setChecked( opt-&gt;ppFile );
-	d-&gt;ck_popupOnOnline-&gt;setChecked( opt-&gt;ppOnline );
-	d-&gt;ck_popupOnOffline-&gt;setChecked( opt-&gt;ppOffline );
-	d-&gt;ck_popupOnStatus-&gt;setChecked( opt-&gt;ppStatus );
+	d-&gt;ck_popupOn-&gt;setChecked( PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.passive-popups.enabled&quot;).toBool() );
+	d-&gt;ck_popupOnMessage-&gt;setChecked( PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.passive-popups.incoming-message&quot;).toBool() || PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.passive-popups.incoming-chat&quot;).toBool() );
+	d-&gt;ck_popupOnHeadline-&gt;setChecked( PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.passive-popups.incoming-headline&quot;).toBool() );
+	d-&gt;ck_popupOnFile-&gt;setChecked( PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.passive-popups.incoming-file-transfer&quot;).toBool() );
+	d-&gt;ck_popupOnOnline-&gt;setChecked( PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.passive-popups.status.online&quot;).toBool() );
+	d-&gt;ck_popupOnOffline-&gt;setChecked( PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.passive-popups.status.offline&quot;).toBool() );
+	d-&gt;ck_popupOnStatus-&gt;setChecked( PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.passive-popups.status.other-changes&quot;).toBool() );
 }</diff>
      <filename>src/options/opt_events.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -5,7 +5,6 @@
 #include &quot;qradiobutton.h&quot;
 
 class QWidget;
-struct Options;
 
 class OptionsTabEvents : public OptionsTab
 {
@@ -14,8 +13,8 @@ public:
 	OptionsTabEvents(QObject *parent);
 
 	QWidget *widget();
-	void applyOptions(Options *opt);
-	void restoreOptions(const Options *opt);
+	void applyOptions();
+	void restoreOptions();
 
 private:
 	QWidget *w;</diff>
      <filename>src/options/opt_events.h</filename>
    </modified>
    <modified>
      <diff>@@ -1,6 +1,7 @@
 #include &quot;opt_groupchat.h&quot;
 #include &quot;common.h&quot;
 #include &quot;iconwidget.h&quot;
+#include &quot;psioptions.h&quot;
 
 #include &lt;qbuttongroup.h&gt;
 #include &lt;qwhatsthis.h&gt;
@@ -58,28 +59,28 @@ QWidget *OptionsTabGroupchat::widget()
 	return w;
 }
 
-void OptionsTabGroupchat::applyOptions(Options *opt)
+void OptionsTabGroupchat::applyOptions()
 {
 	if ( !w )
 		return;
 
 	GeneralGroupchatUI *d = (GeneralGroupchatUI *)w;
-	opt-&gt;gcHighlighting = d-&gt;ck_gcHighlights-&gt;isChecked();
-	opt-&gt;gcNickColoring = d-&gt;ck_gcNickColoring-&gt;isChecked();
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.muc.use-highlighting&quot;, d-&gt;ck_gcHighlights-&gt;isChecked());
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.muc.use-nick-coloring&quot;, d-&gt;ck_gcNickColoring-&gt;isChecked());
 
 	QStringList highlight;
 	int i;
 	for (i = 0; i &lt; (int)d-&gt;lw_highlightWords-&gt;count(); i++)
 		highlight &lt;&lt; d-&gt;lw_highlightWords-&gt;item(i)-&gt;text();
-	opt-&gt;gcHighlights = highlight;
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.muc.highlight-words&quot;, highlight);
 
 	QStringList colors;
 	for (i = 0; i &lt; (int)d-&gt;lw_nickColors-&gt;count(); i++)
 		colors &lt;&lt; d-&gt;lw_nickColors-&gt;item(i)-&gt;text();
-	opt-&gt;gcNickColors = colors;
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.look.colors.muc.nick-colors&quot;, colors);
 }
 
-void OptionsTabGroupchat::restoreOptions(const Options *opt)
+void OptionsTabGroupchat::restoreOptions()
 {
 	if ( !w )
 		return;
@@ -92,16 +93,17 @@ void OptionsTabGroupchat::restoreOptions(const Options *opt)
 	connect(d-&gt;le_newNickColor,	   SIGNAL(textChanged(const QString &amp;)), SLOT(displayGCNickColor()));
 
 	d-&gt;ck_gcHighlights-&gt;setChecked( true );
-	d-&gt;ck_gcHighlights-&gt;setChecked( opt-&gt;gcHighlighting );
+	d-&gt;ck_gcHighlights-&gt;setChecked( PsiOptions::instance()-&gt;getOption(&quot;options.ui.muc.use-highlighting&quot;).toBool() );
 	d-&gt;ck_gcNickColoring-&gt;setChecked( true );
-	d-&gt;ck_gcNickColoring-&gt;setChecked( opt-&gt;gcNickColoring );
+	d-&gt;ck_gcNickColoring-&gt;setChecked( PsiOptions::instance()-&gt;getOption(&quot;options.ui.muc.use-nick-coloring&quot;).toBool() );
 	d-&gt;lw_highlightWords-&gt;clear();
-	d-&gt;lw_highlightWords-&gt;addItems( opt-&gt;gcHighlights );
+	d-&gt;lw_highlightWords-&gt;addItems( PsiOptions::instance()-&gt;getOption(&quot;options.ui.muc.highlight-words&quot;).toStringList() );
 	d-&gt;lw_nickColors-&gt;clear();
 
-	QStringList::ConstIterator it = opt-&gt;gcNickColors.begin();
-	for ( ; it != opt-&gt;gcNickColors.end(); ++it)
-		addNickColor( *it );
+	
+	foreach(QString col, PsiOptions::instance()-&gt;getOption(&quot;options.ui.look.colors.muc.nick-colors&quot;).toStringList()) {
+		addNickColor(col);
+	}
 
 	d-&gt;le_newHighlightWord-&gt;setText(&quot;&quot;);
 	d-&gt;le_newNickColor-&gt;setText(&quot;#FFFFFF&quot;);</diff>
      <filename>src/options/opt_groupchat.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -5,7 +5,6 @@
 
 class QWidget;
 class QListWidgetItem;
-struct Options;
 
 class OptionsTabGroupchat : public OptionsTab
 {
@@ -14,8 +13,8 @@ public:
 	OptionsTabGroupchat(QObject *parent);
 
 	QWidget *widget();
-	void applyOptions(Options *opt);
-	void restoreOptions(const Options *opt);
+	void applyOptions();
+	void restoreOptions();
 
 	void setData(PsiCon *, QWidget *);
 	bool stretchable() const { return true; }</diff>
      <filename>src/options/opt_groupchat.h</filename>
    </modified>
    <modified>
      <diff>@@ -4,6 +4,7 @@
 #include &quot;applicationinfo.h&quot;
 #include &quot;psiiconset.h&quot;
 #include &quot;psicon.h&quot;
+#include &quot;psioptions.h&quot;
 
 #include &lt;QDir&gt;
 #include &lt;qcheckbox.h&gt;
@@ -396,7 +397,7 @@ QWidget *OptionsTabIconsetSystem::widget()
 	return w;
 }
 
-void OptionsTabIconsetSystem::applyOptions(Options *opt)
+void OptionsTabIconsetSystem::applyOptions()
 {
 	if ( !w || thread )
 		return;
@@ -405,16 +406,15 @@ void OptionsTabIconsetSystem::applyOptions(Options *opt)
 	const Iconset *is = d-&gt;iss_system-&gt;iconset();
 	if ( is ) {
 		QFileInfo fi( is-&gt;fileName() );
-		opt-&gt;systemIconset = fi.fileName();
+		PsiOptions::instance()-&gt;setOption(&quot;options.iconsets.system&quot;, fi.fileName());
 	}
 }
 
-void OptionsTabIconsetSystem::restoreOptions(const Options *opt)
+void OptionsTabIconsetSystem::restoreOptions()
 {
 	if ( !w || thread )
 		return;
 
-	o = (Options *)opt;
 	IconsetSystemUI *d = (IconsetSystemUI *)w;
 	d-&gt;iss_system-&gt;clear();
 	QStringList loaded;
@@ -460,7 +460,7 @@ bool OptionsTabIconsetSystem::event(QEvent *e)
 			d-&gt;iss_system-&gt;insert(*i);
 
 			QFileInfo fi( i-&gt;fileName() );
-			if ( fi.fileName() == o-&gt;systemIconset )
+			if ( fi.fileName() == PsiOptions::instance()-&gt;getOption(&quot;options.iconsets.system&quot;).toString() )
 				d-&gt;iss_system-&gt;setItemSelected(d-&gt;iss_system-&gt;lastItem(), true);
 
 			delete i;
@@ -552,15 +552,15 @@ QWidget *OptionsTabIconsetEmoticons::widget()
 	return w;
 }
 
-void OptionsTabIconsetEmoticons::applyOptions(Options *opt)
+void OptionsTabIconsetEmoticons::applyOptions()
 {
 	if ( !w || thread )
 		return;
 
 	IconsetEmoUI *d = (IconsetEmoUI *)w;
-	opt-&gt;useEmoticons = d-&gt;ck_useEmoticons-&gt;isChecked();
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.emoticons.use-emoticons&quot;, d-&gt;ck_useEmoticons-&gt;isChecked());
 
-	opt-&gt;emoticons.clear();
+	QStringList list;
 	for (int row = 0; row &lt; d-&gt;iss_emoticons-&gt;count(); row++) {
 		IconWidgetItem *item = (IconWidgetItem *)d-&gt;iss_emoticons-&gt;item(row);
 
@@ -568,19 +568,20 @@ void OptionsTabIconsetEmoticons::applyOptions(Options *opt)
 			const Iconset *is = item-&gt;iconset();
 			if ( is ) {
 				QFileInfo fi( is-&gt;fileName() );
-				opt-&gt;emoticons &lt;&lt; fi.fileName();
+				list &lt;&lt; fi.fileName();
 			}
 		}
 	}
+	PsiOptions::instance()-&gt;setOption(&quot;options.iconsets.emoticons&quot;, list);
 }
 
-void OptionsTabIconsetEmoticons::restoreOptions(const Options *opt)
+void OptionsTabIconsetEmoticons::restoreOptions()
 {
 	if ( !w || thread )
 		return;
 
 	IconsetEmoUI *d = (IconsetEmoUI *)w;
-	d-&gt;ck_useEmoticons-&gt;setChecked( opt-&gt;useEmoticons );
+	d-&gt;ck_useEmoticons-&gt;setChecked( PsiOptions::instance()-&gt;getOption(&quot;options.ui.emoticons.use-emoticons&quot;).toBool() );
 
 	// fill in the iconset view
 	d-&gt;iss_emoticons-&gt;clear();
@@ -773,54 +774,82 @@ QWidget *OptionsTabIconsetRoster::widget()
 	return w;
 }
 
-void OptionsTabIconsetRoster::applyOptions(Options *opt)
+void OptionsTabIconsetRoster::applyOptions()
 {
 	if ( !w || thread )
 		return;
 
 	IconsetRosterUI *d = (IconsetRosterUI *)w;
-	opt-&gt;useTransportIconsForContacts = d-&gt;ck_useTransportIconsForContacts-&gt;isChecked();
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.contactlist.use-transport-icons&quot;, d-&gt;ck_useTransportIconsForContacts-&gt;isChecked());
 
 	// roster - default
 	{
 		const Iconset *is = d-&gt;iss_defRoster-&gt;iconset();
 		if ( is ) {
 			QFileInfo fi( is-&gt;fileName() );
-			opt-&gt;defaultRosterIconset = fi.fileName();
+			PsiOptions::instance()-&gt;setOption(&quot;options.iconsets.status&quot;, fi.fileName());
 		}
 	}
 
 	// roster - services
 	{
-		opt-&gt;serviceRosterIconset.clear();
-
+		// can't add or remove entries, so just update it.
 		QTreeWidgetItemIterator it( d-&gt;tw_isServices );
 		while(*it) {
-			opt-&gt;serviceRosterIconset[(*it)-&gt;data(0, Qt::UserRole).toString()] = (*it)-&gt;data(1, Qt::UserRole).toString();
+			PsiOptions::instance()-&gt;setOption( 
+				PsiOptions::instance()-&gt;mapLookup(&quot;options.iconsets.service-status&quot;, (*it)-&gt;data(0, Qt::UserRole).toString())+&quot;.iconset&quot;,
+				(*it)-&gt;data(1, Qt::UserRole).toString());
 			++it;
 		}
 	}
 
 	// roster - custom
 	{
-		opt-&gt;customRosterIconset.clear();
-
+		// gather new data
+		QMap&lt;QString, QString&gt; newdata;
+		
 		QTreeWidgetItemIterator it( d-&gt;tw_customRoster );
 		while(*it) {
-			opt-&gt;customRosterIconset[(*it)-&gt;data(0, Qt::UserRole).toString()] = (*it)-&gt;data(1, Qt::UserRole).toString();
+			newdata[(*it)-&gt;data(0, Qt::UserRole).toString()] = (*it)-&gt;data(1, Qt::UserRole).toString();
 			++it;
 		}
+
+		// remove deleted ones
+		QStringList previousIdx = PsiOptions::instance()-&gt;getChildOptionNames(&quot;options.iconsets.custom-status&quot;, true, true);
+		QMap&lt;QString,QString&gt; previous; // (regexp, base)
+		foreach(QString base, previousIdx) {
+			previous[PsiOptions::instance()-&gt;getOption(base + &quot;.regexp&quot;).toString()] = base;
+		}
+		foreach(QString todel, previous.keys().toSet() - newdata.keys().toSet()) {
+			QString base = previous[todel];
+			PsiOptions::instance()-&gt;removeOption(base, true);
+		}
+		// update/add all others
+		foreach(QString regexp, newdata.keys()) {
+			QString base;
+			if (previous.contains(regexp)) {
+				base = previous[regexp];
+			} else {
+				int idx = 0;
+				do {
+					base = &quot;options.iconsets.custom-status&quot; &quot;.a&quot; + QString::number(idx);
+					idx++;
+				} while (previousIdx.contains(base));
+				previous[regexp] = base;
+				PsiOptions::instance()-&gt;setOption(base + &quot;.regexp&quot;, regexp);
+			}
+			PsiOptions::instance()-&gt;setOption(base + &quot;.iconset&quot;, newdata[regexp]);
+		}
 	}
 }
 
-void OptionsTabIconsetRoster::restoreOptions(const Options *opt)
+void OptionsTabIconsetRoster::restoreOptions()
 {
 	if ( !w || thread )
 		return;
 
-	o = (Options *)opt;
 	IconsetRosterUI *d = (IconsetRosterUI *)w;
-	d-&gt;ck_useTransportIconsForContacts-&gt;setChecked( opt-&gt;useTransportIconsForContacts );
+	d-&gt;ck_useTransportIconsForContacts-&gt;setChecked( PsiOptions::instance()-&gt;getOption(&quot;options.ui.contactlist.use-transport-icons&quot;).toBool() );
 
 	d-&gt;iss_defRoster-&gt;clear();
 	d-&gt;iss_servicesRoster-&gt;clear();
@@ -867,7 +896,7 @@ bool OptionsTabIconsetRoster::event(QEvent *e)
 
 			// roster - default
 			d-&gt;iss_defRoster-&gt;insert(*i);
-			if ( fi.fileName() == o-&gt;defaultRosterIconset )
+			if ( fi.fileName() == PsiOptions::instance()-&gt;getOption(&quot;options.iconsets.status&quot;))
 				d-&gt;iss_defRoster-&gt;setItemSelected(d-&gt;iss_defRoster-&gt;lastItem(), true);
 
 			// roster - service
@@ -889,7 +918,10 @@ bool OptionsTabIconsetRoster::event(QEvent *e)
 			while(*it) {
 				QTreeWidgetItem *i = *it;
 				if ( !i-&gt;data(0, Qt::UserRole).toString().isEmpty() ) {
-					Iconset *iss = PsiIconset::instance()-&gt;roster[o-&gt;serviceRosterIconset[i-&gt;data(0, Qt::UserRole).toString()]];
+					Iconset *iss = PsiIconset::instance()-&gt;roster[
+							PsiOptions::instance()-&gt;getOption(
+								PsiOptions::instance()-&gt;mapLookup(
+									&quot;options.iconsets.service-status&quot;,i-&gt;data(0, Qt::UserRole).toString())+&quot;.iconset&quot;).toString()];
 					if ( iss ) {
 						i-&gt;setText(1, iss-&gt;name());
 						QFileInfo fi ( iss-&gt;fileName() );
@@ -904,15 +936,17 @@ bool OptionsTabIconsetRoster::event(QEvent *e)
 		{
 			// Then, fill the QListView
 			QTreeWidgetItem *last = 0;
-			QMap&lt;QString, QString&gt;::ConstIterator it = o-&gt;customRosterIconset.begin();
-			for ( ; it != o-&gt;customRosterIconset.end(); ++it) {
+			QStringList customicons = PsiOptions::instance()-&gt;getChildOptionNames(&quot;options.iconsets.custom-status&quot;, true, true);
+			foreach(QString base, customicons) {
+				QString regexp = PsiOptions::instance()-&gt;getOption(base + &quot;.regexp&quot;).toString();
+				QString icoset = PsiOptions::instance()-&gt;getOption(base + &quot;.iconset&quot;).toString();
 				QTreeWidgetItem *item = new QTreeWidgetItem(d-&gt;tw_customRoster, last);
 				last = item;
 
-				item-&gt;setText(0, clipCustomText(it.key())); // RegExp
-				item-&gt;setData(0, Qt::UserRole, it.key());
+				item-&gt;setText(0, clipCustomText(regexp));
+				item-&gt;setData(0, Qt::UserRole, regexp);
 
-				Iconset *iss = PsiIconset::instance()-&gt;roster[it.data()];
+				Iconset *iss = PsiIconset::instance()-&gt;roster[icoset];
 				if ( iss ) {
 					item-&gt;setText(1, iss-&gt;name());
 					QFileInfo fi ( iss-&gt;fileName() );</diff>
      <filename>src/options/opt_iconset.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -6,7 +6,6 @@
 #include &lt;QEvent&gt;
 
 class QWidget;
-struct Options;
 class QListWidgetItem;
 class IconsetLoadThread;
 class QTreeWidgetItem;
@@ -19,8 +18,8 @@ public:
 	~OptionsTabIconsetSystem();
 
 	QWidget *widget();
-	void applyOptions(Options *opt);
-	void restoreOptions(const Options *opt);
+	void applyOptions();
+	void restoreOptions();
 	bool stretchable() const { return true; }
 
 private slots:
@@ -36,7 +35,6 @@ private:
 
 	int numIconsets, iconsetsLoaded;
 	IconsetLoadThread *thread;
-	Options *o;
 };
 
 class OptionsTabIconsetEmoticons : public OptionsTab
@@ -47,8 +45,8 @@ public:
 	~OptionsTabIconsetEmoticons();
 
 	QWidget *widget();
-	void applyOptions(Options *opt);
-	void restoreOptions(const Options *opt);
+	void applyOptions();
+	void restoreOptions();
 	bool stretchable() const { return true; }
 
 private slots:
@@ -74,8 +72,8 @@ public:
 	~OptionsTabIconsetRoster();
 
 	QWidget *widget();
-	void applyOptions(Options *opt);
-	void restoreOptions(const Options *opt);
+	void applyOptions();
+	void restoreOptions();
 	bool stretchable() const { return true; }
 
 private slots:
@@ -104,7 +102,6 @@ private:
 
 	int numIconsets, iconsetsLoaded;
 	IconsetLoadThread *thread;
-	Options *o;
 };
 
 #endif</diff>
      <filename>src/options/opt_iconset.h</filename>
    </modified>
    <modified>
      <diff>@@ -4,7 +4,6 @@
 #include &quot;optionstab.h&quot;
 
 class QWidget;
-struct Options;
 
 class OptionsTabPlugins : public OptionsTab
 {</diff>
      <filename>src/options/opt_plugins.h</filename>
    </modified>
    <modified>
      <diff>@@ -106,8 +106,7 @@ QWidget *OptionsTabShortcuts::widget()
  * \brief	applyOptions, if options have changed, they will be applied by calling this function
  * \param	opt, unused, totally ignored
  */
-void OptionsTabShortcuts::applyOptions(Options *opt) {
-	Q_UNUSED(opt);
+void OptionsTabShortcuts::applyOptions() {
 	if ( !w )
 		return;
 
@@ -166,9 +165,8 @@ void OptionsTabShortcuts::applyOptions(Options *opt) {
  * \brief	restoreOptions, reads in the currently set options
  * \param	opt, unused, totally ignored
  */
-void OptionsTabShortcuts::restoreOptions(const Options *opt)
+void OptionsTabShortcuts::restoreOptions()
 {
-	Q_UNUSED(opt);
 
 	if ( !w )
 		return;</diff>
      <filename>src/options/opt_shortcuts.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -36,8 +36,8 @@ public:
 	~OptionsTabShortcuts();
 
 	QWidget *widget();
-	void applyOptions(Options *opt);
-	void restoreOptions(const Options *opt);
+	void applyOptions();
+	void restoreOptions();
 
 	typedef enum Kind {
 		TopLevelItem = 1,</diff>
      <filename>src/options/opt_shortcuts.h</filename>
    </modified>
    <modified>
      <diff>@@ -3,6 +3,7 @@
 #include &quot;iconwidget.h&quot;
 #include &quot;iconset.h&quot;
 #include &quot;applicationinfo.h&quot;
+#include &quot;psioptions.h&quot;
 
 #include &lt;qbuttongroup.h&gt;
 #include &lt;qwhatsthis.h&gt;
@@ -128,23 +129,30 @@ QWidget *OptionsTabSound::widget()
 	return w;
 }
 
-void OptionsTabSound::applyOptions(Options *opt)
+void OptionsTabSound::applyOptions()
 {
 	if ( !w )
 		return;
 
 	OptSoundUI *d = (OptSoundUI *)w;
-	opt-&gt;player = d-&gt;le_player-&gt;text();
-	opt-&gt;noAwaySound = !d-&gt;ck_awaySound-&gt;isChecked();
-	opt-&gt;noGCSound = !d-&gt;ck_gcSound-&gt;isChecked();
-
-	int n = 0;
-	foreach(QLineEdit* le, sounds_) {
-		opt-&gt;onevent[n++] = le-&gt;text();
-	}
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.notifications.sounds.unix-sound-player&quot;, d-&gt;le_player-&gt;text());
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.notifications.sounds.silent-while-away&quot;, !d-&gt;ck_awaySound-&gt;isChecked());
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.notifications.sounds.notify-every-muc-message&quot;, d-&gt;ck_gcSound-&gt;isChecked());
+	
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.notifications.sounds.incoming-message&quot;, d-&gt;le_oeMessage-&gt;text());
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.notifications.sounds.new-chat&quot;, d-&gt;le_oeChat1-&gt;text());
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.notifications.sounds.chat-message&quot;, d-&gt;le_oeChat2-&gt;text());
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.notifications.sounds.system-message&quot;, d-&gt;le_oeSystem-&gt;text());
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.notifications.sounds.incoming-headline&quot;, d-&gt;le_oeHeadline-&gt;text());
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.notifications.sounds.contact-online&quot;, d-&gt;le_oeOnline-&gt;text());
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.notifications.sounds.contact-offline&quot;, d-&gt;le_oeOffline-&gt;text());
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.notifications.sounds.outgoing-chat&quot;, d-&gt;le_oeSend-&gt;text());
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.notifications.sounds.incoming-file-transfer&quot;, d-&gt;le_oeIncomingFT-&gt;text());
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.notifications.sounds.completed-file-transfer&quot;, d-&gt;le_oeFTComplete-&gt;text());
+	
 }
 
-void OptionsTabSound::restoreOptions(const Options *opt)
+void OptionsTabSound::restoreOptions()
 {
 	if ( !w )
 		return;
@@ -156,16 +164,22 @@ void OptionsTabSound::restoreOptions(const Options *opt)
 #elif defined(Q_WS_MAC)
 	d-&gt;le_player-&gt;setText(tr(&quot;Mac OS Sound&quot;));
 #else
-	d-&gt;le_player-&gt;setText( opt-&gt;player );
+	d-&gt;le_player-&gt;setText( PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.sounds.unix-sound-player&quot;).toString() );
 #endif
 
-	d-&gt;ck_awaySound-&gt;setChecked( !opt-&gt;noAwaySound );
-	d-&gt;ck_gcSound-&gt;setChecked( !opt-&gt;noGCSound );
-
-	int n = 0;
-	foreach(QLineEdit* le, sounds_) {
-		le-&gt;setText(opt-&gt;onevent[n++]);
-	}
+	d-&gt;ck_awaySound-&gt;setChecked( !PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.sounds.silent-while-away&quot;).toBool() );
+	d-&gt;ck_gcSound-&gt;setChecked( PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.sounds.notify-every-muc-message&quot;).toBool() );
+
+	d-&gt;le_oeMessage-&gt;setText(PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.sounds.incoming-message&quot;).toString());
+	d-&gt;le_oeChat1-&gt;setText(PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.sounds.new-chat&quot;).toString());
+	d-&gt;le_oeChat2-&gt;setText(PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.sounds.chat-message&quot;).toString());
+	d-&gt;le_oeSystem-&gt;setText(PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.sounds.system-message&quot;).toString());
+	d-&gt;le_oeHeadline-&gt;setText(PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.sounds.incoming-headline&quot;).toString());
+	d-&gt;le_oeOnline-&gt;setText(PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.sounds.contact-online&quot;).toString());
+	d-&gt;le_oeOffline-&gt;setText(PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.sounds.contact-offline&quot;).toString());
+	d-&gt;le_oeSend-&gt;setText(PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.sounds.outgoing-chat&quot;).toString());
+	d-&gt;le_oeIncomingFT-&gt;setText(PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.sounds.incoming-file-transfer&quot;).toString());
+	d-&gt;le_oeFTComplete-&gt;setText(PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.sounds.completed-file-transfer&quot;).toString());
 }
 
 void OptionsTabSound::setData(PsiCon *, QWidget *p)
@@ -175,12 +189,12 @@ void OptionsTabSound::setData(PsiCon *, QWidget *p)
 
 void OptionsTabSound::chooseSoundEvent(QAbstractButton* b)
 {
-	if(option.lastPath.isEmpty())
-		option.lastPath = QDir::homeDirPath();
-	QString str = QFileDialog::getOpenFileName(option.lastPath, tr(&quot;Sound (*.wav)&quot;), parentWidget, &quot;&quot;, tr(&quot;Choose a sound file&quot;));
+	if(PsiOptions::instance()-&gt;getOption(&quot;options.ui.last-used-open-path&quot;).toString().isEmpty())
+		PsiOptions::instance()-&gt;getOption(&quot;options.ui.last-used-open-path&quot;).toString() = QDir::homeDirPath();
+	QString str = QFileDialog::getOpenFileName(PsiOptions::instance()-&gt;getOption(&quot;options.ui.last-used-open-path&quot;).toString(), tr(&quot;Sound (*.wav)&quot;), parentWidget, &quot;&quot;, tr(&quot;Choose a sound file&quot;));
 	if(!str.isEmpty()) {
 		QFileInfo fi(str);
-		option.lastPath = fi.dirPath();
+		PsiOptions::instance()-&gt;getOption(&quot;options.ui.last-used-open-path&quot;).toString() = fi.dirPath();
 		modify_buttons_[b]-&gt;setText(str);
 		emit dataChanged();
 	}
@@ -193,22 +207,17 @@ void OptionsTabSound::previewSoundEvent(QAbstractButton* b)
 
 void OptionsTabSound::soundReset()
 {
-	Options opt;
-	opt.onevent[eMessage]    = ApplicationInfo::resourcesDir() + &quot;/sound/chat2.wav&quot;;
-	opt.onevent[eChat1]      = ApplicationInfo::resourcesDir() + &quot;/sound/chat1.wav&quot;;
-	opt.onevent[eChat2]      = ApplicationInfo::resourcesDir() + &quot;/sound/chat2.wav&quot;;
-	opt.onevent[eHeadline]   = ApplicationInfo::resourcesDir() + &quot;/sound/chat2.wav&quot;;
-	opt.onevent[eSystem]     = ApplicationInfo::resourcesDir() + &quot;/sound/chat2.wav&quot;;
-	opt.onevent[eOnline]     = ApplicationInfo::resourcesDir() + &quot;/sound/online.wav&quot;;
-	opt.onevent[eOffline]    = ApplicationInfo::resourcesDir() + &quot;/sound/offline.wav&quot;;
-	opt.onevent[eSend]       = ApplicationInfo::resourcesDir() + &quot;/sound/send.wav&quot;;
-	opt.onevent[eIncomingFT] = ApplicationInfo::resourcesDir() + &quot;/sound/ft_incoming.wav&quot;;
-	opt.onevent[eFTComplete] = ApplicationInfo::resourcesDir() + &quot;/sound/ft_complete.wav&quot;;
-
-	int n = 0;
-	foreach(QLineEdit* le, sounds_) {
-		le-&gt;setText(opt.onevent[n++]);
-	}
-
+	OptSoundUI *d = (OptSoundUI *)w;
+	
+	d-&gt;le_oeMessage-&gt;setText(ApplicationInfo::resourcesDir() + &quot;/sound/chat2.wav&quot;);
+	d-&gt;le_oeChat1-&gt;setText(ApplicationInfo::resourcesDir() + &quot;/sound/chat1.wav&quot;);
+	d-&gt;le_oeChat2-&gt;setText(ApplicationInfo::resourcesDir() + &quot;/sound/chat2.wav&quot;);
+	d-&gt;le_oeSystem-&gt;setText(ApplicationInfo::resourcesDir() + &quot;/sound/chat2.wav&quot;);
+	d-&gt;le_oeHeadline-&gt;setText(ApplicationInfo::resourcesDir() + &quot;/sound/chat2.wav&quot;);
+	d-&gt;le_oeOnline-&gt;setText(ApplicationInfo::resourcesDir() + &quot;/sound/online.wav&quot;);
+	d-&gt;le_oeOffline-&gt;setText(ApplicationInfo::resourcesDir() + &quot;/sound/offline.wav&quot;);
+	d-&gt;le_oeSend-&gt;setText(ApplicationInfo::resourcesDir() + &quot;/sound/send.wav&quot;);
+	d-&gt;le_oeIncomingFT-&gt;setText(ApplicationInfo::resourcesDir() + &quot;/sound/ft_incoming.wav&quot;);
+	d-&gt;le_oeFTComplete-&gt;setText(ApplicationInfo::resourcesDir() + &quot;/sound/ft_complete.wav&quot;);
 	emit dataChanged();
 }</diff>
      <filename>src/options/opt_sound.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -6,7 +6,6 @@
 #include &quot;optionstab.h&quot;
 
 class QWidget;
-struct Options;
 class QLineEdit;
 class QButtonGroup;
 class QAbstractButton;
@@ -19,8 +18,8 @@ public:
 	~OptionsTabSound();
 
 	QWidget *widget();
-	void applyOptions(Options *opt);
-	void restoreOptions(const Options *opt);
+	void applyOptions();
+	void restoreOptions();
 
 private slots:
 	void chooseSoundEvent(QAbstractButton*);</diff>
      <filename>src/options/opt_sound.h</filename>
    </modified>
    <modified>
      <diff>@@ -1,6 +1,7 @@
 #include &quot;opt_status.h&quot;
 #include &quot;common.h&quot;
 #include &quot;iconwidget.h&quot;
+#include &quot;psioptions.h&quot;
 
 #include &lt;qbuttongroup.h&gt;
 #include &lt;QMessageBox&gt;
@@ -31,12 +32,10 @@ OptionsTabStatus::OptionsTabStatus(QObject *parent)
 : OptionsTab(parent, &quot;status&quot;, &quot;&quot;, tr(&quot;Status&quot;), tr(&quot;Status preferences&quot;), &quot;psi/status&quot;)
 {
 	w = 0;
-	o = new Options;
 }
 
 OptionsTabStatus::~OptionsTabStatus()
 {
-	delete o;
 }
 
 QWidget *OptionsTabStatus::widget()
@@ -104,28 +103,52 @@ QWidget *OptionsTabStatus::widget()
 	return w;
 }
 
-void OptionsTabStatus::applyOptions(Options *opt)
+void OptionsTabStatus::applyOptions()
 {
 	if ( !w )
 		return;
 
 	OptStatusUI *d = (OptStatusUI *)w;
 
-	opt-&gt;asAway = d-&gt;sb_asAway-&gt;value();
-	opt-&gt;asXa = d-&gt;sb_asXa-&gt;value();
-	opt-&gt;asOffline = d-&gt;sb_asOffline-&gt;value();
-	opt-&gt;use_asAway = d-&gt;ck_asAway-&gt;isChecked();
-	opt-&gt;use_asXa = d-&gt;ck_asXa-&gt;isChecked();
-	opt-&gt;use_asOffline = d-&gt;ck_asOffline-&gt;isChecked();
-	opt-&gt;asMessage = d-&gt;te_asMessage-&gt;text();
+	PsiOptions::instance()-&gt;setOption(&quot;options.status.auto-away.away-after&quot;, d-&gt;sb_asAway-&gt;value());
+	PsiOptions::instance()-&gt;setOption(&quot;options.status.auto-away.not-availible-after&quot;, d-&gt;sb_asXa-&gt;value());
+	PsiOptions::instance()-&gt;setOption(&quot;options.status.auto-away.offline-after&quot;, d-&gt;sb_asOffline-&gt;value());
+	PsiOptions::instance()-&gt;setOption(&quot;options.status.auto-away.use-away&quot;, d-&gt;ck_asAway-&gt;isChecked());
+	PsiOptions::instance()-&gt;setOption(&quot;options.status.auto-away.use-not-availible&quot;, d-&gt;ck_asXa-&gt;isChecked());
+	PsiOptions::instance()-&gt;setOption(&quot;options.status.auto-away.use-offline&quot;, d-&gt;ck_asOffline-&gt;isChecked());
+	PsiOptions::instance()-&gt;setOption(&quot;options.status.auto-away.message&quot;, d-&gt;te_asMessage-&gt;text());
 
-	opt-&gt;sp = o-&gt;sp;
-
-	opt-&gt;askOnline = d-&gt;ck_askOnline-&gt;isChecked();
-	opt-&gt;askOffline = d-&gt;ck_askOffline-&gt;isChecked();
+	
+	foreach (QString name, deletedPresets) {
+		QString base = PsiOptions::instance()-&gt;mapLookup(&quot;options.status.presets&quot;, name);
+		PsiOptions::instance()-&gt;removeOption(base , true);
+	}
+	deletedPresets.clear();
+	foreach (QString name, dirtyPresets.toList() + newPresets.keys()) {
+		StatusPreset sp;
+		if (newPresets.contains(name)) {
+			sp = newPresets[name];
+		} else {
+			sp = presets[name];
+		}
+		PsiOptions *o = PsiOptions::instance();
+		QString base = o-&gt;mapPut(&quot;options.status.presets&quot;, sp.name());
+		o-&gt;setOption(base+&quot;.message&quot;,sp.message());
+		o-&gt;setOption(base+&quot;.status&quot;,XMPP::Status(sp.status()).typeString());
+		o-&gt;setOption(base+&quot;.force-priority&quot;, sp.priority().hasValue());
+		if (sp.priority().hasValue()) {
+			o-&gt;setOption(base+&quot;.priority&quot;, sp.priority().value());
+		}
+	}
+	dirtyPresets.clear();
+	presets.unite(newPresets);
+	newPresets.clear();
+	
+	PsiOptions::instance()-&gt;setOption(&quot;options.status.ask-for-message-on-online&quot;, d-&gt;ck_askOnline-&gt;isChecked());
+	PsiOptions::instance()-&gt;setOption(&quot;options.status.ask-for-message-on-offline&quot;, d-&gt;ck_askOffline-&gt;isChecked());
 }
 
-void OptionsTabStatus::restoreOptions(const Options *opt)
+void OptionsTabStatus::restoreOptions()
 {
 	if ( !w )
 		return;
@@ -133,37 +156,52 @@ void OptionsTabStatus::restoreOptions(const Options *opt)
 	OptStatusUI *d = (OptStatusUI *)w;
 
 	d-&gt;sb_asAway-&gt;setMinValue(0);
-	d-&gt;sb_asAway-&gt;setValue( opt-&gt;asAway );
+	d-&gt;sb_asAway-&gt;setValue( PsiOptions::instance()-&gt;getOption(&quot;options.status.auto-away.away-after&quot;).toInt() );
 	d-&gt;sb_asXa-&gt;setMinValue(0);
-	d-&gt;sb_asXa-&gt;setValue( opt-&gt;asXa );
+	d-&gt;sb_asXa-&gt;setValue( PsiOptions::instance()-&gt;getOption(&quot;options.status.auto-away.not-availible-after&quot;).toInt() );
 	d-&gt;sb_asOffline-&gt;setMinValue(0);
-	d-&gt;sb_asOffline-&gt;setValue( opt-&gt;asOffline );
-	/*if (opt-&gt;asAway &lt;= 0 )
-		opt-&gt;use_asAway = FALSE;
-	if (opt-&gt;asXa &lt;= 0 )
-		opt-&gt;use_asXa = FALSE;
+	d-&gt;sb_asOffline-&gt;setValue( PsiOptions::instance()-&gt;getOption(&quot;options.status.auto-away.offline-after&quot;).toInt() );
+	/*if (PsiOptions::instance()-&gt;getOption(&quot;options.status.auto-away.away-after&quot;).toInt() &lt;= 0 )
+		PsiOptions::instance()-&gt;getOption(&quot;options.status.auto-away.use-away&quot;).toBool() = FALSE;
+	if (PsiOptions::instance()-&gt;getOption(&quot;options.status.auto-away.not-availible-after&quot;).toInt() &lt;= 0 )
+		PsiOptions::instance()-&gt;getOption(&quot;options.status.auto-away.use-not-availible&quot;).toBool() = FALSE;
 	if(d-&gt;opt.asOffline &lt;= 0)
-		opt-&gt;use_asOffline = FALSE;*/
-	d-&gt;ck_asAway-&gt;setChecked( opt-&gt;use_asAway );
-	d-&gt;ck_asXa-&gt;setChecked( opt-&gt;use_asXa );
-	d-&gt;ck_asOffline-&gt;setChecked( opt-&gt;use_asOffline );
-	d-&gt;te_asMessage-&gt;setText( opt-&gt;asMessage );
-
-	o-&gt;sp = opt-&gt;sp;
-	d-&gt;cb_preset-&gt;clear();
-	QStringList presets;
-	foreach(StatusPreset p, option.sp) {
-		presets += p.name();
+		PsiOptions::instance()-&gt;getOption(&quot;options.status.auto-away.use-offline&quot;).toBool() = FALSE;*/
+	d-&gt;ck_asAway-&gt;setChecked( PsiOptions::instance()-&gt;getOption(&quot;options.status.auto-away.use-away&quot;).toBool() );
+	d-&gt;ck_asXa-&gt;setChecked( PsiOptions::instance()-&gt;getOption(&quot;options.status.auto-away.use-not-availible&quot;).toBool() );
+	d-&gt;ck_asOffline-&gt;setChecked( PsiOptions::instance()-&gt;getOption(&quot;options.status.auto-away.use-offline&quot;).toBool() );
+	d-&gt;te_asMessage-&gt;setText( PsiOptions::instance()-&gt;getOption(&quot;options.status.auto-away.message&quot;).toString() );
+
+	
+	QStringList presetNames;
+	
+	foreach(QVariant name, PsiOptions::instance()-&gt;mapKeyList(&quot;options.status.presets&quot;)) {
+		QString base =  PsiOptions::instance()-&gt;mapLookup(&quot;options.status.presets&quot;, name.toString());
+		StatusPreset sp;
+		sp.setName(name.toString());
+		sp.setMessage(PsiOptions::instance()-&gt;getOption(base+&quot;.message&quot;).toString());
+		if (PsiOptions::instance()-&gt;getOption(base+&quot;.force-priority&quot;).toBool()) {
+			sp.setPriority(PsiOptions::instance()-&gt;getOption(base+&quot;.priority&quot;).toInt());
+		}
+
+		XMPP::Status status;
+		status.setType(PsiOptions::instance()-&gt;getOption(base+&quot;.status&quot;).toString());
+		sp.setStatus(status.type());
+		
+		presets[name.toString()] = sp;
+		presetNames += name.toString();
 	}
-	d-&gt;cb_preset-&gt;insertStringList(presets);
+	
+	
+	d-&gt;cb_preset-&gt;insertStringList(presetNames);
 
 	if(d-&gt;cb_preset-&gt;count() &gt;= 1) {
 		d-&gt;cb_preset-&gt;setCurrentIndex(0);
 		selectStatusPreset(0);
 	}
 
-	d-&gt;ck_askOnline-&gt;setChecked( opt-&gt;askOnline );
-	d-&gt;ck_askOffline-&gt;setChecked( opt-&gt;askOffline );
+	d-&gt;ck_askOnline-&gt;setChecked( PsiOptions::instance()-&gt;getOption(&quot;options.status.ask-for-message-on-online&quot;).toBool() );
+	d-&gt;ck_askOffline-&gt;setChecked( PsiOptions::instance()-&gt;getOption(&quot;options.status.ask-for-message-on-offline&quot;).toBool() );
 }
 
 void OptionsTabStatus::setData(PsiCon *, QWidget *parentDialog)
@@ -194,7 +232,16 @@ void OptionsTabStatus::selectStatusPreset(int x)
 
 	d-&gt;pb_spDelete-&gt;setEnabled(true);
 
-	StatusPreset preset = o-&gt;sp[d-&gt;cb_preset-&gt;text(x)];
+	StatusPreset preset;
+	QString name = d-&gt;cb_preset-&gt;text(x);
+	
+	if (newPresets.contains(name)) {
+		preset = newPresets[name];
+	} else {
+		preset = presets[name];
+	}
+	
+	
 	d-&gt;te_sp-&gt;setText(preset.message());
 	d-&gt;te_sp-&gt;setEnabled(true);
 	if (preset.priority().hasValue())
@@ -228,18 +275,20 @@ void OptionsTabStatus::newStatusPreset()
 			CAP(tr(&quot;New Status Preset&quot;)),
 			tr(&quot;Please enter a name for the new status preset:&quot;),
 			QLineEdit::Normal, text, &amp;ok, parentWidget);
-		if(!ok)
+		if(!ok) {
 			return;
+		}
 
-		if(text.isEmpty())
+		if(text.isEmpty()) {
 			QMessageBox::information(parentWidget, tr(&quot;Error&quot;), tr(&quot;Can't create a blank preset!&quot;));
-		else if(o-&gt;sp.contains(text))
+		} else if(presets.contains(text) || newPresets.contains(text)) {
 			QMessageBox::information(parentWidget, tr(&quot;Error&quot;), tr(&quot;You already have a preset with that name!&quot;));
-		else
+		} else {
 			break;
+		}
 	}
 
-	o-&gt;sp[text].setName(text);
+	newPresets[text].setName(text);
 	d-&gt;cb_preset-&gt;insertItem(text);
 	d-&gt;cb_preset-&gt;setCurrentItem(d-&gt;cb_preset-&gt;count()-1);
 	selectStatusPreset(d-&gt;cb_preset-&gt;count()-1);
@@ -257,7 +306,14 @@ void OptionsTabStatus::removeStatusPreset()
 
 	emit dataChanged();
 
-	o-&gt;sp.remove(d-&gt;cb_preset-&gt;text(id));
+	QString name = d-&gt;cb_preset-&gt;text(id);
+	
+	if (newPresets.contains(name)) {
+		newPresets.remove(name);
+	} else {
+		deletedPresets += d-&gt;cb_preset-&gt;text(id);
+		presets.remove(d-&gt;cb_preset-&gt;text(id));
+	}
 	d-&gt;cb_preset-&gt;removeItem(id);
 
 	// select a new entry if possible
@@ -280,12 +336,23 @@ void OptionsTabStatus::changeStatusPreset()
 	if(id == -1)
 		return;
 
-	o-&gt;sp[d-&gt;cb_preset-&gt;text(id)].setMessage(d-&gt;te_sp-&gt;text());
+	StatusPreset sp;
+	sp.setMessage(d-&gt;te_sp-&gt;text());
 	if (d-&gt;le_sp_priority-&gt;text().isEmpty())
-		o-&gt;sp[d-&gt;cb_preset-&gt;text(id)].clearPriority();
+		sp.clearPriority();
 	else
-		o-&gt;sp[d-&gt;cb_preset-&gt;text(id)].setPriority(d-&gt;le_sp_priority-&gt;text().toInt());
-	o-&gt;sp[d-&gt;cb_preset-&gt;text(id)].setStatus(combomap[d-&gt;cb_sp_status-&gt;currentItem()]);
+		sp.setPriority(d-&gt;le_sp_priority-&gt;text().toInt());
+	sp.setStatus(combomap[d-&gt;cb_sp_status-&gt;currentItem()]);
 
+	QString name = d-&gt;cb_preset-&gt;text(id);
+	
+	sp.setName(name);
+	if (newPresets.contains(name)) {
+		newPresets[name] = sp;
+	} else {
+		dirtyPresets += name;
+		presets[name] = sp;
+	}
+	
 	emit dataChanged();
 }</diff>
      <filename>src/options/opt_status.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -1,10 +1,14 @@
 #ifndef OPT_STATUS_H
 #define OPT_STATUS_H
 
+#include &lt;QMap&gt;
+#include &lt;QSet&gt;
+#include &lt;QStringList&gt;
+
 #include &quot;optionstab.h&quot;
+#include &quot;statuspreset.h&quot;
 
 class QWidget;
-struct Options;
 
 class OptionsTabStatus : public OptionsTab
 {
@@ -14,8 +18,8 @@ public:
 	~OptionsTabStatus();
 
 	QWidget *widget();
-	void applyOptions(Options *opt);
-	void restoreOptions(const Options *opt);
+	void applyOptions();
+	void restoreOptions();
 
 	void setData(PsiCon *, QWidget *parentDialog);
 	//bool stretchable() const { return true; }
@@ -28,7 +32,10 @@ private slots:
 
 private:
 	QWidget *w, *parentWidget;
-	Options *o;
+	QMap&lt;QString, StatusPreset&gt; presets;
+	QSet&lt;QString&gt; dirtyPresets;
+	QStringList deletedPresets;
+	QMap&lt;QString, StatusPreset&gt; newPresets;
 };
 
 #endif</diff>
      <filename>src/options/opt_status.h</filename>
    </modified>
    <modified>
      <diff>@@ -6,6 +6,7 @@
 #include &quot;psitoolbar.h&quot;
 #include &quot;iconaction.h&quot;
 #include &quot;psiactionlist.h&quot;
+#include &quot;psioptions.h&quot;
 
 #include &quot;ui_opt_lookfeel_toolbars.h&quot;
 #include &quot;ui_ui_positiontoolbar.h&quot;
@@ -38,7 +39,7 @@ class PositionOptionsTabToolbars : public QDialog, public Ui::PositionToolbarUI
 {
 	Q_OBJECT
 public:
-	PositionOptionsTabToolbars(QWidget *parent, Options::ToolbarPrefs *, int);
+	PositionOptionsTabToolbars(QWidget *parent, ToolbarPrefs *, int);
 	~PositionOptionsTabToolbars();
 
 	int n();
@@ -55,10 +56,10 @@ private slots:
 
 private:
 	int id;
-	Options::ToolbarPrefs *tb;
+	ToolbarPrefs *tb;
 };
 
-PositionOptionsTabToolbars::PositionOptionsTabToolbars(QWidget *parent, Options::ToolbarPrefs *_tb, int _id)
+PositionOptionsTabToolbars::PositionOptionsTabToolbars(QWidget *parent, ToolbarPrefs *_tb, int _id)
 : QDialog(parent)
 {
 	setupUi(this);
@@ -145,27 +146,31 @@ bool PositionOptionsTabToolbars::eventFilter(QObject *watched, QEvent *e)
 class OptionsTabToolbars::Private
 {
 public:
-	struct ToolbarItem {
-		QString group;
-		int index;
-		ToolbarItem() {
-			group = &quot;&quot;;
-			index = -1;
-		}
-		ToolbarItem( QString _w, int _i ) {
-			group = _w;
-			index = _i;
-		}
-	};
-
-	QMap&lt;int, ToolbarItem&gt; toolbars;
-
-	PsiActionList::ActionsType class2id( QString name ) {
+// 	struct ToolbarItem {
+// 		QString group;
+// 		int index;
+// 		ToolbarItem() {
+// 			group = &quot;&quot;;
+// 			index = -1;
+// 		}
+// 		ToolbarItem( QString _w, int _i ) {
+// 			group = _w;
+// 			index = _i;
+// 		}
+// 	};
+
+	QMap&lt;QString, ToolbarPrefs&gt; toolbarsCurrent;
+	// hack: can't really assign real ids to new toolbars before apply
+	// So new toolbars will get &quot;..%n&quot; as name (is invalid in OptionsTree)
+	int newTBidx;
+	QMap&lt;QString, ToolbarPrefs&gt; toolbarsNew;
+	QSet&lt;QString&gt; toolbarsDirty;
+	QSet&lt;QString&gt; toolbarsDelete;
+	
+	
+	PsiActionList::ActionsType class2id() {
 		int ret = (int)PsiActionList::Actions_Common;
-
-		if ( name == &quot;mainWin&quot; )
-			ret |= (int)PsiActionList::Actions_MainWin;
-
+		ret |= (int)PsiActionList::Actions_MainWin;
 		return (PsiActionList::ActionsType)ret;
 	}
 };
@@ -176,8 +181,9 @@ OptionsTabToolbars::OptionsTabToolbars(QObject *parent)
 	w = 0;
 	p = new Private();
 
+	p-&gt;newTBidx=0;
+	
 	noDirty = false;
-	opt = new Options;
 }
 
 QWidget *OptionsTabToolbars::widget()
@@ -253,7 +259,6 @@ QWidget *OptionsTabToolbars::widget()
 
 OptionsTabToolbars::~OptionsTabToolbars()
 {
-	delete opt;
 	delete p;
 }
 
@@ -289,59 +294,94 @@ void OptionsTabToolbars::setData(PsiCon * psi_, QWidget *parent_)
 	}
 }*/
 
-void OptionsTabToolbars::applyOptions(Options *o)
+void OptionsTabToolbars::applyOptions()
 {
 	if ( !w )
-		opt-&gt;toolbars = o-&gt;toolbars;
+		return;
+
+	LookFeelToolbarsUI *d = (LookFeelToolbarsUI *)w;
+
+	PsiOptions *o = PsiOptions::instance();
+	
+	
+	foreach (QString base, p-&gt;toolbarsDelete) {
+		o-&gt;removeOption(base, true);
+		// UI will auto updated by option change signal.
+	}
+	p-&gt;toolbarsDelete.clear();
+	foreach (QString base, p-&gt;toolbarsDirty) {
+		ToolbarPrefs tb = p-&gt;toolbarsCurrent[base];
+		// update options
+		PsiToolBar::structToOptions(base, &amp;tb);
+		// UI will auto updated by option change signal.
+	}
+	p-&gt;toolbarsDirty.clear();
+	
+	QStringList toolbarBases = o-&gt;getChildOptionNames(&quot;options.ui.contactlist.toolbars&quot;, true, true);
+	int idx = 0;
+	foreach (QString pseudoBase, p-&gt;toolbarsNew.keys()) {
+		ToolbarPrefs tb = p-&gt;toolbarsNew[pseudoBase];
+	
+		// get a real base
+		QString base;
+		do {
+			base = &quot;options.ui.contactlist.toolbars&quot; &quot;.a&quot; + QString::number(idx++);
+		} while (toolbarBases.contains(base));
+		toolbarBases += base;
+		PsiToolBar::structToOptions(base, &amp;tb);
+		
+		// merge to current
+		p-&gt;toolbarsCurrent[base] = tb;
+		d-&gt;cb_toolbars-&gt;setItemData(d-&gt;cb_toolbars-&gt;findData(pseudoBase), base);
+		// update options
+		PsiToolBar::structToOptions(base, &amp;tb);
+		// update ui
+		psi-&gt;addToolbar(base);
+	}
+	p-&gt;toolbarsNew.clear();
+		
+	
 
+/* old stuff
 	// get current toolbars' positions
 	QList&lt;PsiToolBar*&gt; toolbars = psi-&gt;toolbarList();
-	for (int i = 0; i &lt; opt-&gt;toolbars[&quot;mainWin&quot;].count() &amp;&amp; i &lt; toolbars.count(); i++) {
+	for (int i = 0; i &lt; LEGOPTS.toolbars[&quot;mainWin&quot;].count() &amp;&amp; i &lt; toolbars.count(); i++) {
 		//if ( toolbarPositionInProgress &amp;&amp; posTbDlg-&gt;n() == (int)i )
 		//	continue;
 
-		Options::ToolbarPrefs &amp;tbPref = opt-&gt;toolbars[&quot;mainWin&quot;][i];
-		psi-&gt;getToolbarLocation(toolbars.at(i), tbPref.dock, tbPref.index, tbPref.nl, tbPref.extraOffset);
-	}
-
-	// apply options
-	o-&gt;toolbars = opt-&gt;toolbars;
-
-	doApply();
-}
-
-void OptionsTabToolbars::rebuildToolbarList()
-{
-	LookFeelToolbarsUI *d = (LookFeelToolbarsUI *)w;
-
-	d-&gt;cb_toolbars-&gt;clear();
-	p-&gt;toolbars.clear();
-
-	QMap&lt; QString, QList&lt;Options::ToolbarPrefs&gt; &gt;::Iterator it = opt-&gt;toolbars.begin();
-	for ( ; it != opt-&gt;toolbars.end(); ++it ) {
-		if ( p-&gt;toolbars.count() )
-			d-&gt;cb_toolbars-&gt;insertItem( &quot;---&quot; ); // TODO: think of better separator
-
-		int i = 0;
-		QList&lt;Options::ToolbarPrefs&gt;::Iterator it2 = it.data().begin();
-		for ( ; it2 != it.data().end(); ++it2, ++i ) {
-			d-&gt;cb_toolbars-&gt;insertItem( (*it2).name );
-			p-&gt;toolbars[d-&gt;cb_toolbars-&gt;count()-1] = Private::ToolbarItem( it.key(), i );
-		}
+		Options::ToolbarPrefs &amp;tbPref = LEGOPTS.toolbars[&quot;mainWin&quot;][i];
+		//psi-&gt;getToolbarLocation(toolbars.at(i), tbPref.dock, tbPref.index, tbPref.nl, tbPref.extraOffset);
 	}
+*/
 }
 
-void OptionsTabToolbars::restoreOptions(const Options *o)
+void OptionsTabToolbars::restoreOptions()
 {
 	if ( !w )
 		return;
 
 	LookFeelToolbarsUI *d = (LookFeelToolbarsUI *)w;
-	opt-&gt;toolbars = o-&gt;toolbars;
-	opt-&gt;hideMenubar = o-&gt;hideMenubar;
-
-	rebuildToolbarList();
 
+	PsiOptions *o = PsiOptions::instance();
+	
+	QStringList toolbarBases = o-&gt;getChildOptionNames(&quot;options.ui.contactlist.toolbars&quot;, true, true);
+	
+	foreach(QString base, toolbarBases) {
+		ToolbarPrefs tb;
+		tb.name = o-&gt;getOption(base + &quot;.name&quot;).toString();
+		tb.on = o-&gt;getOption(base + &quot;.visible&quot;).toBool();
+		tb.locked = o-&gt;getOption(base + &quot;.locked&quot;).toBool();
+		tb.stretchable = o-&gt;getOption(base + &quot;.stretchable&quot;).toBool();
+		tb.dock = (Qt::Dock)o-&gt;getOption(base + &quot;.dock.position&quot;).toInt(); //FIXME
+		tb.index = o-&gt;getOption(base + &quot;.dock.index&quot;).toInt();
+		tb.nl = o-&gt;getOption(base + &quot;.dock.nl&quot;).toBool();
+		tb.extraOffset = o-&gt;getOption(base + &quot;.dock.extra-offset&quot;).toInt();
+		tb.keys = o-&gt;getOption(base + &quot;.actions&quot;).toStringList();
+		
+		p-&gt;toolbarsCurrent[base] = tb;
+		d-&gt;cb_toolbars-&gt;addItem(tb.name, base);
+	}
+	
 	if(d-&gt;cb_toolbars-&gt;count() &gt; 0) {
 		d-&gt;cb_toolbars-&gt;setCurrentIndex( 0 );
 		toolbarSelectionChanged( 0 );
@@ -358,8 +398,25 @@ void OptionsTabToolbars::toolbarAdd()
 
 	int i = d-&gt;cb_toolbars-&gt;count();
 
-	Options::ToolbarPrefs tb;
-	tb.name = QObject::tr(&quot;&lt;unnamed&gt;&quot;);
+	ToolbarPrefs tb;
+	int j = 0;
+	bool ok;
+	do {
+		ok = true;
+		tb.name = QObject::tr(&quot;&lt;unnamed%1&gt;&quot;).arg(j++);
+		foreach(ToolbarPrefs other, p-&gt;toolbarsNew) {
+			if (other.name == tb.name) {
+				ok = false;
+				break;
+			}
+		}
+		if (ok) foreach(ToolbarPrefs other, p-&gt;toolbarsCurrent) {
+			if (other.name == tb.name) {
+				ok = false;
+				break;
+			}
+		}
+	} while (!ok);
 	tb.on = false;
 	tb.locked = false;
 	tb.stretchable = false;
@@ -372,9 +429,18 @@ void OptionsTabToolbars::toolbarAdd()
 
 	tb.dirty = true;
 
-	opt-&gt;toolbars[&quot;mainWin&quot;].append(tb);
+	QString base;
+	j=0;
+	do {
+		ok = true;
+		base = &quot;..&quot; + QString::number(j++);
+	} while (p-&gt;toolbarsNew.keys().contains(base));
+	qDebug() &lt;&lt; &quot;allocted &quot; &lt;&lt; base &lt;&lt; &quot; for new toolbar&quot;;
+	
+	p-&gt;toolbarsNew[base] = tb;
+
+	d-&gt;cb_toolbars-&gt;addItem(tb.name, base);
 
-	rebuildToolbarList();
 	d-&gt;cb_toolbars-&gt;setCurrentIndex( d-&gt;cb_toolbars-&gt;count()-1 );
 	toolbarSelectionChanged( d-&gt;cb_toolbars-&gt;currentIndex() );
 
@@ -385,21 +451,24 @@ void OptionsTabToolbars::toolbarDelete()
 {
 	LookFeelToolbarsUI *d = (LookFeelToolbarsUI *)w;
 	int n = d-&gt;cb_toolbars-&gt;currentIndex();
+	
+	QString base = d-&gt;cb_toolbars-&gt;itemData(n).toString();
+	qDebug() &lt;&lt; &quot;removing &quot; &lt;&lt; base;
 
-	{
-		int idx = p-&gt;toolbars[n].index;
-		QList&lt;Options::ToolbarPrefs&gt;::Iterator it = opt-&gt;toolbars[p-&gt;toolbars[n].group].begin();
-		for (int i = 0; i &lt; idx; i++)
-			++it;
-
-		noDirty = true;
-		opt-&gt;toolbars[p-&gt;toolbars[n].group].remove(it);
-
-		toolbarSelectionChanged(-1);
-		rebuildToolbarList();
-		noDirty = false;
-		toolbarSelectionChanged( d-&gt;cb_toolbars-&gt;currentIndex() );
+	noDirty = true;
+	toolbarSelectionChanged(-1);
+	
+	if (p-&gt;toolbarsNew.contains(base)) {
+		p-&gt;toolbarsNew.remove(base);
+	} else {
+		p-&gt;toolbarsCurrent.remove(base);
+		p-&gt;toolbarsDelete += base;
 	}
+	
+	d-&gt;cb_toolbars-&gt;removeItem(d-&gt;cb_toolbars-&gt;findData(base));
+	
+	noDirty = false;
+	toolbarSelectionChanged( d-&gt;cb_toolbars-&gt;currentIndex() );
 }
 
 void OptionsTabToolbars::addToolbarAction(QListWidget *parent, QString name, int toolbarId)
@@ -429,12 +498,12 @@ void OptionsTabToolbars::toolbarSelectionChanged(int item)
 		return;
 
 	int n = item;
-	PsiToolBar *toolBar = 0;
-	if ( item != -1 )
-		toolBar = psi-&gt;findToolBar( p-&gt;toolbars[n].group, p-&gt;toolbars[n].index );
+//	PsiToolBar *toolBar = 0;
+//	if ( item != -1 )
+//		toolBar = psi-&gt;findToolBar( p-&gt;toolbars[n].group, p-&gt;toolbars[n].index );
 
-	bool customizeable = toolBar ? toolBar-&gt;isCustomizeable() : true;
-	bool moveable      = toolBar ? toolBar-&gt;isMoveable() : true;
+	bool customizeable = true;
+	bool moveable      = true;
 
 	LookFeelToolbarsUI *d = (LookFeelToolbarsUI *)w;
 	bool enable = (item == -1) ? false: true;
@@ -449,7 +518,7 @@ void OptionsTabToolbars::toolbarSelectionChanged(int item)
 	d-&gt;tb_down-&gt;setEnabled( enable &amp;&amp; customizeable );
 	d-&gt;tb_left-&gt;setEnabled( enable &amp;&amp; customizeable );
 	d-&gt;tb_right-&gt;setEnabled( enable &amp;&amp; customizeable );
-	d-&gt;pb_deleteToolbar-&gt;setEnabled( enable &amp;&amp; p-&gt;toolbars[n].group == &quot;mainWin&quot; );
+	d-&gt;pb_deleteToolbar-&gt;setEnabled( enable );
 	d-&gt;cb_toolbars-&gt;setEnabled( enable );
 
 	d-&gt;tw_availActions-&gt;clear();
@@ -462,7 +531,15 @@ void OptionsTabToolbars::toolbarSelectionChanged(int item)
 
 	noDirty = true;
 
-	Options::ToolbarPrefs tb = opt-&gt;toolbars[p-&gt;toolbars[n].group][p-&gt;toolbars[n].index];
+	QString base = d-&gt;cb_toolbars-&gt;itemData(n).toString();
+	ToolbarPrefs tb;
+	if (p-&gt;toolbarsNew.contains(base)) {
+		tb = p-&gt;toolbarsNew[base];
+	} else {
+		tb = p-&gt;toolbarsCurrent[base];
+	}
+	
+	
 	d-&gt;le_toolbarName-&gt;setText( tb.name );
 	d-&gt;ck_toolbarOn-&gt;setChecked( tb.on );
 	d-&gt;ck_toolbarLocked-&gt;setChecked( tb.locked || !moveable );
@@ -473,7 +550,7 @@ void OptionsTabToolbars::toolbarSelectionChanged(int item)
 		QTreeWidget *tw = d-&gt;tw_availActions;
 		QTreeWidgetItem *lastRoot = 0;
 
-		foreach(ActionList* actionList, psi-&gt;actionList()-&gt;actionLists( p-&gt;class2id( p-&gt;toolbars[n].group ) )) {
+		foreach(ActionList* actionList, psi-&gt;actionList()-&gt;actionLists( p-&gt;class2id() )) {
 			QTreeWidgetItem *root = new QTreeWidgetItem(tw, lastRoot);
 			lastRoot = root;
 			root-&gt;setText( 0, actionList-&gt;name() );
@@ -485,12 +562,13 @@ void OptionsTabToolbars::toolbarSelectionChanged(int item)
 			QStringList::Iterator it2 = actionNames.begin();
 			for ( ; it2 != actionNames.end(); ++it2 ) {
 				IconAction *action = actionList-&gt;action( *it2 );
-		        	QTreeWidgetItem *item = new QTreeWidgetItem( root, last );
+				QTreeWidgetItem *item = new QTreeWidgetItem( root, last );
 				last = item;
 
 				QString n = actionName((QAction *)action);
-				if ( !action-&gt;whatsThis().isEmpty() )
+				if ( !action-&gt;whatsThis().isEmpty() ) {
 					n += &quot; - &quot; + action-&gt;whatsThis();
+				}
 				item-&gt;setText( 0, n );
 				item-&gt;setIcon( 0, action-&gt;iconSet() );
 				item-&gt;setData( 0, Qt::UserRole, action-&gt;name() );
@@ -501,7 +579,7 @@ void OptionsTabToolbars::toolbarSelectionChanged(int item)
 
 	QStringList::Iterator it = tb.keys.begin();
 	for ( ; it != tb.keys.end(); ++it) {
-		addToolbarAction(d-&gt;lw_selectedActions, *it, p-&gt;class2id( p-&gt;toolbars[n].group ) );
+		addToolbarAction(d-&gt;lw_selectedActions, *it, p-&gt;class2id());
 	}
 	updateArrows();
 
@@ -520,10 +598,16 @@ void OptionsTabToolbars::rebuildToolbarKeys()
 	int count = d-&gt;lw_selectedActions-&gt;count();
 	for (int i = 0; i &lt; count; i++) {
 		keys &lt;&lt; d-&gt;lw_selectedActions-&gt;item(i)-&gt;data(Qt::UserRole).toString();
-        }
+	}
 
-	opt-&gt;toolbars[&quot;mainWin&quot;][n].keys  = keys;
-	opt-&gt;toolbars[&quot;mainWin&quot;][n].dirty = true;
+	QString base = d-&gt;cb_toolbars-&gt;itemData(n).toString();
+	if (p-&gt;toolbarsNew.contains(base)) {
+		p-&gt;toolbarsNew[base].keys = keys;
+	} else {
+		p-&gt;toolbarsCurrent[base].keys = keys;
+		p-&gt;toolbarsDirty += base;
+	}
+		
 	emit dataChanged();
 }
 
@@ -559,9 +643,18 @@ void OptionsTabToolbars::toolbarNameChanged()
 	if ( !d-&gt;cb_toolbars-&gt;count() )
 		return;
 
+	QString name = d-&gt;le_toolbarName-&gt;text();
+	
 	int n = d-&gt;cb_toolbars-&gt;currentIndex();
-	d-&gt;cb_toolbars-&gt;changeItem(d-&gt;le_toolbarName-&gt;text(), n);
-	opt-&gt;toolbars[&quot;mainWin&quot;][n].name = d-&gt;le_toolbarName-&gt;text();
+	QString base = d-&gt;cb_toolbars-&gt;itemData(n).toString();
+	if (p-&gt;toolbarsNew.contains(base)) {
+		p-&gt;toolbarsNew[base].name = name;
+	} else {
+		p-&gt;toolbarsCurrent[base].name = name;
+		p-&gt;toolbarsDirty += base;
+	}
+	
+	d-&gt;cb_toolbars-&gt;setItemText(d-&gt;cb_toolbars-&gt;findData(base), name);
 
 	emit dataChanged();
 }
@@ -609,7 +702,7 @@ void OptionsTabToolbars::toolbarAddAction()
 	if ( !item || item-&gt;data(0, Qt::UserRole).toString().isEmpty() )
 		return;
 
-	addToolbarAction(d-&gt;lw_selectedActions, item-&gt;data(0, Qt::UserRole).toString(), p-&gt;class2id( p-&gt;toolbars[d-&gt;cb_toolbars-&gt;currentIndex()].group ) );
+	addToolbarAction(d-&gt;lw_selectedActions, item-&gt;data(0, Qt::UserRole).toString(), p-&gt;class2id());
 	rebuildToolbarKeys();
 	updateArrows();
 }
@@ -636,13 +729,30 @@ void OptionsTabToolbars::toolbarDataChanged()
 	if ( !d-&gt;cb_toolbars-&gt;count() )
 		return;
 	int n = d-&gt;cb_toolbars-&gt;currentIndex();
+	
+	
+	
+	QString base = d-&gt;cb_toolbars-&gt;itemData(n).toString();
+	ToolbarPrefs tb;
+	if (p-&gt;toolbarsNew.contains(base)) {
+		tb = p-&gt;toolbarsNew[base];
+	} else {
+		tb = p-&gt;toolbarsCurrent[base];
+		p-&gt;toolbarsDirty += base;
+	}
 
-	opt-&gt;toolbars[&quot;mainWin&quot;][n].dirty = true;
-	opt-&gt;toolbars[&quot;mainWin&quot;][n].name = d-&gt;le_toolbarName-&gt;text();
-	opt-&gt;toolbars[&quot;mainWin&quot;][n].on = d-&gt;ck_toolbarOn-&gt;isChecked();
-	opt-&gt;toolbars[&quot;mainWin&quot;][n].locked = d-&gt;ck_toolbarLocked-&gt;isChecked();
-	opt-&gt;toolbars[&quot;mainWin&quot;][n].stretchable = d-&gt;ck_toolbarStretch-&gt;isChecked();
-
+	tb.dirty = true;
+	tb.name = d-&gt;le_toolbarName-&gt;text();
+	tb.on = d-&gt;ck_toolbarOn-&gt;isChecked();
+	tb.locked = d-&gt;ck_toolbarLocked-&gt;isChecked();
+	tb.stretchable = d-&gt;ck_toolbarStretch-&gt;isChecked();
+
+	if (p-&gt;toolbarsNew.contains(base)) {
+		p-&gt;toolbarsNew[base] = tb;
+	} else {
+		p-&gt;toolbarsCurrent[base] = tb;
+	}
+	
 	emit dataChanged();
 }
 
@@ -663,30 +773,30 @@ QString OptionsTabToolbars::actionName(const QAction *a)
 
 void OptionsTabToolbars::toolbarPosition()
 {
+#if 0
+ LEGOPTFIXME
 	LookFeelToolbarsUI *d = (LookFeelToolbarsUI *)w;
 	if ( !d-&gt;cb_toolbars-&gt;count() )
 		return;
 	int n = d-&gt;cb_toolbars-&gt;currentIndex();
 
-	PositionOptionsTabToolbars *posTbDlg = new PositionOptionsTabToolbars(w, &amp;opt-&gt;toolbars[&quot;mainWin&quot;][n], n);
+	PositionOptionsTabToolbars *posTbDlg = new PositionOptionsTabToolbars(w, &amp;LEGOPTS.toolbars[&quot;mainWin&quot;][n], n);
 	connect(posTbDlg, SIGNAL(applyPressed()), SLOT(toolbarPositionApply()));
 
 	posTbDlg-&gt;exec();
 	delete posTbDlg;
+#endif
 }
 
 void OptionsTabToolbars::toolbarPositionApply()
 {
+#if 0
+ LEGOPTFIXME
 	emit dataChanged();
 
-	option.toolbars = opt-&gt;toolbars;
-	psi-&gt;buildToolbars();
-}
-
-void OptionsTabToolbars::doApply()
-{
-	option.toolbars = opt-&gt;toolbars;
+	LEGOPTS.toolbars = LEGOPTS.toolbars;
 	psi-&gt;buildToolbars();
+#endif
 }
 
 void OptionsTabToolbars::selAct_selectionChanged(QListWidgetItem *)</diff>
      <filename>src/options/opt_toolbars.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -5,7 +5,6 @@
 
 class PsiCon;
 class PsiToolBar;
-struct Options;
 class QAction;
 class IconButton;
 class QListWidget;
@@ -18,10 +17,12 @@ public:
 	OptionsTabToolbars(QObject* parent);
 	~OptionsTabToolbars();
 
+	bool stretchable() const {return true;};
+	
 	//void setCurrentToolbar(PsiToolBar *);
 	QWidget* widget();
-	void applyOptions(Options *opt);
-	void restoreOptions(const Options* opt);
+	void applyOptions();
+	void restoreOptions();
 
 private slots:
 	void setData(PsiCon*, QWidget*);
@@ -42,11 +43,8 @@ private slots:
 	void selAct_selectionChanged(QListWidgetItem *);
 	void avaAct_selectionChanged(QTreeWidgetItem *);
 
-	void doApply();
 	void toolbarPositionApply();
 
-	void rebuildToolbarList();
-
 signals:
 	void dataChanged();
 
@@ -55,7 +53,6 @@ private:
 
 	QWidget *w;
 	QWidget *parent;
-	Options *opt;
 	PsiCon *psi;
 	bool noDirty;
 	IconButton *pb_apply;</diff>
      <filename>src/options/opt_toolbars.h</filename>
    </modified>
    <modified>
      <diff>@@ -4,7 +4,6 @@
 #include &quot;optionstab.h&quot;
 
 class QWidget;
-struct Options;
 
 class OptionsTabTree : public OptionsTab
 {</diff>
      <filename>src/options/opt_tree.h</filename>
    </modified>
    <modified>
      <diff>@@ -162,7 +162,7 @@ class OptionsDlg::Private : public QObject
 {
 	Q_OBJECT
 public:
-	Private(OptionsDlg *dlg, PsiCon *_psi, const Options &amp;_opt);
+	Private(OptionsDlg *dlg, PsiCon *_psi);
 
 public slots:
 	void doApply();
@@ -181,7 +181,6 @@ private slots:
 public:
 	OptionsDlg *dlg;
 	PsiCon *psi;
-	Options opt;
 	bool dirty, noDirty;
 	Q3Dict&lt;QWidget&gt; id2widget;
 	Q3PtrList&lt;OptionsTab&gt; tabs;
@@ -189,11 +188,10 @@ public:
 	QMap&lt;QString, QByteArray&gt; changedMap;
 };
 
-OptionsDlg::Private::Private(OptionsDlg *d, PsiCon *_psi, const Options &amp;_opt)
+OptionsDlg::Private::Private(OptionsDlg *d, PsiCon *_psi)
 {
 	dlg = d;
 	psi = _psi;
-	opt = _opt; // option
 	noDirty = false;
 	dirty = false;
 
@@ -435,7 +433,7 @@ void OptionsDlg::Private::openTab(QString id)
 
 				bool d = dirty;
 
-				opttab-&gt;restoreOptions( &amp;opt ); // initialize widgets' values
+				opttab-&gt;restoreOptions(); // initialize widgets' values
 
 				dirty = d;
 				dlg-&gt;pb_apply-&gt;setEnabled( dirty );
@@ -525,10 +523,10 @@ void OptionsDlg::Private::doApply()
 	for ( ; it.current(); ++it) {
 		opttab = it.current();
 
-		opttab-&gt;applyOptions( &amp;opt );
+		opttab-&gt;applyOptions();
 	}
 
-	emit dlg-&gt;applyOptions( opt );
+	emit dlg-&gt;applyOptions();
 
 	dirty = false;
 	dlg-&gt;pb_apply-&gt;setEnabled(false);
@@ -538,12 +536,12 @@ void OptionsDlg::Private::doApply()
 // OptionsDlg
 //----------------------------------------------------------------------------
 
-OptionsDlg::OptionsDlg(PsiCon *psi, const Options &amp;opt, QWidget *parent)
+OptionsDlg::OptionsDlg(PsiCon *psi, QWidget *parent)
 	: QDialog(parent)
 {
 	setAttribute(Qt::WA_DeleteOnClose);
 	setupUi(this);
-	d = new Private(this, psi, opt);
+	d = new Private(this, psi);
 	setModal(false);
 	d-&gt;psi-&gt;dialogRegister(this);
 </diff>
      <filename>src/options/optionsdlg.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -5,19 +5,18 @@
 #include &lt;QDialog&gt;
 
 class PsiCon;
-struct Options;
 
 class OptionsDlg : public QDialog, public Ui::OptionsUI
 {
 	Q_OBJECT
 public:
-	OptionsDlg(PsiCon *, const Options &amp;, QWidget *parent = 0);
+	OptionsDlg(PsiCon *, QWidget *parent = 0);
 	~OptionsDlg();
 
 	void openTab(const QString&amp; id);
 
 signals:
-	void applyOptions(const Options &amp;);
+	void applyOptions();
 
 private slots:
 	void doOk();</diff>
      <filename>src/options/optionsdlg.h</filename>
    </modified>
    <modified>
      <diff>@@ -75,11 +75,11 @@ PsiIcon *OptionsTab::psiIcon() const
 	return (PsiIcon *)IconsetFactory::iconPtr( v_iconName );
 }
 
-void OptionsTab::applyOptions(Options *)
+void OptionsTab::applyOptions()
 {
 }
 
-void OptionsTab::restoreOptions(const Options *)
+void OptionsTab::restoreOptions()
 {
 }
 
@@ -106,7 +106,7 @@ class OptionsTabWidget : public QTabWidget
 public:
 	OptionsTabWidget(QWidget *parent);
 	void addTab(OptionsTab *);
-	void restoreOptions(const Options *);
+	void restoreOptions();
 
 signals:
 	void connectDataChanged(QWidget *);
@@ -123,14 +123,12 @@ private:
 		bool initialized;
 	};
 	QMap&lt;QWidget *, TabData&gt; w2tab;
-	Options *opt;
 };
 
 OptionsTabWidget::OptionsTabWidget(QWidget *parent)
 : QTabWidget(parent)
 {
 	connect(this, SIGNAL(currentChanged(QWidget *)), SLOT(updateCurrent(QWidget *)));
-	opt = 0;
 }
 
 void OptionsTabWidget::addTab(OptionsTab *tab)
@@ -174,11 +172,10 @@ void OptionsTabWidget::updateCurrent(QWidget *w)
 		if ( !opttab-&gt;stretchable() )
 			vbox-&gt;addStretch();
 
-		if ( opt ) {
-			emit noDirty(true);
-			opttab-&gt;restoreOptions(opt);
-			emit noDirty(false);
-		}
+		emit noDirty(true);
+		opttab-&gt;restoreOptions();
+		emit noDirty(false);
+		
 		emit connectDataChanged(tab);
 
 		tab-&gt;show();
@@ -186,16 +183,11 @@ void OptionsTabWidget::updateCurrent(QWidget *w)
 	}
 }
 
-void OptionsTabWidget::restoreOptions(const Options *o)
+void OptionsTabWidget::restoreOptions()
 {
-	bool doRestore = !opt;
-	opt = (Options *)o;
-
-	if ( doRestore ) {
-		emit noDirty(true);
-		w2tab[currentPage()].tab-&gt;restoreOptions(opt);
-		emit noDirty(false);
-	}
+	emit noDirty(true);
+	w2tab[currentPage()].tab-&gt;restoreOptions();
+	emit noDirty(false);
 }
 
 //----------------------------------------------------------------------------
@@ -257,23 +249,25 @@ QWidget *MetaOptionsTab::widget()
 	return w;
 }
 
-void MetaOptionsTab::applyOptions(Options *opt)
+void MetaOptionsTab::applyOptions()
 {
 	Q3PtrListIterator&lt;OptionsTab&gt; it(tabs);
-	for ( ; it.current(); ++it)
-		it.current()-&gt;applyOptions(opt);
+	for ( ; it.current(); ++it) {
+		it.current()-&gt;applyOptions();
+	}
 }
 
-void MetaOptionsTab::restoreOptions(const Options *opt)
+void MetaOptionsTab::restoreOptions()
 {
 	if ( w ) {
 		OptionsTabWidget *d = (OptionsTabWidget *)w;
-		d-&gt;restoreOptions(opt);
+		d-&gt;restoreOptions();
 	}
 
 	Q3PtrListIterator&lt;OptionsTab&gt; it(tabs);
-	for ( ; it.current(); ++it)
-		it.current()-&gt;restoreOptions(opt);
+	for ( ; it.current(); ++it) {
+		it.current()-&gt;restoreOptions();
+	}
 }
 
 void MetaOptionsTab::setData(PsiCon *psi, QWidget *w)</diff>
      <filename>src/options/optionstab.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -6,7 +6,6 @@
 #include &lt;q3ptrlist.h&gt;
 #include &lt;QByteArray&gt;
 
-struct Options;
 class PsiIcon;
 class QWidget;
 class PsiCon;
@@ -41,8 +40,8 @@ signals:
 
 public slots:
 	virtual void setData(PsiCon *, QWidget *parentDialog);
-	virtual void applyOptions(Options *opt);
-	virtual void restoreOptions(const Options *opt);
+	virtual void applyOptions();
+	virtual void restoreOptions();
 	virtual void tabAdded(OptionsTab *tab);	// called when tab 'tab' specifies this tab as parent
 
 private:
@@ -59,8 +58,8 @@ public:
 	~MetaOptionsTab();
 
 	QWidget *widget();
-	void applyOptions(Options *opt);
-	void restoreOptions(const Options *opt);
+	void applyOptions();
+	void restoreOptions();
 
 	void setData(PsiCon *, QWidget *);
 	bool stretchable() const { return true; }</diff>
      <filename>src/options/optionstab.h</filename>
    </modified>
    <modified>
      <diff>@@ -21,6 +21,7 @@
 #include &quot;profiledlg.h&quot;
 #include &quot;applicationinfo.h&quot;
 #include &quot;iconset.h&quot;
+#include &quot;psioptions.h&quot;
 
 #include &lt;QLabel&gt;
 #include &lt;QComboBox&gt;
@@ -36,6 +37,7 @@
 #include &lt;Q3ButtonGroup&gt;
 #include &lt;QPixmap&gt;
 #include &quot;profiles.h&quot;
+#include &quot;common.h&quot;
 #include &quot;iconwidget.h&quot;
 
 #include &lt;qpainter.h&gt;
@@ -331,11 +333,17 @@ void ProfileNewDlg::slotCreate()
 	}
 
 	// save config
-	UserProfile p;
-	p.prefs.defaultAction = bg_defAct-&gt;selected() == (Q3Button *)rb_message ? 0: 1;
-	p.prefs.useEmoticons = ck_useEmoticons-&gt;isChecked();
-	p.toFile(pathToProfileConfig(name));
-
+	PsiOptions o;
+	
+	if (!o.load(&quot;:/options/newprofile.xml&quot;)) {
+		qWarning(&quot;ERROR: Failed to new profile default options&quot;);
+	}
+	
+	
+	o.setOption(&quot;options.messages.default-outgoing-message-type&quot; ,bg_defAct-&gt;selected() == (Q3Button *)rb_message ? &quot;message&quot;: &quot;chat&quot;);
+	o.setOption(&quot;options.ui.emoticons.use-emoticons&quot; ,ck_useEmoticons-&gt;isChecked());
+	o.save(pathToProfile(name) + &quot;/options.xml&quot;);
+	
 	accept();
 }
 </diff>
      <filename>src/profiledlg.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -33,6 +33,8 @@
 #include &quot;xmpp_roster.h&quot;
 #include &quot;xmpp_jid.h&quot;
 
+class OptionsTree;
+
 class UserAccount
 {
 public:
@@ -43,6 +45,9 @@ public:
 
 	QDomElement toXml(QDomDocument &amp;, const QString &amp;tagName);
 	void fromXml(const QDomElement &amp;);
+	
+	void fromOptions(OptionsTree *o, QString base);
+	void toOptions(OptionsTree *o, QString base=QString());
 
 	QString name;
 	QString jid, pass, host, resource, authid, realm;
@@ -50,16 +55,13 @@ public:
 	int port, priority;
  	bool opt_enabled, opt_pass, opt_host, opt_auto, opt_keepAlive, opt_log, opt_reconn, opt_ignoreSSLWarnings, opt_compress;
 	XMPP::ClientStream::AllowPlainType allow_plain;
-	bool tog_offline, tog_away, tog_agents, tog_hidden, tog_self;
 	bool req_mutual_auth;
 	bool legacy_ssl_probe;
 	bool opt_automatic_resource;
 	int security_level;
 	enum SSLFlag { SSL_No = 0, SSL_Yes = 1, SSL_Auto = 2, SSL_Legacy = 3 } ssl;
 
-	int proxy_index;
-	int proxy_type, proxy_port;
-	QString proxy_host, proxy_user, proxy_pass;
+	QString proxyID;
 
 	XMPP::Roster roster;
 
@@ -74,31 +76,34 @@ public:
 	VarList keybind;
 
 	XMPP::Jid dtProxy;
+	
+	QString optionsBase;
+	
+	
+	/* migration only */
+	int proxy_index;
+	int proxy_type, proxy_port;
+	QString proxy_host, proxy_user, proxy_pass;
+	bool tog_offline, tog_away, tog_agents, tog_hidden, tog_self;
 };
 
 typedef QList&lt;UserAccount&gt; UserAccountList;
 
 
-class UserProfile
+class OptionsMigration
 {
 public:
-	UserProfile();
-
-	void reset();
-	bool toFile(const QString &amp;);
 	bool fromFile(const QString &amp;);
+	
+	void lateMigration();
 
-	QString progver;
-	UserAccountList acc;
-	Options prefs;
-
-	QRect mwgeom;
-	QStringList recentGCList;
-	QStringList recentBrowseList;
-	QString lastStatusString;
-	bool useSound;
+	//QString progver;
+	UserAccountList accMigration;
 
-	ProxyItemList proxyList;
+	ProxyItemList proxyMigration;
+	
+private:
+	lateMigrationOptions lateMigrationData;
 };
 
 QString pathToProfile(const QString &amp;);</diff>
      <filename>src/profiles.h</filename>
    </modified>
    <modified>
      <diff>@@ -36,8 +36,10 @@
 //Added by qt3to4:
 #include &lt;QHBoxLayout&gt;
 #include &lt;QList&gt;
+#include &lt;QDebug&gt;
 #include &quot;common.h&quot;
 #include &quot;iconwidget.h&quot;
+#include &quot;psioptions.h&quot;
 
 static QDomElement textTag(QDomDocument &amp;doc, const QString &amp;name, const QString &amp;content)
 {
@@ -143,6 +145,29 @@ ProxySettings::ProxySettings()
 	useAuth = false;
 }
 
+#define PASSWORDKEY &quot;Cae1voo:ea}fae2OCai|f1il&quot;
+
+void ProxySettings::toOptions(OptionsTree* o, QString base) const
+{
+	o-&gt;setOption(base + &quot;.host&quot;, host);
+	o-&gt;setOption(base + &quot;.port&quot;, port);
+	o-&gt;setOption(base + &quot;.url&quot;, url);
+	o-&gt;setOption(base + &quot;.useAuth&quot;, useAuth);
+	o-&gt;setOption(base + &quot;.user&quot;, user);
+	o-&gt;setOption(base + &quot;.pass&quot;, encodePassword(pass, PASSWORDKEY));
+}
+
+void ProxySettings::fromOptions(OptionsTree* o, QString base)
+{
+	host = o-&gt;getOption(base + &quot;.host&quot;).toString();
+	port = o-&gt;getOption(base + &quot;.port&quot;).toInt();
+	url = o-&gt;getOption(base + &quot;.url&quot;).toString();
+	useAuth = o-&gt;getOption(base + &quot;.useAuth&quot;).toBool();
+	user = o-&gt;getOption(base + &quot;.user&quot;).toString();
+	pass = decodePassword(o-&gt;getOption(base + &quot;.pass&quot;).toString(), PASSWORDKEY);
+}
+	
+	
 QDomElement ProxySettings::toXml(QDomDocument *doc) const
 {
 	QDomElement e = doc-&gt;createElement(&quot;proxySettings&quot;);
@@ -303,7 +328,7 @@ public:
 	int last;
 };
 
-ProxyDlg::ProxyDlg(const ProxyItemList &amp;list, const QStringList &amp;methods, int def, QWidget *parent)
+ProxyDlg::ProxyDlg(const ProxyItemList &amp;list, const QStringList &amp;methods, const QString &amp;def, QWidget *parent)
 	: QDialog(parent)
 {
 	setAttribute(Qt::WA_DeleteOnClose);
@@ -331,12 +356,17 @@ ProxyDlg::ProxyDlg(const ProxyItemList &amp;list, const QStringList &amp;methods, int de
 	cb_type-&gt;insertStringList(methods);
 	connect(cb_type, SIGNAL(activated(int)), SLOT(cb_activated(int)));
 
-	for(ProxyItemList::ConstIterator it = d-&gt;list.begin(); it != d-&gt;list.end(); ++it)
+	int defIdx = -1;
+	int i = 0;
+	for(ProxyItemList::ConstIterator it = d-&gt;list.begin(); it != d-&gt;list.end(); ++it) {
 		lbx_proxy-&gt;insertItem((*it).name);
+		if ((*it).id == def) defIdx= i;
+		++i;
+	}
 	if(!list.isEmpty()) {
-		if(def &lt; 0)
-			def = 0;
-		lbx_proxy-&gt;setCurrentItem(def);
+		if(defIdx &lt; 0)
+			defIdx = 0;
+		lbx_proxy-&gt;setCurrentItem(defIdx);
 		selectCurrent();
 	}
 
@@ -354,7 +384,7 @@ ProxyDlg::~ProxyDlg()
 void ProxyDlg::proxy_new()
 {
 	ProxyItem s;
-	s.id = -1; // id of -1 means 'new'
+	s.id = &quot;&quot;; // id of &quot;&quot; means 'new'
 	s.name = getUniqueName();
 	d-&gt;list += s;
 
@@ -530,50 +560,57 @@ ProxyChooser::~ProxyChooser()
 	delete d;
 }
 
-int ProxyChooser::currentItem() const
+QString ProxyChooser::currentItem() const
 {
-	return d-&gt;cb_proxy-&gt;currentItem();
+	return d-&gt;cb_proxy-&gt;itemData(d-&gt;cb_proxy-&gt;currentItem()).toString();
 }
 
-void ProxyChooser::setCurrentItem(int x)
+void ProxyChooser::setCurrentItem(const QString &amp;id)
 {
-	d-&gt;cb_proxy-&gt;setCurrentItem(x);
+	d-&gt;cb_proxy-&gt;setCurrentItem(d-&gt;cb_proxy-&gt;findData(id));
 }
 
-void ProxyChooser::pm_settingsChanged()
+void ProxyChooser::pm_settingsChangedApply()
 {
-	int x = d-&gt;cb_proxy-&gt;currentItem();
+	disconnect(d-&gt;m, SIGNAL(settingsChanged()), this, SLOT(pm_settingsChangedApply()));
+	QString prev = currentItem();
 	buildComboBox();
-	if(x &gt;= 1) {
-		x = d-&gt;m-&gt;findOldIndex(x-1);
-		if(x == -1)
-			d-&gt;cb_proxy-&gt;setCurrentItem(0);
-		else
-			d-&gt;cb_proxy-&gt;setCurrentItem(x+1);
+	prev = d-&gt;m-&gt;lastEdited();
+	int x = d-&gt;cb_proxy-&gt;findData(prev);
+	if(x == -1) {
+		d-&gt;cb_proxy-&gt;setCurrentItem(0);
+	} else {
+		d-&gt;cb_proxy-&gt;setCurrentItem(x);
 	}
-	else {
-		x = d-&gt;m-&gt;lastEdited();
-		if(x != -1)
-			d-&gt;cb_proxy-&gt;setCurrentItem(x+1);
+}
+
+
+void ProxyChooser::pm_settingsChanged()
+{
+	QString prev = currentItem();
+	buildComboBox();
+	int x = d-&gt;cb_proxy-&gt;findData(prev);
+	if(x == -1) {
+		d-&gt;cb_proxy-&gt;setCurrentItem(0);
+	} else {
+		d-&gt;cb_proxy-&gt;setCurrentItem(x);
 	}
 }
 
 void ProxyChooser::buildComboBox()
 {
 	d-&gt;cb_proxy-&gt;clear();
-	d-&gt;cb_proxy-&gt;insertItem(tr(&quot;None&quot;));
+	d-&gt;cb_proxy-&gt;addItem(tr(&quot;None&quot;), &quot;&quot;);
 	ProxyItemList list = d-&gt;m-&gt;itemList();
-	for(ProxyItemList::ConstIterator it = list.begin(); it != list.end(); ++it)
-		d-&gt;cb_proxy-&gt;insertItem((*it).name);
+	foreach(ProxyItem pi, list) {
+		d-&gt;cb_proxy-&gt;addItem(pi.name, pi.id);
+	}
 }
 
 void ProxyChooser::doOpen()
 {
-	int x = d-&gt;cb_proxy-&gt;currentItem();
-	if(x &lt; 1)
-		x = -1;
-	else
-		--x;
+	QString x = d-&gt;cb_proxy-&gt;itemData(d-&gt;cb_proxy-&gt;currentItem()).toString();
+	connect(d-&gt;m, SIGNAL(settingsChanged()), SLOT(pm_settingsChangedApply()));
 	d-&gt;m-&gt;openDialog(x);
 }
 
@@ -593,16 +630,24 @@ class ProxyManager::Private
 public:
 	Private() {}
 
-	ProxyItemList list;
 	QPointer&lt;ProxyDlg&gt; pd;
 	QList&lt;int&gt; prevMap;
-	int lastEdited;
+	QString lastEdited;
+	OptionsTree *o;
+	
+	void itemToOptions(ProxyItem pi) {
+		QString base = &quot;proxies.&quot; + pi.id;
+		pi.settings.toOptions( o, base);
+		o-&gt;setOption(base + &quot;.name&quot;, pi.name);
+		o-&gt;setOption(base + &quot;.type&quot;, pi.type);
+	}
 };
 
-ProxyManager::ProxyManager(QObject *parent)
-:QObject(parent)
+ProxyManager::ProxyManager(OptionsTree *opt, QObject *parent)
+		: QObject(parent)
 {
 	d = new Private;
+	d-&gt;o = opt;
 }
 
 ProxyManager::~ProxyManager()
@@ -617,23 +662,36 @@ ProxyChooser *ProxyManager::createProxyChooser(QWidget *parent)
 
 ProxyItemList ProxyManager::itemList() const
 {
-	return d-&gt;list;
+	QList&lt;ProxyItem&gt; proxies;
+	QString opt = &quot;proxies&quot;;
+	QStringList keys = d-&gt;o-&gt;getChildOptionNames(opt, true, true);
+	foreach(QString key, keys) {
+		proxies += getItem(key.mid(opt.length()+1));
+	}
+	return proxies;
 }
 
-const ProxyItem &amp; ProxyManager::getItem(int x) const
+ProxyItem ProxyManager::getItem(const QString &amp;x) const
 {
-	return d-&gt;list[x];
+	QString base = &quot;proxies.&quot; + x;
+	ProxyItem pi;
+	pi.settings.fromOptions( d-&gt;o, base);
+	pi.name = d-&gt;o-&gt;getOption(base + &quot;.name&quot;).toString();
+	pi.type = d-&gt;o-&gt;getOption(base + &quot;.type&quot;).toString();
+	pi.id = x;
+	return pi;
 }
 
-int ProxyManager::lastEdited() const
+QString ProxyManager::lastEdited() const
 {
 	return d-&gt;lastEdited;
 }
 
-void ProxyManager::setItemList(const ProxyItemList &amp;list)
+void ProxyManager::migrateItemList(const ProxyItemList &amp;list)
 {
-	d-&gt;list = list;
-	assignIds();
+	foreach(ProxyItem pi, list) {
+		d-&gt;itemToOptions(pi);
+	}
 }
 
 QStringList ProxyManager::methodList() const
@@ -645,12 +703,12 @@ QStringList ProxyManager::methodList() const
 	return list;
 }
 
-void ProxyManager::openDialog(int def)
+void ProxyManager::openDialog(QString def)
 {
 	if(d-&gt;pd)
 		bringToFront(d-&gt;pd);
 	else {
-		d-&gt;pd = new ProxyDlg(d-&gt;list, methodList(), def, 0);
+		d-&gt;pd = new ProxyDlg(itemList(), methodList(), def, 0);
 		connect(d-&gt;pd, SIGNAL(applyList(const ProxyItemList &amp;, int)), SLOT(pd_applyList(const ProxyItemList &amp;, int)));
 		d-&gt;pd-&gt;show();
 	}
@@ -658,38 +716,34 @@ void ProxyManager::openDialog(int def)
 
 void ProxyManager::pd_applyList(const ProxyItemList &amp;list, int x)
 {
-	d-&gt;list = list;
-	d-&gt;lastEdited = x;
-
-	// grab old id list
-	d-&gt;prevMap.clear();
-	for(ProxyItemList::ConstIterator it = d-&gt;list.begin(); it != d-&gt;list.end(); ++it)
-		d-&gt;prevMap += (*it).id;
-	assignIds(); // re-assign proper ids
-
-	settingsChanged();
-}
-
-void ProxyManager::assignIds()
-{
-	int n = 0;
-	for(ProxyItemList::Iterator it = d-&gt;list.begin(); it != d-&gt;list.end(); ++it)
-		(*it).id = n++;
-}
-
-int ProxyManager::findOldIndex(int x) const
-{
-	int newPos = 0;
-	bool found = false;
-	for(QList&lt;int&gt;::ConstIterator it = d-&gt;prevMap.begin(); it != d-&gt;prevMap.end(); ++it) {
-		if(*it == x) {
-			found = true;
-			break;
+	QSet&lt;QString&gt; current;
+	
+	QString opt = &quot;proxies&quot;;
+	QStringList old = d-&gt;o-&gt;getChildOptionNames(opt, true, true);
+	for (int i=0; i &lt; old.size(); i++) {
+		old[i] = old[i].mid(opt.length()+1);
+	}
+	
+	// Update all
+	int idx = 0;
+	int i = 0;
+	foreach(ProxyItem pi, list) {
+		if (pi.id.isEmpty()) {
+			do {
+				pi.id = &quot;a&quot;+QString::number(idx++);
+			} while (old.contains(pi.id) || current.contains(pi.id));
 		}
-		++newPos;
+		d-&gt;itemToOptions(pi);
+		current += pi.id;
+		
+		if (i++ == x) d-&gt;lastEdited = pi.id;
 	}
-	if(found)
-		return newPos;
-	else
-		return -1;
+	
+	// and remove removed
+	foreach(QString key, old.toSet() - current) {
+		d-&gt;o-&gt;removeOption(&quot;proxies.&quot; + key, true);
+		emit proxyRemoved(key);
+	}	
+	
+	settingsChanged();
 }</diff>
      <filename>src/proxy.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -26,6 +26,7 @@
 
 #include &quot;ui_proxy.h&quot;
 
+class OptionsTree;
 class QDomElement;
 class QDomDocument;
 
@@ -61,6 +62,9 @@ public:
 	bool useAuth;
 	QString url;
 
+	
+	void toOptions(OptionsTree* o, QString base) const;
+	void fromOptions(OptionsTree* o, QString base);
 	QDomElement toXml(QDomDocument *) const;
 	bool fromXml(const QDomElement &amp;);
 };
@@ -90,7 +94,7 @@ class ProxyDlg : public QDialog, public Ui::Proxy
 {
 	Q_OBJECT
 public:
-	ProxyDlg(const ProxyItemList &amp;, const QStringList &amp;, int def, QWidget *parent=0);
+	ProxyDlg(const ProxyItemList &amp;, const QStringList &amp;, const QString &amp;def, QWidget *parent=0);
 	~ProxyDlg();
 
 signals:
@@ -122,12 +126,13 @@ public:
 	ProxyChooser(ProxyManager *, QWidget *parent=0, const char *name=0);
 	~ProxyChooser();
 
-	int currentItem() const;
-	void setCurrentItem(int);
+	QString currentItem() const;
+	void setCurrentItem(const QString &amp;item);
 	void fixTabbing(QWidget *a, QWidget *b);
 
 private slots:
 	void pm_settingsChanged();
+	void pm_settingsChangedApply();
 	void doOpen();
 
 private:
@@ -142,7 +147,7 @@ class ProxyItem
 public:
 	ProxyItem() {}
 
-	int id; // used to keep track of 'old' position in a list
+	QString id;
 	QString name;
 	QString type;
 	ProxySettings settings;
@@ -152,22 +157,23 @@ class ProxyManager : public QObject
 {
 	Q_OBJECT
 public:
-	ProxyManager(QObject *parent=0);
+	ProxyManager(OptionsTree *o, QObject *parent=0);
 	~ProxyManager();
 
 	ProxyChooser *createProxyChooser(QWidget *parent=0);
 	ProxyItemList itemList() const;
-	const ProxyItem &amp; getItem(int) const;
-	int lastEdited() const;
-	void setItemList(const ProxyItemList &amp;);
+	ProxyItem getItem(const QString &amp;id) const;
+	QString lastEdited() const;
+	void migrateItemList(const ProxyItemList &amp;);
 	QStringList methodList() const;
-	int findOldIndex(int) const;
+//	int findOldIndex(int) const;
 
 signals:
 	void settingsChanged();
+	void proxyRemoved(QString);
 
 public slots:
-	void openDialog(int);
+	void openDialog(QString);
 
 private slots:
 	void pd_applyList(const ProxyItemList &amp;, int cur);
@@ -175,8 +181,6 @@ private slots:
 private:
 	class Private;
 	Private *d;
-
-	void assignIds();
 };
 
 #endif</diff>
      <filename>src/proxy.h</filename>
    </modified>
    <modified>
      <diff>@@ -40,6 +40,8 @@
 #include &quot;psioptions.h&quot;
 #include &quot;varlist.h&quot;
 #include &quot;atomicxmlfile.h&quot;
+#include &quot;psitoolbar.h&quot;
+#include &quot;optionstree.h&quot;
 
 using namespace XMPP;
 using namespace XMLHelper;
@@ -76,6 +78,28 @@ void migrateSizeEntry(const QDomElement&amp; element, const QString&amp; entry, const QS
 	migrateEntry&lt;QSize&gt;(element, entry, option, readSizeEntry);
 }
 
+void migrateStringEntry(const QDomElement&amp; element, const QString&amp; entry, const QString&amp; option)
+{
+	migrateEntry&lt;QString&gt;(element, entry, option, readEntry);
+}
+
+void migrateStringList(const QDomElement&amp; element, const QString&amp; entry, const QString&amp; option)
+{
+	migrateEntry&lt;QStringList&gt;(element, entry, option, xmlToStringList);
+}
+
+void migrateColorEntry(const QDomElement&amp; element, const QString &amp;entry, const QString &amp;option)
+{
+	migrateEntry&lt;QColor&gt;(element, entry, option, readColorEntry);
+}
+
+void migrateRectEntry(const QDomElement&amp; element, const QString &amp;entry, const QString &amp;option)
+{
+	migrateEntry&lt;QRect&gt;(element, entry, option, readRectEntry);
+}
+
+
+
 UserAccount::UserAccount()
 {
 	reset();
@@ -128,65 +152,192 @@ UserAccount::~UserAccount()
 {
 }
 
-// FIXME: this should be a const function (as should other ::toXml functions)
-QDomElement UserAccount::toXml(QDomDocument &amp;doc, const QString &amp;tagName)
+void UserAccount::fromOptions(OptionsTree *o, QString base)
 {
-	QDomElement a = doc.createElement(tagName);
-
-	setBoolAttribute(a, &quot;enabled&quot;, opt_enabled);
-	setBoolAttribute(a, &quot;auto&quot;, opt_auto);
-	setBoolAttribute(a, &quot;showOffline&quot;, tog_offline);
-	setBoolAttribute(a, &quot;showAway&quot;, tog_away);
-	setBoolAttribute(a, &quot;showHidden&quot;, tog_hidden);
-	setBoolAttribute(a, &quot;showAgents&quot;, tog_agents);
-	setBoolAttribute(a, &quot;showSelf&quot;, tog_self);
-	setBoolAttribute(a, &quot;keepAlive&quot;, opt_keepAlive);
-	setBoolAttribute(a, &quot;compress&quot;, opt_compress);
-	setBoolAttribute(a, &quot;require-mutual-auth&quot;, req_mutual_auth);
-	setBoolAttribute(a, &quot;legacy-ssl-probe&quot;, legacy_ssl_probe);
-	setBoolAttribute(a, &quot;automatic-resource&quot;, opt_automatic_resource);
-	setBoolAttribute(a, &quot;log&quot;, opt_log);
-	setBoolAttribute(a, &quot;reconn&quot;, opt_reconn);
-	setBoolAttribute(a, &quot;ignoreSSLWarnings&quot;, opt_ignoreSSLWarnings);
-	//setBoolAttribute(a, &quot;gpg&quot;, opt_gpg);
-
-	//QString jid = user + '@' + vhost;
-	a.appendChild(textTag(doc, &quot;name&quot;, name));
-	a.appendChild(textTag(doc, &quot;jid&quot;, jid));
+	optionsBase = base;
 	
-	QDomElement customauth = doc.createElement(&quot;custom-auth&quot;);
-	setBoolAttribute(customauth, &quot;use&quot;, customAuth);
-	QDomElement ac = textTag(doc, &quot;authid&quot;, authid);
-	QDomElement re = textTag(doc, &quot;realm&quot;, realm);
-	customauth.appendChild(ac);
-	customauth.appendChild(re);
-	a.appendChild(customauth);
-
-	if(opt_pass)
-		a.appendChild(textTag(doc, &quot;password&quot;, encodePassword(pass, jid) ));
-	a.appendChild(textTag(doc, &quot;useHost&quot;, opt_host));
-	a.appendChild(textTag(doc, &quot;security-level&quot;, security_level));
-	a.appendChild(textTag(doc, &quot;ssl&quot;, ssl));
-	a.appendChild(textTag(doc, &quot;host&quot;, host));
-	a.appendChild(textTag(doc, &quot;port&quot;, QString::number(port)));
-	a.appendChild(textTag(doc, &quot;resource&quot;, resource));
-	a.appendChild(textTag(doc, &quot;priority&quot;, QString::number(priority)));
-	if (!pgpSecretKey.isNull()) {
-		a.appendChild(textTag(doc, &quot;pgpSecretKeyID&quot;, pgpSecretKey.keyId()));
+	reset();
+
+	opt_enabled = o-&gt;getOption(base + &quot;.enabled&quot;).toBool();
+	opt_auto = o-&gt;getOption(base + &quot;.auto&quot;).toBool();
+	opt_keepAlive = o-&gt;getOption(base + &quot;.keep-alive&quot;).toBool();
+	opt_compress = o-&gt;getOption(base + &quot;.compress&quot;).toBool();
+	req_mutual_auth = o-&gt;getOption(base + &quot;.require-mutual-auth&quot;).toBool();
+	legacy_ssl_probe = o-&gt;getOption(base + &quot;.legacy-ssl-probe&quot;).toBool();
+	opt_automatic_resource = o-&gt;getOption(base + &quot;.automatic-resource&quot;).toBool();
+	opt_log = o-&gt;getOption(base + &quot;.log&quot;).toBool();
+	opt_reconn = o-&gt;getOption(base + &quot;.reconn&quot;).toBool();
+	opt_ignoreSSLWarnings = o-&gt;getOption(base + &quot;.ignore-SSL-warnings&quot;).toBool();
+	
+	name = o-&gt;getOption(base + &quot;.name&quot;).toString();
+	jid = o-&gt;getOption(base + &quot;.jid&quot;).toString();
+
+	customAuth = o-&gt;getOption(base + &quot;.custom-auth.use&quot;).toBool();
+	authid = o-&gt;getOption(base + &quot;.custom-auth.authid&quot;).toString();
+	realm = o-&gt;getOption(base + &quot;.custom-auth.realm&quot;).toString();
+
+	// read password (we must do this after reading the jid, to decode properly)
+	QString tmp = o-&gt;getOption(base + &quot;.password&quot;).toString();
+	if(!tmp.isEmpty()) {
+		opt_pass = TRUE;
+		pass = decodePassword(tmp, jid);
 	}
-	a.appendChild(textTag(doc, &quot;allow-plain&quot;, allow_plain));
 	
-	QDomElement r = doc.createElement(&quot;roster&quot;);
-	a.appendChild(r);
-	Roster::ConstIterator rit = roster.begin();
-	for ( ; rit != roster.end(); ++rit) {
-		const RosterItem &amp;i = *rit;
-		QDomElement tag = i.toXml(&amp;doc);
-		r.appendChild(tag);
+	opt_host = o-&gt;getOption(base + &quot;.use-host&quot;).toBool();
+	security_level = o-&gt;getOption(base + &quot;.security-level&quot;).toInt();
+	
+	tmp = o-&gt;getOption(base + &quot;.ssl&quot;).toString();
+	if (tmp == &quot;no&quot;) {
+		ssl = SSL_No;
+	} else if (tmp == &quot;yes&quot;) {
+		ssl = SSL_Yes;
+	} else if (tmp == &quot;auto&quot;) {
+		ssl = SSL_Auto;
+	} else if (tmp == &quot;legacy&quot;) {
+		ssl = SSL_Legacy;
+	} else {
+		ssl = SSL_Yes;
 	}
+	
+	host = o-&gt;getOption(base + &quot;.host&quot;).toString();
+	port = o-&gt;getOption(base + &quot;.port&quot;).toInt();
+	
+	resource = o-&gt;getOption(base + &quot;.resource&quot;).toString();
+	priority = o-&gt;getOption(base + &quot;.priority&quot;).toInt();
+	
+	QString pgpSecretKeyID = o-&gt;getOption(base + &quot;.pgp-secret-key-id&quot;).toString();
+	if (!pgpSecretKeyID.isEmpty()) {
+		QCA::KeyStoreEntry e = PGPUtil::instance().getSecretKeyStoreEntry(pgpSecretKeyID);
+		if (!e.isNull())
+			pgpSecretKey = e.pgpSecretKey();
+	}
+	
+	tmp = o-&gt;getOption(base + &quot;.allow-plain&quot;).toString();
+	if (tmp == &quot;never&quot;) {
+		allow_plain = XMPP::ClientStream::NoAllowPlain;
+	} else if (tmp == &quot;always&quot;) {
+		allow_plain = XMPP::ClientStream::AllowPlain;
+	} else if (tmp == &quot;over encryped&quot;) {
+		allow_plain = XMPP::ClientStream::AllowPlainOverTLS;
+	} else {
+		allow_plain = XMPP::ClientStream::NoAllowPlain;		
+	}
+	
+	QStringList rosterCache = o-&gt;getChildOptionNames(base + &quot;.roster-cache&quot;, true, true);
+	foreach(QString rbase, rosterCache) {
+		RosterItem ri;
+		ri.setJid(Jid(o-&gt;getOption(rbase + &quot;.jid&quot;).toString()));
+		ri.setName(o-&gt;getOption(rbase + &quot;.name&quot;).toString());
+		Subscription s;
+		s.fromString(o-&gt;getOption(rbase + &quot;.subscription&quot;).toString());
+		ri.setSubscription(s);
+		ri.setAsk(o-&gt;getOption(rbase + &quot;.ask&quot;).toString());
+		ri.setGroups(o-&gt;getOption(rbase + &quot;.groups&quot;).toStringList());
+		roster += ri;
+	}
+
+	groupState.clear();
+	QVariantList states = o-&gt;mapKeyList(base + &quot;.group-state&quot;);
+	foreach(QVariant k, states) {
+		GroupData gd;
+		QString sbase = o-&gt;mapLookup(base + &quot;.group-state&quot;, k);
+		gd.open = o-&gt;getOption(sbase + &quot;.open&quot;).toBool();
+		gd.rank = o-&gt;getOption(sbase + &quot;.rank&quot;).toInt();
+		groupState.insert(k.toString(), gd);
+	}
+	
+	proxyID = o-&gt;getOption(base + &quot;.proxy-id&quot;).toString();
+
+	keybind.fromOptions(o, base + &quot;.pgp-key-bindings&quot;);
+
+	dtProxy = o-&gt;getOption(base + &quot;.bytestreams-proxy&quot;).toString();
+}
 
+void UserAccount::toOptions(OptionsTree *o, QString base)
+{
+	if (base.isEmpty()) {
+		base = optionsBase;
+	}
+	// clear old data away
+	o-&gt;removeOption(base, true);
+	
+	o-&gt;setOption(base + &quot;.enabled&quot;, opt_enabled);
+	o-&gt;setOption(base + &quot;.auto&quot;, opt_auto);
+	o-&gt;setOption(base + &quot;.keep-alive&quot;, opt_keepAlive);
+	o-&gt;setOption(base + &quot;.compress&quot;, opt_compress);
+	o-&gt;setOption(base + &quot;.require-mutual-auth&quot;, req_mutual_auth);
+	o-&gt;setOption(base + &quot;.legacy-ssl-probe&quot;, legacy_ssl_probe);
+	o-&gt;setOption(base + &quot;.automatic-resource&quot;, opt_automatic_resource);
+	o-&gt;setOption(base + &quot;.log&quot;, opt_log);
+	o-&gt;setOption(base + &quot;.reconn&quot;, opt_reconn);
+	o-&gt;setOption(base + &quot;.ignore-SSL-warnings&quot;, opt_ignoreSSLWarnings);
+
+	o-&gt;setOption(base + &quot;.name&quot;, name);
+	o-&gt;setOption(base + &quot;.jid&quot;, jid);
+	
+	o-&gt;setOption(base + &quot;.custom-auth.use&quot;, customAuth);
+	o-&gt;setOption(base + &quot;.custom-auth.authid&quot;, authid);
+	o-&gt;setOption(base + &quot;.custom-auth.realm&quot;, realm);
+
+	if(opt_pass) {
+		o-&gt;setOption(base + &quot;.password&quot;, encodePassword(pass, jid));
+	} else {
+		o-&gt;setOption(base + &quot;.password&quot;, &quot;&quot;);
+	}
+	o-&gt;setOption(base + &quot;.use-host&quot;, opt_host);
+	o-&gt;setOption(base + &quot;.security-level&quot;, security_level);
+	switch (ssl) {
+		case SSL_No:
+			o-&gt;setOption(base + &quot;.ssl&quot;, &quot;no&quot;);
+			break;
+		case SSL_Yes:
+			o-&gt;setOption(base + &quot;.ssl&quot;, &quot;yes&quot;);
+			break;
+		case SSL_Auto:
+			o-&gt;setOption(base + &quot;.ssl&quot;, &quot;auto&quot;);
+			break;
+		case SSL_Legacy:
+			o-&gt;setOption(base + &quot;.ssl&quot;, &quot;legacy&quot;);
+			break;
+		default:
+			qFatal(&quot;unknown ssl enum value in UserAccount::toOptions&quot;);
+	}
+	o-&gt;setOption(base + &quot;.host&quot;, host);
+	o-&gt;setOption(base + &quot;.port&quot;, port);
+	o-&gt;setOption(base + &quot;.resource&quot;, resource);
+	o-&gt;setOption(base + &quot;.priority&quot;, priority);
+	if (!pgpSecretKey.isNull()) {
+		o-&gt;setOption(base + &quot;.pgp-secret-key-id&quot;, pgpSecretKey.keyId());
+	} else {
+		o-&gt;setOption(base + &quot;.pgp-secret-key-id&quot;, &quot;&quot;);
+	}
+	switch (allow_plain) {
+		case XMPP::ClientStream::NoAllowPlain:
+			o-&gt;setOption(base + &quot;.allow-plain&quot;, &quot;never&quot;);
+			break;
+		case XMPP::ClientStream::AllowPlain:
+			o-&gt;setOption(base + &quot;.allow-plain&quot;, &quot;always&quot;);
+			break;
+		case XMPP::ClientStream::AllowPlainOverTLS:
+			o-&gt;setOption(base + &quot;.allow-plain&quot;, &quot;over encryped&quot;);
+			break;
+		default:
+			qFatal(&quot;unknown allow_plain enum value in UserAccount::toOptions&quot;);
+	}
+	
+	int idx = 0;
+	foreach(RosterItem ri, roster) {
+		QString rbase = base + &quot;.roster-cache.a&quot; + QString::number(idx++);
+		o-&gt;setOption(rbase + &quot;.jid&quot;, ri.jid().full());
+		o-&gt;setOption(rbase + &quot;.name&quot;, ri.name());
+		o-&gt;setOption(rbase + &quot;.subscription&quot;, ri.subscription().toString());
+		o-&gt;setOption(rbase + &quot;.ask&quot;, ri.ask());
+		o-&gt;setOption(rbase + &quot;.groups&quot;, ri.groups());
+	}
+	
 	// now we check for redundant entries
-	QStringList groupList, removeList;
+	QStringList groupList;
+	QSet&lt;QString&gt; removeList;
 	groupList &lt;&lt; &quot;/\\/&quot; + name + &quot;\\/\\&quot;; // account name is a very 'special' group
 
 	// special groups that should also have their state remembered
@@ -194,58 +345,34 @@ QDomElement UserAccount::toXml(QDomDocument &amp;doc, const QString &amp;tagName)
 	groupList &lt;&lt; qApp-&gt;translate(&quot;ContactProfile&quot;, &quot;Agents/Transports&quot;);
 
 	// first, add all groups' names to groupList
-	rit = roster.begin();
-	for ( ; rit != roster.end(); ++rit) {
-		const RosterItem &amp;i = *rit;
+	foreach(RosterItem i, roster) {
 		groupList += i.groups();
 	}
 
 	// now, check if there's groupState name entry in groupList
-	QMap&lt;QString, GroupData&gt;::Iterator git = groupState.begin();
-	for ( ; git != groupState.end(); ++git) {
-		bool found = false;
-
-		QStringList::Iterator it = groupList.begin();
-		for ( ; it != groupList.end(); ++it)
-			if ( git.key() == *it ) {
-				found = true;
-				break;
-			}
-
-		if ( !found )
-			removeList &lt;&lt; git.key();
+	foreach(QString group, groupState.keys()) {
+		if (!groupList.contains(group)) {
+			removeList &lt;&lt; group;
+		}
 	}
 
 	// remove redundant groups
-	QStringList::Iterator it = removeList.begin();
-	for ( ; it != removeList.end(); ++it)
-		groupState.remove( *it );
+	foreach(QString group, removeList) {
+		groupState.remove( group );
+	}
 
 	// and finally, save the data
-	QDomElement gs = doc.createElement(&quot;groupState&quot;);
-	a.appendChild(gs);
-	git = groupState.begin();
-	for ( ; git != groupState.end(); ++git) {
-		//if ( !git.data().open || git.data().rank ) { // don't save unnecessary entries (the default is 'true' to open, and '0' to rank)
-			QDomElement group = doc.createElement(&quot;group&quot;);
-			group.setAttribute(&quot;name&quot;, git.key());
-			group.setAttribute(&quot;open&quot;, git.data().open ? &quot;true&quot; : &quot;false&quot;);
-			group.setAttribute(&quot;rank&quot;, QString::number(git.data().rank));
-			gs.appendChild(group);
-		//}
+	foreach(QString group, groupState.keys()) {
+		QString groupBase = o-&gt;mapPut(base + &quot;.group-state&quot;, group);
+		o-&gt;setOption(groupBase + &quot;.open&quot;, groupState[group].open);
+		o-&gt;setOption(groupBase + &quot;.rank&quot;, groupState[group].rank);
 	}
+		
+	o-&gt;setOption(base + &quot;.proxy-id&quot;, proxyID);
 
-	a.appendChild(textTag(doc, &quot;proxyindex&quot;, QString::number(proxy_index)));
-	//a.appendChild(textTag(doc, &quot;proxytype&quot;, QString::number(proxy_type)));
-	//a.appendChild(textTag(doc, &quot;proxyhost&quot;, proxy_host));
-	//a.appendChild(textTag(doc, &quot;proxyport&quot;, QString::number(proxy_port)));
-	//a.appendChild(textTag(doc, &quot;proxyuser&quot;, proxy_user));
-	//a.appendChild(textTag(doc, &quot;proxypass&quot;, encodePassword(proxy_pass, jid)));
-
-	a.appendChild(keybind.toXml(doc, &quot;pgpkeybindings&quot;));
-	a.appendChild(textTag(doc, &quot;dtProxy&quot;, dtProxy.full()));
-
-	return a;
+	keybind.toOptions(o, base + &quot;.pgp-key-bindings&quot;);
+	o-&gt;setOption(base + &quot;.bytestreams-proxy&quot;, dtProxy.full());
+	
 }
 
 void UserAccount::fromXml(const QDomElement &amp;a)
@@ -399,12 +526,9 @@ void UserAccount::fromXml(const QDomElement &amp;a)
 	dtProxy = str;
 }
 
-UserProfile::UserProfile()
-{
-	reset();
-}
-
-void UserProfile::reset()
+#if 0
+ LEGOPTFIXME
+void OptionsMigration::reset()
 {
 	bool nix, win, mac;
 	nix = win = mac = FALSE;
@@ -426,154 +550,143 @@ void UserProfile::reset()
 	proxyList.clear();
 	acc.clear();
 
-	// prefs
-	prefs.useleft = FALSE;
-	prefs.singleclick = FALSE;
- 	prefs.hideMenubar = FALSE;
-	prefs.defaultAction = 1;
-	prefs.delChats = dcHour;
-	prefs.browser = 0;
-	prefs.alwaysOnTop = FALSE;
-	prefs.keepSizes = TRUE;
-	prefs.ignoreHeadline = FALSE;
-	prefs.ignoreNonRoster = FALSE;
-	prefs.excludeGroupChatsFromIgnore = TRUE;
-	prefs.useDock = true;
-	prefs.dockDCstyle = win ? TRUE: FALSE;
-	prefs.dockHideMW = FALSE;
-	prefs.dockToolMW = FALSE;
+	// LEGOPTP
+	LEGOPTP.useleft = FALSE;
+	LEGOPTP.singleclick = FALSE;
+ 	LEGOPTP.hideMenubar = FALSE;
+	LEGOPTP.defaultAction = 1;
+	LEGOPTP.delChats = dcHour;
+	LEGOPTP.browser = 0;
+	LEGOPTP.alwaysOnTop = FALSE;
+	LEGOPTP.keepSizes = TRUE;
+	LEGOPTP.ignoreHeadline = FALSE;
+	LEGOPTP.ignoreNonRoster = FALSE;
+	LEGOPTP.excludeGroupChatsFromIgnore = TRUE;
+	LEGOPTP.useDock = true;
+	LEGOPTP.dockDCstyle = win ? TRUE: FALSE;
+	LEGOPTP.dockHideMW = FALSE;
+	LEGOPTP.dockToolMW = FALSE;
 #ifdef Q_WS_MAC
-	prefs.alertStyle = 0;
+	LEGOPTP.alertStyle = 0;
 #else
-	prefs.alertStyle = 2;
+	LEGOPTP.alertStyle = 2;
 #endif
-	prefs.popupMsgs = FALSE;
-	prefs.popupChats = FALSE;
-	prefs.popupHeadlines = FALSE;
-	prefs.popupFiles = FALSE;
-	prefs.noAwayPopup = FALSE;
-	prefs.noUnlistedPopup = false;
-	prefs.raise = FALSE;
-	prefs.incomingAs = 0;
-	prefs.askOnline = FALSE;
-	prefs.askOffline = FALSE;
-	prefs.rosterAnim = TRUE;
-	prefs.autoVCardOnLogin = true;
-	prefs.xmlConsoleOnLogin = false;
-	prefs.asAway = 10;
-	prefs.asXa = 30;
-	prefs.asOffline = 0;
-	prefs.use_asAway = TRUE;
-	prefs.use_asXa = TRUE;
-	prefs.use_asOffline = FALSE;
-	prefs.asMessage = QObject::tr(&quot;Auto Status (idle)&quot;);
-	prefs.scrollTo = TRUE;
-	prefs.useEmoticons = false;
-	prefs.alertOpenChats = true;
-	prefs.raiseChatWindow = false;
-	prefs.showSubjects = true;
-	prefs.showCounter = false;
-	prefs.chatSays = false;
-	prefs.showGroupCounts = true;
-	prefs.smallChats = false;
-	prefs.brushedMetal = false;
-	prefs.chatLineEdit = true;
-	prefs.useTabs = false;
-	prefs.usePerTabCloseButton = true;
-	prefs.putTabsAtBottom = false;
-	prefs.autoRosterSize = false;
-	prefs.autoRosterSizeGrowTop = false;
-	prefs.autoResolveNicksOnAdd = false;
-	prefs.chatBgImage = &quot;&quot;;
-	prefs.rosterBgImage = &quot;&quot;;
-	prefs.autoCopy = false;
-	prefs.useCaps = true;
-	prefs.useRC = false;
-
-	prefs.sp.clear();
+	LEGOPTP.popupMsgs = FALSE;
+	LEGOPTP.popupChats = FALSE;
+	LEGOPTP.popupHeadlines = FALSE;
+	LEGOPTP.popupFiles = FALSE;
+	LEGOPTP.noAwayPopup = FALSE;
+	LEGOPTP.noUnlistedPopup = false;
+	LEGOPTP.raise = FALSE;
+	LEGOPTP.incomingAs = 0;
+	LEGOPTP.askOnline = FALSE;
+	LEGOPTP.askOffline = FALSE;
+	LEGOPTP.rosterAnim = TRUE;
+	LEGOPTP.autoVCardOnLogin = true;
+	LEGOPTP.xmlConsoleOnLogin = false;
+	LEGOPTP.asAway = 10;
+	LEGOPTP.asXa = 30;
+	LEGOPTP.asOffline = 0;
+	LEGOPTP.use_asAway = TRUE;
+	LEGOPTP.use_asXa = TRUE;
+	LEGOPTP.use_asOffline = FALSE;
+	LEGOPTP.asMessage = QObject::tr(&quot;Auto Status (idle)&quot;);
+	LEGOPTP.scrollTo = TRUE;
+	LEGOPTP.useEmoticons = false;
+	LEGOPTP.alertOpenChats = true;
+	LEGOPTP.raiseChatWindow = false;
+	LEGOPTP.showSubjects = true;
+	LEGOPTP.showCounter = false;
+	LEGOPTP.chatSays = false;
+	LEGOPTP.showGroupCounts = true;
+	LEGOPTP.smallChats = false;
+	LEGOPTP.brushedMetal = false;
+	LEGOPTP.chatLineEdit = true;
+	LEGOPTP.useTabs = false;
+	LEGOPTP.usePerTabCloseButton = true;
+	LEGOPTP.putTabsAtBottom = false;
+	LEGOPTP.autoRosterSize = false;
+	LEGOPTP.autoRosterSizeGrowTop = false;
+	LEGOPTP.autoResolveNicksOnAdd = false;
+	LEGOPTP.chatBgImage = &quot;&quot;;
+	LEGOPTP.rosterBgImage = &quot;&quot;;
+	LEGOPTP.autoCopy = false;
+	LEGOPTP.useCaps = true;
+	LEGOPTP.useRC = false;
+
+	LEGOPTP.sp.clear();
 	QString name;
 	name = QObject::tr(&quot;Away from desk&quot;);
-	prefs.sp[name] = StatusPreset(name, QObject::tr(&quot;I am away from my desk.  Leave a message.&quot;), STATUS_AWAY);;
+	LEGOPTP.sp[name] = StatusPreset(name, QObject::tr(&quot;I am away from my desk.  Leave a message.&quot;), STATUS_AWAY);;
 	name = QObject::tr(&quot;Showering&quot;);
-	prefs.sp[name] = StatusPreset(name, QObject::tr(&quot;I'm in the shower.  You'll have to wait for me to get out.&quot;), STATUS_AWAY);
+	LEGOPTP.sp[name] = StatusPreset(name, QObject::tr(&quot;I'm in the shower.  You'll have to wait for me to get out.&quot;), STATUS_AWAY);
 	name = QObject::tr(&quot;Eating&quot;);
-	prefs.sp[name] = StatusPreset(name, QObject::tr(&quot;Out eating.  Mmmm.. food.&quot;), STATUS_AWAY);
+	LEGOPTP.sp[name] = StatusPreset(name, QObject::tr(&quot;Out eating.  Mmmm.. food.&quot;), STATUS_AWAY);
 	name = QObject::tr(&quot;Sleep&quot;);
-	prefs.sp[name] = StatusPreset(name, QObject::tr(&quot;Sleep is good.  Zzzzz&quot;),STATUS_DND);
+	LEGOPTP.sp[name] = StatusPreset(name, QObject::tr(&quot;Sleep is good.  Zzzzz&quot;),STATUS_DND);
 	name = QObject::tr(&quot;Work&quot;);
-	prefs.sp[name] = StatusPreset(name, QObject::tr(&quot;Can't chat.  Gotta work.&quot;), STATUS_DND);
+	LEGOPTP.sp[name] = StatusPreset(name, QObject::tr(&quot;Can't chat.  Gotta work.&quot;), STATUS_DND);
 	name = QObject::tr(&quot;Air&quot;);
-	prefs.sp[name] = StatusPreset(name, QObject::tr(&quot;Stepping out to get some fresh air.&quot;), STATUS_AWAY);
+	LEGOPTP.sp[name] = StatusPreset(name, QObject::tr(&quot;Stepping out to get some fresh air.&quot;), STATUS_AWAY);
 	name = QObject::tr(&quot;Movie&quot;);
-	prefs.sp[name] = StatusPreset(name, QObject::tr(&quot;Out to a movie.  Is that OK with you?&quot;), STATUS_AWAY);
+	LEGOPTP.sp[name] = StatusPreset(name, QObject::tr(&quot;Out to a movie.  Is that OK with you?&quot;), STATUS_AWAY);
 	name = QObject::tr(&quot;Secret&quot;);
-	prefs.sp[name] = StatusPreset(name, QObject::tr(&quot;I'm not available right now and that's all you need to know.&quot;), STATUS_XA);
+	LEGOPTP.sp[name] = StatusPreset(name, QObject::tr(&quot;I'm not available right now and that's all you need to know.&quot;), STATUS_XA);
 	name = QObject::tr(&quot;Out for the night&quot;);
-	prefs.sp[name] = StatusPreset(name, QObject::tr(&quot;Out for the night.&quot;), STATUS_AWAY);
+	LEGOPTP.sp[name] = StatusPreset(name, QObject::tr(&quot;Out for the night.&quot;), STATUS_AWAY);
 	name = QObject::tr(&quot;Greece&quot;);
-	prefs.sp[name] = StatusPreset(name, QObject::tr(&quot;I have gone to a far away place.  I will be back someday!&quot;), STATUS_XA);
- 	prefs.recentStatus.clear();
-
-	prefs.color[cOnline]    = QColor(&quot;#000000&quot;);
-	prefs.color[cListBack]  = QColor(&quot;#FFFFFF&quot;);
-	prefs.color[cAway]      = QColor(&quot;#004BB4&quot;);
-	prefs.color[cDND]       = QColor(&quot;#7E0000&quot;);
-	prefs.color[cOffline]   = QColor(&quot;#646464&quot;);
-	prefs.color[cStatus]    = QColor(&quot;#808080&quot;);
-	prefs.color[cProfileFore] = QColor(&quot;#FFFFFF&quot;);
-	prefs.color[cProfileBack] = QColor(&quot;#969696&quot;);
-	prefs.color[cGroupFore] = QColor(&quot;#5A5A5A&quot;);
-	prefs.color[cGroupBack] = QColor(&quot;#F0F0F0&quot;);
-	prefs.color[cAnimFront] = QColor(&quot;#000000&quot;);
-	prefs.color[cAnimBack] 	= QColor(&quot;#969696&quot;);
-
-	prefs.font[fRoster] = QApplication::font().toString();
-	prefs.font[fMessage] = QApplication::font().toString();
-	prefs.font[fChat] = QApplication::font().toString();
+	LEGOPTP.sp[name] = StatusPreset(name, QObject::tr(&quot;I have gone to a far away place.  I will be back someday!&quot;), STATUS_XA);
+ 	LEGOPTP.recentStatus.clear();
+
+	LEGOPTP.color[cOnline]    = QColor(&quot;#000000&quot;);
+	LEGOPTP.color[cListBack]  = QColor(&quot;#FFFFFF&quot;);
+	LEGOPTP.color[cAway]      = QColor(&quot;#004BB4&quot;);
+	LEGOPTP.color[cDND]       = QColor(&quot;#7E0000&quot;);
+	LEGOPTP.color[cOffline]   = QColor(&quot;#646464&quot;);
+	LEGOPTP.color[cStatus]    = QColor(&quot;#808080&quot;);
+	LEGOPTP.color[cProfileFore] = QColor(&quot;#FFFFFF&quot;);
+	LEGOPTP.color[cProfileBack] = QColor(&quot;#969696&quot;);
+	LEGOPTP.color[cGroupFore] = QColor(&quot;#5A5A5A&quot;);
+	LEGOPTP.color[cGroupBack] = QColor(&quot;#F0F0F0&quot;);
+	LEGOPTP.color[cAnimFront] = QColor(&quot;#000000&quot;);
+	LEGOPTP.color[cAnimBack] 	= QColor(&quot;#969696&quot;);
+
+	LEGOPTP.font[fRoster] = QApplication::font().toString();
+	LEGOPTP.font[fMessage] = QApplication::font().toString();
+	LEGOPTP.font[fChat] = QApplication::font().toString();
 	{
 		QFont font = QApplication::font();
 		font.setPointSize( font.pointSize() - 2 );
-		prefs.font[fPopup] = font.toString();
+		LEGOPTP.font[fPopup] = font.toString();
 	}
+	LEGOPTP.clNewHeadings = false;
+	LEGOPTP.outlineHeadings = false;
+
+	LEGOPTP.player = &quot;play&quot;;
+	LEGOPTP.noAwaySound = FALSE;
+
+	LEGOPTP.onevent[eMessage]    = ApplicationInfo::resourcesDir() + &quot;/sound/chat2.wav&quot;;
+	LEGOPTP.onevent[eChat1]      = ApplicationInfo::resourcesDir() + &quot;/sound/chat1.wav&quot;;
+	LEGOPTP.onevent[eChat2]      = ApplicationInfo::resourcesDir() + &quot;/sound/chat2.wav&quot;;
+	LEGOPTP.onevent[eSystem]     = ApplicationInfo::resourcesDir() + &quot;/sound/chat2.wav&quot;;
+	LEGOPTP.onevent[eHeadline]   = ApplicationInfo::resourcesDir() + &quot;/sound/chat2.wav&quot;;
+	LEGOPTP.onevent[eOnline]     = ApplicationInfo::resourcesDir() + &quot;/sound/online.wav&quot;;
+	LEGOPTP.onevent[eOffline]    = ApplicationInfo::resourcesDir() + &quot;/sound/offline.wav&quot;;
+	LEGOPTP.onevent[eSend]       = ApplicationInfo::resourcesDir() + &quot;/sound/send.wav&quot;;
+	LEGOPTP.onevent[eIncomingFT] = ApplicationInfo::resourcesDir() + &quot;/sound/ft_incoming.wav&quot;;
+	LEGOPTP.onevent[eFTComplete] = ApplicationInfo::resourcesDir() + &quot;/sound/ft_complete.wav&quot;;
+
+
+	LEGOPTP.sizeEventDlg = EventDlg::defaultSize();
+	LEGOPTP.sizeChatDlg = ChatDlg::defaultSize();
+	LEGOPTP.sizeTabDlg = ChatDlg::defaultSize(); //TODO: no!
 
-	// calculate the small font size
-	const int minimumFontSize = 7;
-	prefs.smallFontSize = qApp-&gt;font().pointSize();
-	prefs.smallFontSize -= 2;
-	if ( prefs.smallFontSize &lt; minimumFontSize )
-		prefs.smallFontSize = minimumFontSize;
-	FancyLabel::setSmallFontSize( prefs.smallFontSize );
-
-	prefs.clNewHeadings = false;
-	prefs.outlineHeadings = false;
-
-	prefs.player = &quot;play&quot;;
-	prefs.noAwaySound = FALSE;
-
-	prefs.onevent[eMessage]    = ApplicationInfo::resourcesDir() + &quot;/sound/chat2.wav&quot;;
-	prefs.onevent[eChat1]      = ApplicationInfo::resourcesDir() + &quot;/sound/chat1.wav&quot;;
-	prefs.onevent[eChat2]      = ApplicationInfo::resourcesDir() + &quot;/sound/chat2.wav&quot;;
-	prefs.onevent[eSystem]     = ApplicationInfo::resourcesDir() + &quot;/sound/chat2.wav&quot;;
-	prefs.onevent[eHeadline]   = ApplicationInfo::resourcesDir() + &quot;/sound/chat2.wav&quot;;
-	prefs.onevent[eOnline]     = ApplicationInfo::resourcesDir() + &quot;/sound/online.wav&quot;;
-	prefs.onevent[eOffline]    = ApplicationInfo::resourcesDir() + &quot;/sound/offline.wav&quot;;
-	prefs.onevent[eSend]       = ApplicationInfo::resourcesDir() + &quot;/sound/send.wav&quot;;
-	prefs.onevent[eIncomingFT] = ApplicationInfo::resourcesDir() + &quot;/sound/ft_incoming.wav&quot;;
-	prefs.onevent[eFTComplete] = ApplicationInfo::resourcesDir() + &quot;/sound/ft_complete.wav&quot;;
-
-	// Added by Kiko 020621: sets up the default certificate store
-	prefs.trustCertStoreDir = ApplicationInfo::resourcesDir() + &quot;/certs&quot;;
-
-	prefs.sizeEventDlg = EventDlg::defaultSize();
-	prefs.sizeChatDlg = ChatDlg::defaultSize();
-	prefs.sizeTabDlg = ChatDlg::defaultSize(); //TODO: no!
-
-	prefs.jidComplete = true;
-	prefs.grabUrls = false;
-	prefs.noGCSound = true;
+	LEGOPTP.jidComplete = true;
+	LEGOPTP.grabUrls = false;
+	LEGOPTP.noGCSound = true;
 
 	// toolbars
-	prefs.toolbars.clear();
+	LEGOPTP.toolbars.clear();
 
 	Options::ToolbarPrefs tbDef;
 	tbDef.name = QString::null;
@@ -625,107 +738,104 @@ void UserProfile::reset()
 		tb[2].index = 0;
 
 		for ( i = 0; i &lt; sizeof(tb)/sizeof(Options::ToolbarPrefs); i++ )
-			prefs.toolbars[&quot;mainWin&quot;].append( tb[i] );
+			LEGOPTP.toolbars[&quot;mainWin&quot;].append( tb[i] );
 	}
 
 	// groupchat
-	prefs.gcHighlighting = true;
-	prefs.gcHighlights.clear();
+	LEGOPTP.gcHighlighting = true;
+	LEGOPTP.gcHighlights.clear();
 
-	prefs.gcNickColoring = true;
-	prefs.gcNickColors.clear();
+	LEGOPTP.gcNickColoring = true;
+	LEGOPTP.gcNickColors.clear();
 
-	prefs.gcNickColors &lt;&lt; &quot;Blue&quot;;
-	prefs.gcNickColors &lt;&lt; &quot;Green&quot;;
-	prefs.gcNickColors &lt;&lt; &quot;Orange&quot;;
-	prefs.gcNickColors &lt;&lt; &quot;Purple&quot;;
-	prefs.gcNickColors &lt;&lt; &quot;Red&quot;;
+	LEGOPTP.gcNickColors &lt;&lt; &quot;Blue&quot;;
+	LEGOPTP.gcNickColors &lt;&lt; &quot;Green&quot;;
+	LEGOPTP.gcNickColors &lt;&lt; &quot;Orange&quot;;
+	LEGOPTP.gcNickColors &lt;&lt; &quot;Purple&quot;;
+	LEGOPTP.gcNickColors &lt;&lt; &quot;Red&quot;;
 
 	// popups
-	prefs.ppIsOn        = false;
-	prefs.ppOnline      = true;
-	prefs.ppOffline     = true;
-	prefs.ppStatus      = false;
-	prefs.ppMessage     = true;
-	prefs.ppChat        = true;
-	prefs.ppHeadline    = true;
-	prefs.ppFile        = true;
-	prefs.ppJidClip     = 25;
-	prefs.ppStatusClip  = -1;
-	prefs.ppTextClip    = 300;
-	prefs.ppHideTime    = 10000; // 10 sec
-	prefs.ppBorderColor = QColor (0x52, 0x97, 0xF9);
+	LEGOPTP.ppIsOn        = false;
+	LEGOPTP.ppOnline      = true;
+	LEGOPTP.ppOffline     = true;
+	LEGOPTP.ppStatus      = false;
+	LEGOPTP.ppMessage     = true;
+	LEGOPTP.ppChat        = true;
+	LEGOPTP.ppHeadline    = true;
+	LEGOPTP.ppFile        = true;
+	LEGOPTP.ppJidClip     = 25;
+	LEGOPTP.ppStatusClip  = -1;
+	LEGOPTP.ppTextClip    = 300;
+	LEGOPTP.ppHideTime    = 10000; // 10 sec
+	LEGOPTP.ppBorderColor = QColor (0x52, 0x97, 0xF9);
 
 	// Bouncing of the dock (Mac OS X)
-	prefs.bounceDock = Options::BounceForever;
+	LEGOPTP.bounceDock = Options::BounceForever;
 
 	// lockdown
-	prefs.lockdown.roster   = false;
-	prefs.lockdown.services = false;
+	LEGOPTP.lockdown.roster   = false;
+	LEGOPTP.lockdown.services = false;
 
-	prefs.useTransportIconsForContacts = false;
+	LEGOPTP.useTransportIconsForContacts = false;
 
 	// iconsets
-	prefs.systemIconset = &quot;default&quot;;
-	prefs.emoticons = QStringList(&quot;default&quot;);
-	prefs.defaultRosterIconset = &quot;default&quot;;
+	LEGOPTP.systemIconset = &quot;default&quot;;
+	LEGOPTP.emoticons = QStringList(&quot;default&quot;);
+	LEGOPTP.defaultRosterIconset = &quot;default&quot;;
 
-	prefs.serviceRosterIconset.clear();
-	prefs.serviceRosterIconset[&quot;transport&quot;]	= &quot;crystal-service.jisp&quot;;
-	prefs.serviceRosterIconset[&quot;aim&quot;]	= &quot;crystal-aim.jisp&quot;;
-	prefs.serviceRosterIconset[&quot;gadugadu&quot;]	= &quot;crystal-gadugadu.jisp&quot;;
-	prefs.serviceRosterIconset[&quot;icq&quot;]	= &quot;crystal-icq.jisp&quot;;
-	prefs.serviceRosterIconset[&quot;msn&quot;]	= &quot;crystal-msn.jisp&quot;;
-	prefs.serviceRosterIconset[&quot;yahoo&quot;]	= &quot;crystal-yahoo.jisp&quot;;
-	prefs.serviceRosterIconset[&quot;sms&quot;]	= &quot;crystal-sms.jisp&quot;;
+	LEGOPTP.serviceRosterIconset.clear();
+	LEGOPTP.serviceRosterIconset[&quot;transport&quot;]	= &quot;crystal-service.jisp&quot;;
+	LEGOPTP.serviceRosterIconset[&quot;aim&quot;]	= &quot;crystal-aim.jisp&quot;;
+	LEGOPTP.serviceRosterIconset[&quot;gadugadu&quot;]	= &quot;crystal-gadugadu.jisp&quot;;
+	LEGOPTP.serviceRosterIconset[&quot;icq&quot;]	= &quot;crystal-icq.jisp&quot;;
+	LEGOPTP.serviceRosterIconset[&quot;msn&quot;]	= &quot;crystal-msn.jisp&quot;;
+	LEGOPTP.serviceRosterIconset[&quot;yahoo&quot;]	= &quot;crystal-yahoo.jisp&quot;;
+	LEGOPTP.serviceRosterIconset[&quot;sms&quot;]	= &quot;crystal-sms.jisp&quot;;
 
-	prefs.customRosterIconset.clear();
+	LEGOPTP.customRosterIconset.clear();
 
 	// roster sorting
-	prefs.rosterContactSortStyle = Options::ContactSortStyle_Status;
-	prefs.rosterGroupSortStyle   = Options::GroupSortStyle_Alpha;
-	prefs.rosterAccountSortStyle = Options::AccountSortStyle_Alpha;
+	LEGOPTP.rosterContactSortStyle = Options::ContactSortStyle_Status;
+	LEGOPTP.rosterGroupSortStyle   = Options::GroupSortStyle_Alpha;
+	LEGOPTP.rosterAccountSortStyle = Options::AccountSortStyle_Alpha;
 
 	// disco dialog
-	prefs.discoItems = false;
-	prefs.discoInfo  = true;
+	LEGOPTP.discoItems = false;
+	LEGOPTP.discoInfo  = true;
 
 	// auto-auth
-	prefs.autoAuth = false;
+	LEGOPTP.autoAuth = false;
 
 	// Notify authorization
-	prefs.notifyAuth = false;
+	LEGOPTP.notifyAuth = false;
 
 	// message events
-	prefs.messageEvents = true;
-	prefs.inactiveEvents = false;
+	LEGOPTP.messageEvents = true;
+	LEGOPTP.inactiveEvents = false;
 
 	// event priority
-	prefs.eventPriorityHeadline = 0;
-	prefs.eventPriorityChat     = 1;
-	prefs.eventPriorityMessage  = 1;
-	prefs.eventPriorityAuth     = 2;
-	prefs.eventPriorityFile     = 3;
-	prefs.eventPriorityFile     = 2;
+	LEGOPTP.eventPriorityHeadline = 0;
+	LEGOPTP.eventPriorityChat     = 1;
+	LEGOPTP.eventPriorityMessage  = 1;
+	LEGOPTP.eventPriorityAuth     = 2;
+	LEGOPTP.eventPriorityFile     = 3;
+	LEGOPTP.eventPriorityFile     = 2;
 
 	// Last used path remembering
-	prefs.lastPath = QDir::homeDirPath();
-	prefs.lastSavePath = QDir::homeDirPath();
+	LEGOPTP.lastPath = QDir::homeDirPath();
+	LEGOPTP.lastSavePath = QDir::homeDirPath();
 
 	// data transfer
-	prefs.dtPort = 8010;
-	prefs.dtExternal = &quot;&quot;;
+	LEGOPTP.dtPort = 8010;
+	LEGOPTP.dtExternal = &quot;&quot;;
 
-	// advanced widget
-	GAdvancedWidget::setStickEnabled( false ); //until this is bugless
-	GAdvancedWidget::setStickToWindows( false ); //again
-	GAdvancedWidget::setStickAt( 5 );
 }
+#endif
 
-static Options::ToolbarPrefs loadToolbarData( const QDomElement &amp;e )
+static ToolbarPrefs loadToolbarData( const QDomElement &amp;e )
 {
 	QDomElement tb_prefs = e;
-	Options::ToolbarPrefs tb;
+	ToolbarPrefs tb;
 
 	readEntry(tb_prefs, &quot;name&quot;,		&amp;tb.name);
 	readBoolEntry(tb_prefs, &quot;on&quot;,		&amp;tb.on);
@@ -765,492 +875,8 @@ static Options::ToolbarPrefs loadToolbarData( const QDomElement &amp;e )
 	return tb;
 }
 
-bool UserProfile::toFile(const QString &amp;fname)
-{
-	QDomDocument doc;
-
-	QDomElement base = doc.createElement(&quot;psiconf&quot;);
-	base.setAttribute(&quot;version&quot;, &quot;1.0&quot;);
-	doc.appendChild(base);
-
-	base.appendChild(textTag(doc, &quot;progver&quot;, ApplicationInfo::version()));
-	base.appendChild(textTag(doc, &quot;geom&quot;, mwgeom));
-	base.appendChild(stringListToXml(doc, &quot;recentGCList&quot;, recentGCList));
-	base.appendChild(stringListToXml(doc, &quot;recentBrowseList&quot;, recentBrowseList));
-	base.appendChild(textTag(doc, &quot;lastStatusString&quot;, lastStatusString));
-	base.appendChild(textTag(doc, &quot;useSound&quot;, useSound));
-
-	QDomElement accs = doc.createElement(&quot;accounts&quot;);
-	base.appendChild(accs);
-	for(UserAccountList::Iterator ai = acc.begin(); ai != acc.end(); ++ai)
-		accs.appendChild((*ai).toXml(doc, &quot;account&quot;));
-
-	QDomElement prox = doc.createElement(&quot;proxies&quot;);
-	base.appendChild(prox);
-	for(ProxyItemList::Iterator pi = proxyList.begin(); pi != proxyList.end(); ++pi) {
-		const ProxyItem &amp;p = *pi;
-		QDomElement i = doc.createElement(&quot;proxy&quot;);
-		i.appendChild(textTag(doc, &quot;name&quot;, p.name));
-		i.appendChild(textTag(doc, &quot;type&quot;, p.type));
-		i.appendChild(p.settings.toXml(&amp;doc));
-		prox.appendChild(i);
-	}
-
-	QDomElement p = doc.createElement(&quot;preferences&quot;);
-	base.appendChild(p);
-
-	{
-		QDomElement p_general = doc.createElement(&quot;general&quot;);
-		p.appendChild(p_general);
-
-		{
-			QDomElement p_roster = doc.createElement(&quot;roster&quot;);
-			p_general.appendChild(p_roster);
-
-			p_roster.appendChild(textTag(doc, &quot;useleft&quot;, prefs.useleft));
-			p_roster.appendChild(textTag(doc, &quot;rosterBgImage&quot;, prefs.rosterBgImage));
-			p_roster.appendChild(textTag(doc, &quot;singleclick&quot;, prefs.singleclick));
-			p_roster.appendChild(textTag(doc, &quot;hideMenubar&quot;, prefs.hideMenubar));
-			p_roster.appendChild(textTag(doc, &quot;defaultAction&quot;, prefs.defaultAction));
-			p_roster.appendChild(textTag(doc, &quot;useTransportIconsForContacts&quot;, prefs.useTransportIconsForContacts));
-
-			{
-				QDomElement sorting = doc.createElement(&quot;sortStyle&quot;);
-				p_roster.appendChild(sorting);
-
-				QString name = &quot;status&quot;;
-				if ( prefs.rosterContactSortStyle == Options::ContactSortStyle_Alpha )
-					name = &quot;alpha&quot;;
-				sorting.appendChild(textTag(doc, &quot;contact&quot;, name));
-
-				name = &quot;alpha&quot;;
-				if ( prefs.rosterGroupSortStyle == Options::GroupSortStyle_Rank )
-					name = &quot;rank&quot;;
-				sorting.appendChild(textTag(doc, &quot;group&quot;, name));
-
-				name = &quot;alpha&quot;;
-				if ( prefs.rosterAccountSortStyle == Options::AccountSortStyle_Rank )
-					name = &quot;rank&quot;;
-				sorting.appendChild(textTag(doc, &quot;account&quot;, name));
-			}
-		}
-
-		{
-			QDomElement p_misc = doc.createElement(&quot;misc&quot;);
-			p_general.appendChild(p_misc);
-
-			p_misc.appendChild(textTag(doc, &quot;chatBgImage&quot;, prefs.chatBgImage));
-			p_misc.appendChild(textTag(doc, &quot;smallChats&quot;, prefs.smallChats));
-			p_misc.appendChild(textTag(doc, &quot;brushedMetal&quot;, prefs.brushedMetal));
-			p_misc.appendChild(textTag(doc, &quot;chatLineEdit&quot;, prefs.chatLineEdit));
-			p_misc.appendChild(textTag(doc, &quot;useTabs&quot;, prefs.useTabs));
-			p_misc.appendChild(textTag(doc, &quot;usePerTabCloseButton&quot;, prefs.usePerTabCloseButton));
-			p_misc.appendChild(textTag(doc, &quot;putTabsAtBottom&quot;, prefs.putTabsAtBottom));
-			p_misc.appendChild(textTag(doc, &quot;autoRosterSize&quot;, prefs.autoRosterSize));
-			p_misc.appendChild(textTag(doc, &quot;autoRosterSizeGrowTop&quot;, prefs.autoRosterSizeGrowTop));
-			p_misc.appendChild(textTag(doc, &quot;autoResolveNicksOnAdd&quot;, prefs.autoResolveNicksOnAdd));
-			p_misc.appendChild(textTag(doc, &quot;delChats&quot;, prefs.delChats));
-			p_misc.appendChild(textTag(doc, &quot;browser&quot;, prefs.browser));
-			p_misc.appendChild(textTag(doc, &quot;alwaysOnTop&quot;, prefs.alwaysOnTop));
-			p_misc.appendChild(textTag(doc, &quot;keepSizes&quot;, prefs.keepSizes));
-			p_misc.appendChild(textTag(doc, &quot;ignoreHeadline&quot;, prefs.ignoreHeadline));
-			p_misc.appendChild(textTag(doc, &quot;ignoreNonRoster&quot;, prefs.ignoreNonRoster));
-			p_misc.appendChild(textTag(doc, &quot;excludeGroupChatIgnore&quot;, prefs.excludeGroupChatsFromIgnore));
-			p_misc.appendChild(textTag(doc, &quot;scrollTo&quot;, prefs.scrollTo));
-			p_misc.appendChild(textTag(doc, &quot;useEmoticons&quot;, prefs.useEmoticons));
-			p_misc.appendChild(textTag(doc, &quot;alertOpenChats&quot;, prefs.alertOpenChats));
-			p_misc.appendChild(textTag(doc, &quot;raiseChatWindow&quot;, prefs.raiseChatWindow));
-			p_misc.appendChild(textTag(doc, &quot;showSubjects&quot;, prefs.showSubjects));
-			p_misc.appendChild(textTag(doc, &quot;showCounter&quot;, prefs.showCounter));
-			p_misc.appendChild(textTag(doc, &quot;chatSays&quot;, prefs.chatSays));
-			p_misc.appendChild(textTag(doc, &quot;showGroupCounts&quot;, prefs.showGroupCounts));
-			p_misc.appendChild(textTag(doc, &quot;jidComplete&quot;, prefs.jidComplete));
-			p_misc.appendChild(textTag(doc, &quot;grabUrls&quot;, prefs.grabUrls));
-			p_misc.appendChild(textTag(doc, &quot;messageEvents&quot;, prefs.messageEvents));
-			p_misc.appendChild(textTag(doc, &quot;inactiveEvents&quot;, prefs.inactiveEvents));
-			p_misc.appendChild(textTag(doc, &quot;lastPath&quot;, prefs.lastPath));
-			p_misc.appendChild(textTag(doc, &quot;lastSavePath&quot;, prefs.lastSavePath));
-			p_misc.appendChild(textTag(doc, &quot;autoCopy&quot;, prefs.autoCopy));
-			p_misc.appendChild(textTag(doc, &quot;useCaps&quot;, prefs.useCaps));
-			p_misc.appendChild(textTag(doc, &quot;rc&quot;, prefs.useRC));
-		}
-		{
-			QDomElement p_dock = doc.createElement(&quot;dock&quot;);
-			p_general.appendChild(p_dock);
-
-			p_dock.appendChild(textTag(doc, &quot;useDock&quot;, prefs.useDock));
-			p_dock.appendChild(textTag(doc, &quot;dockDCstyle&quot;, prefs.dockDCstyle));
-			p_dock.appendChild(textTag(doc, &quot;dockHideMW&quot;, prefs.dockHideMW));
-			p_dock.appendChild(textTag(doc, &quot;dockToolMW&quot;, prefs.dockToolMW));
-		}
-		/*{
-			QDomElement p_sec = doc.createElement(&quot;security&quot;);
-			p_general.appendChild(p_sec);
-
-			p_sec.appendChild(textTag(doc, &quot;pgp&quot;, prefs.pgp));
-		}*/
-	}
-
-	// Added by Kiko 020621: stores SSL cert chain validation configuration
-	{
-		QDomElement p_ssl = doc.createElement(&quot;ssl&quot;);
-		p.appendChild(p_ssl);
-
-		p_ssl.appendChild(textTag(doc, &quot;trustedcertstoredir&quot;, prefs.trustCertStoreDir));
-	}
-
-	{
-		QDomElement p_events = doc.createElement(&quot;events&quot;);
-		p.appendChild(p_events);
-
-		p_events.appendChild(textTag(doc, &quot;alertstyle&quot;, prefs.alertStyle));
-		p_events.appendChild(textTag(doc, &quot;autoAuth&quot;, prefs.autoAuth));
-		p_events.appendChild(textTag(doc, &quot;notifyAuth&quot;, prefs.notifyAuth));
-
-
-		{
-			QDomElement p_receive = doc.createElement(&quot;receive&quot;);
-			p_events.appendChild(p_receive);
-
-			p_receive.appendChild(textTag(doc, &quot;popupMsgs&quot;, prefs.popupMsgs));
-			p_receive.appendChild(textTag(doc, &quot;popupChats&quot;, prefs.popupChats));
-			p_receive.appendChild(textTag(doc, &quot;popupHeadlines&quot;, prefs.popupHeadlines));
-			p_receive.appendChild(textTag(doc, &quot;popupFiles&quot;, prefs.popupFiles));
-			p_receive.appendChild(textTag(doc, &quot;noAwayPopup&quot;, prefs.noAwayPopup));
-			p_receive.appendChild(textTag(doc, &quot;noUnlistedPopup&quot;, prefs.noUnlistedPopup));
-			p_receive.appendChild(textTag(doc, &quot;raise&quot;, prefs.raise));
-			p_receive.appendChild(textTag(doc, &quot;incomingAs&quot;, prefs.incomingAs));
-		}
 
-		{
-			QDomElement p_priority = doc.createElement(&quot;priority&quot;);
-			p_events.appendChild(p_priority);
-
-			p_priority.appendChild(textTag(doc, &quot;message&quot;,  prefs.eventPriorityMessage));
-			p_priority.appendChild(textTag(doc, &quot;chat&quot;,     prefs.eventPriorityChat));
-			p_priority.appendChild(textTag(doc, &quot;headline&quot;, prefs.eventPriorityHeadline));
-			p_priority.appendChild(textTag(doc, &quot;auth&quot;,     prefs.eventPriorityAuth));
-			p_priority.appendChild(textTag(doc, &quot;file&quot;,     prefs.eventPriorityFile));
-			p_priority.appendChild(textTag(doc, &quot;rosterx&quot;,     prefs.eventPriorityRosterExchange));
-		}
-	}
-
-	{
-		QDomElement p_pres = doc.createElement(&quot;presence&quot;);
-		p.appendChild(p_pres);
-
-		{
-			QDomElement tag = doc.createElement(&quot;misc&quot;);
-			p_pres.appendChild(tag);
-
-			tag.appendChild(textTag(doc, &quot;askOnline&quot;, prefs.askOnline));
-			tag.appendChild(textTag(doc, &quot;askOffline&quot;, prefs.askOffline));
-			tag.appendChild(textTag(doc, &quot;rosterAnim&quot;, prefs.rosterAnim));
-			tag.appendChild(textTag(doc, &quot;autoVCardOnLogin&quot;, prefs.autoVCardOnLogin));
-			tag.appendChild(textTag(doc, &quot;xmlConsoleOnLogin&quot;, prefs.xmlConsoleOnLogin));
-		}
-		{
-			QDomElement tag = doc.createElement(&quot;autostatus&quot;);
-			p_pres.appendChild(tag);
-
-			QDomElement e;
-
-			e = textTag(doc, &quot;away&quot;, prefs.asAway);
-			setBoolAttribute(e, &quot;use&quot;, prefs.use_asAway);
-			tag.appendChild(e);
-
-			e = textTag(doc, &quot;xa&quot;, prefs.asXa);
-			setBoolAttribute(e, &quot;use&quot;, prefs.use_asXa);
-			tag.appendChild(e);
-
-			e = textTag(doc, &quot;offline&quot;, prefs.asOffline);
-			setBoolAttribute(e, &quot;use&quot;, prefs.use_asOffline);
-			tag.appendChild(e);
-
-			tag.appendChild(textTag(doc, &quot;message&quot;, prefs.asMessage));
-		}
-		{
-			// Status presets
-			QDomElement p_statuspresets = doc.createElement(&quot;statuspresets&quot;);
-			p_pres.appendChild(p_statuspresets);
-			foreach (StatusPreset p, prefs.sp) {
-				p_statuspresets.appendChild(p.toXml(doc));
-			}
-		}
-		{
-			p_pres.appendChild(stringListToXml(doc, &quot;recentstatus&quot;,prefs.recentStatus));
-		}
-	}
-
-	{
-		QDomElement p_lnf = doc.createElement(&quot;lookandfeel&quot;);
-		p.appendChild(p_lnf);
-
-		p_lnf.appendChild(textTag(doc, &quot;newHeadings&quot;, prefs.clNewHeadings));
-		p_lnf.appendChild(textTag(doc, &quot;outline-headings&quot;, prefs.outlineHeadings));
-
-		{
-			QDomElement tag = doc.createElement(&quot;colors&quot;);
-			p_lnf.appendChild(tag);
-
-			tag.appendChild(textTag(doc, &quot;online&quot;, prefs.color[cOnline].name() ));
-			tag.appendChild(textTag(doc, &quot;listback&quot;, prefs.color[cListBack].name() ));
-			tag.appendChild(textTag(doc, &quot;away&quot;, prefs.color[cAway].name() ));
-			tag.appendChild(textTag(doc, &quot;dnd&quot;, prefs.color[cDND].name() ));
-			tag.appendChild(textTag(doc, &quot;offline&quot;, prefs.color[cOffline].name() ));
-			tag.appendChild(textTag(doc, &quot;status&quot;, prefs.color[cStatus].name() ));
-			tag.appendChild(textTag(doc, &quot;profilefore&quot;, prefs.color[cProfileFore].name() ));
-			tag.appendChild(textTag(doc, &quot;profileback&quot;, prefs.color[cProfileBack].name() ));
-			tag.appendChild(textTag(doc, &quot;groupfore&quot;, prefs.color[cGroupFore].name() ));
-			tag.appendChild(textTag(doc, &quot;groupback&quot;, prefs.color[cGroupBack].name() ));
-			tag.appendChild(textTag(doc, &quot;animfront&quot;, prefs.color[cAnimFront].name() ));
-			tag.appendChild(textTag(doc, &quot;animback&quot;, prefs.color[cAnimBack].name() ));
-		}
-
-		{
-			QDomElement tag = doc.createElement(&quot;fonts&quot;);
-			p_lnf.appendChild(tag);
-
-			tag.appendChild(textTag(doc, &quot;roster&quot;, prefs.font[fRoster] ));
-			tag.appendChild(textTag(doc, &quot;message&quot;, prefs.font[fMessage] ));
-			tag.appendChild(textTag(doc, &quot;chat&quot;, prefs.font[fChat] ));
-			tag.appendChild(textTag(doc, &quot;popup&quot;, prefs.font[fPopup] ));
-		}
-	}
-
-	{
-		QDomElement p_sound = doc.createElement(&quot;sound&quot;);
-		p.appendChild(p_sound);
-
-		p_sound.appendChild(textTag(doc, &quot;player&quot;, prefs.player));
-		p_sound.appendChild(textTag(doc, &quot;noawaysound&quot;, prefs.noAwaySound));
-		p_sound.appendChild(textTag(doc, &quot;noGCSound&quot;, prefs.noGCSound));
-
-		{
-			QDomElement p_onevent = doc.createElement(&quot;onevent&quot;);
-			p_sound.appendChild(p_onevent);
-
-			p_onevent.appendChild(textTag(doc, &quot;message&quot;, prefs.onevent[eMessage]));
-			p_onevent.appendChild(textTag(doc, &quot;chat1&quot;, prefs.onevent[eChat1]));
-			p_onevent.appendChild(textTag(doc, &quot;chat2&quot;, prefs.onevent[eChat2]));
-			p_onevent.appendChild(textTag(doc, &quot;system&quot;, prefs.onevent[eSystem]));
-			p_onevent.appendChild(textTag(doc, &quot;headline&quot;, prefs.onevent[eHeadline]));
-			p_onevent.appendChild(textTag(doc, &quot;online&quot;, prefs.onevent[eOnline]));
-			p_onevent.appendChild(textTag(doc, &quot;offline&quot;, prefs.onevent[eOffline]));
-			p_onevent.appendChild(textTag(doc, &quot;send&quot;, prefs.onevent[eSend]));
-			p_onevent.appendChild(textTag(doc, &quot;incoming_ft&quot;, prefs.onevent[eIncomingFT]));
-			p_onevent.appendChild(textTag(doc, &quot;ft_complete&quot;, prefs.onevent[eFTComplete]));
-		}
-	}
-
-	{
-		QDomElement p_sizes = doc.createElement(&quot;sizes&quot;);
-		p.appendChild(p_sizes);
-
-		p_sizes.appendChild(textTag(doc, &quot;eventdlg&quot;, prefs.sizeEventDlg));
-		p_sizes.appendChild(textTag(doc, &quot;chatdlg&quot;, prefs.sizeChatDlg));
-		p_sizes.appendChild(textTag(doc, &quot;tabdlg&quot;, prefs.sizeTabDlg));
-	}
-
-	{
-		QDomElement p_toolbars = doc.createElement(&quot;toolbars&quot;);
-		p.appendChild(p_toolbars);
-
-		QMap&lt; QString, QList&lt;Options::ToolbarPrefs&gt; &gt;::Iterator itBars = prefs.toolbars.begin();
-		for ( ; itBars != prefs.toolbars.end(); ++itBars ) {
-			QList&lt;Options::ToolbarPrefs&gt; toolbars = itBars.data();
-			QDomElement p_bars = doc.createElement( itBars.key() );
-			p_toolbars.appendChild( p_bars );
-
-			QList&lt;Options::ToolbarPrefs&gt;::Iterator it = toolbars.begin();
-			for ( ; it != toolbars.end(); ++it) {
-				Options::ToolbarPrefs tb = *it;
-				if ( tb.keys.size() ||
-				     !tb.name.isEmpty() )
-				{
-					QDomElement tb_prefs = doc.createElement(&quot;toolbar&quot;);
-					p_bars.appendChild(tb_prefs);
-
-					tb_prefs.appendChild(textTag(doc, &quot;name&quot;,		tb.name));
-					tb_prefs.appendChild(textTag(doc, &quot;on&quot;,			tb.on));
-					tb_prefs.appendChild(textTag(doc, &quot;locked&quot;,		tb.locked));
-					tb_prefs.appendChild(textTag(doc, &quot;stretchable&quot;,	tb.stretchable));
-					tb_prefs.appendChild(stringListToXml(doc, &quot;keys&quot;,	tb.keys));
-
-					QDomElement tb_position = doc.createElement(&quot;position&quot;);
-					tb_prefs.appendChild(tb_position);
-
-					QString dockStr;
-					Qt::Dock dock = tb.dock;
-					if (dock == Qt::DockTop)
-						dockStr = &quot;DockTop&quot;;
-					else if (dock == Qt::DockBottom)
-						dockStr = &quot;DockBottom&quot;;
-					else if (dock == Qt::DockLeft)
-						dockStr = &quot;DockLeft&quot;;
-					else if (dock == Qt::DockRight)
-						dockStr = &quot;DockRight&quot;;
-					else if (dock == Qt::DockMinimized)
-						dockStr = &quot;DockMinimized&quot;;
-					else if (dock == Qt::DockTornOff)
-						dockStr = &quot;DockTornOff&quot;;
-					else if (dock == Qt::DockUnmanaged)
-						dockStr = &quot;DockUnmanaged&quot;;
-
-					tb_position.appendChild(textTag(doc, &quot;dock&quot;,		dockStr));
-					tb_position.appendChild(textTag(doc, &quot;index&quot;,		tb.index));
-					tb_position.appendChild(textTag(doc, &quot;nl&quot;,		tb.nl));
-					tb_position.appendChild(textTag(doc, &quot;extraOffset&quot;,	tb.extraOffset));
-				}
-			}
-		}
-	}
-
-	{
-		QDomElement pp = doc.createElement(&quot;popups&quot;);
-		p.appendChild(pp);
-		pp.appendChild(textTag(doc, &quot;on&quot;, prefs.ppIsOn));
-		pp.appendChild(textTag(doc, &quot;online&quot;, prefs.ppOnline));
-		pp.appendChild(textTag(doc, &quot;offline&quot;, prefs.ppOffline));
-		pp.appendChild(textTag(doc, &quot;statusChange&quot;, prefs.ppStatus));
-		pp.appendChild(textTag(doc, &quot;message&quot;, prefs.ppMessage));
-		pp.appendChild(textTag(doc, &quot;chat&quot;, prefs.ppChat));
-		pp.appendChild(textTag(doc, &quot;headline&quot;, prefs.ppHeadline));
-		pp.appendChild(textTag(doc, &quot;file&quot;, prefs.ppFile));
-		pp.appendChild(textTag(doc, &quot;jidClip&quot;, prefs.ppJidClip));
-		pp.appendChild(textTag(doc, &quot;statusClip&quot;, prefs.ppStatusClip));
-		pp.appendChild(textTag(doc, &quot;textClip&quot;, prefs.ppTextClip));
-		pp.appendChild(textTag(doc, &quot;hideTime&quot;, prefs.ppHideTime));
-		pp.appendChild(textTag(doc, &quot;borderColor&quot;, prefs.ppBorderColor.name()));
-	}
-	
-	{
-		// Bouncing dock (on Mac OS X)
-		QDomElement dock = doc.createElement(&quot;dock&quot;);
-		p.appendChild(dock);
-		switch (prefs.bounceDock) {
-			case Options::NoBounce :
-				dock.setAttribute(&quot;bounce&quot;, &quot;never&quot;);
-				break;
-			case Options::BounceOnce :
-				dock.setAttribute(&quot;bounce&quot;, &quot;once&quot;);
-				break;
-			case Options::BounceForever :
-				dock.setAttribute(&quot;bounce&quot;, &quot;forever&quot;);
-				break;
-			default:
-				break;
-		}
-	}
-
-	{
-		//group chat
-		QDomElement gc = doc.createElement(&quot;groupchat&quot;);
-		p.appendChild(gc);
-		gc.appendChild(stringListToXml(doc, &quot;highlightwords&quot;, prefs.gcHighlights));
-		gc.appendChild(stringListToXml(doc, &quot;nickcolors&quot;, prefs.gcNickColors));
-		gc.appendChild(textTag(doc, &quot;nickcoloring&quot;, prefs.gcNickColoring));
-		gc.appendChild(textTag(doc, &quot;highlighting&quot;, prefs.gcHighlighting));
-	}
-
-	{
-		QDomElement p_lockdown = doc.createElement(&quot;lockdown&quot;);
-		p.appendChild(p_lockdown);
-		p_lockdown.appendChild(textTag(doc, &quot;roster&quot;, prefs.lockdown.roster));
-		p_lockdown.appendChild(textTag(doc, &quot;services&quot;, prefs.lockdown.services));
-	}
-
-	{
-		QDomElement is = doc.createElement(&quot;iconset&quot;);
-		p.appendChild(is);
-
-		// system
-		is.appendChild(textTag(doc, &quot;system&quot;, prefs.systemIconset));
-
-		// roster - default
-		QDomElement is_roster = doc.createElement(&quot;roster&quot;);
-		is.appendChild(is_roster);
-		is_roster.appendChild(textTag(doc, &quot;default&quot;, prefs.defaultRosterIconset));
-
-		{
-			// roster - service
-			QDomElement roster_service = doc.createElement(&quot;service&quot;);
-			is_roster.appendChild(roster_service);
-
-			QMap&lt;QString, QString&gt;::iterator it = prefs.serviceRosterIconset.begin();
-			for ( ; it != prefs.serviceRosterIconset.end(); ++it) {
-				QDomElement item = doc.createElement(&quot;item&quot;);
-				roster_service.appendChild(item);
-
-				item.setAttribute(&quot;service&quot;, it.key());
-				item.setAttribute(&quot;iconset&quot;, it.data());
-			}
-		}
-
-		{
-			// roster - custom
-			QDomElement roster_custom = doc.createElement(&quot;custom&quot;);
-			is_roster.appendChild(roster_custom);
-
-			QMap&lt;QString, QString&gt;::iterator it = prefs.customRosterIconset.begin();
-			for ( ; it != prefs.customRosterIconset.end(); ++it) {
-				QDomElement item = doc.createElement(&quot;item&quot;);
-				roster_custom.appendChild(item);
-
-				item.setAttribute(&quot;regExp&quot;, it.key());
-				item.setAttribute(&quot;iconset&quot;, it.data());
-			}
-		}
-
-		{
-			// emoticons
-			QDomElement is_emoticons = doc.createElement(&quot;emoticons&quot;);
-			is.appendChild(is_emoticons);
-
-			QStringList::Iterator it = prefs.emoticons.begin();
-			for ( ; it != prefs.emoticons.end(); ++it)
-				is_emoticons.appendChild(textTag(doc, &quot;item&quot;, *it));
-		}
-	}
-
-	{
-		// disco dialog
-		QDomElement p_disco = doc.createElement(&quot;disco&quot;);
-		p.appendChild(p_disco);
-
-		p_disco.appendChild( textTag(doc, &quot;items&quot;, prefs.discoItems ) );
-		p_disco.appendChild( textTag(doc, &quot;info&quot;,  prefs.discoInfo ) );
-	}
-
-	{
-		// data transfer
-		QDomElement p_dt = doc.createElement(&quot;dt&quot;);
-		p.appendChild(p_dt);
-		p_dt.appendChild( textTag(doc, &quot;port&quot;, prefs.dtPort ) );
-		p_dt.appendChild( textTag(doc, &quot;external&quot;, prefs.dtExternal ) );
-	}
-
-	{
-		// advanced widget
-		QDomElement p_advWidget = doc.createElement(&quot;advancedWidget&quot;);
-		p.appendChild(p_advWidget);
-
-		QDomElement stick = doc.createElement(&quot;sticky&quot;);
-		p_advWidget.appendChild(stick);
-
-		setBoolAttribute(stick, &quot;enabled&quot;, GAdvancedWidget::stickEnabled());
-		stick.appendChild( textTag(doc, &quot;offset&quot;, GAdvancedWidget::stickAt()) );
-		stick.appendChild( textTag(doc, &quot;stickToWindows&quot;, GAdvancedWidget::stickToWindows()) );
-	}
-
-	AtomicXmlFile f(fname);
-	if (!f.saveDocument(doc))
-		return false;
-
-	return true;
-}
-
-bool UserProfile::fromFile(const QString &amp;fname)
+bool OptionsMigration::fromFile(const QString &amp;fname)
 {
 	QString confver;
 	QDomDocument doc;
@@ -1269,11 +895,11 @@ bool UserProfile::fromFile(const QString &amp;fname)
 
 	readEntry(base, &quot;progver&quot;, &amp;progver);
 
-	readRectEntry(base, &quot;geom&quot;, &amp;mwgeom);
-	xmlToStringList(base, &quot;recentGCList&quot;, &amp;recentGCList);
-	xmlToStringList(base, &quot;recentBrowseList&quot;, &amp;recentBrowseList);
-	readEntry(base, &quot;lastStatusString&quot;, &amp;lastStatusString);
-	readBoolEntry(base, &quot;useSound&quot;, &amp;useSound);
+	migrateRectEntry(base, &quot;geom&quot;, &quot;options.ui.contactlist.saved-window-geometry&quot;);
+	migrateStringList(base, &quot;recentGCList&quot;, &quot;options.muc.recent-joins.jids&quot;);
+	migrateStringList(base, &quot;recentBrowseList&quot;, &quot;options.ui.service-discovery.recent-jids&quot;);
+	migrateStringEntry(base, &quot;lastStatusString&quot;, &quot;options.status.last-message&quot;);
+	migrateBoolEntry(base, &quot;useSound&quot;, &quot;options.ui.notifications.sounds.enable&quot;);
 
 	bool found;
 	QDomElement accs = findSubTag(base, &quot;accounts&quot;, &amp;found);
@@ -1286,13 +912,13 @@ bool UserProfile::fromFile(const QString &amp;fname)
 			if(a.tagName() == &quot;account&quot;) {
 				UserAccount ua;
 				ua.fromXml(a);
-				acc.append(ua);
+				accMigration.append(ua);
 			}
 		}
 	}
 
 	// convert old proxy config into new
-	for(UserAccountList::Iterator it = acc.begin(); it != acc.end(); ++it) {
+	for(UserAccountList::Iterator it = accMigration.begin(); it != accMigration.end(); ++it) {
 		UserAccount &amp;a = *it;
 		if(a.proxy_type &gt; 0) {
 			ProxyItem p;
@@ -1303,9 +929,9 @@ bool UserProfile::fromFile(const QString &amp;fname)
 			p.settings.useAuth = !a.proxy_user.isEmpty();
 			p.settings.user = a.proxy_user;
 			p.settings.pass = a.proxy_pass;
-			proxyList.append(p);
+			proxyMigration.append(p);
 
-			a.proxy_index = proxyList.count(); // 1 and up are proxies
+			a.proxy_index = proxyMigration.count(); // 1 and up are proxies
 		}
 	}
 
@@ -1324,10 +950,39 @@ bool UserProfile::fromFile(const QString &amp;fname)
 			QDomElement pset = e.elementsByTagName(&quot;proxySettings&quot;).item(0).toElement();
 			if(!pset.isNull())
 				p.settings.fromXml(pset);
-			proxyList.append(p);
+			proxyMigration.append(p);
 		}
 	}
 
+	// assign storage IDs to proxies and update accounts
+	for (int i=0; i &lt; proxyMigration.size(); i++) {
+		proxyMigration[i].id = &quot;a&quot;+QString::number(i);
+	}
+	for (int i=0; i &lt; accMigration.size(); i++) {
+		if (accMigration[i].proxy_index != 0) {
+			accMigration[i].proxyID = proxyMigration[accMigration[i].proxy_index].id;
+		}
+	}
+	
+	
+	
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.contactlist.show.offline-contacts&quot;, true);
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.contactlist.show.away-contacts&quot;, true);
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.contactlist.show.hidden-contacts-group&quot;, true);
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.contactlist.show.agent-contacts&quot;, true);
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.contactlist.show.self-contact&quot;, true);
+		
+	for (int i=0; i &lt; accMigration.size(); i++) {
+		if (!accMigration[i].opt_enabled) continue;
+		PsiOptions::instance()-&gt;setOption(&quot;options.ui.contactlist.show.offline-contacts&quot;, accMigration[i].tog_offline);
+		PsiOptions::instance()-&gt;setOption(&quot;options.ui.contactlist.show.away-contacts&quot;, accMigration[i].tog_away);
+		PsiOptions::instance()-&gt;setOption(&quot;options.ui.contactlist.show.hidden-contacts-group&quot;, accMigration[i].tog_hidden);
+		PsiOptions::instance()-&gt;setOption(&quot;options.ui.contactlist.show.agent-contacts&quot;, accMigration[i].tog_agents);
+		PsiOptions::instance()-&gt;setOption(&quot;options.ui.contactlist.show.self-contact&quot;, accMigration[i].tog_self);
+		break;
+	}
+
+	
 	QDomElement p = findSubTag(base, &quot;preferences&quot;, &amp;found);
 	if(found) {
 		bool found;
@@ -1338,73 +993,96 @@ bool UserProfile::fromFile(const QString &amp;fname)
 
 			QDomElement p_roster = findSubTag(p_general, &quot;roster&quot;, &amp;found);
 			if(found) {
-				readEntry(p_roster, &quot;rosterBgImage&quot;, &amp;prefs.rosterBgImage);
-				readBoolEntry(p_roster, &quot;useleft&quot;, &amp;prefs.useleft);
-				readBoolEntry(p_roster, &quot;singleclick&quot;, &amp;prefs.singleclick);
-				readBoolEntry(p_roster, &quot;hideMenubar&quot;, &amp;prefs.hideMenubar);
-				readNumEntry(p_roster, &quot;defaultAction&quot;, &amp;prefs.defaultAction);
-				readBoolEntry(p_roster, &quot;useTransportIconsForContacts&quot;, &amp;prefs.useTransportIconsForContacts);
+				migrateBoolEntry(p_roster, &quot;useleft&quot;, &quot;options.ui.contactlist.use-left-click&quot;);
+				migrateBoolEntry(p_roster, &quot;singleclick&quot;, &quot;options.ui.contactlist.use-single-click&quot;);
+				bool hideMenu;
+				readBoolEntry(p_roster, &quot;hideMenubar&quot;, &amp;hideMenu);
+				PsiOptions::instance()-&gt;setOption(&quot;options.ui.contactlist.show-menubar&quot;, !hideMenu);
+				int defaultAction;
+				readNumEntry(p_roster, &quot;defaultAction&quot;, &amp;defaultAction);
+				PsiOptions::instance()-&gt;setOption(&quot;options.messages.default-outgoing-message-type&quot;, defaultAction == 0 ? &quot;message&quot; : &quot;chat&quot;);
+				migrateBoolEntry(p_roster, &quot;useTransportIconsForContacts&quot;, &quot;options.ui.contactlist.use-transport-icons&quot;);
 
 				QDomElement sorting = findSubTag(p_roster, &quot;sortStyle&quot;, &amp;found);
 				if(found) {
 					QString name;
 
+					migrateStringEntry(sorting, &quot;contact&quot;, &quot;options.ui.contactlist.contact-sort-style&quot;);
+					migrateStringEntry(sorting, &quot;group&quot;, &quot;options.ui.contactlist.group-sort-style&quot;);
+					migrateStringEntry(sorting, &quot;account&quot;, &quot;options.ui.contactlist.account-sort-style&quot;);
+					
+					/* FIXME
 					readEntry(sorting, &quot;contact&quot;, &amp;name);
 					if ( name == &quot;alpha&quot; )
-						prefs.rosterContactSortStyle = Options::ContactSortStyle_Alpha;
+						lateMigrationData.rosterContactSortStyle = Options::ContactSortStyle_Alpha;
 					else
-						prefs.rosterContactSortStyle = Options::ContactSortStyle_Status;
+						lateMigrationData.rosterContactSortStyle = Options::ContactSortStyle_Status;
 
 					readEntry(sorting, &quot;group&quot;, &amp;name);
 					if ( name == &quot;rank&quot; )
-						prefs.rosterGroupSortStyle = Options::GroupSortStyle_Rank;
+						lateMigrationData.rosterGroupSortStyle = Options::GroupSortStyle_Rank;
 					else
-						prefs.rosterGroupSortStyle = Options::GroupSortStyle_Alpha;
+						lateMigrationData.rosterGroupSortStyle = Options::GroupSortStyle_Alpha;
 
 					readEntry(sorting, &quot;account&quot;, &amp;name);
 					if ( name == &quot;rank&quot; )
-						prefs.rosterAccountSortStyle = Options::AccountSortStyle_Rank;
+						lateMigrationData.rosterAccountSortStyle = Options::AccountSortStyle_Rank;
 					else
-						prefs.rosterAccountSortStyle = Options::AccountSortStyle_Alpha;
+						lateMigrationData.rosterAccountSortStyle = Options::AccountSortStyle_Alpha;
+					*/
 				}
 			}
 
 			QDomElement tag = findSubTag(p_general, &quot;misc&quot;, &amp;found);
 			if(found) {
-				readEntry(tag, &quot;chatBgImage&quot;, &amp;prefs.chatBgImage);
-				readNumEntry(tag, &quot;delChats&quot;, &amp;prefs.delChats);
-				readNumEntry(tag, &quot;browser&quot;, &amp;prefs.browser);
-				readBoolEntry(tag, &quot;alwaysOnTop&quot;, &amp;prefs.alwaysOnTop);
-				readBoolEntry(tag, &quot;keepSizes&quot;, &amp;prefs.keepSizes);
-				readBoolEntry(tag, &quot;ignoreHeadline&quot;, &amp;prefs.ignoreHeadline);
-				readBoolEntry(tag, &quot;ignoreNonRoster&quot;, &amp;prefs.ignoreNonRoster);
-				readBoolEntry(tag, &quot;excludeGroupChatIgnore&quot;, &amp;prefs.excludeGroupChatsFromIgnore);
-				readBoolEntry(tag, &quot;scrollTo&quot;, &amp;prefs.scrollTo);
-				readBoolEntry(tag, &quot;useEmoticons&quot;, &amp;prefs.useEmoticons);
-				readBoolEntry(tag, &quot;alertOpenChats&quot;, &amp;prefs.alertOpenChats);
-				readBoolEntry(tag, &quot;raiseChatWindow&quot;, &amp;prefs.raiseChatWindow);
-				readBoolEntry(tag, &quot;showSubjects&quot;, &amp;prefs.showSubjects);
-				readBoolEntry(tag, &quot;showGroupCounts&quot;, &amp;prefs.showGroupCounts);
-				readBoolEntry(tag, &quot;showCounter&quot;, &amp;prefs.showCounter);
-				readBoolEntry(tag, &quot;chatSays&quot;, &amp;prefs.chatSays);
-				readBoolEntry(tag, &quot;jidComplete&quot;, &amp;prefs.jidComplete);
-				readBoolEntry(tag, &quot;grabUrls&quot;, &amp;prefs.grabUrls);
-				readBoolEntry(tag, &quot;smallChats&quot;, &amp;prefs.smallChats);
-				readBoolEntry(tag, &quot;brushedMetal&quot;, &amp;prefs.brushedMetal);
-				readBoolEntry(tag, &quot;chatLineEdit&quot;, &amp;prefs.chatLineEdit);
-				readBoolEntry(tag, &quot;useTabs&quot;, &amp;prefs.useTabs);
-				readBoolEntry(tag, &quot;usePerTabCloseButton&quot;, &amp;prefs.usePerTabCloseButton);
-				readBoolEntry(tag, &quot;putTabsAtBottom&quot;, &amp;prefs.putTabsAtBottom);
-				readBoolEntry(tag, &quot;autoRosterSize&quot;, &amp;prefs.autoRosterSize);
-				readBoolEntry(tag, &quot;autoRosterSizeGrowTop&quot;, &amp;prefs.autoRosterSizeGrowTop);
-				readBoolEntry(tag, &quot;autoResolveNicksOnAdd&quot;, &amp;prefs.autoResolveNicksOnAdd);
-				readBoolEntry(tag, &quot;messageEvents&quot;, &amp;prefs.messageEvents);
-				readBoolEntry(tag, &quot;inactiveEvents&quot;, &amp;prefs.inactiveEvents);
-				readEntry(tag, &quot;lastPath&quot;, &amp;prefs.lastPath);
-				readEntry(tag, &quot;lastSavePath&quot;, &amp;prefs.lastSavePath);
-				readBoolEntry(tag, &quot;autoCopy&quot;, &amp;prefs.autoCopy);
-				readBoolEntry(tag, &quot;useCaps&quot;, &amp;prefs.useCaps);
-				readBoolEntry(tag, &quot;rc&quot;, &amp;prefs.useRC);
+				int delafterint;
+				readNumEntry(tag, &quot;delChats&quot;, &amp;delafterint);
+				QString delafter;
+				switch (delafterint) {
+					case 0:
+						delafter = &quot;instant&quot;;
+						break;
+					case 1:
+						delafter = &quot;hour&quot;;
+						break;
+					case 2:
+						delafter = &quot;day&quot;;
+						break;
+					case 3:
+						delafter = &quot;never&quot;;
+						break;
+				}
+				PsiOptions::instance()-&gt;setOption(&quot;options.ui.chat.delete-contents-after&quot;, delafter);
+				migrateBoolEntry(tag, &quot;alwaysOnTop&quot;, &quot;options.ui.contactlist.always-on-top&quot;);
+				migrateBoolEntry(tag, &quot;keepSizes&quot;, &quot;options.ui.remember-window-sizes&quot;);
+				migrateBoolEntry(tag, &quot;ignoreHeadline&quot;, &quot;options.messages.ignore-headlines&quot;);
+				migrateBoolEntry(tag, &quot;ignoreNonRoster&quot;, &quot;options.messages.ignore-non-roster-contacts&quot;);
+				migrateBoolEntry(tag, &quot;excludeGroupChatIgnore&quot;, &quot;options.messages.exclude-muc-from-ignore&quot;);
+				migrateBoolEntry(tag, &quot;scrollTo&quot;, &quot;options.ui.contactlist.ensure-contact-visible-on-event&quot;);
+				migrateBoolEntry(tag, &quot;useEmoticons&quot;, &quot;options.ui.emoticons.use-emoticons&quot;);
+				migrateBoolEntry(tag, &quot;alertOpenChats&quot;, &quot;options.ui.chat.alert-for-already-open-chats&quot;);
+				migrateBoolEntry(tag, &quot;raiseChatWindow&quot;, &quot;options.ui.chat.raise-chat-windows-on-new-messages&quot;);
+				migrateBoolEntry(tag, &quot;showSubjects&quot;, &quot;options.ui.message.show-subjects&quot;);
+				migrateBoolEntry(tag, &quot;showGroupCounts&quot;, &quot;options.ui.contactlist.show-group-counts&quot;);
+				migrateBoolEntry(tag, &quot;showCounter&quot;, &quot;options.ui.message.show-character-count&quot;);
+				migrateBoolEntry(tag, &quot;chatSays&quot;, &quot;options.ui.chat.use-chat-says-style&quot;);
+				migrateBoolEntry(tag, &quot;jidComplete&quot;, &quot;options.ui.message.use-jid-auto-completion&quot;);
+				migrateBoolEntry(tag, &quot;grabUrls&quot;, &quot;options.ui.message.auto-grab-urls-from-clipboard&quot;);
+				migrateBoolEntry(tag, &quot;smallChats&quot;, &quot;options.ui.chat.use-small-chats&quot;);
+				migrateBoolEntry(tag, &quot;brushedMetal&quot;, &quot;options.ui.mac.use-brushed-metal-windows&quot;);
+				migrateBoolEntry(tag, &quot;chatLineEdit&quot;, &quot;options.ui.chat.use-expanding-line-edit&quot;);
+				migrateBoolEntry(tag, &quot;useTabs&quot;, &quot;options.ui.tabs.use-tabs&quot;);
+				migrateBoolEntry(tag, &quot;putTabsAtBottom&quot;, &quot;options.ui.tabs.put-tabs-at-bottom&quot;);
+				migrateBoolEntry(tag, &quot;autoRosterSize&quot;, &quot;options.ui.contactlist.automatically-resize-roster&quot;);
+				migrateBoolEntry(tag, &quot;autoRosterSizeGrowTop&quot;, &quot;options.ui.contactlist.grow-roster-upwards&quot;);
+				migrateBoolEntry(tag, &quot;autoResolveNicksOnAdd&quot;, &quot;options.contactlist.resolve-nicks-on-contact-add&quot;);
+				migrateBoolEntry(tag, &quot;messageEvents&quot;, &quot;options.messages.send-composing-events&quot;);
+				migrateBoolEntry(tag, &quot;inactiveEvents&quot;, &quot;options.messages.send-inactivity-events&quot;);
+				migrateStringEntry(tag, &quot;lastPath&quot;, &quot;options.ui.last-used-open-path&quot;);
+				migrateStringEntry(tag, &quot;lastSavePath&quot;, &quot;options.ui.last-used-save-path&quot;);
+				migrateBoolEntry(tag, &quot;autoCopy&quot;, &quot;options.ui.automatically-copy-selected-text&quot;);
+				migrateBoolEntry(tag, &quot;useCaps&quot;, &quot;options.service-discovery.enable-entity-capabilities&quot;);
+				migrateBoolEntry(tag, &quot;rc&quot;, &quot;options.external-control.adhoc-remote-control.enable&quot;);
 				
 				// Migrating for soft return option
 				bool found;
@@ -1423,10 +1101,10 @@ bool UserProfile::fromFile(const QString &amp;fname)
 
 			tag = findSubTag(p_general, &quot;dock&quot;, &amp;found);
 			if(found) {
-				readBoolEntry(tag, &quot;useDock&quot;, &amp;prefs.useDock);
-				readBoolEntry(tag, &quot;dockDCstyle&quot;, &amp;prefs.dockDCstyle);
-				readBoolEntry(tag, &quot;dockHideMW&quot;, &amp;prefs.dockHideMW);
-				readBoolEntry(tag, &quot;dockToolMW&quot;, &amp;prefs.dockToolMW);
+				migrateBoolEntry(tag, &quot;useDock&quot;, &quot;options.ui.systemtray.enable&quot;);
+				migrateBoolEntry(tag, &quot;dockDCstyle&quot;, &quot;options.ui.systemtray.use-double-click&quot;);
+				migrateBoolEntry(tag, &quot;dockHideMW&quot;, &quot;options.contactlist.hide-on-start&quot;);
+				migrateBoolEntry(tag, &quot;dockToolMW&quot;, &quot;options.contactlist.use-toolwindow&quot;);
 			}
 
 			/*tag = findSubTag(p_general, &quot;security&quot;, &amp;found);
@@ -1435,41 +1113,33 @@ bool UserProfile::fromFile(const QString &amp;fname)
 			}*/
 		}
 
-		// Added by Kiko 020621: retrieves SSL cert chain validation configuration
-		QDomElement p_ssl = findSubTag(p,&quot;ssl&quot;,&amp;found);
-		if(found) {
-			readEntry(p_ssl, &quot;trustedcertstoredir&quot;, &amp;prefs.trustCertStoreDir);
-		}
 
 		QDomElement p_events = findSubTag(p, &quot;events&quot;, &amp;found);
 		if(found) {
 			bool found;
 
-			readNumEntry(p_events, &quot;alertstyle&quot;, &amp;prefs.alertStyle);
-			readBoolEntry(p_events, &quot;autoAuth&quot;, &amp;prefs.autoAuth);
-			readBoolEntry(p_events, &quot;notifyAuth&quot;, &amp;prefs.notifyAuth);
+			int alertstyle;
+			readNumEntry(p_events, &quot;alertstyle&quot;, &amp;alertstyle);
+			QString ase[3] = {&quot;no&quot;, &quot;blink&quot;, &quot;animate&quot;};
+			PsiOptions::instance()-&gt;setOption(&quot;options.ui.notifications.alert-style&quot;, ase[alertstyle]);
+			migrateBoolEntry(p_events, &quot;autoAuth&quot;, &quot;options.subscriptions.automatically-allow-authorisation&quot;);
+			migrateBoolEntry(p_events, &quot;notifyAuth&quot;, &quot;options.ui.notifications.successful-subscription&quot;);
 
 			QDomElement tag = findSubTag(p_events, &quot;receive&quot;, &amp;found);
 			if(found) {
-				readBoolEntry(tag, &quot;popupMsgs&quot;, &amp;prefs.popupMsgs);
-				readBoolEntry(tag, &quot;popupChats&quot;, &amp;prefs.popupChats);
-				readBoolEntry(tag, &quot;popupHeadlines&quot;, &amp;prefs.popupHeadlines);
-				readBoolEntry(tag, &quot;popupFiles&quot;, &amp;prefs.popupFiles);
-				readBoolEntry(tag, &quot;noAwayPopup&quot;, &amp;prefs.noAwayPopup);
-				readBoolEntry(tag, &quot;noUnlistedPopup&quot;, &amp;prefs.noUnlistedPopup);
-				readBoolEntry(tag, &quot;raise&quot;, &amp;prefs.raise);
-				readNumEntry(tag, &quot;incomingAs&quot;, &amp;prefs.incomingAs);
+				migrateBoolEntry(tag, &quot;popupMsgs&quot;, &quot;options.ui.message.auto-popup&quot;);
+				migrateBoolEntry(tag, &quot;popupChats&quot;, &quot;options.ui.chat.auto-popup&quot;);
+				migrateBoolEntry(tag, &quot;popupHeadlines&quot;, &quot;options.ui.message.auto-popup-headlines&quot;);
+				migrateBoolEntry(tag, &quot;popupFiles&quot;, &quot;options.ui.file-transfer.auto-popup&quot;);
+				migrateBoolEntry(tag, &quot;noAwayPopup&quot;, &quot;options.ui.notifications.popup-dialogs.suppress-while-away&quot;);
+				migrateBoolEntry(tag, &quot;noUnlistedPopup&quot;, &quot;options.ui.notifications.popup-dialogs.suppress-when-not-on-roster&quot;);
+				migrateBoolEntry(tag, &quot;raise&quot;, &quot;options.ui.contactlist.raise-on-new-event&quot;);
+				int force;
+				readNumEntry(tag, &quot;incomingAs&quot;, &amp;force);
+				QString fe[4] = {&quot;no&quot;, &quot;message&quot;, &quot;chat&quot;, &quot;current-open&quot;};
+				PsiOptions::instance()-&gt;setOption(&quot;options.messages.force-incoming-message-type&quot;, fe[force]);
 			}
 
-			tag = findSubTag(p_events, &quot;priority&quot;, &amp;found);
-			if(found) {
-				readNumEntry(tag, &quot;message&quot;,  &amp;prefs.eventPriorityMessage);
-				readNumEntry(tag, &quot;chat&quot;,     &amp;prefs.eventPriorityChat);
-				readNumEntry(tag, &quot;headline&quot;, &amp;prefs.eventPriorityHeadline);
-				readNumEntry(tag, &quot;auth&quot;,     &amp;prefs.eventPriorityAuth);
-				readNumEntry(tag, &quot;file&quot;,     &amp;prefs.eventPriorityFile);
-				readNumEntry(tag, &quot;rosterx&quot;,  &amp;prefs.eventPriorityRosterExchange);
- 			}
 		}
 
 		QDomElement p_pres = findSubTag(p, &quot;presence&quot;, &amp;found);
@@ -1478,89 +1148,87 @@ bool UserProfile::fromFile(const QString &amp;fname)
 
 			QDomElement tag = findSubTag(p_pres, &quot;misc&quot;, &amp;found);
 			if(found) {
-				readBoolEntry(tag, &quot;askOnline&quot;, &amp;prefs.askOnline);
-				readBoolEntry(tag, &quot;askOffline&quot;, &amp;prefs.askOffline);
-				readBoolEntry(tag, &quot;rosterAnim&quot;, &amp;prefs.rosterAnim);
-				readBoolEntry(tag, &quot;autoVCardOnLogin&quot;, &amp;prefs.autoVCardOnLogin);
-				readBoolEntry(tag, &quot;xmlConsoleOnLogin&quot;, &amp;prefs.xmlConsoleOnLogin);
+				migrateBoolEntry(tag, &quot;askOnline&quot;, &quot;options.status.ask-for-message-on-online&quot;);
+				migrateBoolEntry(tag, &quot;askOffline&quot;, &quot;options.status.ask-for-message-on-offline&quot;);
+				migrateBoolEntry(tag, &quot;rosterAnim&quot;, &quot;options.ui.contactlist.use-status-change-animation&quot;);
+				migrateBoolEntry(tag, &quot;autoVCardOnLogin&quot;, &quot;options.vcard.query-own-vcard-on-login&quot;);
+				migrateBoolEntry(tag, &quot;xmlConsoleOnLogin&quot;, &quot;options.xml-console.enable-at-login&quot;);
 			}
 
 			tag = findSubTag(p_pres, &quot;autostatus&quot;, &amp;found);
 			if(found) {
 				bool found;
+				bool use;
 				QDomElement e;
 				e = findSubTag(tag, &quot;away&quot;, &amp;found);
 				if(found) {
-					if(e.hasAttribute(&quot;use&quot;))
-						readBoolAttribute(e, &quot;use&quot;, &amp;prefs.use_asAway);
-					else
-						prefs.use_asAway = TRUE;
+					if(e.hasAttribute(&quot;use&quot;)) {
+						readBoolAttribute(e, &quot;use&quot;, &amp;use);
+						PsiOptions::instance()-&gt;setOption(&quot;options.status.auto-away.use-away&quot;, use);
+					}
 				}
 				e = findSubTag(tag, &quot;xa&quot;, &amp;found);
 				if(found) {
 					if(e.hasAttribute(&quot;use&quot;))
-						readBoolAttribute(e, &quot;use&quot;, &amp;prefs.use_asXa);
-					else
-						prefs.use_asXa = TRUE;
+						readBoolAttribute(e, &quot;use&quot;, &amp;use);
+					PsiOptions::instance()-&gt;setOption(&quot;options.status.auto-away.use-not-availible&quot;, use);
 				}
 				e = findSubTag(tag, &quot;offline&quot;, &amp;found);
 				if(found) {
 					if(e.hasAttribute(&quot;use&quot;))
-						readBoolAttribute(e, &quot;use&quot;, &amp;prefs.use_asOffline);
-					else
-						prefs.use_asOffline = TRUE;
+						readBoolAttribute(e, &quot;use&quot;, &amp;use);
+					PsiOptions::instance()-&gt;setOption(&quot;options.status.auto-away.use-offline&quot;, use);
 				}
 
-				readNumEntry(tag, &quot;away&quot;, &amp;prefs.asAway);
-				readNumEntry(tag, &quot;xa&quot;, &amp;prefs.asXa);
-				readNumEntry(tag, &quot;offline&quot;, &amp;prefs.asOffline);
+				migrateIntEntry(tag, &quot;away&quot;, &quot;options.status.auto-away.away-after&quot;);
+				migrateIntEntry(tag, &quot;xa&quot;, &quot;options.status.auto-away.not-availible-after&quot;);
+				migrateIntEntry(tag, &quot;offline&quot;, &quot;options.status.auto-away.offline-after&quot;);
 
-				readEntry(tag, &quot;message&quot;, &amp;prefs.asMessage);
+				migrateStringEntry(tag, &quot;message&quot;, &quot;options.status.auto-away.message&quot;);
 			}
 
 			tag = findSubTag(p_pres, &quot;statuspresets&quot;, &amp;found);
 			if(found) {
-				prefs.sp.clear();
+				lateMigrationData.sp.clear();
 				for(QDomNode n = tag.firstChild(); !n.isNull(); n = n.nextSibling()) {
 					StatusPreset preset(n.toElement());
 					if (!preset.name().isEmpty()) 
-						prefs.sp[preset.name()] = preset;
+						lateMigrationData.sp[preset.name()] = preset;
 				}
 			}
-			xmlToStringList(p_pres, &quot;recentstatus&quot;, &amp;prefs.recentStatus);
 		}
 
 		QDomElement p_lnf = findSubTag(p, &quot;lookandfeel&quot;, &amp;found);
 		if(found) {
 			bool found;
 
-			readBoolEntry(p_lnf, &quot;newHeadings&quot;, &amp;prefs.clNewHeadings);
-			readBoolEntry(p_lnf, &quot;outline-headings&quot;, &amp;prefs.outlineHeadings);
+			migrateBoolEntry(p_lnf, &quot;newHeadings&quot;, &quot;options.ui.look.contactlist.use-slim-group-headings&quot;);
+			migrateBoolEntry(p_lnf, &quot;outline-headings&quot;, &quot;options.ui.look.contactlist.use-outlined-group-headings&quot;);
 			migrateIntEntry(p_lnf, &quot;chat-opacity&quot;, &quot;options.ui.chat.opacity&quot;);
 			migrateIntEntry(p_lnf, &quot;roster-opacity&quot;, &quot;options.ui.contactlist.opacity&quot;);
 
 			QDomElement tag = findSubTag(p_lnf, &quot;colors&quot;, &amp;found);
 			if(found) {
-				readColorEntry(tag, &quot;online&quot;, &amp;prefs.color[cOnline]);
-				readColorEntry(tag, &quot;listback&quot;, &amp;prefs.color[cListBack]);
-				readColorEntry(tag, &quot;away&quot;, &amp;prefs.color[cAway]);
-				readColorEntry(tag, &quot;dnd&quot;, &amp;prefs.color[cDND]);
-				readColorEntry(tag, &quot;offline&quot;, &amp;prefs.color[cOffline]);
-				readColorEntry(tag, &quot;status&quot;, &amp;prefs.color[cStatus]);
-				readColorEntry(tag, &quot;groupfore&quot;, &amp;prefs.color[cGroupFore]);
-				readColorEntry(tag, &quot;groupback&quot;, &amp;prefs.color[cGroupBack]);
-				readColorEntry(tag, &quot;profilefore&quot;, &amp;prefs.color[cProfileFore]);
-				readColorEntry(tag, &quot;profileback&quot;, &amp;prefs.color[cProfileBack]);
-				readColorEntry(tag, &quot;animfront&quot;, &amp;prefs.color[cAnimFront]);
-				readColorEntry(tag, &quot;animback&quot;, &amp;prefs.color[cAnimBack]);
+				migrateColorEntry(tag, &quot;online&quot;, &quot;options.ui.look.colors.contactlist.status.online&quot;);
+				migrateColorEntry(tag, &quot;listback&quot;, &quot;options.ui.look.colors.contactlist.background&quot;);
+				migrateColorEntry(tag, &quot;away&quot;, &quot;options.ui.look.colors.contactlist.status.away&quot;);
+				migrateColorEntry(tag, &quot;dnd&quot;, &quot;options.ui.look.colors.contactlist.status.do-no-disturb&quot;);
+				migrateColorEntry(tag, &quot;offline&quot;, &quot;options.ui.look.colors.contactlist.status.offline&quot;);
+				migrateColorEntry(tag, &quot;status&quot;, &quot;options.ui.look.colors.contactlist.status-messages&quot;);
+				migrateColorEntry(tag, &quot;groupfore&quot;, &quot;options.ui.look.colors.contactlist.grouping.header-foreground&quot;);
+				migrateColorEntry(tag, &quot;groupback&quot;, &quot;options.ui.look.colors.contactlist.grouping.header-background&quot;);
+				migrateColorEntry(tag, &quot;profilefore&quot;, &quot;options.ui.look.colors.contactlist.profile.header-foreground&quot;);
+				migrateColorEntry(tag, &quot;profileback&quot;, &quot;options.ui.look.colors.contactlist.profile.header-background&quot;);
+				migrateColorEntry(tag, &quot;animfront&quot;, &quot;options.ui.look.contactlist.status-change-animation.color1&quot;);
+				migrateColorEntry(tag, &quot;animback&quot;, &quot;options.ui.look.contactlist.status-change-animation.color2&quot;);
 			}
 
 			tag = findSubTag(p_lnf, &quot;fonts&quot;, &amp;found);
 			if(found) {
-				readEntry(tag, &quot;roster&quot;, &amp;prefs.font[fRoster]);
-				readEntry(tag, &quot;message&quot;, &amp;prefs.font[fMessage]);
-				readEntry(tag, &quot;chat&quot;, &amp;prefs.font[fChat]);
-				readEntry(tag, &quot;popup&quot;, &amp;prefs.font[fPopup]);
+				migrateStringEntry(tag, &quot;roster&quot;, &quot;options.ui.look.font.contactlist&quot;);
+				migrateStringEntry(tag, &quot;message&quot;, &quot;options.ui.look.font.message&quot;);
+				migrateStringEntry(tag, &quot;chat&quot;, &quot;options.ui.look.font.chat&quot;);
+				migrateStringEntry(tag, &quot;popup&quot;, &quot;options.ui.look.font.passive-popup&quot;);
 			}
 		}
 
@@ -1568,30 +1236,41 @@ bool UserProfile::fromFile(const QString &amp;fname)
 		if(found) {
 			bool found;
 
-			readEntry(p_sound, &quot;player&quot;, &amp;prefs.player);
-			readBoolEntry(p_sound, &quot;noawaysound&quot;, &amp;prefs.noAwaySound);
-			readBoolEntry(p_sound, &quot;noGCSound&quot;, &amp;prefs.noGCSound);
+			QString oldplayer;
+			readEntry(p_sound, &quot;player&quot;, &amp;oldplayer);
+			// psi now auto detects &quot;play&quot; or &quot;aplay&quot;
+			// force auto detection on for old default and simple case of aplay on
+			// alsa enabled systems.
+			if (oldplayer != soundDetectPlayer() &amp;&amp; oldplayer != &quot;play&quot;) {
+				PsiOptions::instance()-&gt;setOption(&quot;options.ui.notifications.sounds.unix-sound-player&quot;, oldplayer);
+			} else {
+				PsiOptions::instance()-&gt;setOption(&quot;options.ui.notifications.sounds.unix-sound-player&quot;, &quot;&quot;);
+			}
+			migrateBoolEntry(p_sound, &quot;noawaysound&quot;, &quot;options.ui.notifications.sounds.silent-while-away&quot;);
+			bool noGCSound;
+			readBoolEntry(p_sound, &quot;noGCSound&quot;, &amp;noGCSound);
+			PsiOptions::instance()-&gt;setOption(&quot;options.ui.notifications.sounds.notify-every-muc-message&quot;, !noGCSound);
 
 			QDomElement tag = findSubTag(p_sound, &quot;onevent&quot;, &amp;found);
 			if(found) {
-				readEntry(tag, &quot;message&quot;, &amp;prefs.onevent[eMessage]);
-				readEntry(tag, &quot;chat1&quot;, &amp;prefs.onevent[eChat1]);
-				readEntry(tag, &quot;chat2&quot;, &amp;prefs.onevent[eChat2]);
-				readEntry(tag, &quot;system&quot;, &amp;prefs.onevent[eSystem]);
-				readEntry(tag, &quot;headline&quot;, &amp;prefs.onevent[eHeadline]);
-				readEntry(tag, &quot;online&quot;, &amp;prefs.onevent[eOnline]);
-				readEntry(tag, &quot;offline&quot;, &amp;prefs.onevent[eOffline]);
-				readEntry(tag, &quot;send&quot;, &amp;prefs.onevent[eSend]);
-				readEntry(tag, &quot;incoming_ft&quot;, &amp;prefs.onevent[eIncomingFT]);
-				readEntry(tag, &quot;ft_complete&quot;, &amp;prefs.onevent[eFTComplete]);
+				migrateStringEntry(tag, &quot;message&quot;, &quot;options.ui.notifications.sounds.incoming-message&quot;);
+				migrateStringEntry(tag, &quot;chat1&quot;, &quot;options.ui.notifications.sounds.new-chat&quot;);
+				migrateStringEntry(tag, &quot;chat2&quot;, &quot;options.ui.notifications.sounds.chat-message&quot;);
+				migrateStringEntry(tag, &quot;system&quot;, &quot;options.ui.notifications.sounds.system-message&quot;);
+				migrateStringEntry(tag, &quot;headline&quot;, &quot;options.ui.notifications.sounds.incoming-headline&quot;);
+				migrateStringEntry(tag, &quot;online&quot;, &quot;options.ui.notifications.sounds.contact-online&quot;);
+				migrateStringEntry(tag, &quot;offline&quot;, &quot;options.ui.notifications.sounds.contact-offline&quot;);
+				migrateStringEntry(tag, &quot;send&quot;, &quot;options.ui.notifications.sounds.outgoing-chat&quot;);
+				migrateStringEntry(tag, &quot;incoming_ft&quot;, &quot;options.ui.notifications.sounds.incoming-file-transfer&quot;);
+				migrateStringEntry(tag, &quot;ft_complete&quot;, &quot;options.ui.notifications.sounds.completed-file-transfer&quot;);
 			}
 		}
 
 		QDomElement p_sizes = findSubTag(p, &quot;sizes&quot;, &amp;found);
 		if(found) {
-			readSizeEntry(p_sizes, &quot;eventdlg&quot;, &amp;prefs.sizeEventDlg);
+			migrateSizeEntry(p_sizes, &quot;eventdlg&quot;, &quot;options.ui.message.size&quot;);
 			migrateSizeEntry(p_sizes, &quot;chatdlg&quot;, &quot;options.ui.chat.size&quot;);
-			readSizeEntry(p_sizes, &quot;tabdlg&quot;, &amp;prefs.sizeTabDlg);
+			migrateSizeEntry(p_sizes, &quot;tabdlg&quot;, &quot;options.ui.tabs.size&quot;);
 		}
 
 
@@ -1629,14 +1308,14 @@ bool UserProfile::fromFile(const QString &amp;fname)
 
 				if ( isGood ) {
 					if ( tbGroup != &quot;mainWin&quot; || !mainWinCleared ) {
-						prefs.toolbars[tbGroup].clear();
+						lateMigrationData.toolbars[tbGroup].clear();
 						if ( tbGroup == &quot;mainWin&quot; )
 							mainWinCleared = true;
 					}
 
 					if ( oldStyle ) {
-						Options::ToolbarPrefs tb = loadToolbarData( e );
-						prefs.toolbars[tbGroup].append(tb);
+						ToolbarPrefs tb = loadToolbarData( e );
+						lateMigrationData.toolbars[tbGroup].append(tb);
 					}
 					else {
 						for(QDomNode nn = e.firstChild(); !nn.isNull(); nn = nn.nextSibling()) {
@@ -1645,8 +1324,8 @@ bool UserProfile::fromFile(const QString &amp;fname)
 								continue;
 
 							if ( ee.tagName() == &quot;toolbar&quot; ) {
-								Options::ToolbarPrefs tb = loadToolbarData( ee );
-								prefs.toolbars[tbGroup].append(tb);
+								ToolbarPrefs tb = loadToolbarData( ee );
+								lateMigrationData.toolbars[tbGroup].append(tb);
 							}
 						}
 					}
@@ -1657,8 +1336,8 @@ bool UserProfile::fromFile(const QString &amp;fname)
 			if ( progver == &quot;0.9&quot; || progver == &quot;0.9-CVS&quot; ) {
 				// at first, we need to scan the options, to determine, whether event_notifier already available
 				bool found = false;
-				QList&lt;Options::ToolbarPrefs&gt;::Iterator it = prefs.toolbars[&quot;mainWin&quot;].begin();
-				for ( ; it != prefs.toolbars[&quot;mainWin&quot;].end(); ++it) {
+				QList&lt;ToolbarPrefs&gt;::Iterator it = lateMigrationData.toolbars[&quot;mainWin&quot;].begin();
+				for ( ; it != lateMigrationData.toolbars[&quot;mainWin&quot;].end(); ++it) {
 					QStringList::Iterator it2 = (*it).keys.begin();
 					for ( ; it2 != (*it).keys.end(); ++it2) {
 						if ( *it2 == &quot;event_notifier&quot; ) {
@@ -1669,7 +1348,7 @@ bool UserProfile::fromFile(const QString &amp;fname)
 				}
 
 				if ( !found ) {
-					Options::ToolbarPrefs tb;
+					ToolbarPrefs tb;
 					tb.name = QObject::tr(&quot;Event notifier&quot;);
 					tb.on = false;
 					tb.locked = true;
@@ -1677,7 +1356,7 @@ bool UserProfile::fromFile(const QString &amp;fname)
 					tb.keys &lt;&lt; &quot;event_notifier&quot;;
 					tb.dock  = Qt::DockBottom;
 					tb.index = 0;
-					prefs.toolbars[&quot;mainWin&quot;].append(tb);
+					lateMigrationData.toolbars[&quot;mainWin&quot;].append(tb);
 				}
 			}
 		}
@@ -1685,85 +1364,87 @@ bool UserProfile::fromFile(const QString &amp;fname)
 		//group chat
 		QDomElement p_groupchat = findSubTag(p, &quot;groupchat&quot;, &amp;found);
 		if (found) {
-			readBoolEntry(p_groupchat, &quot;nickcoloring&quot;, &amp;prefs.gcNickColoring);
-			readBoolEntry(p_groupchat, &quot;highlighting&quot;, &amp;prefs.gcHighlighting);
-			xmlToStringList(p_groupchat, &quot;highlightwords&quot;, &amp;prefs.gcHighlights);
-			xmlToStringList(p_groupchat, &quot;nickcolors&quot;, &amp;prefs.gcNickColors);
+			migrateBoolEntry(p_groupchat, &quot;nickcoloring&quot;, &quot;options.ui.muc.use-nick-coloring&quot;);
+			migrateBoolEntry(p_groupchat, &quot;highlighting&quot;, &quot;options.ui.muc.use-highlighting&quot;);
+			migrateStringList(p_groupchat, &quot;highlightwords&quot;, &quot;options.ui.muc.highlight-words&quot;);
+			migrateStringList(p_groupchat, &quot;nickcolors&quot;, &quot;options.ui.look.colors.muc.nick-colors&quot;);
 		}
 
 		// Bouncing dock icon (Mac OS X)
 		QDomElement p_dock = findSubTag(p, &quot;dock&quot;, &amp;found);
 		if(found) {
+			PsiOptions::instance()-&gt;setOption(&quot;options.ui.notifications.bounce-dock&quot;, p_dock.attribute(&quot;bounce&quot;));
+			/* FIXME convert back to some modern enum?
 			if (p_dock.attribute(&quot;bounce&quot;) == &quot;once&quot;) {
-				prefs.bounceDock = Options::BounceOnce;
+				lateMigrationData.bounceDock = Options::BounceOnce;
 			}
 			else if (p_dock.attribute(&quot;bounce&quot;) == &quot;forever&quot;) {
-				prefs.bounceDock = Options::BounceForever;
+				lateMigrationData.bounceDock = Options::BounceForever;
 			}
 			else if (p_dock.attribute(&quot;bounce&quot;) == &quot;never&quot;) {
-				prefs.bounceDock = Options::NoBounce;
-			}
+				lateMigrationData.bounceDock = Options::NoBounce;
+			}*/
 		}
 
 		QDomElement p_popup = findSubTag(p, &quot;popups&quot;, &amp;found);
 		if(found) {
-			readBoolEntry(p_popup, &quot;on&quot;, &amp;prefs.ppIsOn);
-			readBoolEntry(p_popup, &quot;online&quot;, &amp;prefs.ppOnline);
-			readBoolEntry(p_popup, &quot;offline&quot;, &amp;prefs.ppOffline);
-			readBoolEntry(p_popup, &quot;statusChange&quot;, &amp;prefs.ppStatus);
-			readBoolEntry(p_popup, &quot;message&quot;, &amp;prefs.ppMessage);
-			readBoolEntry(p_popup, &quot;chat&quot;, &amp;prefs.ppChat);
-			readBoolEntry(p_popup, &quot;headline&quot;, &amp;prefs.ppHeadline);
-			readBoolEntry(p_popup, &quot;file&quot;, &amp;prefs.ppFile);
-			readNumEntry(p_popup,  &quot;jidClip&quot;, &amp;prefs.ppJidClip);
-			readNumEntry(p_popup,  &quot;statusClip&quot;, &amp;prefs.ppStatusClip);
-			readNumEntry(p_popup,  &quot;textClip&quot;, &amp;prefs.ppTextClip);
-			readNumEntry(p_popup,  &quot;hideTime&quot;, &amp;prefs.ppHideTime);
-			readColorEntry(p_popup, &quot;borderColor&quot;, &amp;prefs.ppBorderColor);
+			migrateBoolEntry(p_popup, &quot;on&quot;, &quot;options.ui.notifications.passive-popups.enabled&quot;);
+			migrateBoolEntry(p_popup, &quot;online&quot;, &quot;options.ui.notifications.passive-popups.status.online&quot;);
+			migrateBoolEntry(p_popup, &quot;offline&quot;, &quot;options.ui.notifications.passive-popups.status.offline&quot;);
+			migrateBoolEntry(p_popup, &quot;statusChange&quot;, &quot;options.ui.notifications.passive-popups.status.other-changes&quot;);
+			migrateBoolEntry(p_popup, &quot;message&quot;, &quot;options.ui.notifications.passive-popups.incoming-message&quot;);
+			migrateBoolEntry(p_popup, &quot;chat&quot;, &quot;options.ui.notifications.passive-popups.incoming-chat&quot;);
+			migrateBoolEntry(p_popup, &quot;headline&quot;, &quot;options.ui.notifications.passive-popups.incoming-headline&quot;);
+			migrateBoolEntry(p_popup, &quot;file&quot;, &quot;options.ui.notifications.passive-popups.incoming-file-transfer&quot;);
+			migrateIntEntry(p_popup,  &quot;jidClip&quot;, &quot;options.ui.notifications.passive-popups.maximum-jid-length&quot;);
+			migrateIntEntry(p_popup,  &quot;statusClip&quot;, &quot;options.ui.notifications.passive-popups.maximum-status-length&quot;);
+			migrateIntEntry(p_popup,  &quot;textClip&quot;, &quot;options.ui.notifications.passive-popups.maximum-text-length&quot;);
+			migrateIntEntry(p_popup,  &quot;hideTime&quot;, &quot;options.ui.notifications.passive-popups.duration&quot;);
+			migrateColorEntry(p_popup, &quot;borderColor&quot;, &quot;options.ui.look.colors.passive-popup.border&quot;);
 		}
 
 		QDomElement p_lockdown = findSubTag(p, &quot;lockdown&quot;, &amp;found);
 		if(found) {
-			readBoolEntry(p_lockdown, &quot;roster&quot;, &amp;prefs.lockdown.roster);
-			readBoolEntry(p_lockdown, &quot;services&quot;, &amp;prefs.lockdown.services);
+			migrateBoolEntry(p_lockdown, &quot;roster&quot;, &quot;options.ui.contactlist.lockdown-roster&quot;);
+			migrateBoolEntry(p_lockdown, &quot;services&quot;, &quot;options.ui.contactlist.disable-service-discovery&quot;);
 		}
 
 		QDomElement p_iconset = findSubTag(p, &quot;iconset&quot;, &amp;found);
 		if(found) {
-			readEntry(p_iconset, &quot;system&quot;, &amp;prefs.systemIconset);
+			migrateStringEntry(p_iconset, &quot;system&quot;, &quot;options.iconsets.system&quot;);
 
 			QDomElement roster = findSubTag(p_iconset, &quot;roster&quot;, &amp;found);
 			if (found) {
-				readEntry(roster, &quot;default&quot;, &amp;prefs.defaultRosterIconset);
+				migrateStringEntry(roster, &quot;default&quot;, &quot;options.iconsets.status&quot;);
 
 				QDomElement service = findSubTag(roster, &quot;service&quot;, &amp;found);
 				if (found) {
-					prefs.serviceRosterIconset.clear();
+					lateMigrationData.serviceRosterIconset.clear();
 					for (QDomNode n = service.firstChild(); !n.isNull(); n = n.nextSibling()) {
 						QDomElement i = n.toElement();
 						if ( i.isNull() )
 							continue;
 
-						prefs.serviceRosterIconset[i.attribute(&quot;service&quot;)] = i.attribute(&quot;iconset&quot;);
+						lateMigrationData.serviceRosterIconset[i.attribute(&quot;service&quot;)] = i.attribute(&quot;iconset&quot;);
 					}
 				}
 
 				QDomElement custom = findSubTag(roster, &quot;custom&quot;, &amp;found);
 				if (found) {
-					prefs.customRosterIconset.clear();
+					lateMigrationData.customRosterIconset.clear();
 					for (QDomNode n = custom.firstChild(); !n.isNull(); n = n.nextSibling()) {
 						QDomElement i = n.toElement();
 						if ( i.isNull() )
 							continue;
 
-						prefs.customRosterIconset[i.attribute(&quot;regExp&quot;)] = i.attribute(&quot;iconset&quot;);
+						lateMigrationData.customRosterIconset[i.attribute(&quot;regExp&quot;)] = i.attribute(&quot;iconset&quot;);
 					}
 				}
 			}
 
 			QDomElement emoticons = findSubTag(p_iconset, &quot;emoticons&quot;, &amp;found);
 			if (found) {
-				prefs.emoticons.clear();
+				QStringList emoticons_list;
 				for (QDomNode n = emoticons.firstChild(); !n.isNull(); n = n.nextSibling()) {
 					QDomElement i = n.toElement();
 					if ( i.isNull() )
@@ -1771,9 +1452,10 @@ bool UserProfile::fromFile(const QString &amp;fname)
 
 					if ( i.tagName() == &quot;item&quot; ) {
 						QString is = i.text();
-						prefs.emoticons &lt;&lt; is;
+						emoticons_list &lt;&lt; is;
 					}
 				}
+				PsiOptions::instance()-&gt;setOption(&quot;options.iconsets.emoticons&quot;, emoticons_list);
 			}
 		}
 
@@ -1785,14 +1467,14 @@ bool UserProfile::fromFile(const QString &amp;fname)
 
 		QDomElement p_disco = findSubTag(p, &quot;disco&quot;, &amp;found);
 		if (found) {
-			readBoolEntry(p_disco, &quot;items&quot;, &amp;prefs.discoItems);
-			readBoolEntry(p_disco, &quot;info&quot;, &amp;prefs.discoInfo);
+			migrateBoolEntry(p_disco, &quot;items&quot;, &quot;options.ui.service-discovery.automatically-get-items&quot;);
+			migrateBoolEntry(p_disco, &quot;info&quot;, &quot;options.ui.service-discovery.automatically-browse-into&quot;);
 		}
 
 		QDomElement p_dt = findSubTag(p, &quot;dt&quot;, &amp;found);
 		if (found) {
-			readNumEntry(p_dt, &quot;port&quot;, &amp;prefs.dtPort);
-			readEntry(p_dt, &quot;external&quot;, &amp;prefs.dtExternal);
+			migrateIntEntry(p_dt, &quot;port&quot;, &quot;options.p2p.bytestreams.listen-port&quot;);
+			migrateStringEntry(p_dt, &quot;external&quot;, &quot;options.p2p.bytestreams.external-address&quot;);
 		}
 
 		QDomElement p_globalAccel = findSubTag(p, &quot;globalAccel&quot;, &amp;found);
@@ -1835,6 +1517,56 @@ bool UserProfile::fromFile(const QString &amp;fname)
 	return TRUE;
 }
 
+void OptionsMigration::lateMigration()
+{
+	QStringList allSetOptions = PsiOptions::instance()-&gt;allOptionNames();
+
+	bool migrated=false;
+	foreach(QString opt, allSetOptions) {
+		if (opt.startsWith(&quot;options.status.presets.&quot;)) {
+			migrated = true;
+		}
+	}
+	if (!migrated) {
+		PsiOptions *o = PsiOptions::instance();
+		//QMap&lt;QString, QString&gt; serviceRosterIconset;
+		QMapIterator&lt;QString, QString&gt; iSRI(lateMigrationData.serviceRosterIconset);
+ 		while (iSRI.hasNext()) {
+			iSRI.next();
+			QString base = o-&gt;mapPut(&quot;options.iconsets.service-status&quot;, iSRI.key());
+			o-&gt;setOption(base+&quot;.iconset&quot;, iSRI.value());
+		}
+	
+		//QMap&lt;QString, QString&gt; customRosterIconset;
+		int idx=0;
+		QMapIterator&lt;QString, QString&gt; iCRI(lateMigrationData.customRosterIconset);
+ 		while (iSRI.hasNext()) {
+			iSRI.next();
+			QString base = &quot;options.iconsets.custom-status&quot; &quot;.a&quot; + QString::number(idx++);
+			o-&gt;setOption(base+&quot;.regexp&quot;, iCRI.key());
+			o-&gt;setOption(base+&quot;.iconset&quot;, iCRI.value());
+		}
+
+		//QMap&lt;QString,StatusPreset&gt; sp; // Status message presets.
+		foreach (StatusPreset sp, lateMigrationData.sp) {
+			QString base = o-&gt;mapPut(&quot;options.status.presets&quot;, sp.name());
+			o-&gt;setOption(base+&quot;.message&quot;,sp.message());
+			o-&gt;setOption(base+&quot;.status&quot;,XMPP::Status(sp.status()).typeString());
+			o-&gt;setOption(base+&quot;.force-priority&quot;, sp.priority().hasValue());
+			if (sp.priority().hasValue()) {
+				o-&gt;setOption(base+&quot;.priority&quot;, sp.priority().value());
+			}
+		}
+		//QMap&lt; QString, QList&lt;ToolbarPrefs&gt; &gt; toolbars;
+		idx = 0;
+		QList&lt;ToolbarPrefs&gt; tbs = lateMigrationData.toolbars[&quot;mainWin&quot;];
+		foreach(ToolbarPrefs tb, tbs) {
+			QString base = &quot;options.ui.contactlist.toolbars&quot; &quot;.a&quot; + QString::number(idx++);
+			PsiToolBar::structToOptions(base, &amp;tb);
+		}
+	}
+}
+
 
 QString pathToProfile(const QString &amp;name)
 {</diff>
      <filename>src/psi_profiles.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -293,7 +293,7 @@ public:
 	PsiOptions *options;
 	Client *client;
 	ContactProfile *cp;
-	UserAccount acc, accnext;
+	UserAccount acc;
 	Jid jid, nextJid;
 	Status loginStatus;
 	bool loginWithPriority;
@@ -381,8 +381,9 @@ public:
 		if (lastManualStatus_.isAvailable()) {
 			if (lastManualStatus_.type() == XMPP::Status::DND)
 				return true;
-			if ((lastManualStatus_.type() == XMPP::Status::Away || lastManualStatus_.type() == XMPP::Status::XA) &amp;&amp; option.noAwayPopup)
+			if ((lastManualStatus_.type() == XMPP::Status::Away || lastManualStatus_.type() == XMPP::Status::XA) &amp;&amp; PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.popup-dialogs.suppress-while-away&quot;).toBool()) {
 				return true;
+			}
 		}
 
 		return false;
@@ -396,15 +397,15 @@ public slots:
 
 	void loadQueue()
 	{
-		bool soundEnabled = useSound;
-		useSound  = false; // disable the sound and popups
+		bool soundEnabled = PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.sounds.enable&quot;).toBool();
+		PsiOptions::instance()-&gt;setOption(&quot;options.ui.notifications.sounds.enable&quot;, false); // disable the sound and popups
 		doPopups_ = false;
 
 		QFileInfo fi( pathToProfileEvents() );
 		if ( fi.exists() )
 			eventQueue-&gt;fromFile(pathToProfileEvents());
 
-		useSound = soundEnabled;
+		PsiOptions::instance()-&gt;setOption(&quot;options.ui.notifications.sounds.enable&quot;, soundEnabled);
 		doPopups_ = true;
 	}
 
@@ -433,6 +434,11 @@ public slots:
 		xmlRingbuf[xmlRingbufWrite].time = QDateTime::currentDateTime();
 		xmlRingbufWrite = (xmlRingbufWrite + 1) % xmlRingbuf.count();
 	}
+	
+	void pm_proxyRemoved(QString proxykey)
+	{
+		if (acc.proxyID == proxykey) acc.proxyID = &quot;&quot;;
+	}
 
 	void vcardChanged(const Jid &amp;j)
 	{
@@ -571,9 +577,9 @@ private:
 		if (!lastManualStatus_.isAway()) {
 			switch (autoAway) {
 			case AutoAway_Away:
-				return Status(XMPP::Status::Away, option.asMessage, acc.priority);
+				return Status(XMPP::Status::Away, PsiOptions::instance()-&gt;getOption(&quot;options.status.auto-away.message&quot;).toString(), acc.priority);
 			case AutoAway_XA:
-				return Status(XMPP::Status::XA, option.asMessage, acc.priority);
+				return Status(XMPP::Status::XA, PsiOptions::instance()-&gt;getOption(&quot;options.status.auto-away.message&quot;).toString(), acc.priority);
 			case AutoAway_Offline:
 				return Status(Status::Offline, loginStatus.status(), acc.priority);
 			default:
@@ -653,7 +659,7 @@ PsiAccount::PsiAccount(const UserAccount &amp;acc, PsiContactList *parent, CapsRegis
 
 	d-&gt;client-&gt;setFileTransferEnabled(true);
 
-	setSendChatState(option.messageEvents);
+	setSendChatState(PsiOptions::instance()-&gt;getOption(&quot;options.messages.send-composing-events&quot;).toBool());
 
 	//connect(d-&gt;client, SIGNAL(connected()), SLOT(client_connected()));
 	//connect(d-&gt;client, SIGNAL(handshaken()), SLOT(client_handshaken()));
@@ -685,7 +691,7 @@ PsiAccount::PsiAccount(const UserAccount &amp;acc, PsiContactList *parent, CapsRegis
 
 	// Caps manager
 	d-&gt;capsManager = new CapsManager(d-&gt;client-&gt;jid(), capsRegistry, new IrisProtocol::DiscoInfoQuerier(d-&gt;client));
-	d-&gt;capsManager-&gt;setEnabled(option.useCaps);
+	d-&gt;capsManager-&gt;setEnabled(PsiOptions::instance()-&gt;getOption(&quot;options.service-discovery.enable-entity-capabilities&quot;).toBool());
 
 	// Roster item exchange task
 	d-&gt;rosterItemExchangeTask = new RosterItemExchangeTask(d-&gt;client-&gt;rootTask());
@@ -771,7 +777,7 @@ PsiAccount::PsiAccount(const UserAccount &amp;acc, PsiContactList *parent, CapsRegis
 	d-&gt;rcSetStatusServer = 0;
 	d-&gt;rcSetOptionsServer = 0;
 	d-&gt;rcForwardServer = 0;
-	setRCEnabled(option.useRC);
+	setRCEnabled(PsiOptions::instance()-&gt;getOption(&quot;options.external-control.adhoc-remote-control.enable&quot;).toBool());
 
 	// Plugins
 #ifdef PSI_PLUGINS
@@ -797,14 +803,13 @@ PsiAccount::PsiAccount(const UserAccount &amp;acc, PsiContactList *parent, CapsRegis
 	}
 
 	setUserAccount(acc);
+	connect(d-&gt;psi-&gt;proxy(), SIGNAL(proxyRemoved(QString)), d, SLOT(pm_proxyRemoved(QString)));
 
 	d-&gt;contactList-&gt;link(this);
 	connect(d-&gt;psi, SIGNAL(emitOptionsUpdate()), SLOT(optionsUpdate()));
 	//connect(d-&gt;psi, SIGNAL(pgpToggled(bool)), SLOT(pgpToggled(bool)));
 	connect(&amp;PGPUtil::instance(), SIGNAL(pgpKeysUpdated()), SLOT(pgpKeysUpdated()));
 
-	d-&gt;psi-&gt;setToggles(d-&gt;acc.tog_offline, d-&gt;acc.tog_away, d-&gt;acc.tog_agents, d-&gt;acc.tog_hidden,d-&gt;acc.tog_self);
-
 	d-&gt;setEnabled(d-&gt;acc.opt_enabled);
 
 	// Listen to the capabilities manager
@@ -812,7 +817,7 @@ PsiAccount::PsiAccount(const UserAccount &amp;acc, PsiContactList *parent, CapsRegis
 
 	//printf(&quot;PsiAccount: [%s] loaded\n&quot;, name().latin1());
 	d-&gt;xmlConsole = new XmlConsole(this);
-	if(option.xmlConsoleOnLogin &amp;&amp; d-&gt;acc.opt_enabled) {
+	if(PsiOptions::instance()-&gt;getOption(&quot;options.xml-console.enable-at-login&quot;).toBool() &amp;&amp; d-&gt;acc.opt_enabled) {
 		this-&gt;showXmlConsole();
 		d-&gt;xmlConsole-&gt;enable();
 	}
@@ -964,8 +969,6 @@ const QString &amp; PsiAccount::name() const
 
 const UserAccount &amp; PsiAccount::userAccount() const
 {
-	d-&gt;psi-&gt;getToggles(&amp;d-&gt;acc.tog_offline, &amp;d-&gt;acc.tog_away, &amp;d-&gt;acc.tog_agents, &amp;d-&gt;acc.tog_hidden,&amp;d-&gt;acc.tog_self);
-
 	// save the roster and pgp key bindings
 	d-&gt;acc.roster.clear();
 	d-&gt;acc.keybind.clear();
@@ -1166,8 +1169,8 @@ void PsiAccount::login()
 	}
 
 	AdvancedConnector::Proxy p;
-	if(d-&gt;acc.proxy_index &gt; 0) {
-		const ProxyItem &amp;pi = d-&gt;psi-&gt;proxy()-&gt;getItem(d-&gt;acc.proxy_index-1);
+	if(d-&gt;acc.proxyID != &quot;&quot;) {
+		const ProxyItem &amp;pi = d-&gt;psi-&gt;proxy()-&gt;getItem(d-&gt;acc.proxyID);
 		if(pi.type == &quot;http&quot;) // HTTP Connect
 			p.setHttpConnect(pi.settings.host, pi.settings.port);
 		else if(pi.type == &quot;socks&quot;) // SOCKS
@@ -1762,7 +1765,7 @@ void PsiAccount::incomingHttpAuthRequest(const PsiHttpAuthRequest &amp;req)
 
 void PsiAccount::client_rosterItemAdded(const RosterItem &amp;r)
 {
-	if ( r.isPush() &amp;&amp; r.name().isEmpty() &amp;&amp; option.autoResolveNicksOnAdd ) {
+	if ( r.isPush() &amp;&amp; r.name().isEmpty() &amp;&amp; PsiOptions::instance()-&gt;getOption(&quot;options.contactlist.resolve-nicks-on-contact-add&quot;).toBool() ) {
 		// automatically resolve nickname from vCard, if newly added item doesn't have any
 		VCardFactory::instance()-&gt;getVCard(r.jid(), d-&gt;client-&gt;rootTask(), this, SLOT(resolveContactName()));
 	}
@@ -1886,16 +1889,16 @@ void PsiAccount::client_resourceAvailable(const Jid &amp;j, const Resource &amp;r)
 		u-&gt;setPresenceError(&quot;&quot;);
 		cpUpdate(*u, r.name(), true);
 
-		if(doAnim &amp;&amp; option.rosterAnim)
+		if(doAnim &amp;&amp; PsiOptions::instance()-&gt;getOption(&quot;options.ui.contactlist.use-status-change-animation&quot;).toBool())
 			d-&gt;cp-&gt;animateNick(u-&gt;jid());
 	}
 
 	if(doSound)
-		playSound(option.onevent[eOnline]);
+		playSound(PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.sounds.contact-online&quot;).toString());
 
 #if !defined(Q_WS_MAC) || !defined(HAVE_GROWL)
 	// Do the popup test earlier (to avoid needless JID lookups)
-	if ((popupType == PopupOnline &amp;&amp; option.ppOnline) || (popupType == PopupStatusChange &amp;&amp; option.ppStatus))
+	if ((popupType == PopupOnline &amp;&amp; PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.passive-popups.status.online&quot;).toBool()) || (popupType == PopupStatusChange &amp;&amp; PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.passive-popups.status.other-changes&quot;).toBool()))
 #endif
 	if(notifyOnlineOk &amp;&amp; doPopup &amp;&amp; !d-&gt;blockTransportPopupList-&gt;find(j, popupType == PopupOnline) &amp;&amp; !d-&gt;noPopup(IncomingStanza)) {
 		QString name;
@@ -1907,7 +1910,7 @@ void PsiAccount::client_resourceAvailable(const Jid &amp;j, const Resource &amp;r)
 		else if ( popupType == PopupStatusChange )
 			pt = PsiPopup::AlertStatusChange;
 
-		if ((popupType == PopupOnline &amp;&amp; option.ppOnline) || (popupType == PopupStatusChange &amp;&amp; option.ppStatus)) {
+		if ((popupType == PopupOnline &amp;&amp; PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.passive-popups.status.online&quot;).toBool()) || (popupType == PopupStatusChange &amp;&amp; PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.passive-popups.status.other-changes&quot;).toBool())) {
 			PsiPopup *popup = new PsiPopup(pt, this);
 			popup-&gt;setData(j, r, u);
 		}
@@ -1970,17 +1973,17 @@ void PsiAccount::client_resourceUnavailable(const Jid &amp;j, const Resource &amp;r)
 		cpUpdate(*u, r.name(), true);
 	}
 	if(doSound)
-		playSound(option.onevent[eOffline]);
+		playSound(PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.sounds.contact-offline&quot;).toString());
 
 #if !defined(Q_WS_MAC) || !defined(HAVE_GROWL)
 	// Do the popup test earlier (to avoid needless JID lookups)
-	if (option.ppOffline)
+	if (PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.passive-popups.status.offline&quot;).toBool())
 #endif
 	if(doPopup &amp;&amp; !d-&gt;blockTransportPopupList-&gt;find(j) &amp;&amp; !d-&gt;noPopup(IncomingStanza)) {
 		QString name;
 		UserListItem *u = findFirstRelevant(j);
 
-		if (option.ppOffline) {
+		if (PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.passive-popups.status.offline&quot;).toBool()) {
 			PsiPopup *popup = new PsiPopup(PsiPopup::AlertOffline, this);
 			popup-&gt;setData(j, r, u);
 		}
@@ -2047,7 +2050,7 @@ void PsiAccount::processIncomingMessage(const Message &amp;_m)
 		return;
 
 	// skip headlines?
-	if(_m.type() == &quot;headline&quot; &amp;&amp; option.ignoreHeadline)
+	if(_m.type() == &quot;headline&quot; &amp;&amp; PsiOptions::instance()-&gt;getOption(&quot;options.messages.ignore-headlines&quot;).toBool())
 		return;
 
 	if(_m.type() == &quot;groupchat&quot;) {
@@ -2076,9 +2079,9 @@ void PsiAccount::processIncomingMessage(const Message &amp;_m)
 	QList&lt;UserListItem*&gt; ul = findRelevant(m.from());
 
 	// ignore events from non-roster JIDs?
-	if (ul.isEmpty() &amp;&amp; option.ignoreNonRoster)
+	if (ul.isEmpty() &amp;&amp; PsiOptions::instance()-&gt;getOption(&quot;options.messages.ignore-non-roster-contacts&quot;).toBool())
 	{
-		if (option.excludeGroupChatsFromIgnore)
+		if (PsiOptions::instance()-&gt;getOption(&quot;options.messages.exclude-muc-from-ignore&quot;).toBool())
 		{
 			GCMainDlg *w = findDialog&lt;GCMainDlg*&gt;(Jid(_m.from().userHost()));
 			if(!w)
@@ -2121,11 +2124,11 @@ void PsiAccount::processIncomingMessage(const Message &amp;_m)
 
 	// change the type?
 	if (m.type() != &quot;headline&quot; &amp;&amp; m.invite().isEmpty() &amp;&amp; m.mucInvites().isEmpty()) {
-		if (option.incomingAs == 1)
+		if (PsiOptions::instance()-&gt;getOption(&quot;options.messages.force-incoming-message-type&quot;).toString() == &quot;message&quot;)
 			m.setType(&quot;&quot;);
-		else if (option.incomingAs == 2)
+		else if (PsiOptions::instance()-&gt;getOption(&quot;options.messages.force-incoming-message-type&quot;).toString() == &quot;chat&quot;)
 			m.setType(&quot;chat&quot;);
-		else if (option.incomingAs == 3) {
+		else if (PsiOptions::instance()-&gt;getOption(&quot;options.messages.force-incoming-message-type&quot;).toString() == &quot;current-open&quot;) {
 			if (c != NULL &amp;&amp; !c-&gt;isHidden())
 				m.setType(&quot;chat&quot;);
 			else
@@ -2350,7 +2353,7 @@ void PsiAccount::setStatusActual(const Status &amp;_s)
 		
 		// Get the vcard
 		const VCard *vcard = VCardFactory::instance()-&gt;vcard(d-&gt;jid);
-		if ( option.autoVCardOnLogin || !vcard || vcard-&gt;isEmpty() || vcard-&gt;nickName().isEmpty() )
+		if ( PsiOptions::instance()-&gt;getOption(&quot;options.vcard.query-own-vcard-on-login&quot;).toBool() || !vcard || vcard-&gt;isEmpty() || vcard-&gt;nickName().isEmpty() )
 			VCardFactory::instance()-&gt;getVCard(d-&gt;jid, d-&gt;client-&gt;rootTask(), this, SLOT(slotCheckVCard()));
 		else {
 			d-&gt;nickFromVCard = true;
@@ -2415,11 +2418,11 @@ void PsiAccount::secondsIdle(int seconds)
 {
 	int minutes = seconds / 60;
 
-	if(option.use_asOffline &amp;&amp; option.asOffline &gt; 0 &amp;&amp; minutes &gt;= option.asOffline)
+	if(PsiOptions::instance()-&gt;getOption(&quot;options.status.auto-away.use-offline&quot;).toBool() &amp;&amp; PsiOptions::instance()-&gt;getOption(&quot;options.status.auto-away.offline-after&quot;).toInt() &gt; 0 &amp;&amp; minutes &gt;= PsiOptions::instance()-&gt;getOption(&quot;options.status.auto-away.offline-after&quot;).toInt())
 		d-&gt;setAutoAway(Private::AutoAway_Offline);
-	else if(option.use_asXa &amp;&amp; option.asXa &gt; 0 &amp;&amp; minutes &gt;= option.asXa)
+	else if(PsiOptions::instance()-&gt;getOption(&quot;options.status.auto-away.use-not-availible&quot;).toBool() &amp;&amp; PsiOptions::instance()-&gt;getOption(&quot;options.status.auto-away.not-availible-after&quot;).toInt() &gt; 0 &amp;&amp; minutes &gt;= PsiOptions::instance()-&gt;getOption(&quot;options.status.auto-away.not-availible-after&quot;).toInt())
 		d-&gt;setAutoAway(Private::AutoAway_XA);
-	else if(option.use_asAway &amp;&amp; option.asAway &gt; 0 &amp;&amp; minutes &gt;= option.asAway)
+	else if(PsiOptions::instance()-&gt;getOption(&quot;options.status.auto-away.use-away&quot;).toBool() &amp;&amp; PsiOptions::instance()-&gt;getOption(&quot;options.status.auto-away.away-after&quot;).toInt() &gt; 0 &amp;&amp; minutes &gt;= PsiOptions::instance()-&gt;getOption(&quot;options.status.auto-away.away-after&quot;).toInt())
 		d-&gt;setAutoAway(Private::AutoAway_Away);
 	else
 		d-&gt;setAutoAway(Private::AutoAway_None);
@@ -2438,7 +2441,7 @@ void PsiAccount::playSound(const QString &amp;str)
 		return;
 
 	// no away sounds?
-	if(option.noAwaySound &amp;&amp; (s == STATUS_AWAY || s == STATUS_XA))
+	if(PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.sounds.silent-while-away&quot;).toBool() &amp;&amp; (s == STATUS_AWAY || s == STATUS_XA))
 		return;
 
 	d-&gt;psi-&gt;playSound(str);
@@ -2914,7 +2917,7 @@ ChatDlg *PsiAccount::ensureChatDlg(const Jid &amp;j)
 		 * only way */
 		//TODO: This doesn't work as expected atm, it doesn't seem to reparent the tabset
 		QWidget *window=c;
-		if ( option.useTabs )
+		if ( PsiOptions::instance()-&gt;getOption(&quot;options.ui.tabs.use-tabs&quot;).toBool() )
 			window = d-&gt;tabManager-&gt;getManagingTabs(c);
 		if(window &amp;&amp; window-&gt;isHidden()) {
 			const QPixmap *pp = c-&gt;icon();
@@ -2937,11 +2940,11 @@ ChatDlg *PsiAccount::ensureChatDlg(const Jid &amp;j)
 
 void PsiAccount::changeStatus(int x)
 {
-	if(x == STATUS_OFFLINE &amp;&amp; !option.askOffline) {
+	if(x == STATUS_OFFLINE &amp;&amp; !PsiOptions::instance()-&gt;getOption(&quot;options.status.ask-for-message-on-offline&quot;).toBool()) {
 		setStatus(Status(Status::Offline, &quot;Logged out&quot;, 0));
 	}
 	else {
-		if(x == STATUS_ONLINE &amp;&amp; !option.askOnline) {
+		if(x == STATUS_ONLINE &amp;&amp; !PsiOptions::instance()-&gt;getOption(&quot;options.status.ask-for-message-on-online&quot;).toBool()) {
 			setStatus(Status());
 		}
 		else if(x == STATUS_INVISIBLE){
@@ -3054,16 +3057,16 @@ void PsiAccount::actionSetMood()
 void PsiAccount::actionSetAvatar()
 {
 	while(1) {
-		if(option.lastPath.isEmpty())
-			option.lastPath = QDir::homeDirPath();
-		QString str = QFileDialog::getOpenFileName(0,tr(&quot;Choose a file&quot;),option.lastPath, tr(&quot;Images (*.png *.xpm *.jpg *.PNG *.XPM *.JPG)&quot;));
+		if(PsiOptions::instance()-&gt;getOption(&quot;options.ui.last-used-open-path&quot;).toString().isEmpty())
+			PsiOptions::instance()-&gt;getOption(&quot;options.ui.last-used-open-path&quot;).toString() = QDir::homeDirPath();
+		QString str = QFileDialog::getOpenFileName(0,tr(&quot;Choose a file&quot;),PsiOptions::instance()-&gt;getOption(&quot;options.ui.last-used-open-path&quot;).toString(), tr(&quot;Images (*.png *.xpm *.jpg *.PNG *.XPM *.JPG)&quot;));
 		if(!str.isEmpty()) {
 			QFileInfo fi(str);
 			if(!fi.exists()) {
 				QMessageBox::critical(0, tr(&quot;Error&quot;), tr(&quot;The file specified does not exist.&quot;));
 				continue;
 			}
-			option.lastPath = fi.dirPath();
+			PsiOptions::instance()-&gt;getOption(&quot;options.ui.last-used-open-path&quot;).toString() = fi.dirPath();
 			avatarFactory()-&gt;setSelfAvatar(str);
 		}
 		break;
@@ -3084,7 +3087,7 @@ void PsiAccount::actionDefault(const Jid &amp;j)
 	if(d-&gt;eventQueue-&gt;count(u-&gt;jid()) &gt; 0)
 		openNextEvent(*u, UserAction);
 	else {
-		if(option.defaultAction == 0)
+		if(PsiOptions::instance()-&gt;getOption(&quot;options.messages.default-outgoing-message-type&quot;).toString() == &quot;message&quot;)
 			actionSendMessage(u-&gt;jid());
 		else
 			actionOpenChat(u-&gt;jid());
@@ -3437,7 +3440,7 @@ void PsiAccount::dj_sendMessage(const Message &amp;m, bool log)
 	UserListItem *u = findFirstRelevant(m.to());
 	Message nm = m;
 
-	if(option.incomingAs == 3) {
+	if(PsiOptions::instance()-&gt;getOption(&quot;options.messages.force-incoming-message-type&quot;).toString() == &quot;current-open&quot;) {
 		if(u) {
 			switch(u-&gt;lastMessageType()) {
 				case 0: nm.setType(&quot;&quot;); break;
@@ -3472,7 +3475,7 @@ void PsiAccount::dj_sendMessage(const Message &amp;m, bool log)
 
 	// don't sound when sending groupchat messages or message events
 	if(m.type() != &quot;groupchat&quot; &amp;&amp; !m.body().isEmpty())
-		playSound(option.onevent[eSend]);
+		playSound(PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.sounds.outgoing-chat&quot;).toString());
 
 	// auto close an open messagebox (if non-chat)
 	if(m.type() != &quot;chat&quot; &amp;&amp; !m.body().isEmpty()) {
@@ -3738,7 +3741,7 @@ void PsiAccount::handleEvent(PsiEvent* e, ActivationType activationType)
 
 		// Pass message events to chat window
 		if ((m.containsEvents() || m.chatState() != StateNone) &amp;&amp; m.body().isEmpty()) {
-			if (option.messageEvents) {
+			if (PsiOptions::instance()-&gt;getOption(&quot;options.messages.send-composing-events&quot;).toBool()) {
 				ChatDlg *c = findChatDialog(e-&gt;from());
 				if (!c) {
 					c = findChatDialog(e-&gt;jid());
@@ -3763,8 +3766,8 @@ void PsiAccount::handleEvent(PsiEvent* e, ActivationType activationType)
 			//or in a window
 			if( c &amp;&amp; ( d-&gt;tabManager-&gt;isChatTabbed(c) || !c-&gt;isHidden() ) ) {
 				c-&gt;incomingMessage(m);
-				playSound(option.onevent[eChat2]);
-				if(option.alertOpenChats &amp;&amp; !c-&gt;isActiveTab()) {
+				playSound(PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.sounds.chat-message&quot;).toString());
+				if(PsiOptions::instance()-&gt;getOption(&quot;options.ui.chat.alert-for-already-open-chats&quot;).toBool() &amp;&amp; !c-&gt;isActiveTab()) {
 					// to alert the chat also, we put it in the queue
 					me-&gt;setSentToChatWindow(true);
 				}
@@ -3773,7 +3776,7 @@ void PsiAccount::handleEvent(PsiEvent* e, ActivationType activationType)
 			}
 			else {
 				bool firstChat = !d-&gt;eventQueue-&gt;hasChats(e-&gt;from());
-				playSound(option.onevent[firstChat ? eChat1: eChat2]);
+				playSound(PsiOptions::instance()-&gt;getOption(firstChat ? &quot;options.ui.notifications.sounds.new-chat&quot;: &quot;options.ui.notifications.sounds.chat-message&quot;).toString());
 			}
 
 			if (putToQueue) {
@@ -3782,19 +3785,19 @@ void PsiAccount::handleEvent(PsiEvent* e, ActivationType activationType)
 			}
 		} // /chat
 		else if (m.type() == &quot;headline&quot;) {
-			playSound(option.onevent[eHeadline]);
+			playSound(PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.sounds.incoming-headline&quot;).toString());
 			doPopup = true;
 			popupType = PsiPopup::AlertHeadline;
 		} // /headline
 		else if (m.type() == &quot;&quot;) {
-			playSound(option.onevent[eMessage]);
+			playSound(PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.sounds.incoming-message&quot;).toString());
 			if (m.type() == &quot;&quot;) {
 				doPopup = true;
 				popupType = PsiPopup::AlertMessage;
 			}
 		} // /&quot;&quot;
 		else
-			playSound(option.onevent[eSystem]);
+			playSound(PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.sounds.system-message&quot;).toString());
 
 		if(m.type() == &quot;error&quot;) {
 			// FIXME: handle message errors
@@ -3808,10 +3811,10 @@ void PsiAccount::handleEvent(PsiEvent* e, ActivationType activationType)
 #endif
 	}
 	else if(e-&gt;type() == PsiEvent::HttpAuth) {
-		playSound(option.onevent[eSystem]);
+		playSound(PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.sounds.system-message&quot;).toString());
 	}
 	else if(e-&gt;type() == PsiEvent::File) {
-		playSound(option.onevent[eIncomingFT]);
+		playSound(PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.sounds.incoming-file-transfer&quot;).toString());
 		doPopup = true;
 		popupType = PsiPopup::AlertFile;
 	}
@@ -3827,14 +3830,14 @@ void PsiAccount::handleEvent(PsiEvent* e, ActivationType activationType)
 			return;
 		}
 		re-&gt;setRosterExchangeItems(items);
-		playSound(option.onevent[eSystem]);
+		playSound(PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.sounds.system-message&quot;).toString());
 	}
 	else if (e-&gt;type() == PsiEvent::Auth) {
-		playSound(option.onevent[eSystem]);
+		playSound(PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.sounds.system-message&quot;).toString());
 
 		AuthEvent *ae = (AuthEvent *)e;
 		if(ae-&gt;authType() == &quot;subscribe&quot;) {
-			if(option.autoAuth) {
+			if(PsiOptions::instance()-&gt;getOption(&quot;options.subscriptions.automatically-allow-authorisation&quot;).toBool()) {
 				// Check if we want to request auth as well
 				UserListItem *u = d-&gt;userList.find(ae-&gt;from());
 				if (!u || (u-&gt;subscription().type() != Subscription::Both &amp;&amp; u-&gt;subscription().type() != Subscription::To)) {
@@ -3847,7 +3850,7 @@ void PsiAccount::handleEvent(PsiEvent* e, ActivationType activationType)
 			}
 		} 
 		else if(ae-&gt;authType() == &quot;subscribed&quot;) {
-			if(!option.notifyAuth)
+			if(!PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.successful-subscription&quot;).toBool())
 				putToQueue = false;
 		}
 		else if(ae-&gt;authType() == &quot;unsubscribe&quot;) {
@@ -3866,10 +3869,10 @@ void PsiAccount::handleEvent(PsiEvent* e, ActivationType activationType)
 			r = *(u-&gt;priority());
 		}
 
-		if ((popupType == PsiPopup::AlertChat     &amp;&amp; option.ppChat)     ||
-		    (popupType == PsiPopup::AlertMessage  &amp;&amp; option.ppMessage)  ||
-		    (popupType == PsiPopup::AlertHeadline &amp;&amp; option.ppHeadline) ||
-		    (popupType == PsiPopup::AlertFile     &amp;&amp; option.ppFile))
+		if ((popupType == PsiPopup::AlertChat     &amp;&amp; PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.passive-popups.incoming-chat&quot;).toBool())     ||
+		    (popupType == PsiPopup::AlertMessage  &amp;&amp; PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.passive-popups.incoming-message&quot;).toBool())  ||
+		    (popupType == PsiPopup::AlertHeadline &amp;&amp; PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.passive-popups.incoming-headline&quot;).toBool()) ||
+		    (popupType == PsiPopup::AlertFile     &amp;&amp; PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.passive-popups.incoming-file-transfer&quot;).toBool()))
 		{
 			PsiPopup *popup = new PsiPopup(popupType, this);
 			popup-&gt;setData(j, r, u, e);
@@ -3939,7 +3942,7 @@ void PsiAccount::queueEvent(PsiEvent* e, ActivationType activationType)
 	d-&gt;eventQueue-&gt;enqueue(e);
 
 	updateReadNext(e-&gt;jid());
-	if(option.raise)
+	if(PsiOptions::instance()-&gt;getOption(&quot;options.ui.contactlist.raise-on-new-event&quot;).toBool())
 		d-&gt;psi-&gt;raiseMainwin();
 
 	// udpate the roster
@@ -3955,23 +3958,23 @@ void PsiAccount::queueEvent(PsiEvent* e, ActivationType activationType)
 			MessageEvent *me = (MessageEvent *)e;
 			const Message &amp;m = me-&gt;message();
 			if (m.type() == &quot;chat&quot;)
-				doPopup = option.popupChats;
+				doPopup = PsiOptions::instance()-&gt;getOption(&quot;options.ui.chat.auto-popup&quot;).toBool();
 			else if (m.type() == &quot;headline&quot;)
-				doPopup = option.popupHeadlines;
+				doPopup = PsiOptions::instance()-&gt;getOption(&quot;options.ui.message.auto-popup-headlines&quot;).toBool();
 			else
-				doPopup = option.popupMsgs;
+				doPopup = PsiOptions::instance()-&gt;getOption(&quot;options.ui.message.auto-popup&quot;).toBool();
 		}
 		else if (e-&gt;type() == PsiEvent::File) {
-			doPopup = option.popupFiles;
+			doPopup = PsiOptions::instance()-&gt;getOption(&quot;options.ui.file-transfer.auto-popup&quot;).toBool();
 		}
 		else {
-			doPopup = option.popupMsgs;
+			doPopup = PsiOptions::instance()-&gt;getOption(&quot;options.ui.message.auto-popup&quot;).toBool();
 		}
 
 		// Popup
 		if (doPopup) {
 			UserListItem *u = find(e-&gt;jid());
-			if (u &amp;&amp; (!option.noUnlistedPopup || u-&gt;inList()))
+			if (u &amp;&amp; (!PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.popup-dialogs.suppress-when-not-on-roster&quot;).toBool() || u-&gt;inList()))
 				openNextEvent(*u, activationType);
 		}
 
@@ -4151,7 +4154,7 @@ void PsiAccount::openChat(const Jid&amp; j, ActivationType activationType)
 
 void PsiAccount::chatMessagesRead(const Jid &amp;j)
 {
-	if(option.alertOpenChats) {
+	if(PsiOptions::instance()-&gt;getOption(&quot;options.ui.chat.alert-for-already-open-chats&quot;).toBool()) {
 		processChats(j);
 	}
 }
@@ -4644,16 +4647,16 @@ void PsiAccount::optionsUpdate()
 #endif
 
 	// Chat states
-	setSendChatState(option.messageEvents);
+	setSendChatState(PsiOptions::instance()-&gt;getOption(&quot;options.messages.send-composing-events&quot;).toBool());
 
 	// Remote Controlling
-	setRCEnabled(option.useRC);
+	setRCEnabled(PsiOptions::instance()-&gt;getOption(&quot;options.external-control.adhoc-remote-control.enable&quot;).toBool());
 
 	// Roster item exchange
-	d-&gt;rosterItemExchangeTask-&gt;setIgnoreNonRoster(option.ignoreNonRoster);
+	d-&gt;rosterItemExchangeTask-&gt;setIgnoreNonRoster(PsiOptions::instance()-&gt;getOption(&quot;options.messages.ignore-non-roster-contacts&quot;).toBool());
 
 	// Caps manager
-	d-&gt;capsManager-&gt;setEnabled(option.useCaps);
+	d-&gt;capsManager-&gt;setEnabled(PsiOptions::instance()-&gt;getOption(&quot;options.service-discovery.enable-entity-capabilities&quot;).toBool());
 }
 
 </diff>
      <filename>src/psiaccount.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -20,6 +20,7 @@
 
 #include &quot;psiactionlist.h&quot;
 #include &quot;iconset.h&quot;
+#include &quot;psioptions.h&quot;
 
 #include &lt;qobject.h&gt;
 
@@ -172,13 +173,13 @@ void PsiActionList::Private::createMainWin()
 
 	{
 		IconAction *add_act = 0;
-		if (!option.lockdown.roster)
+		if (!PsiOptions::instance()-&gt;getOption(&quot;options.ui.contactlist.lockdown-roster&quot;).toBool())
 			add_act = new MAction(IconsetFactory::icon(&quot;psi/addContact&quot;), tr(&quot;&amp;Add a contact&quot;), 0, psi, this);
 
 		IconAction *lw_act = new MAction(IconsetFactory::icon(&quot;psi/xml&quot;), tr(&quot;&amp;XML Console&quot;), 2, psi, this);
 
 		IconAction *actDisco = 0;
-		if(!option.lockdown.services)
+		if(!PsiOptions::instance()-&gt;getOption(&quot;options.ui.contactlist.disable-service-discovery&quot;).toBool())
 			actDisco = new MAction(IconsetFactory::icon(&quot;psi/disco&quot;), tr(&quot;Service &amp;Discovery&quot;), 3, psi, this);
 
 //		IconAction *actReadme = new IconAction (tr(&quot;ReadMe&quot;), tr(&quot;&amp;ReadMe&quot;), 0, this);</diff>
      <filename>src/psiactionlist.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -20,7 +20,6 @@
 
 #include &quot;psicon.h&quot;
 #include &quot;psiaccount.h&quot;
-#include &quot;common.h&quot;
 #include &quot;iconaction.h&quot;
 #include &quot;stretchwidget.h&quot;
 #include &quot;psiiconset.h&quot;
@@ -86,12 +85,12 @@ void PsiChatDlg::initUi()
 	list &lt;&lt; 96;
 	ui_.splitter-&gt;setSizes(list);
 
-	smallChat_ = option.smallChats;
+	smallChat_ = PsiOptions::instance()-&gt;getOption(&quot;options.ui.chat.use-small-chats&quot;).toBool();
 }
 
 void PsiChatDlg::updateCountVisibility()
 {
-	if (option.showCounter &amp;&amp; !smallChat_) {
+	if (PsiOptions::instance()-&gt;getOption(&quot;options.ui.message.show-character-count&quot;).toBool() &amp;&amp; !smallChat_) {
 		ui_.lb_count-&gt;show();
 	}
 	else {
@@ -124,7 +123,7 @@ void PsiChatDlg::setLooks()
 		}
 		else {
 			ui_.toolbar-&gt;hide();
-			ui_.tb_emoticons-&gt;setVisible(option.useEmoticons);
+			ui_.tb_emoticons-&gt;setVisible(PsiOptions::instance()-&gt;getOption(&quot;options.ui.emoticons.use-emoticons&quot;).toBool());
 			ui_.tb_actions-&gt;show();
 		}
 	}
@@ -308,7 +307,7 @@ void PsiChatDlg::updateAvatar()
 
 void PsiChatDlg::optionsUpdate()
 {
-	smallChat_ = option.smallChats;
+	smallChat_ = PsiOptions::instance()-&gt;getOption(&quot;options.ui.chat.use-small-chats&quot;).toBool();
 
 	ChatDlg::optionsUpdate();
 }
@@ -385,7 +384,7 @@ void PsiChatDlg::appendNormalMessage(SpooledType spooled, const QDateTime&amp; time,
 	QString color = colorString(local, spooled);
 	QString timestr = chatView()-&gt;formatTimeStamp(time);
 
-	if (option.chatSays) {
+	if (PsiOptions::instance()-&gt;getOption(&quot;options.ui.chat.use-chat-says-style&quot;).toBool()) {
 		chatView()-&gt;appendText(QString(&quot;&lt;p style=\&quot;color: %1\&quot;&gt;&quot;).arg(color) + QString(&quot;[%1] &quot;).arg(timestr) + tr(&quot;%1 says:&quot;).arg(whoNick(local)) + &quot;&lt;/p&gt;&quot; + txt);
 	}
 	else {</diff>
      <filename>src/psichatdlg.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -123,7 +123,7 @@ public:
 public slots:
 	void playSound(QString file)
 	{
-		if ( file.isEmpty() || !useSound )
+		if ( file.isEmpty() || !PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.sounds.enable&quot;).toBool() )
 			return;
 
 		soundPlay(file);
@@ -191,17 +191,31 @@ public:
 
 	void saveProfile(UserAccountList acc)
 	{
-		pro.recentGCList = recentGCList;
-		pro.recentBrowseList = recentBrowseList;
-		pro.lastStatusString = lastStatusString;
-		pro.useSound = useSound;
-		pro.prefs = option;
-		if ( proxy )
-			pro.proxyList = proxy-&gt;itemList();
-
-		pro.acc = acc;
-
-		pro.toFile(pathToProfileConfig(activeProfile));
+		// clear it
+		accountTree.removeOption(&quot;accounts&quot;, true);
+		// save accounts with known base
+		QSet&lt;QString&gt; cbases;
+		foreach(UserAccount ua, acc) {
+			if (!ua.optionsBase.isEmpty()) {
+				ua.toOptions(&amp;accountTree);
+				cbases += ua.optionsBase;
+			}
+		}
+		// save new accounts
+		int idx = 0;
+		foreach(UserAccount ua, acc) {
+			if (ua.optionsBase.isEmpty()) {
+				QString base;
+				do {
+					base = &quot;accounts.a&quot;+QString::number(idx++);
+				} while (cbases.contains(base));
+				cbases += base;
+				ua.toOptions(&amp;accountTree, base);
+			}
+		}
+		QFile accountsFile(pathToProfile( activeProfile ) + &quot;/accounts.xml&quot;);	
+		accountTree.saveOptions(accountsFile.fileName(), &quot;accounts&quot;, ApplicationInfo::optionsNS(), ApplicationInfo::version());;
+		
 	}
 
 	void updateIconSelect()
@@ -220,13 +234,13 @@ public:
 
 	PsiCon* psi;
 	PsiContactList* contactList;
-	UserProfile pro;
-	QString lastStatusString;
+	OptionsMigration optionsMigration;
+	OptionsTree accountTree;
 	MainWin *mainwin;
 	Idle idle;
 	QList&lt;item_dialog*&gt; dialogList;
 	int eventId;
-	QStringList recentGCList, recentBrowseList, recentNodeList;
+	QStringList recentNodeList; // FIXME move this to options system?
 	EDB *edb;
 	S5BServer *s5bServer;
 	ProxyManager *proxy;
@@ -252,8 +266,6 @@ PsiCon::PsiCon()
 	d = new Private(this);
 	d-&gt;tabManager = new TabManager(this);
 
-	d-&gt;lastStatusString = &quot;&quot;;
-	useSound = true;
 	d-&gt;mainwin = 0;
 	d-&gt;ftwin = 0;
 
@@ -303,6 +315,21 @@ bool PsiCon::init()
 	connect(d-&gt;contactList, SIGNAL(accountActivityChanged()), SIGNAL(accountActivityChanged()));
 	connect(d-&gt;contactList, SIGNAL(saveAccounts()), SLOT(saveAccounts()));
 
+	// do some backuping in case we are about to start migration from config.xml+options.xml
+	// to options.xml only.
+	QString backupfile = optionsFile() + &quot;-preOptionsMigration&quot;;
+	if (QFile::exists(pathToProfileConfig(activeProfile))
+		&amp;&amp; QFile::exists(optionsFile())
+		&amp;&amp; !QFile::exists(backupfile)) {
+		QFile::copy(optionsFile(), backupfile);
+	}
+	
+	// advanced widget
+	GAdvancedWidget::setStickEnabled( false ); //until this is bugless
+	GAdvancedWidget::setStickToWindows( false ); //again
+	GAdvancedWidget::setStickAt( 5 );
+	
+	
 	// To allow us to upgrade from old hardcoded options gracefully, be careful about the order here
 	PsiOptions *options=PsiOptions::instance();
 	//load the system-wide defaults, if they exist
@@ -316,9 +343,23 @@ bool PsiCon::init()
 	d-&gt;tuneController = new CombinedTuneController();
 #endif
 
+	// calculate the small font size
+	const int minimumFontSize = 7;
+	common_smallFontSize = qApp-&gt;font().pointSize();
+	common_smallFontSize -= 2;
+	if ( common_smallFontSize &lt; minimumFontSize )
+		common_smallFontSize = minimumFontSize;
+	FancyLabel::setSmallFontSize( common_smallFontSize );
+	
+	
+	if (!QFile::exists(optionsFile()) &amp;&amp; !QFile::exists(pathToProfileConfig(activeProfile))) {
+		if (!options-&gt;load(&quot;:/options/newprofile.xml&quot;)) {
+			qWarning(&quot;ERROR: Failed to new profile default options&quot;);
+		}
+	}
+	
 	// load the old profile
-	d-&gt;pro.reset();
-	d-&gt;pro.fromFile(pathToProfileConfig(activeProfile));
+	d-&gt;optionsMigration.fromFile(pathToProfileConfig(activeProfile));
 	
 	//load the new profile
 	//Save every time an option is changed
@@ -329,22 +370,38 @@ bool PsiCon::init()
 	options-&gt;setOption(&quot;trigger-save&quot;,false);
 	options-&gt;setOption(&quot;trigger-save&quot;,true);
 	
-	connect(options, SIGNAL(optionChanged(const QString&amp;)), SLOT(optionsUpdate()));
+	// do some late migration work
+	d-&gt;optionsMigration.lateMigration();
+	
+	QFile accountsFile(pathToProfile( activeProfile ) + &quot;/accounts.xml&quot;);
+	bool accountMigration = false;	
+	if (!accountsFile.exists()) {
+		accountMigration = true;
+		int idx = 0;
+		foreach(UserAccount a, d-&gt;optionsMigration.accMigration) {
+			QString base = &quot;accounts.a&quot;+QString::number(idx++);
+			a.toOptions(&amp;d-&gt;accountTree, base);
+		}
+	} else {
+		d-&gt;accountTree.loadOptions(accountsFile.fileName(), &quot;accounts&quot;, ApplicationInfo::optionsNS());
+	}
+
+	// proxy
+	d-&gt;proxy = new ProxyManager(&amp;d-&gt;accountTree, this);
+	if (accountMigration) d-&gt;proxy-&gt;migrateItemList(d-&gt;optionsMigration.proxyMigration);
+	connect(d-&gt;proxy, SIGNAL(settingsChanged()), SLOT(proxy_settingsChanged()));
+	
+	connect(options, SIGNAL(optionChanged(const QString&amp;)), SLOT(optionChanged(const QString&amp;)));
 	
 	QDir profileDir( pathToProfile( activeProfile ) );
 	profileDir.rmdir( &quot;info&quot; ); // remove unused dir
 
-	d-&gt;recentGCList = d-&gt;pro.recentGCList;
-	d-&gt;recentBrowseList = d-&gt;pro.recentBrowseList;
-	d-&gt;lastStatusString = d-&gt;pro.lastStatusString;
-	useSound = d-&gt;pro.useSound;
 
-	option = d-&gt;pro.prefs;
 
 	// first thing, try to load the iconset
 	if( !PsiIconset::instance()-&gt;loadAll() ) {
-		//option.iconset = &quot;stellar&quot;;
-		//if(!is.load(option.iconset)) {
+		//LEGOPTS.iconset = &quot;stellar&quot;;
+		//if(!is.load(LEGOPTS.iconset)) {
 			QMessageBox::critical(0, tr(&quot;Error&quot;), tr(&quot;Unable to load iconset!  Please make sure Psi is properly installed.&quot;));
 			return false;
 		//}
@@ -361,8 +418,8 @@ bool PsiCon::init()
 	d-&gt;updateIconSelect();
 
 	// setup the main window
-	d-&gt;mainwin = new MainWin(option.alwaysOnTop, (option.useDock &amp;&amp; option.dockToolMW), this, &quot;psimain&quot;); 
-	d-&gt;mainwin-&gt;setUseDock(option.useDock);
+	d-&gt;mainwin = new MainWin(PsiOptions::instance()-&gt;getOption(&quot;options.ui.contactlist.always-on-top&quot;).toBool(), (PsiOptions::instance()-&gt;getOption(&quot;options.ui.systemtray.enable&quot;).toBool() &amp;&amp; PsiOptions::instance()-&gt;getOption(&quot;options.contactlist.use-toolwindow&quot;).toBool()), this, &quot;psimain&quot;); 
+	d-&gt;mainwin-&gt;setUseDock(PsiOptions::instance()-&gt;getOption(&quot;options.ui.systemtray.enable&quot;).toBool());
 
 	connect(d-&gt;mainwin, SIGNAL(closeProgram()), SLOT(closeProgram()));
 	connect(d-&gt;mainwin, SIGNAL(changeProfile()), SLOT(changeProfile()));
@@ -379,9 +436,10 @@ bool PsiCon::init()
 
 	connect(this, SIGNAL(emitOptionsUpdate()), d-&gt;mainwin-&gt;cvlist, SLOT(optionsUpdate()));
 
-	d-&gt;mainwin-&gt;restoreSavedGeometry(d-&gt;pro.mwgeom);
-
-	if(!(option.useDock &amp;&amp; option.dockHideMW))
+	QRect geom = PsiOptions::instance()-&gt;getOption(&quot;options.ui.contactlist.saved-window-geometry&quot;).toRect();
+	if (geom.isValid()) d-&gt;mainwin-&gt;restoreSavedGeometry(geom);
+	
+	if(!(PsiOptions::instance()-&gt;getOption(&quot;options.ui.systemtray.enable&quot;).toBool() &amp;&amp; PsiOptions::instance()-&gt;getOption(&quot;options.contactlist.hide-on-start&quot;).toBool()))
 		d-&gt;mainwin-&gt;show();
 
 	d-&gt;ftwin = new FileTransDlg(this);
@@ -392,35 +450,6 @@ bool PsiCon::init()
 	d-&gt;s5bServer = new S5BServer;
 	s5b_init();
 
-	// proxy
-	d-&gt;proxy = new ProxyManager(this);
-	d-&gt;proxy-&gt;setItemList(d-&gt;pro.proxyList);
-	connect(d-&gt;proxy, SIGNAL(settingsChanged()), SLOT(proxy_settingsChanged()));
-
-	// Disable accounts if necessary, and overwrite locked properties
-	if (PsiOptions::instance()-&gt;getOption(&quot;options.ui.account.single&quot;).toBool() || !PsiOptions::instance()-&gt;getOption(&quot;options.account.domain&quot;).toString().isEmpty()) {
-		bool haveEnabled = false;
-		for(UserAccountList::Iterator it = d-&gt;pro.acc.begin(); it != d-&gt;pro.acc.end(); ++it) {
-			// With single accounts, only modify the first account
-			if (PsiOptions::instance()-&gt;getOption(&quot;options.ui.account.single&quot;).toBool()) {
-				if (!haveEnabled) {
-					haveEnabled = it-&gt;opt_enabled;
-					if (it-&gt;opt_enabled) {
-						if (!PsiOptions::instance()-&gt;getOption(&quot;options.account.domain&quot;).toString().isEmpty())
-							it-&gt;jid = JIDUtil::accountFromString(Jid(it-&gt;jid).user()).bare();
-					}
-				}
-				else
-					it-&gt;opt_enabled = false;
-			}
-			else {
-				// Overwirte locked properties
-				if (!PsiOptions::instance()-&gt;getOption(&quot;options.account.domain&quot;).toString().isEmpty())
-					it-&gt;jid = JIDUtil::accountFromString(Jid(it-&gt;jid).user()).bare();
-			}
-		}
-	}
-	
 	// Connect to the system monitor
 	SystemWatch* sw = SystemWatch::instance();
 	connect(sw, SIGNAL(sleep()), this, SLOT(doSleep()));
@@ -474,8 +503,45 @@ bool PsiCon::init()
 	registerCaps(&quot;mr&quot;, QStringList(&quot;urn:xmpp:receipts&quot;));
 
 	// load accounts
-	d-&gt;contactList-&gt;loadAccounts(d-&gt;pro.acc);
+	{
+		QList&lt;UserAccount&gt; accs;
+		QStringList bases = d-&gt;accountTree.getChildOptionNames(&quot;accounts&quot;, true, true);
+		foreach (QString base, bases) {
+			UserAccount ua;
+			ua.fromOptions(&amp;d-&gt;accountTree, base);
+			accs += ua;
+		}
+		
+		// Disable accounts if necessary, and overwrite locked properties
+		if (PsiOptions::instance()-&gt;getOption(&quot;options.ui.account.single&quot;).toBool() || !PsiOptions::instance()-&gt;getOption(&quot;options.account.domain&quot;).toString().isEmpty()) {
+			bool haveEnabled = false;
+			for(UserAccountList::Iterator it = accs.begin(); it != accs.end(); ++it) {
+				// With single accounts, only modify the first account
+				if (PsiOptions::instance()-&gt;getOption(&quot;options.ui.account.single&quot;).toBool()) {
+					if (!haveEnabled) {
+						haveEnabled = it-&gt;opt_enabled;
+						if (it-&gt;opt_enabled) {
+							if (!PsiOptions::instance()-&gt;getOption(&quot;options.account.domain&quot;).toString().isEmpty())
+								it-&gt;jid = JIDUtil::accountFromString(Jid(it-&gt;jid).user()).bare();
+						}
+					}
+					else
+						it-&gt;opt_enabled = false;
+				}
+				else {
+					// Overwirte locked properties
+					if (!PsiOptions::instance()-&gt;getOption(&quot;options.account.domain&quot;).toString().isEmpty())
+						it-&gt;jid = JIDUtil::accountFromString(Jid(it-&gt;jid).user()).bare();
+				}
+			}
+		}
+		
+		d-&gt;contactList-&gt;loadAccounts(accs);
+	}	
+	
 	checkAccountsEmpty();
+	
+	
 	// try autologin if needed
 	foreach(PsiAccount* account, d-&gt;contactList-&gt;accounts()) {
 		account-&gt;autoLogin();
@@ -524,6 +590,11 @@ void PsiCon::deinit()
 	delete d-&gt;ftwin;
 
 	if(d-&gt;mainwin) {
+		// shut down mainwin
+		if (!d-&gt;mainwin-&gt;isHidden() &amp;&amp; !d-&gt;mainwin-&gt;isMinimized()) {
+			PsiOptions::instance()-&gt;setOption(&quot;options.ui.contactlist.saved-window-geometry&quot;, d-&gt;mainwin-&gt;saveableGeometry());
+		}
+
 		delete d-&gt;mainwin;
 		d-&gt;mainwin = 0;
 	}
@@ -535,11 +606,6 @@ void PsiCon::deinit()
 	d-&gt;saveProfile(acc);
 }
 
-void PsiCon::optionsUpdate()
-{
-	// Global shortcuts
-	setShortcuts();
-}
 
 void PsiCon::setShortcuts()
 {
@@ -720,7 +786,7 @@ AccountsComboBox *PsiCon::accountsComboBox(QWidget *parent, bool online_only)
 	return acb;
 }
 
-void PsiCon::createAccount(const QString &amp;name, const Jid &amp;j, const QString &amp;pass, bool opt_host, const QString &amp;host, int port, bool legacy_ssl_probe, UserAccount::SSLFlag ssl, int proxy)
+void PsiCon::createAccount(const QString &amp;name, const Jid &amp;j, const QString &amp;pass, bool opt_host, const QString &amp;host, int port, bool legacy_ssl_probe, UserAccount::SSLFlag ssl, QString proxy)
 {
 	d-&gt;contactList-&gt;createAccount(name, j, pass, opt_host, host, port, legacy_ssl_probe, ssl, proxy);
 }
@@ -746,30 +812,30 @@ void PsiCon::removeAccount(PsiAccount *pa)
 
 void PsiCon::statusMenuChanged(int x)
 {
-	if(x == STATUS_OFFLINE &amp;&amp; !option.askOffline) {
+	if(x == STATUS_OFFLINE &amp;&amp; !PsiOptions::instance()-&gt;getOption(&quot;options.status.ask-for-message-on-offline&quot;).toBool()) {
 		setGlobalStatus(Status(Status::Offline, &quot;Logged out&quot;, 0));
-		if(option.useDock == true)
+		if(PsiOptions::instance()-&gt;getOption(&quot;options.ui.systemtray.enable&quot;).toBool() == true)
 			d-&gt;mainwin-&gt;setTrayToolTip(Status(Status::Offline, &quot;&quot;, 0));
 	}
 	else {
-		if(x == STATUS_ONLINE &amp;&amp; !option.askOnline) {
+		if(x == STATUS_ONLINE &amp;&amp; !PsiOptions::instance()-&gt;getOption(&quot;options.status.ask-for-message-on-online&quot;).toBool()) {
 			setGlobalStatus(Status());
-			if(option.useDock == true)
+			if(PsiOptions::instance()-&gt;getOption(&quot;options.ui.systemtray.enable&quot;).toBool() == true)
 				d-&gt;mainwin-&gt;setTrayToolTip(Status());
 		}
 		else if(x == STATUS_INVISIBLE){
 			Status s(&quot;&quot;,&quot;&quot;,0,true);
 			s.setIsInvisible(true);
 			setGlobalStatus(s);
-			if(option.useDock == true)
+			if(PsiOptions::instance()-&gt;getOption(&quot;options.ui.systemtray.enable&quot;).toBool() == true)
 				d-&gt;mainwin-&gt;setTrayToolTip(s);
 		}
 		else {
 			// Create a dialog with the last status message
-			StatusSetDlg *w = new StatusSetDlg(this, makeStatus(x, d-&gt;lastStatusString));
+			StatusSetDlg *w = new StatusSetDlg(this, makeStatus(x, PsiOptions::instance()-&gt;getOption(&quot;options.status.last-message&quot;).toString()));
 			connect(w, SIGNAL(set(const XMPP::Status &amp;, bool)), SLOT(setStatusFromDialog(const XMPP::Status &amp;, bool)));
 			connect(w, SIGNAL(cancelled()), SLOT(updateMainwinStatus()));
-			if(option.useDock == true)
+			if(PsiOptions::instance()-&gt;getOption(&quot;options.ui.systemtray.enable&quot;).toBool() == true)
 				connect(w, SIGNAL(set(const XMPP::Status &amp;, bool)), d-&gt;mainwin, SLOT(setTrayToolTip(const XMPP::Status &amp;, bool)));
 			w-&gt;show();
 		}
@@ -778,7 +844,7 @@ void PsiCon::statusMenuChanged(int x)
 
 void PsiCon::setStatusFromDialog(const Status &amp;s, bool withPriority)
 {
-	d-&gt;lastStatusString = s.status();
+	PsiOptions::instance()-&gt;setOption(&quot;options.status.last-message&quot;, s.status());
 	setGlobalStatus(s, withPriority);
 }
 
@@ -821,10 +887,6 @@ void PsiCon::pa_updatedAccount()
 void PsiCon::saveAccounts()
 {
 	UserAccountList acc = d-&gt;contactList-&gt;getUserAccountList();
-
-	d-&gt;pro.proxyList = d-&gt;proxy-&gt;itemList();
-	//d-&gt;pro.acc = acc;
-	//d-&gt;pro.toFile(pathToProfileConfig(activeProfile));
 	d-&gt;saveProfile(acc);
 }
 
@@ -857,35 +919,14 @@ void PsiCon::updateMainwinStatus()
 	}
 }
 
-void PsiCon::setToggles(bool tog_offline, bool tog_away, bool tog_agents, bool tog_hidden, bool tog_self)
-{
-	if(d-&gt;contactList-&gt;enabledAccounts().count() &gt; 1)
-		return;
-
-	d-&gt;mainwin-&gt;cvlist-&gt;setShowOffline(tog_offline);
-	d-&gt;mainwin-&gt;cvlist-&gt;setShowAway(tog_away);
-	d-&gt;mainwin-&gt;cvlist-&gt;setShowAgents(tog_agents);
-	d-&gt;mainwin-&gt;cvlist-&gt;setShowHidden(tog_hidden);
-	d-&gt;mainwin-&gt;cvlist-&gt;setShowSelf(tog_self);
-}
-
-void PsiCon::getToggles(bool *tog_offline, bool *tog_away, bool *tog_agents, bool *tog_hidden, bool *tog_self)
-{
-	*tog_offline = d-&gt;mainwin-&gt;cvlist-&gt;isShowOffline();
-	*tog_away = d-&gt;mainwin-&gt;cvlist-&gt;isShowAway();
-	*tog_agents = d-&gt;mainwin-&gt;cvlist-&gt;isShowAgents();
-	*tog_hidden = d-&gt;mainwin-&gt;cvlist-&gt;isShowHidden();
-	*tog_self = d-&gt;mainwin-&gt;cvlist-&gt;isShowSelf();
-}
-
 void PsiCon::doOptions()
 {
 	OptionsDlg *w = (OptionsDlg *)dialogFind(&quot;OptionsDlg&quot;);
 	if(w)
 		bringToFront(w);
 	else {
-		w = new OptionsDlg(this, option);
-		connect(w, SIGNAL(applyOptions(const Options &amp;)), SLOT(slotApplyOptions(const Options &amp;)));
+		w = new OptionsDlg(this);
+		connect(w, SIGNAL(applyOptions()), SLOT(slotApplyOptions()));
 		w-&gt;show();
 	}
 }
@@ -897,7 +938,7 @@ void PsiCon::doFileTransDlg()
 
 void PsiCon::checkAccountsEmpty()
 {
-	if (d-&gt;pro.acc.count() == 0) {
+	if (d-&gt;contactList-&gt;accounts().count() == 0) {
 		promptUserToCreateAccount();
 	}
 }
@@ -992,52 +1033,37 @@ void PsiCon::doToolbars()
 		bringToFront(w);
 	}
 	else {
-		w = new OptionsDlg(this, option);
+		w = new OptionsDlg(this);
 		connect(w, SIGNAL(applyOptions(const Options &amp;)), SLOT(slotApplyOptions(const Options &amp;)));
 		w-&gt;openTab(&quot;toolbars&quot;);
 		w-&gt;show();
 	}
 }
 
-void PsiCon::slotApplyOptions(const Options &amp;opt)
+void PsiCon::optionChanged(const QString&amp; option)
 {
-	Options oldOpt = option;
-	bool notifyRestart = true;
-
-	option = opt;
-
-#ifndef Q_WS_MAC
-	if (option.hideMenubar) {
-		// check if all toolbars are disabled
-		bool toolbarsVisible = false;
-		QList&lt;Options::ToolbarPrefs&gt;::ConstIterator it = option.toolbars[&quot;mainWin&quot;].begin();
-		for ( ; it != option.toolbars[&quot;mainWin&quot;].end() &amp;&amp; !toolbarsVisible; ++it) {
-			toolbarsVisible = toolbarsVisible || (*it).on;
-		}
-
-		// Check whether it is legal to disable the menubar
-		if ( !toolbarsVisible ) {
-			QMessageBox::warning(0, tr(&quot;Warning&quot;),
-				tr(&quot;You can not disable &lt;i&gt;all&lt;/i&gt; toolbars &lt;i&gt;and&lt;/i&gt; the menubar. If you do so, you will be unable to enable them back, when you'll change your mind.\n&quot;
-					&quot;&lt;br&gt;&lt;br&gt;\n&quot;
-					&quot;If you really-really want to disable all toolbars and the menubar, you need to edit the config.xml file by hand.&quot;),
-				tr(&quot;I understand&quot;));
-			option.hideMenubar = false;
-		}
+	// Global shortcuts
+	setShortcuts();
+	
+	if (option == &quot;options.ui.notifications.alert-style&quot;) {
+		alertIconUpdateAlertStyle();		
 	}
-#endif
-
-	if ( option.useTabs != oldOpt.useTabs ) {
+	
+	if ( option == &quot;options.ui.tabs.use-tabs&quot;) {
 		QMessageBox::information(0, tr(&quot;Information&quot;), tr(&quot;Some of the options you changed will only have full effect upon restart.&quot;));
-		notifyRestart = false;
+		//notifyRestart = false;
+	}
+	
+	// update s5b
+	if(option == &quot;options.p2p.bytestreams.listen-port&quot;) {
+		s5b_init();
 	}
 
+/* LEGOPTFIXME
 	// change icon set
-	if ( option.systemIconset		!= oldOpt.systemIconset		||
-	     option.emoticons			!= oldOpt.emoticons		||
-	     option.defaultRosterIconset	!= oldOpt.defaultRosterIconset	||
-	     operator!=(option.serviceRosterIconset,oldOpt.serviceRosterIconset)	||
-	     operator!=(option.customRosterIconset,oldOpt.customRosterIconset) )
+	if ( &quot;options.iconsets.system&quot; &quot;options.iconsets.emoticons&quot; &quot;options.iconsets.status&quot;	||
+	     operator!=(LEGOPTS.serviceRosterIconset,oldOpt.serviceRosterIconset)	||
+	     operator!=(LEGOPTS.customRosterIconset,oldOpt.customRosterIconset) )
 	{
 		if ( notifyRestart &amp;&amp; PsiIconset::instance()-&gt;optionsChanged(&amp;oldOpt) )
 			QMessageBox::information(0, tr(&quot;Information&quot;), tr(&quot;The complete iconset update will happen on next Psi start.&quot;));
@@ -1048,38 +1074,43 @@ void PsiCon::slotApplyOptions(const Options &amp;opt)
 		// flush the QPixmapCache
 		QPixmapCache::clear();
 	}
+*/
+}
 
-	if ( oldOpt.alertStyle != option.alertStyle )
-		alertIconUpdateAlertStyle();
+void PsiCon::slotApplyOptions()
+{
+	bool notifyRestart = true;
+	
+	PsiOptions *o = PsiOptions::instance();
 
-	d-&gt;mainwin-&gt;buildToolbars();
+#ifndef Q_WS_MAC
+	if (!PsiOptions::instance()-&gt;getOption(&quot;options.ui.contactlist.show-menubar&quot;).toBool()) {
+		// check if all toolbars are disabled
+		bool toolbarsVisible = false;
+		QStringList bases = o-&gt;getChildOptionNames(&quot;options.ui.contactlist.toolbars&quot;, true, true);
+		foreach(QString base, bases) {
+			toolbarsVisible = toolbarsVisible || o-&gt;getOption( base + &quot;.visible&quot;).toBool();
+		}
 
-	/*// change pgp engine
-	if(option.pgp != oldpgp) {
-		if(d-&gt;pgp) {
-			delete d-&gt;pgp;
-			d-&gt;pgp = 0;
-			pgpToggled(false);
+		// Check whether it is legal to disable the menubar
+		if ( !toolbarsVisible ) {
+			QMessageBox::warning(0, tr(&quot;Warning&quot;),
+				tr(&quot;You can not disable &lt;i&gt;all&lt;/i&gt; toolbars &lt;i&gt;and&lt;/i&gt; the menubar. If you do so, you will be unable to enable them back, when you'll change your mind.&quot;),
+				tr(&quot;I understand&quot;));
+			PsiOptions::instance()-&gt;setOption(&quot;options.ui.contactlist.show-menubar&quot;, true);
 		}
-		pgp_init(option.pgp);
-	}*/
+	}
+#endif
 
-	// update s5b
-	if(oldOpt.dtPort != option.dtPort)
-		s5b_init();
 	updateS5BServerAddresses();
 
 	// mainwin stuff
-	d-&gt;mainwin-&gt;setWindowOpts(option.alwaysOnTop, (option.useDock &amp;&amp; option.dockToolMW));
-	d-&gt;mainwin-&gt;setUseDock(option.useDock);
+	d-&gt;mainwin-&gt;setWindowOpts(PsiOptions::instance()-&gt;getOption(&quot;options.ui.contactlist.always-on-top&quot;).toBool(), (PsiOptions::instance()-&gt;getOption(&quot;options.ui.systemtray.enable&quot;).toBool() &amp;&amp; PsiOptions::instance()-&gt;getOption(&quot;options.contactlist.use-toolwindow&quot;).toBool()));
+	d-&gt;mainwin-&gt;setUseDock(PsiOptions::instance()-&gt;getOption(&quot;options.ui.systemtray.enable&quot;).toBool());
+
 
 	// notify about options change
 	emitOptionsUpdate();
-
-	// save just the options
-	//d-&gt;pro.prefs = option;
-	//d-&gt;pro.toFile(pathToProfileConfig(activeProfile));
-	d-&gt;saveProfile(d-&gt;pro.acc);
 }
 
 int PsiCon::getId()
@@ -1136,7 +1167,7 @@ void PsiCon::recvNextEvent()
 
 void PsiCon::playSound(const QString &amp;str)
 {
-	if(str.isEmpty() || !useSound)
+	if(str.isEmpty() || !PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.sounds.enable&quot;).toBool())
 		return;
 
 	soundPlay(str);
@@ -1147,50 +1178,59 @@ void PsiCon::raiseMainwin()
 	d-&gt;mainwin-&gt;showNoFocus();
 }
 
-const QStringList &amp; PsiCon::recentGCList() const
+QStringList PsiCon::recentGCList() const
 {
-	return d-&gt;recentGCList;
+	return PsiOptions::instance()-&gt;getOption(&quot;options.muc.recent-joins.jids&quot;).toStringList();
 }
 
 void PsiCon::recentGCAdd(const QString &amp;str)
 {
+	QStringList recentList = recentGCList();
+	
 	// remove it if we have it
-	for(QStringList::Iterator it = d-&gt;recentGCList.begin(); it != d-&gt;recentGCList.end(); ++it) {
+	for(QStringList::Iterator it = recentList.begin(); it != recentList.end(); ++it) {
 		if(*it == str) {
-			d-&gt;recentGCList.remove(it);
+			recentList.remove(it);
 			break;
 		}
 	}
 
 	// put it in the front
-	d-&gt;recentGCList.prepend(str);
+	recentList.prepend(str);
 
 	// trim the list if bigger than 10
-	while(d-&gt;recentGCList.count() &gt; PsiOptions::instance()-&gt;getOption(&quot;options.muc.recent-joins.maximum&quot;).toInt())
-		d-&gt;recentGCList.remove(d-&gt;recentGCList.fromLast());
+	while(recentList.count() &gt; PsiOptions::instance()-&gt;getOption(&quot;options.muc.recent-joins.maximum&quot;).toInt()) {
+		recentList.remove(recentList.fromLast());
+	}
+	
+	PsiOptions::instance()-&gt;setOption(&quot;options.muc.recent-joins.jids&quot;, recentList);
 }
 
-const QStringList &amp; PsiCon::recentBrowseList() const
+QStringList PsiCon::recentBrowseList() const
 {
-	return d-&gt;recentBrowseList;
+	return PsiOptions::instance()-&gt;getOption(&quot;options.ui.service-discovery.recent-jids&quot;).toStringList();
 }
 
 void PsiCon::recentBrowseAdd(const QString &amp;str)
 {
+	QStringList recentList = recentBrowseList();
 	// remove it if we have it
-	for(QStringList::Iterator it = d-&gt;recentBrowseList.begin(); it != d-&gt;recentBrowseList.end(); ++it) {
+	for(QStringList::Iterator it = recentList.begin(); it != recentList.end(); ++it) {
 		if(*it == str) {
-			d-&gt;recentBrowseList.remove(it);
+			recentList.remove(it);
 			break;
 		}
 	}
 
 	// put it in the front
-	d-&gt;recentBrowseList.prepend(str);
+	recentList.prepend(str);
 
 	// trim the list if bigger than 10
-	while(d-&gt;recentBrowseList.count() &gt; 10)
-		d-&gt;recentBrowseList.remove(d-&gt;recentBrowseList.fromLast());
+	while(recentList.count() &gt; 10) {
+		recentList.remove(recentList.fromLast());
+	}
+	
+	PsiOptions::instance()-&gt;setOption(&quot;options.ui.service-discovery.recent-jids&quot;, recentList);
 }
 
 const QStringList &amp; PsiCon::recentNodeList() const
@@ -1218,19 +1258,6 @@ void PsiCon::recentNodeAdd(const QString &amp;str)
 
 void PsiCon::proxy_settingsChanged()
 {
-	// properly index accounts
-	foreach(PsiAccount* account, d-&gt;contactList-&gt;accounts()) {
-		UserAccount acc = account-&gt;userAccount();
-		if(acc.proxy_index &gt; 0) {
-			int x = d-&gt;proxy-&gt;findOldIndex(acc.proxy_index-1);
-			if(x == -1)
-				acc.proxy_index = 0;
-			else
-				acc.proxy_index = x+1;
-			account-&gt;setUserAccount(acc);
-		}
-	}
-
 	saveAccounts();
 }
 
@@ -1287,7 +1314,7 @@ void PsiCon::processEvent(PsiEvent *e, ActivationType activationType)
 		PsiAccount* account = e-&gt;account();
 		XMPP::Jid from = e-&gt;from();
 
-		if ( option.alertOpenChats &amp;&amp; sentToChatWindow ) {
+		if ( PsiOptions::instance()-&gt;getOption(&quot;options.ui.chat.alert-for-already-open-chats&quot;).toBool() &amp;&amp; sentToChatWindow ) {
 			// Message already displayed, need only to pop up chat dialog, so that
 			// it will be read (or marked as read)
 			ChatDlg *c = account-&gt;findChatDialog(from);
@@ -1321,7 +1348,7 @@ void PsiCon::processEvent(PsiEvent *e, ActivationType activationType)
 void PsiCon::mainWinGeomChanged(QRect saveableGeometry)
 {
 	if (!saveableGeometry.isNull())
-		d-&gt;pro.mwgeom = saveableGeometry;
+		PsiOptions::instance()-&gt;setOption(&quot;options.ui.contactlist.saved-window-geometry&quot;, saveableGeometry);
 }
 
 void PsiCon::updateS5BServerAddresses()
@@ -1356,17 +1383,17 @@ void PsiCon::updateS5BServerAddresses()
 		slist += (*hit).toString();
 
 	// add external
-	if(!option.dtExternal.isEmpty()) {
+	if(!PsiOptions::instance()-&gt;getOption(&quot;options.p2p.bytestreams.external-address&quot;).toString().isEmpty()) {
 		bool found = false;
 		for(QStringList::ConstIterator sit = slist.begin(); sit != slist.end(); ++sit) {
 			const QString &amp;s = *sit;
-			if(s == option.dtExternal) {
+			if(s == PsiOptions::instance()-&gt;getOption(&quot;options.p2p.bytestreams.external-address&quot;).toString()) {
 				found = true;
 				break;
 			}
 		}
 		if(!found)
-			slist += option.dtExternal;
+			slist += PsiOptions::instance()-&gt;getOption(&quot;options.p2p.bytestreams.external-address&quot;).toString();
 	}
 
 	// set up the server
@@ -1378,9 +1405,9 @@ void PsiCon::s5b_init()
 	if(d-&gt;s5bServer-&gt;isActive())
 		d-&gt;s5bServer-&gt;stop();
 
-	if (option.dtPort) {
-		if(!d-&gt;s5bServer-&gt;start(option.dtPort)) {
-			QMessageBox::warning(0, tr(&quot;Warning&quot;), tr(&quot;Unable to bind to port %1 for Data Transfer.\nThis may mean you are already running another instance of Psi. You may experience problems sending and/or receiving files.&quot;).arg(option.dtPort));
+	if (PsiOptions::instance()-&gt;getOption(&quot;options.p2p.bytestreams.listen-port&quot;).toInt()) {
+		if(!d-&gt;s5bServer-&gt;start(PsiOptions::instance()-&gt;getOption(&quot;options.p2p.bytestreams.listen-port&quot;).toInt())) {
+			QMessageBox::warning(0, tr(&quot;Warning&quot;), tr(&quot;Unable to bind to port %1 for Data Transfer.\nThis may mean you are already running another instance of Psi. You may experience problems sending and/or receiving files.&quot;).arg(PsiOptions::instance()-&gt;getOption(&quot;options.p2p.bytestreams.listen-port&quot;).toInt()));
 		}
 	}
 }
@@ -1403,31 +1430,11 @@ void PsiCon::doWakeup()
 	}
 }
 
-
-QList&lt;PsiToolBar*&gt; PsiCon::toolbarList() const
+void PsiCon::addToolbar(const QString &amp;base)
 {
-	return d-&gt;mainwin-&gt;toolbars;
+	d-&gt;mainwin-&gt;addToolbar(base);
 }
 
-PsiToolBar *PsiCon::findToolBar(QString group, int index)
-{
-	PsiToolBar *toolBar = 0;
-
-	if (( group == &quot;mainWin&quot; ) &amp;&amp; (index &lt; d-&gt;mainwin-&gt;toolbars.size()))
-		toolBar = d-&gt;mainwin-&gt;toolbars.at(index);
-
-	return toolBar;
-}
-
-void PsiCon::buildToolbars()
-{
-	d-&gt;mainwin-&gt;buildToolbars();
-}
-
-bool PsiCon::getToolbarLocation(Q3DockWindow* dw, Qt::Dock&amp; dock, int&amp; index, bool&amp; nl, int&amp; extraOffset) const
-{
-	return d-&gt;mainwin-&gt;getLocation(dw, dock, index, nl, extraOffset);
-}
 
 PsiActionList *PsiCon::actionList() const
 {
@@ -1464,7 +1471,6 @@ QString PsiCon::optionsFile() const
 
 void PsiCon::forceSavePreferences()
 {
-	slotApplyOptions(option);
 	PsiOptions::instance()-&gt;save(optionsFile());
 }
  </diff>
      <filename>src/psicon.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -84,7 +84,7 @@ public:
 
 	QMenuBar* defaultMenuBar() const;
 
-	void createAccount(const QString &amp;name, const Jid &amp;j=&quot;&quot;, const QString &amp;pass=&quot;&quot;, bool opt_host=false, const QString &amp;host=&quot;&quot;, int port=5222, bool legacy_ssl_probe = true, UserAccount::SSLFlag ssl=UserAccount::SSL_Auto, int proxy=0);
+	void createAccount(const QString &amp;name, const Jid &amp;j=&quot;&quot;, const QString &amp;pass=&quot;&quot;, bool opt_host=false, const QString &amp;host=&quot;&quot;, int port=5222, bool legacy_ssl_probe = true, UserAccount::SSLFlag ssl=UserAccount::SSL_Auto, QString proxy=&quot;&quot;);
 	PsiAccount *createAccount(const UserAccount &amp;);
 	//void createAccount(const QString &amp;, const QString &amp;host=&quot;&quot;, int port=5222, bool ssl=false, const QString &amp;user=&quot;&quot;, const QString &amp;pass=&quot;&quot;);
 	void removeAccount(PsiAccount *);
@@ -93,9 +93,9 @@ public:
 
 	AccountsComboBox *accountsComboBox(QWidget *parent=0, bool online_only = false);
 
-	const QStringList &amp; recentGCList() const;
+	QStringList recentGCList() const;
 	void recentGCAdd(const QString &amp;);
-	const QStringList &amp; recentBrowseList() const;
+	QStringList recentBrowseList() const;
 	void recentBrowseAdd(const QString &amp;);
 	const QStringList &amp; recentNodeList() const;
 	void recentNodeAdd(const QString &amp;);
@@ -103,12 +103,9 @@ public:
 	EventDlg *createEventDlg(const QString &amp;, PsiAccount *);
 	void updateContactGlobal(PsiAccount *, const Jid &amp;);
 
-	QList&lt;PsiToolBar*&gt; toolbarList() const;
-	PsiToolBar *findToolBar(QString group, int index);
 	PsiActionList *actionList() const;
 
-	void buildToolbars();
-	bool getToolbarLocation(Q3DockWindow* dw, Qt::Dock&amp; dock, int&amp; index, bool&amp; nl, int&amp; extraOffset) const;
+	void addToolbar(const QString &amp;base);
 
 	IconSelectPopup *iconSelectPopup() const;
 	void processEvent(PsiEvent*, ActivationType activationType);
@@ -140,7 +137,7 @@ public slots:
 	void statusMenuChanged(int);
 	void pa_updatedActivity();
 	void pa_updatedAccount();
-	void slotApplyOptions(const Options &amp;);
+	void slotApplyOptions();
 	void queueChanged();
 	void recvNextEvent();
 	void setStatusFromDialog(const XMPP::Status &amp;, bool withPriority);
@@ -154,7 +151,7 @@ public slots:
 private slots:
 	void saveAccounts();
 	void saveCapabilities();
-	void optionsUpdate();
+	void optionChanged(const QString&amp; option);
 	void forceSavePreferences();
 	void startBounce();
 
@@ -168,8 +165,6 @@ private:
 	void setShortcuts();
 
 	friend class PsiAccount; // FIXME
-	void setToggles(bool tog_offline, bool tog_away, bool tog_agents, bool tog_hidden, bool tog_self);
-	void getToggles(bool *tog_offline, bool *tog_away, bool *tog_agents, bool *tog_hidden, bool *tog_self);
 	void promptUserToCreateAccount();
 	QString optionsFile() const;
 </diff>
      <filename>src/psicon.h</filename>
    </modified>
    <modified>
      <diff>@@ -99,7 +99,7 @@ PsiAccount *PsiContactList::defaultAccount() const
 /**
  * Creates new PsiAccount based on some initial settings. This is used by AccountAddDlg.
  */
-void PsiContactList::createAccount(const QString&amp; name, const Jid&amp; j, const QString&amp; pass, bool opt_host, const QString&amp; host, int port, bool legacy_ssl_probe, UserAccount::SSLFlag ssl, int proxy, bool modify)
+void PsiContactList::createAccount(const QString&amp; name, const Jid&amp; j, const QString&amp; pass, bool opt_host, const QString&amp; host, int port, bool legacy_ssl_probe, UserAccount::SSLFlag ssl, QString proxyID, bool modify)
 {
 	UserAccount acc;
 	acc.name = name;
@@ -114,7 +114,7 @@ void PsiContactList::createAccount(const QString&amp; name, const Jid&amp; j, const QStr
 	acc.host = host;
 	acc.port = port;
 	acc.ssl = ssl;
-	acc.proxy_index = proxy;
+	acc.proxyID = proxyID;
 	acc.legacy_ssl_probe = legacy_ssl_probe;
 
 	PsiAccount *pa = loadAccount(acc);
@@ -205,9 +205,9 @@ void PsiContactList::loadAccounts(const UserAccountList &amp;list)
 UserAccountList PsiContactList::getUserAccountList() const
 {
 	UserAccountList acc;
-	foreach(PsiAccount* account, accounts_)
+	foreach(PsiAccount* account, accounts_) {
 		acc += account-&gt;userAccount();
-
+	}
 	return acc;
 }
 
@@ -243,7 +243,7 @@ PsiAccount *PsiContactList::tryQueueLowestEventId(bool includeDND)
 {
 	PsiAccount *low = 0;
 	int low_id = 0;
-	int low_prior = option.EventPriorityDontCare;
+	int low_prior = EventPriorityDontCare;
 
 	foreach(PsiAccount *account, enabledAccounts_) {
 		int n = account-&gt;eventQueue()-&gt;nextId();</diff>
      <filename>src/psicontactlist.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -50,7 +50,7 @@ public:
 
 	UserAccountList getUserAccountList() const;
 
-	void createAccount(const QString&amp; name, const Jid&amp; j = &quot;&quot;, const QString&amp; pass = &quot;&quot;, bool opt_host = false, const QString&amp; host = &quot;&quot;, int port = 5222, bool legacy_ssl_probe = true, UserAccount::SSLFlag ssl = UserAccount::SSL_Auto, int proxy = 0, bool modify = true);
+	void createAccount(const QString&amp; name, const Jid&amp; j = &quot;&quot;, const QString&amp; pass = &quot;&quot;, bool opt_host = false, const QString&amp; host = &quot;&quot;, int port = 5222, bool legacy_ssl_probe = true, UserAccount::SSLFlag ssl = UserAccount::SSL_Auto, QString proxyID = &quot;&quot;, bool modify = true);
 	void createAccount(const UserAccount&amp;);
 	void removeAccount(PsiAccount*);
 	void setAccountEnabled(PsiAccount*, bool enabled = TRUE);</diff>
      <filename>src/psicontactlist.h</filename>
    </modified>
    <modified>
      <diff>@@ -31,6 +31,17 @@
 #include &quot;applicationinfo.h&quot;
 #include &quot;psicontactlist.h&quot;
 #include &quot;atomicxmlfile.h&quot;
+#include &quot;psioptions.h&quot;
+
+// FIXME renames those
+const int eventPriorityHeadline = 0;
+const int eventPriorityChat     = 1;
+const int eventPriorityMessage  = 1;
+const int eventPriorityAuth     = 2;
+//const int eventPriorityFile     = 3;
+const int eventPriorityFile     = 2;
+const int eventPriorityRosterExchange = 0; // LEGOPTFIXME: was uninitialised
+
 
 using namespace XMPP;
 using namespace XMLHelper;
@@ -176,7 +187,7 @@ bool PsiEvent::fromXml(PsiCon *psi, PsiAccount *account, const QDomElement *e)
 
 int PsiEvent::priority() const
 {
-	return Options::EventPriorityDontCare;
+	return EventPriorityDontCare;
 }
 
 QString PsiEvent::description() const
@@ -300,11 +311,11 @@ bool MessageEvent::fromXml(PsiCon *psi, PsiAccount *account, const QDomElement *
 int MessageEvent::priority() const
 {
 	if ( v_m.type() == &quot;headline&quot; )
-		return option.eventPriorityHeadline;
+		return eventPriorityHeadline;
 	else if ( v_m.type() == &quot;chat&quot; )
-		return option.eventPriorityChat;
+		return eventPriorityChat;
 
-	return option.eventPriorityMessage;
+	return eventPriorityMessage;
 }
 
 QString MessageEvent::description() const
@@ -403,7 +414,7 @@ bool AuthEvent::fromXml(PsiCon *psi, PsiAccount *account, const QDomElement *e)
 
 int AuthEvent::priority() const
 {
-	return option.eventPriorityAuth;
+	return eventPriorityAuth;
 }
 
 QString AuthEvent::description() const
@@ -450,7 +461,7 @@ FileEvent::FileEvent(const FileEvent &amp;from)
 
 int FileEvent::priority() const
 {
-	return option.eventPriorityFile;
+	return eventPriorityFile;
 }
 
 Jid FileEvent::from() const
@@ -525,7 +536,7 @@ RosterExchangeEvent::RosterExchangeEvent(const Jid &amp;j, const RosterExchangeItems
 
 int RosterExchangeEvent::priority() const
 {
-	return option.eventPriorityRosterExchange;
+	return eventPriorityRosterExchange;
 }
 
 Jid RosterExchangeEvent::from() const
@@ -575,7 +586,7 @@ QString RosterExchangeEvent::description() const
 
 int StatusEvent::priority() const
 {
-	return option.eventPriorityChat;
+	return eventPriorityChat;
 }
 
 Jid StatusEvent::from() const</diff>
      <filename>src/psievent.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -27,7 +27,6 @@
 #include &lt;QStringList&gt;
 #include &lt;QCoreApplication&gt;
 
-#include &quot;common.h&quot;
 #include &quot;psiaccount.h&quot;
 #include &quot;avatars.h&quot;
 #include &quot;growlnotifier.h&quot;</diff>
      <filename>src/psigrowlnotifier.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -25,6 +25,8 @@
 #include &quot;anim.h&quot;
 #include &quot;applicationinfo.h&quot;
 
+#include &quot;psioptions.h&quot;
+
 #include &lt;QFileInfo&gt;
 #include &lt;Q3Dict&gt;
 #include &lt;Q3PtrList&gt;
@@ -119,7 +121,7 @@ public:
 		PsiIcon *icon = (PsiIcon *)IconsetFactory::iconPtr(iconName);
 
 		// second level -- transport icon
-		if ( jid.user().isEmpty() || option.useTransportIconsForContacts ) {
+		if ( jid.user().isEmpty() || PsiOptions::instance()-&gt;getOption(&quot;options.ui.contactlist.use-transport-icons&quot;).toBool() ) {
 			QMap&lt;QString, QRegExp&gt; services;
 			services[&quot;aim&quot;]		= QRegExp(&quot;^aim&quot;);
 			services[&quot;gadugadu&quot;]	= QRegExp(&quot;^gg&quot;);
@@ -130,14 +132,14 @@ public:
 
 			bool found = false;
 
-			QMap&lt;QString, QRegExp&gt;::Iterator it = services.begin();
-			for ( ; it != services.end(); ++it) {
-				QRegExp rx = it.data();
-				if ( rx.search(jid.host()) != -1 ) {
-					// get the iconset name of the current service
-					QMap&lt;QString, QString&gt;::Iterator it2 = option.serviceRosterIconset.find(it.key());
-					if ( it2 != option.serviceRosterIconset.end() ) {
-						Iconset *is = psi-&gt;roster.find(it2.data());
+			
+			foreach(QVariant serviceV, PsiOptions::instance()-&gt;mapKeyList(&quot;options.iconsets.service-status&quot;)) {
+				QString service = serviceV.toString();
+				if (services.contains(service)) {
+					if (services[service].search(jid.host()) != -1 ) {
+						Iconset *is = psi-&gt;roster.find(
+								PsiOptions::instance()-&gt;getOption(
+								PsiOptions::instance()-&gt;mapLookup(&quot;options.iconsets.service-status&quot;, service)+&quot;.iconset&quot;).toString());
 						if ( is ) {
 							PsiIcon *i = (PsiIcon *)is-&gt;icon(iconName);
 							if ( i ) {
@@ -149,24 +151,30 @@ public:
 					}
 				}
 			}
+			
 
 			// let's try the default transport iconset then...
 			if ( !found &amp;&amp; jid.user().isEmpty() ) {
-				Iconset *is = psi-&gt;roster.find(option.serviceRosterIconset[&quot;transport&quot;]);
-				if ( is ) {
-					PsiIcon *i = (PsiIcon *)is-&gt;icon(iconName);
-					if ( i )
-						icon = i;
+				if (PsiOptions::instance()-&gt;mapKeyList(&quot;options.iconsets.service-status&quot;).contains(&quot;transport&quot;)) {
+					Iconset *is = psi-&gt;roster.find(
+								PsiOptions::instance()-&gt;getOption(
+								PsiOptions::instance()-&gt;mapLookup(&quot;options.iconsets.service-status&quot;, &quot;transport&quot;)+&quot;.iconset&quot;).toString());			  
+					if ( is ) {
+						PsiIcon *i = (PsiIcon *)is-&gt;icon(iconName);
+						if ( i )
+							icon = i;
+					}
 				}
 			}
 		}
 
 		// third level -- custom icons
-		QMap&lt;QString, QString&gt;::Iterator it = option.customRosterIconset.begin();
-		for ( ; it != option.customRosterIconset.end(); ++it) {
-			QRegExp rx = QRegExp(it.key());
+		
+		QStringList customicons = PsiOptions::instance()-&gt;getChildOptionNames(&quot;options.iconsets.custom-status&quot;, true, true);
+		foreach(QString base, customicons) {
+			QRegExp rx = QRegExp(PsiOptions::instance()-&gt;getOption(base + &quot;.regexp&quot;).toString());
 			if ( rx.search(jid.userHost()) != -1 ) {
-				Iconset *is = psi-&gt;roster.find(it.data());
+				Iconset *is = psi-&gt;roster.find(PsiOptions::instance()-&gt;getOption(base + &quot;.iconset&quot;).toString());
 				if ( is ) {
 					PsiIcon *i = (PsiIcon *)is-&gt;icon(iconName);
 					if ( i )
@@ -183,9 +191,9 @@ public:
 		Iconset def;
 		*ok = def.load(&quot;:/iconsets/system/default&quot;);
 
-		if ( option.systemIconset != &quot;default&quot; ) {
+		if ( PsiOptions::instance()-&gt;getOption(&quot;options.iconsets.system&quot;).toString() != &quot;default&quot; ) {
 			Iconset is;
-			is.load ( iconsetPath(&quot;system/&quot; + option.systemIconset) );
+			is.load ( iconsetPath(&quot;system/&quot; + PsiOptions::instance()-&gt;getOption(&quot;options.iconsets.system&quot;).toString()) );
 
 			loadIconset(&amp;def, &amp;is);
 		}
@@ -200,9 +208,9 @@ public:
 		Iconset *def = new Iconset;
 		*ok = def-&gt;load (&quot;:/iconsets/roster/default&quot;);
 
-		if ( option.defaultRosterIconset != &quot;default&quot; ) {
+		if ( PsiOptions::instance()-&gt;getOption(&quot;options.iconsets.status&quot;).toString() != &quot;default&quot; ) {
 			Iconset is;
-			is.load ( iconsetPath(&quot;roster/&quot; + option.defaultRosterIconset) );
+			is.load ( iconsetPath(&quot;roster/&quot; + PsiOptions::instance()-&gt;getOption(&quot;options.iconsets.status&quot;).toString()) );
 
 			loadIconset(def, &amp;is);
 		}
@@ -216,7 +224,7 @@ public:
 	{
 		Q3PtrList&lt;Iconset&gt; emo;
 
-		foreach(QString name, option.emoticons) {
+		foreach(QString name, PsiOptions::instance()-&gt;getOption(&quot;options.iconsets.emoticons&quot;).toStringList()) {
 			Iconset *is = new Iconset;
 			if ( is-&gt;load ( iconsetPath(&quot;emoticons/&quot; + name) ) ) {
 				PsiIconset::removeAnimation(is);
@@ -267,34 +275,35 @@ bool PsiIconset::loadAll()
 	// default roster iconset
 	Iconset *def = d-&gt;defaultRosterIconset(&amp;ok);
 	def-&gt;addToFactory();
-	roster.insert (option.defaultRosterIconset, def);
+	roster.insert (PsiOptions::instance()-&gt;getOption(&quot;options.iconsets.status&quot;).toString(), def);
 
 	// load only necessary roster iconsets
-	QStringList rosterIconsets;
+	QSet&lt;QString&gt; rosterIconsets;
 
-	QMap&lt;QString, QString&gt;::Iterator it = option.serviceRosterIconset.begin();
-	for ( ; it != option.serviceRosterIconset.end(); ++it)
-		if ( rosterIconsets.findIndex( it.data() ) == -1 )
-			rosterIconsets &lt;&lt; it.data();
+	foreach(QVariant service, PsiOptions::instance()-&gt;mapKeyList(&quot;options.iconsets.service-status&quot;)) {
+		rosterIconsets &lt;&lt; PsiOptions::instance()-&gt;getOption(
+								PsiOptions::instance()-&gt;mapLookup(&quot;options.iconsets.service-status&quot;, service)+&quot;.iconset&quot;).toString();
+	}
 
-	it = option.customRosterIconset.begin();
-	for ( ; it != option.customRosterIconset.end(); ++it)
-		if ( rosterIconsets.findIndex( it.data() ) == -1 )
-			rosterIconsets &lt;&lt; it.data();
+	QStringList customicons = PsiOptions::instance()-&gt;getChildOptionNames(&quot;options.iconsets.custom-status&quot;, true, true);
+	foreach(QString base, customicons) {
+		rosterIconsets &lt;&lt; PsiOptions::instance()-&gt;getOption(base + &quot;.iconset&quot;).toString();
+	}
 
-	QStringList::Iterator it2 = rosterIconsets.begin();
-	for ( ; it2 != rosterIconsets.end(); ++it2) {
-		if ( *it2 == option.defaultRosterIconset )
+	foreach(QString it2, rosterIconsets) {
+		if ( it2 == PsiOptions::instance()-&gt;getOption(&quot;options.iconsets.status&quot;).toString()) {
 			continue;
+		}
 
 		Iconset *is = new Iconset;
-		if ( is-&gt;load (d-&gt;iconsetPath(&quot;roster/&quot; + *it2)) ) {
+		if ( is-&gt;load (d-&gt;iconsetPath(&quot;roster/&quot; + it2)) ) {
 			is-&gt;addToFactory ();
 			d-&gt;stripFirstAnimFrame( *is );
-			roster.insert (*it2, is);
+			roster.insert (it2, is);
 		}
-		else
+		else {
 		     delete is;
+		}
 	}
 
 	// load emoticons
@@ -304,12 +313,13 @@ bool PsiIconset::loadAll()
 	return ok;
 }
 
-bool PsiIconset::optionsChanged(const Options *old)
+bool PsiIconset::optionsChanged()
 {
+/* LEGOPTFIXME
 	bool ok = loadSystem();
 
 	// default roster iconset
-	if ( old-&gt;defaultRosterIconset != option.defaultRosterIconset ) {
+	if ( old-&gt;defaultRosterIconset != PsiOptions::instance()-&gt;getOption(&quot;options.iconsets.status&quot;).toString() ) {
 		Iconset *newDef = d-&gt;defaultRosterIconset(&amp;ok);
 		Iconset *oldDef = roster[old-&gt;defaultRosterIconset];
 		d-&gt;loadIconset( oldDef, newDef );
@@ -318,27 +328,27 @@ bool PsiIconset::optionsChanged(const Options *old)
 		roster.remove(old-&gt;defaultRosterIconset);
 		roster.setAutoDelete(true);
 
-		roster.insert (option.defaultRosterIconset, oldDef);
+		roster.insert (PsiOptions::instance()-&gt;getOption(&quot;options.iconsets.status&quot;).toString(), oldDef);
 		delete newDef;
 	}
 
 	// service&amp;custom roster iconsets
-	if (  operator!=(old-&gt;serviceRosterIconset,option.serviceRosterIconset) || operator!=(old-&gt;customRosterIconset,option.customRosterIconset)) {
+	if (  operator!=(old-&gt;serviceRosterIconset,LEGOPTS.serviceRosterIconset) || operator!=(old-&gt;customRosterIconset,LEGOPTS.customRosterIconset)) {
 		QStringList rosterIconsets;
 
-		QMap&lt;QString, QString&gt;::Iterator it = option.serviceRosterIconset.begin();
-		for ( ; it != option.serviceRosterIconset.end(); ++it)
+		QMap&lt;QString, QString&gt;::Iterator it = LEGOPTS.serviceRosterIconset.begin();
+		for ( ; it != LEGOPTS.serviceRosterIconset.end(); ++it)
 			if ( rosterIconsets.findIndex( it.data() ) == -1 )
 				rosterIconsets &lt;&lt; it.data();
 
-		it = option.customRosterIconset.begin();
-		for ( ; it != option.customRosterIconset.end(); ++it)
+		it = LEGOPTS.customRosterIconset.begin();
+		for ( ; it != LEGOPTS.customRosterIconset.end(); ++it)
 			if ( rosterIconsets.findIndex( it.data() ) == -1 )
 				rosterIconsets &lt;&lt; it.data();
 
 		QStringList::Iterator it2 = rosterIconsets.begin();
 		for ( ; it2 != rosterIconsets.end(); ++it2) {
-			if ( *it2 == option.defaultRosterIconset )
+			if ( *it2 == PsiOptions::instance()-&gt;getOption(&quot;options.iconsets.status&quot;).toString() )
 				continue;
 
 			Iconset *is = new Iconset;
@@ -364,7 +374,7 @@ bool PsiIconset::optionsChanged(const Options *old)
 			Q3DictIterator&lt;Iconset&gt; it3 ( roster );
 			for ( ; it3.current(); ++it3) {
 				QString name = it3.currentKey();
-				if ( name == option.defaultRosterIconset )
+				if ( name == PsiOptions::instance()-&gt;getOption(&quot;options.iconsets.status&quot;).toString() )
 					continue;
 
 				it2 = rosterIconsets.find( name );
@@ -379,12 +389,12 @@ bool PsiIconset::optionsChanged(const Options *old)
 	}
 
 	// load emoticons
-	if ( old-&gt;emoticons != option.emoticons ) {
+	if ( old-&gt;emoticons != PsiOptions::instance()-&gt;getOption(&quot;options.iconsets.emoticons&quot;).toStringList() ) {
 		emoticons.clear();
 		emoticons = d-&gt;emoticons();
 	}
 
-	return old-&gt;defaultRosterIconset != option.defaultRosterIconset;
+	return old-&gt;defaultRosterIconset != PsiOptions::instance()-&gt;getOption(&quot;options.iconsets.status&quot;).toString();*/
 }
 
 PsiIcon *PsiIconset::event2icon(PsiEvent *e)
@@ -483,16 +493,14 @@ PsiIcon PsiIconset::status(const XMPP::Status &amp;s)
 PsiIcon *PsiIconset::transportStatusPtr(QString name, int s)
 {
 	PsiIcon *icon = 0;
-
-	QMap&lt;QString, QString&gt;::Iterator it = option.serviceRosterIconset.begin();
-	for ( ; it != option.serviceRosterIconset.end(); ++it) {
-		if (name == it.key()) {
-			Iconset *is = roster.find(it.data());
-			if ( is ) {
-				icon = (PsiIcon *)is-&gt;icon(status2name(s));
-				if ( icon )
-					break;
-			}
+	
+	QVariantList serviceicons = PsiOptions::instance()-&gt;mapKeyList(&quot;options.iconsets.service-status&quot;);
+	if (serviceicons.contains(name)) {
+		Iconset *is = roster.find(
+							PsiOptions::instance()-&gt;getOption(
+							PsiOptions::instance()-&gt;mapLookup(&quot;options.iconsets.service-status&quot;, name)+&quot;.iconset&quot;).toString());
+		if ( is ) {
+			icon = (PsiIcon *)is-&gt;icon(status2name(s));
 		}
 	}
 </diff>
      <filename>src/psiiconset.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -29,7 +29,6 @@
 
 class PsiEvent;
 class UserListItem;
-struct Options;
 namespace XMPP {
 	class Status;
 	class Jid;
@@ -43,7 +42,7 @@ public:
 	bool loadSystem();
 	bool loadAll();
 
-	bool optionsChanged(const Options *old); // returns 'true' if Psi needs to be restarted
+	bool optionsChanged();
 
 	Q3Dict&lt;Iconset&gt; roster;
 	Q3PtrList&lt;Iconset&gt; emoticons;</diff>
      <filename>src/psiiconset.h</filename>
    </modified>
    <modified>
      <diff>@@ -43,7 +43,7 @@ public:
 	bool save(QString file);
 	void autoSave(bool autoSave, QString autoFile = &quot;&quot;);
 
-private:
+// don't call this normally
 	PsiOptions();
 
 private slots:</diff>
      <filename>src/psioptions.h</filename>
    </modified>
    <modified>
      <diff>@@ -116,7 +116,7 @@ void PsiPopup::Private::init(const PsiIcon *_titleIcon, QString titleText, PsiAc
 	account = acc;
 	display = true;
 
-	if ( !option.ppIsOn )
+	if ( !PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.passive-popups.enabled&quot;).toBool() )
 		return;
 
 	if ( !psiPopupList )
@@ -134,8 +134,8 @@ void PsiPopup::Private::init(const PsiIcon *_titleIcon, QString titleText, PsiAc
 	else
 		titleIcon = new PsiIcon(*_titleIcon);
 
-	FancyPopup::setHideTimeout( option.ppHideTime );
-	FancyPopup::setBorderColor( option.ppBorderColor );
+	FancyPopup::setHideTimeout( PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.passive-popups.duration&quot;).toInt() );
+	FancyPopup::setBorderColor( PsiOptions::instance()-&gt;getOption(&quot;options.ui.look.colors.passive-popup.border&quot;).value&lt;QColor&gt;() );
 
 	popup = new FancyPopup(titleText, titleIcon, lastPopup, false);
 	connect(popup, SIGNAL(clicked(int)), SLOT(popupClicked(int)));
@@ -175,10 +175,10 @@ void PsiPopup::Private::eventDestroyed()
 
 QString PsiPopup::Private::clipText(QString text)
 {
-	if ( option.ppTextClip &gt; 0 ) {
+	if ( PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.passive-popups.maximum-text-length&quot;).toInt() &gt; 0 ) {
 		// richtext will give us trouble here
-		if ( ((int)text.length()) &gt; option.ppTextClip ) {
-			text = text.left( option.ppTextClip );
+		if ( ((int)text.length()) &gt; PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.passive-popups.maximum-text-length&quot;).toInt() ) {
+			text = text.left( PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.passive-popups.maximum-text-length&quot;).toInt() );
 
 			// delete last unclosed tag
 			/*if ( text.find(&quot;&lt;/&quot;) &gt; text.find(&quot;&gt;&quot;) ) {
@@ -208,7 +208,7 @@ QBoxLayout *PsiPopup::Private::createContactInfo(const PsiIcon *icon, QString te
 
 	QLabel *textLabel = new QLabel(popup);
 	QFont font;
-	font.fromString( option.font[fPopup] );
+	font.fromString( PsiOptions::instance()-&gt;getOption(&quot;options.ui.look.font.passive-popup&quot;).toString() );
 	textLabel-&gt;setFont(font);
 
 	textLabel-&gt;setWordWrap(false);
@@ -318,15 +318,15 @@ void PsiPopup::setData(const Jid &amp;j, const Resource &amp;r, const UserListItem *u, c
 	QString text;
 
 	QString jid = j.full();
-	if ( option.ppJidClip &gt; 0 &amp;&amp; ((int)jid.length()) &gt; option.ppJidClip )
-		jid = jid.left( option.ppJidClip ) + &quot;...&quot;;
+	if ( PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.passive-popups.maximum-jid-length&quot;).toInt() &gt; 0 &amp;&amp; ((int)jid.length()) &gt; PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.passive-popups.maximum-jid-length&quot;).toInt() )
+		jid = jid.left( PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.passive-popups.maximum-jid-length&quot;).toInt() ) + &quot;...&quot;;
 
 	QString status;
-	if ( option.ppStatusClip != 0 )
+	if ( PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.passive-popups.maximum-status-length&quot;).toInt() != 0 )
 		status = r.status().status();
-	if ( option.ppStatusClip &gt; 0 )
-		if ( ((int)status.length()) &gt; option.ppStatusClip )
-			status = status.left ( option.ppStatusClip ) + &quot;...&quot;;
+	if ( PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.passive-popups.maximum-status-length&quot;).toInt() &gt; 0 )
+		if ( ((int)status.length()) &gt; PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.passive-popups.maximum-status-length&quot;).toInt() )
+			status = status.left ( PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.passive-popups.maximum-status-length&quot;).toInt() ) + &quot;...&quot;;
 
 	QString name;
 	if ( u &amp;&amp; !u-&gt;name().isEmpty() ) {
@@ -340,7 +340,7 @@ void PsiPopup::setData(const Jid &amp;j, const Resource &amp;r, const UserListItem *u, c
 	}
 		
 	if (!name.isEmpty()) {
-		if ( !option.ppJidClip )
+		if ( !PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.passive-popups.maximum-jid-length&quot;).toInt() )
 			name = &quot;&lt;nobr&gt;&quot; + Qt::escape(name) + &quot;&lt;/nobr&gt;&quot;;
 		else
 			name = &quot;&lt;nobr&gt;&quot; + Qt::escape(name) + &quot; &amp;lt;&quot; + Qt::escape(jid) + &quot;&amp;gt;&quot; + &quot;&lt;/nobr&gt;&quot;;
@@ -349,7 +349,7 @@ void PsiPopup::setData(const Jid &amp;j, const Resource &amp;r, const UserListItem *u, c
 		name = &quot;&lt;nobr&gt;&amp;lt;&quot; + Qt::escape(jid) + &quot;&amp;gt;&lt;/nobr&gt;&quot;;
 
 	QString statusString = TextUtil::plain2rich(status);
-	if ( option.useEmoticons )
+	if ( PsiOptions::instance()-&gt;getOption(&quot;options.ui.emoticons.use-emoticons&quot;).toBool() )
 		statusString = TextUtil::emoticonify(statusString);
 	if( PsiOptions::instance()-&gt;getOption(&quot;options.ui.chat.legacy-formatting&quot;).toBool() )
 		statusString = TextUtil::legacyFormat(statusString);
@@ -371,7 +371,7 @@ void PsiPopup::setData(const Jid &amp;j, const Resource &amp;r, const UserListItem *u, c
 	}
 
 	// show popup
-	if ( d-&gt;popupType != AlertHeadline &amp;&amp; (d-&gt;popupType != AlertFile || !option.popupFiles) )
+	if ( d-&gt;popupType != AlertHeadline &amp;&amp; (d-&gt;popupType != AlertFile || !PsiOptions::instance()-&gt;getOption(&quot;options.ui.file-transfer.auto-popup&quot;).toBool()) )
 		setData(icon, contactText);
 	else if ( d-&gt;popupType == AlertHeadline ) {
 		QVBoxLayout *vbox = new QVBoxLayout(0);
@@ -387,7 +387,7 @@ void PsiPopup::setData(const Jid &amp;j, const Resource &amp;r, const UserListItem *u, c
 
 		QLabel *messageLabel = new QLabel(d-&gt;popup);
 		QFont font = messageLabel-&gt;font();
-		font.setPointSize(option.smallFontSize);
+		font.setPointSize(common_smallFontSize);
 		messageLabel-&gt;setFont(font);
 
 		messageLabel-&gt;setWordWrap(true);
@@ -414,7 +414,7 @@ void PsiPopup::show()
 		return;
 	}
 
-	if ( !d-&gt;id.isEmpty() /*&amp;&amp; option.ppNoDupes*/ ) {
+	if ( !d-&gt;id.isEmpty() /*&amp;&amp; LEGOPTS.ppNoDupes*/ ) {
 		foreach (PsiPopup *pp, *psiPopupList) {
 			if ( d-&gt;id == pp-&gt;id() &amp;&amp; pp-&gt;popup() ) {
 				pp-&gt;popup()-&gt;restartHideTimer();</diff>
      <filename>src/psipopup.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -26,10 +26,12 @@
 //Added by qt3to4:
 #include &lt;QContextMenuEvent&gt;
 #include &lt;Q3PtrList&gt;
+#include &lt;Q3MainWindow&gt;
 #include &quot;psicon.h&quot;
 #include &quot;iconset.h&quot;
 #include &quot;psicon.h&quot;
 #include &quot;iconaction.h&quot;
+#include &quot;psioptions.h&quot;
 #include &quot;options/opt_toolbars.h&quot;
 
 //----------------------------------------------------------------------------
@@ -43,10 +45,10 @@ public:
 
 	bool customizeable, moveable;
 	PsiActionList::ActionsType type;
-	QString group;
-	int groupIndex;
 	PsiCon *psi;
 	Q3PtrList&lt;IconAction&gt; uniqueActions;
+	QString base;
+	bool dirty;
 };
 
 PsiToolBar::Private::Private()
@@ -54,6 +56,7 @@ PsiToolBar::Private::Private()
 	customizeable = true;
 	moveable = true;
 	psi = 0;
+	dirty = false;
 	uniqueActions.setAutoDelete( true );
 }
 
@@ -61,11 +64,31 @@ PsiToolBar::Private::Private()
 // PsiToolBar
 //----------------------------------------------------------------------------
 
+PsiToolBar *PsiToolBar::fromOptions(const QString &amp;base, Q3MainWindow* mainWindow, PsiCon* psi, PsiActionList::ActionsType t)
+{
+	PsiToolBar *tb = 0;
+
+	tb = new PsiToolBar(PsiOptions::instance()-&gt;getOption(base + &quot;.name&quot;).toString(),
+						mainWindow, psi);
+	mainWindow-&gt;moveDockWindow ( tb, 
+				(Qt::Dock)PsiOptions::instance()-&gt;getOption(base + &quot;.dock.position&quot;).toInt(), // LEGOPTFIXME
+				PsiOptions::instance()-&gt;getOption(base + &quot;.dock.nl&quot;).toBool(), 
+				PsiOptions::instance()-&gt;getOption(base + &quot;.dock.index&quot;).toInt(), 
+				PsiOptions::instance()-&gt;getOption(base + &quot;.dock.extra-offset&quot;).toInt() );
+
+	tb-&gt;setType(t);
+	tb-&gt;initialize( base, false );
+	return tb;
+}
+
+
 PsiToolBar::PsiToolBar(const QString&amp; label, Q3MainWindow* mainWindow, PsiCon* psi)
 : Q3ToolBar(label, mainWindow, (QWidget*)mainWindow)
 {
 	d = new Private();
 	d-&gt;psi = psi;
+	connect(PsiOptions::instance(), SIGNAL(optionChanged(const QString&amp;)), SLOT(optionChanged(const QString&amp;)));
+	connect(PsiOptions::instance(), SIGNAL(optionRemoved(const QString&amp;)),SLOT(optionRemoved(const QString&amp;)));
 }
 
 PsiToolBar::~PsiToolBar()
@@ -73,25 +96,51 @@ PsiToolBar::~PsiToolBar()
 	delete d;
 }
 
-bool PsiToolBar::isCustomizeable() const
-{
-	return d-&gt;customizeable;
-}
 
-void PsiToolBar::setCustomizeable( bool b )
+void PsiToolBar::optionChanged(const QString&amp; option)
 {
-	d-&gt;customizeable = b;
+	if (d-&gt;dirty) return;
+	if (!option.startsWith(d-&gt;base + &quot;.&quot;)) return;
+	
+	d-&gt;dirty = true;
+	// collapse all updates until next mainloop iteration...
+	QMetaObject::invokeMethod(this, &quot;update&quot;, Qt::QueuedConnection);
 }
 
-bool PsiToolBar::isMoveable() const
+void PsiToolBar::update()
 {
-	return d-&gt;moveable;
+	d-&gt;dirty = false;
+	clear();
+	initialize( d-&gt;base, false );
 }
 
-void PsiToolBar::setMoveable( bool b )
+void PsiToolBar::optionRemoved(const QString&amp; option)
 {
-	d-&gt;moveable = b;
+	if (d-&gt;base == option || d-&gt;base.startsWith(option+&quot;.&quot;)) {
+		deleteLater();
+	}
 }
+
+
+// bool PsiToolBar::isCustomizeable() const
+// {
+// 	return d-&gt;customizeable;
+// }
+// 
+// void PsiToolBar::setCustomizeable( bool b )
+// {
+// 	d-&gt;customizeable = b;
+// }
+// 
+// bool PsiToolBar::isMoveable() const
+// {
+// 	return d-&gt;moveable;
+// }
+// 
+// void PsiToolBar::setMoveable( bool b )
+// {
+// 	d-&gt;moveable = b;
+// }
 	
 void PsiToolBar::contextMenuEvent(QContextMenuEvent *e)
 {
@@ -115,39 +164,26 @@ PsiActionList::ActionsType PsiToolBar::type() const
 	return d-&gt;type;
 }
 
-QString PsiToolBar::group() const
-{
-	return d-&gt;group;
-}
-
-int PsiToolBar::groupIndex() const
-{
-	return d-&gt;groupIndex;
-}
-
-void PsiToolBar::setGroup( QString group, int index )
-{
-	d-&gt;group = group;
-	d-&gt;groupIndex = index;
-}
-
 void PsiToolBar::setType( PsiActionList::ActionsType type )
 {
 	d-&gt;type = PsiActionList::ActionsType( PsiActionList::ActionsType( type ) | PsiActionList::Actions_Common );
 }
 
-void PsiToolBar::initialize( Options::ToolbarPrefs &amp;tbPref, bool createUniqueActions )
+void PsiToolBar::initialize( QString base, bool createUniqueActions )
 {
+	d-&gt;base = base;
 	d-&gt;uniqueActions.clear();
 
-	setHorizontallyStretchable( tbPref.stretchable );
-	setVerticallyStretchable( tbPref.stretchable );
+// PsiOptions::instance()-&gt;getOption(base + &quot;.&quot;).toString()	
+	
+	setHorizontallyStretchable(PsiOptions::instance()-&gt;getOption(base + &quot;.stretchable&quot;).toBool());
+	setVerticallyStretchable(PsiOptions::instance()-&gt;getOption(base + &quot;.stretchable&quot;).toBool());
 
-	setMovingEnabled ( !tbPref.locked );
+	setMovingEnabled (!PsiOptions::instance()-&gt;getOption(base + &quot;.locked&quot;).toBool());
 
 	if ( d-&gt;psi ) {
 		ActionList actions = d-&gt;psi-&gt;actionList()-&gt;suitableActions( d-&gt;type );
-		QStringList keys = tbPref.keys;
+		QStringList keys = PsiOptions::instance()-&gt;getOption(base + &quot;.actions&quot;).toStringList();
 		for (int j = 0; j &lt; keys.size(); j++) {
 			IconAction *action = actions.action( keys[j] );
 
@@ -163,17 +199,33 @@ void PsiToolBar::initialize( Options::ToolbarPrefs &amp;tbPref, bool createUniqueAct
 				action-&gt;addTo( this );
 				emit registerAction( action );
 			}
-			else
+			else {
 				qWarning(&quot;PsiToolBar::initialize(): action %s not found!&quot;, keys[j].latin1());
+			}
 		}
 	}
-	else
+	else {
 		qWarning(&quot;PsiToolBar::initialize(): psi is NULL!&quot;);
+	}
 
-	if ( tbPref.on )
+	if (PsiOptions::instance()-&gt;getOption(base + &quot;.visible&quot;).toBool()) {
 		show();
-	else
+	} else {
 		hide();
+	}
+}
+
 
-	tbPref.dirty = false;
+void PsiToolBar::structToOptions(const QString &amp;base, ToolbarPrefs *tb)
+{
+	PsiOptions *o = PsiOptions::instance();
+	o-&gt;setOption(base+&quot;.name&quot;,tb-&gt;name);
+	o-&gt;setOption(base+&quot;.visible&quot;,tb-&gt;on);
+	o-&gt;setOption(base+&quot;.locked&quot;,tb-&gt;locked);
+	o-&gt;setOption(base+&quot;.stretchable&quot;,tb-&gt;stretchable);
+	o-&gt;setOption(base+&quot;.actions&quot;,tb-&gt;keys);
+	o-&gt;setOption(base+&quot;.dock.position&quot;,tb-&gt;dock); // LEGOPTFIXME
+	o-&gt;setOption(base+&quot;.dock.index&quot;,tb-&gt;index);
+	o-&gt;setOption(base+&quot;.dock.nl&quot;,tb-&gt;nl);
+	o-&gt;setOption(base+&quot;.dock.extra-offset&quot;,tb-&gt;extraOffset);	
 }</diff>
      <filename>src/psitoolbar.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -34,25 +34,29 @@ class PsiToolBar : public Q3ToolBar
 	Q_OBJECT
 
 public:
+	static PsiToolBar *fromOptions(const QString &amp;base, Q3MainWindow* mainWindow, PsiCon* psi, PsiActionList::ActionsType t);
+	static void structToOptions(const QString &amp;base, ToolbarPrefs *s);
+	
 	PsiToolBar(const QString&amp; label, Q3MainWindow* mainWindow, PsiCon* psi);
 	~PsiToolBar();
 
 	PsiActionList::ActionsType type() const;
 	void setType( PsiActionList::ActionsType );
-	void initialize( Options::ToolbarPrefs &amp;, bool createUniqueActions );
+	void initialize( QString base, bool createUniqueActions );
 
-	QString group() const;
-	int groupIndex() const;
-	void setGroup( QString group, int index );
-	
-	bool isCustomizeable() const;
+/*	bool isCustomizeable() const;
 	void setCustomizeable( bool );
 
 	bool isMoveable() const;
-	void setMoveable( bool );
+	void setMoveable( bool );*/
 	
 signals:
 	void registerAction( IconAction * );
+	
+public slots:
+	void optionChanged(const QString&amp; option);
+	void update();
+	void optionRemoved(const QString&amp; option);
 
 protected:
 	void contextMenuEvent(QContextMenuEvent *e);</diff>
      <filename>src/psitoolbar.h</filename>
    </modified>
    <modified>
      <diff>@@ -6,8 +6,8 @@
 #include &quot;psitrayicon.h&quot;
 #include &quot;trayicon.h&quot;
 #include &quot;iconset.h&quot;
-#include &quot;common.h&quot; // options
 #include &quot;alerticon.h&quot;
+#include &quot;psioptions.h&quot;
 
 // TODO: remove the QPoint parameter from the signals when we finally move
 // to the new system.
@@ -212,7 +212,7 @@ void PsiTrayIcon::animate()
 		if ( !icon_ )
 			return;
 
-		QString cachedName = &quot;PsiTray/&quot; + option.defaultRosterIconset + &quot;/&quot; + icon_-&gt;name() + &quot;/&quot; + QString::number( icon_-&gt;frameNumber() );
+		QString cachedName = &quot;PsiTray/&quot; + PsiOptions::instance()-&gt;getOption(&quot;options.iconsets.status&quot;).toString() + &quot;/&quot; + icon_-&gt;name() + &quot;/&quot; + QString::number( icon_-&gt;frameNumber() );
 
 		QPixmap p;
 		if ( !QPixmapCache::find(cachedName, p) ) {
@@ -229,7 +229,7 @@ void PsiTrayIcon::animate()
 		if ( !icon_ )
 			return;
 
-		QString cachedName = &quot;PsiTray/&quot; + option.defaultRosterIconset + &quot;/&quot; + icon_-&gt;name() + &quot;/&quot; + QString::number( icon_-&gt;frameNumber() );
+		QString cachedName = &quot;PsiTray/&quot; + PsiOptions::instance()-&gt;getOption(&quot;options.iconsets.status&quot;).toString() + &quot;/&quot; + icon_-&gt;name() + &quot;/&quot; + QString::number( icon_-&gt;frameNumber() );
 
 		QPixmap p;
 		if ( !QPixmapCache::find(cachedName, p) ) {</diff>
      <filename>src/psitrayicon.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -18,7 +18,6 @@
  *
  */
 
-#include &quot;common.h&quot;
 #include &quot;iconaction.h&quot;
 #include &quot;psiaccount.h&quot;
 #include &quot;psiactionlist.h&quot;
@@ -173,7 +172,7 @@ AHCommand RCSetOptionsServer::execute(const AHCommand&amp; c, const Jid&amp;)
 		sounds_field.setType(XData::Field::Field_Boolean);
 		sounds_field.setLabel(QObject::tr(&quot;Play sounds&quot;));
 		sounds_field.setVar(&quot;sounds&quot;);
-		sounds_field.setValue(QStringList((useSound ? &quot;1&quot; : &quot;0&quot;)));
+		sounds_field.setValue(QStringList((PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.sounds.enable&quot;).toBool() ? &quot;1&quot; : &quot;0&quot;)));
 		sounds_field.setRequired(false);
 		fields += sounds_field;
 		
@@ -181,7 +180,7 @@ AHCommand RCSetOptionsServer::execute(const AHCommand&amp; c, const Jid&amp;)
 		auto_offline_field.setType(XData::Field::Field_Boolean);
 		auto_offline_field.setLabel(QObject::tr(&quot;Automatically go offline when idle&quot;));
 		auto_offline_field.setVar(&quot;auto-offline&quot;);
-		auto_offline_field.setValue(QStringList((option.use_asOffline ? &quot;1&quot; : &quot;0&quot;)));
+		auto_offline_field.setValue(QStringList((PsiOptions::instance()-&gt;getOption(&quot;options.status.auto-away.use-offline&quot;).toBool() ? &quot;1&quot; : &quot;0&quot;)));
 		auto_offline_field.setRequired(false);
 		fields += auto_offline_field;
 		
@@ -189,7 +188,7 @@ AHCommand RCSetOptionsServer::execute(const AHCommand&amp; c, const Jid&amp;)
 		auto_auth_field.setType(XData::Field::Field_Boolean);
 		auto_auth_field.setLabel(QObject::tr(&quot;Auto-authorize contacts&quot;));
 		auto_auth_field.setVar(&quot;auto-auth&quot;);
-		auto_auth_field.setValue(QStringList((option.autoAuth ? &quot;1&quot; : &quot;0&quot;)));
+		auto_auth_field.setValue(QStringList((PsiOptions::instance()-&gt;getOption(&quot;options.subscriptions.automatically-allow-authorisation&quot;).toBool() ? &quot;1&quot; : &quot;0&quot;)));
 		auto_auth_field.setRequired(false);
 		fields += auto_auth_field;
 		
@@ -197,7 +196,7 @@ AHCommand RCSetOptionsServer::execute(const AHCommand&amp; c, const Jid&amp;)
 		auto_open_field.setType(XData::Field::Field_Boolean);
 		auto_open_field.setLabel(QObject::tr(&quot;Auto-open new messages&quot;));
 		auto_open_field.setVar(&quot;auto-open&quot;);
-		auto_open_field.setValue(QStringList((option.popupMsgs ? &quot;1&quot; : &quot;0&quot;)));
+		auto_open_field.setValue(QStringList((PsiOptions::instance()-&gt;getOption(&quot;options.ui.message.auto-popup&quot;).toBool() ? &quot;1&quot; : &quot;0&quot;)));
 		auto_open_field.setRequired(false);
 		fields += auto_open_field;
 		
@@ -220,23 +219,23 @@ AHCommand RCSetOptionsServer::execute(const AHCommand&amp; c, const Jid&amp;)
 			else if (fl[i].var() == &quot;auto-offline&quot;) {
 				QString v =  fl[i].value().first();
 				if (v == &quot;1&quot;) 
-					option.use_asOffline = true;
+					PsiOptions::instance()-&gt;setOption(&quot;options.status.auto-away.use-offline&quot;, (bool) true);
 				else if (v == &quot;0&quot;) 
-					option.use_asOffline = false;
+					PsiOptions::instance()-&gt;setOption(&quot;options.status.auto-away.use-offline&quot;, (bool) false);
 			}
 			else if (fl[i].var() == &quot;auto-auth&quot;) {
 				QString v =  fl[i].value().first();
 				if (v == &quot;1&quot;) 
-					option.autoAuth = true;
+					PsiOptions::instance()-&gt;setOption(&quot;options.subscriptions.automatically-allow-authorisation&quot;, (bool) true);
 				else if (v == &quot;0&quot;) 
-					option.autoAuth = false;
+					PsiOptions::instance()-&gt;setOption(&quot;options.subscriptions.automatically-allow-authorisation&quot;, (bool) false);
 			}
 			else if (fl[i].var() == &quot;auto-open&quot;) {
 				QString v =  fl[i].value().first();
 				if (v == &quot;1&quot;) 
-					option.popupMsgs = true;
+					PsiOptions::instance()-&gt;setOption(&quot;options.ui.message.auto-popup&quot;, (bool) true);
 				else if (v == &quot;0&quot;) 
-					option.popupMsgs = false;
+					PsiOptions::instance()-&gt;setOption(&quot;options.ui.message.auto-popup&quot;, (bool) false);
 			}
 		}
 		return AHCommand::completedReply(c);</diff>
      <filename>src/rc.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -164,8 +164,8 @@ void StatusSetDlg::init()
 	d-&gt;cb_preset = new QComboBox(this);
 	d-&gt;cb_preset-&gt;insertItem(tr(&quot;&lt;None&gt;&quot;));
 	QStringList presets;
-	foreach(StatusPreset p, option.sp) {
-		presets += p.name();
+	foreach(QVariant name, PsiOptions::instance()-&gt;mapKeyList(&quot;options.status.presets&quot;)) {
+		presets += name.toString();
 	}
 	presets.sort();
 	d-&gt;cb_preset-&gt;insertStringList(presets);
@@ -234,7 +234,7 @@ void StatusSetDlg::doButton()
 				QMessageBox::information(this, tr(&quot;Error&quot;), 
 					tr(&quot;Can't create a blank preset!&quot;));
 			}
-			else if(option.sp.contains(text)) {
+			else if(PsiOptions::instance()-&gt;mapKeyList(&quot;options.status.presets&quot;).contains(text)) {
 				QMessageBox::information(this, tr(&quot;Error&quot;), 
 					tr(&quot;You already have a preset with that name!&quot;));
 			}
@@ -242,10 +242,16 @@ void StatusSetDlg::doButton()
 				break;
 		}
 		// Store preset
- 		option.sp[text] = StatusPreset(text,d-&gt;te-&gt;text());
- 		if (!d-&gt;le_priority-&gt;text().isEmpty()) 
- 			option.sp[text].setPriority(d-&gt;le_priority-&gt;text().toInt());
- 		option.sp[text].setStatus((XMPP::Status::Type) d-&gt;cb_type-&gt;itemData(d-&gt;cb_type-&gt;currentIndex()).toInt());
+		QString base = PsiOptions::instance()-&gt;mapPut(&quot;options.status.presets&quot;, text);
+		PsiOptions::instance()-&gt;setOption(base+&quot;.message&quot;, d-&gt;te-&gt;text());
+ 		if (!d-&gt;le_priority-&gt;text().isEmpty()) {
+			PsiOptions::instance()-&gt;setOption(base+&quot;.force-priority&quot;, true);
+			PsiOptions::instance()-&gt;setOption(base+&quot;.priority&quot;, d-&gt;le_priority-&gt;text().toInt());
+		} else {
+			PsiOptions::instance()-&gt;setOption(base+&quot;.force-priority&quot;, false);
+		}
+		PsiOptions::instance()-&gt;setOption(base+&quot;.status&quot;, XMPP::Status((XMPP::Status::Type) d-&gt;cb_type-&gt;itemData(d-&gt;cb_type-&gt;currentIndex()).toInt()).typeString());
+		
 	} 
 
 	// Set status
@@ -265,16 +271,19 @@ void StatusSetDlg::chooseStatusPreset(int x)
 	if(x &lt; 1)
 		return;
 	
-	StatusPreset preset = option.sp[d-&gt;cb_preset-&gt;text(x)];
-	d-&gt;te-&gt;setText(preset.message());
-	if (preset.priority().hasValue()) 
-		d-&gt;le_priority-&gt;setText(QString::number(preset.priority().value()));
-	else
+	QString base = PsiOptions::instance()-&gt;mapLookup(&quot;options.status.presets&quot;, d-&gt;cb_preset-&gt;text(x));
+	d-&gt;te-&gt;setText(PsiOptions::instance()-&gt;getOption(base+&quot;.message&quot;).toString());
+	if (PsiOptions::instance()-&gt;getOption(base+&quot;.force-priority&quot;).toBool()) {
+		d-&gt;le_priority-&gt;setText(QString::number(PsiOptions::instance()-&gt;getOption(base+&quot;.priority&quot;).toInt()));
+	} else {
 		d-&gt;le_priority-&gt;clear();
+	}
 
+	XMPP::Status status;
+	status.setType(PsiOptions::instance()-&gt;getOption(base+&quot;.status&quot;).toString());
 	int n;
 	for(n = 0; n &lt; d-&gt;cb_type-&gt;count(); ++n) {
-		if(preset.status() == d-&gt;cb_type-&gt;itemData(n).toInt()) {
+		if(status.type() == d-&gt;cb_type-&gt;itemData(n).toInt()) {
 			d-&gt;cb_type-&gt;setCurrentItem(n);
 			break;
 		}</diff>
      <filename>src/statusdlg.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -21,7 +21,6 @@
 #include &quot;tabbablewidget.h&quot;
 #include &quot;tabmanager.h&quot;
 #include &quot;tabdlg.h&quot;
-#include &quot;common.h&quot;
 #include &quot;jidutil.h&quot;
 #include &quot;groupchatdlg.h&quot;
 #include &lt;QTimer&gt;</diff>
      <filename>src/tabs/tabbablewidget.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -22,7 +22,6 @@
 
 #include &quot;iconwidget.h&quot;
 #include &quot;iconset.h&quot;
-#include &quot;common.h&quot;
 #include &quot;psicon.h&quot;
 #include &lt;qmenubar.h&gt;
 #include &lt;qcursor.h&gt;
@@ -127,7 +126,7 @@ TabDlg::TabDlg(TabManager* tabManager, TabDlgDelegate *delegate)
 		delegate_-&gt;create(this);
 	}
 
-	if (option.brushedMetal) {
+	if (PsiOptions::instance()-&gt;getOption(&quot;options.ui.mac.use-brushed-metal-windows&quot;).toBool()) {
 		setAttribute(Qt::WA_MacMetalStyle);
 	}
 
@@ -163,7 +162,9 @@ TabDlg::TabDlg(TabManager* tabManager, TabDlgDelegate *delegate)
 
 	setShortcuts();
 
-	resize(option.sizeTabDlg);
+	if (PsiOptions::instance()-&gt;getOption(&quot;options.ui.tabs.size&quot;).toSize().isValid()) {
+		resize(PsiOptions::instance()-&gt;getOption(&quot;options.ui.tabs.size&quot;).toSize());
+	}
 }
 
 TabDlg::~TabDlg() {
@@ -187,8 +188,8 @@ void TabDlg::resizeEvent(QResizeEvent *e)
 {
 	AdvancedWidget&lt;QWidget&gt;::resizeEvent(e);
 
-	if (option.keepSizes)
-		option.sizeTabDlg = e-&gt;size();
+	if (PsiOptions::instance()-&gt;getOption(&quot;options.ui.remember-window-sizes&quot;).toBool())
+		PsiOptions::instance()-&gt;getOption(&quot;options.ui.tabs.size&quot;).toSize() = e-&gt;size();
 
 	// delegate may want to act on resize event
 	if (delegate_) {
@@ -284,7 +285,7 @@ void TabDlg::setLooks()
 	setWindowIcon(IconsetFactory::icon(&quot;psi/start-chat&quot;).icon());
 #endif
 	tabWidget_-&gt;setTabPosition(QTabWidget::Top);
-	if (option.putTabsAtBottom)
+	if (PsiOptions::instance()-&gt;getOption(&quot;options.ui.tabs.put-tabs-at-bottom&quot;).toBool())
 		tabWidget_-&gt;setTabPosition(QTabWidget::Bottom);
 
 	setWindowOpacity(double(qMax(MINIMUM_OPACITY,PsiOptions::instance()-&gt;getOption(&quot;options.ui.chat.opacity&quot;).toInt()))/100);</diff>
      <filename>src/tabs/tabdlg.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -6,6 +6,7 @@
 #include &quot;tabbablewidget.h&quot;
 #include &quot;groupchatdlg.h&quot;
 #include &quot;chatdlg.h&quot;
+#include &quot;psioptions.h&quot;
 
 TabManager::TabManager(PsiCon* psiCon, QObject *parent)
 	: QObject(parent)
@@ -35,7 +36,7 @@ TabDlg* TabManager::getTabs()
 
 bool TabManager::shouldBeTabbed(QWidget *widget)
 {
-	if (!option.useTabs) {
+	if (!PsiOptions::instance()-&gt;getOption(&quot;options.ui.tabs.use-tabs&quot;).toBool()) {
 		return false;
 	}
 	if (qobject_cast&lt;ChatDlg*&gt; (widget)) {</diff>
      <filename>src/tabs/tabmanager.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -27,7 +27,6 @@
 
 #include &quot;psioptions.h&quot;
 #include &quot;psicon.h&quot;
-#include &quot;common.h&quot;
 
 void TipDlg::show(PsiCon* psi)
 {</diff>
      <filename>src/tipdlg.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -3,7 +3,6 @@
 #include &lt;QStringList&gt;
 #include &lt;Q3PtrList&gt;
 
-#include &quot;common.h&quot;
 #include &quot;iconset.h&quot;
 #include &quot;psiiconset.h&quot;
 </diff>
      <filename>src/unittest/psiiconset/testpsiiconset.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -3,7 +3,6 @@
 #include &lt;QTimer&gt;
 #include &lt;QtCrypto&gt;
 
-#include &quot;common.h&quot;
 #include &quot;psipopup.h&quot;
 #include &quot;iconset.h&quot;
 #include &quot;psicon.h&quot; // for PsiCon</diff>
      <filename>src/unittest/psipopup/testpsipopup.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -581,7 +581,7 @@ QString UserListItem::makeBareTip(bool trim, bool doLinkify) const
 					s = TextUtil::plain2rich(s);
 				if ( doLinkify )
 					s = TextUtil::linkify(s);
-				if( option.useEmoticons &amp;&amp; !doLinkify )
+				if( PsiOptions::instance()-&gt;getOption(&quot;options.ui.emoticons.use-emoticons&quot;).toBool() &amp;&amp; !doLinkify )
 					s = TextUtil::emoticonify(s);
 				if( !doLinkify &amp;&amp; PsiOptions::instance()-&gt;getOption(&quot;options.ui.chat.legacy-formatting&quot;).toBool() )
 					s = TextUtil::legacyFormat(s);</diff>
      <filename>src/userlist.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -24,6 +24,7 @@
 #include &lt;QDomDocument&gt;
 
 #include &quot;varlist.h&quot;
+#include &quot;optionstree.h&quot;
 
 
 VarList::VarList() :QList&lt;VarListItem&gt;()
@@ -38,6 +39,26 @@ QStringList VarList::varsToStringList()
 	return list;
 }
 
+void VarList::fromOptions(OptionsTree *o, QString base)
+{
+	QStringList bases = o-&gt;getChildOptionNames( base, true, true);
+	foreach(QString ibase, bases) {
+		QString var = o-&gt;getOption(ibase + &quot;.key&quot;).toString();
+		QString val = o-&gt;getOption(ibase + &quot;.data&quot;).toString();
+		set(var, val);
+	}
+}
+
+void VarList::toOptions(OptionsTree *o, QString base)
+{
+	o-&gt;removeOption(base, true);
+	foreach(VarListItem item, *this) {
+		QString ibase = o-&gt;mapPut(base, item.key());
+		o-&gt;setOption(ibase + &quot;.data&quot;, item.data());
+	}
+}
+
+
 QDomElement VarList::toXml(QDomDocument &amp;doc, const QString &amp;tagName)
 {
 	QDomElement base = doc.createElement(tagName);</diff>
      <filename>src/varlist.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -27,6 +27,7 @@
 class QDomDocument;
 class QDomElement;
 class QStringList;
+class OptionsTree;
 
 class VarListItem
 {
@@ -57,6 +58,10 @@ public:
 	VarList::Iterator findByNum(int);
 
 	QStringList varsToStringList();
+	
+	void fromOptions(OptionsTree *o, QString base);
+	void toOptions(OptionsTree *o, QString base);
+	
 	QDomElement toXml(QDomDocument &amp;doc, const QString &amp;tagName);
 	void fromXml(const QDomElement &amp;);
 };</diff>
      <filename>src/varlist.h</filename>
    </modified>
    <modified>
      <diff>@@ -35,7 +35,7 @@
 //----------------------------------------------------------------------------
 
 WbDlg::WbDlg(const Jid &amp;target, const QString &amp;session, const Jid &amp;ownJid, bool groupChat, PsiAccount *pa) {
-	if ( option.brushedMetal )
+	if ( PsiOptions::instance()-&gt;getOption(&quot;options.ui.mac.use-brushed-metal-windows&quot;).toBool() )
 		setAttribute(Qt::WA_MacMetalStyle);
 
 	groupChat_ = groupChat;
@@ -192,7 +192,7 @@ WbDlg::WbDlg(const Jid &amp;target, const QString &amp;session, const Jid &amp;ownJid, bool
 	
 	setWindowOpacity(double(qMax(MINIMUM_OPACITY, PsiOptions::instance()-&gt;getOption(&quot;options.ui.chat.opacity&quot;).toInt())) / 100);
 
-	resize(option.sizeChatDlg);
+	resize(LEGOPTS.sizeChatDlg);
 }
 
 WbDlg::~WbDlg() {
@@ -216,7 +216,7 @@ void WbDlg::incomingWbElement(const QDomElement &amp;wb, const Jid &amp;sender)
 			++pending_;
 			updateCaption();
 			doFlash(true);
-			if(option.raiseChatWindow)
+			if(PsiOptions::instance()-&gt;getOption(&quot;options.ui.chat.raise-chat-windows-on-new-messages&quot;).toBool())
 				bringToFront(this, false);
 		}
 		keepOpen_ = true;
@@ -335,9 +335,9 @@ void WbDlg::activated() {
 }
 
 void WbDlg::keyPressEvent(QKeyEvent *e) {
-	if(e-&gt;key() == Qt::Key_Escape &amp;&amp; !option.useTabs)
+	if(e-&gt;key() == Qt::Key_Escape &amp;&amp; !PsiOptions::instance()-&gt;getOption(&quot;options.ui.tabs.use-tabs&quot;).toBool())
 		close();
-	else if(e-&gt;key() == Qt::Key_W &amp;&amp; e-&gt;state() &amp; Qt::ControlButton &amp;&amp; !option.useTabs)
+	else if(e-&gt;key() == Qt::Key_W &amp;&amp; e-&gt;state() &amp; Qt::ControlButton &amp;&amp; !PsiOptions::instance()-&gt;getOption(&quot;options.ui.tabs.use-tabs&quot;).toBool())
 		close();
 	else
 		e-&gt;ignore();
@@ -356,19 +356,19 @@ void WbDlg::closeEvent(QCloseEvent *e) {
 	}
 
 	// destroy the dialog if delChats is dcClose
-	if(option.delChats == dcClose)
+	if(PsiOptions::instance()-&gt;getOption(&quot;options.ui.chat.delete-contents-after&quot;).toString() == &quot;instant&quot;)
 		endSession();
 	else {
-		if(option.delChats == dcHour)
+		if(PsiOptions::instance()-&gt;getOption(&quot;options.ui.chat.delete-contents-after&quot;).toString() == &quot;hour&quot;)
 			setSelfDestruct(60);
-		else if(option.delChats == dcDay)
+		else if(PsiOptions::instance()-&gt;getOption(&quot;options.ui.chat.delete-contents-after&quot;).toString() == &quot;day&quot;)
 			setSelfDestruct(60 * 24);
 	}
 }
 
 void WbDlg::resizeEvent(QResizeEvent *e) {
-	if(option.keepSizes)
-		option.sizeChatDlg = e-&gt;size();
+	if(PsiOptions::instance()-&gt;getOption(&quot;options.ui.remember-window-sizes&quot;).toBool())
+		LEGOPTS.sizeChatDlg = e-&gt;size();
 }
 
 void WbDlg::showEvent(QShowEvent *) {</diff>
      <filename>src/wbdlg.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -93,11 +93,11 @@ void WbManager::messageReceived(const Message &amp;message) {
 			if (w) {
 	// 			PsiPopup::PopupType popupType = PsiPopup::AlertNone;
 	//			bool doPopup = false;
-				pa_-&gt;playSound(option.onevent[eChat2]);
-	// 			if(!w-&gt;isActiveWindow() || option.alertOpenChats) {
+				pa_-&gt;playSound(PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.sounds.chat-message&quot;).toString());
+	// 			if(!w-&gt;isActiveWindow() || PsiOptions::instance()-&gt;getOption(&quot;options.ui.chat.alert-for-already-open-chats&quot;).toBool()) {
 	// 				popupType = PsiPopup::AlertChat;
-	// 				if(option.popupChats) {
-	// 					if(!option.noUnlistedPopup &amp;&amp; message.type() != &quot;groupchat&quot;) {
+	// 				if(PsiOptions::instance()-&gt;getOption(&quot;options.ui.chat.auto-popup&quot;).toBool()) {
+	// 					if(!PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.popup-dialogs.suppress-when-not-on-roster&quot;).toBool() &amp;&amp; message.type() != &quot;groupchat&quot;) {
 	// 						// don't popup wb's from unlisted contacts
 	// 						if(!pa_-&gt;find(message.from()))
 	// 							return;
@@ -105,10 +105,10 @@ void WbManager::messageReceived(const Message &amp;message) {
 						w-&gt;show();
 	// 				}
 	// 			}
-				if(option.raiseChatWindow) {
+				if(PsiOptions::instance()-&gt;getOption(&quot;options.ui.chat.raise-chat-windows-on-new-messages&quot;).toBool()) {
 					bringToFront(w);
 				}
-	// 			if ((popupType == PsiPopup::AlertChat &amp;&amp; option.ppChat) /*&amp;&amp; makeSTATUS(status()) != STATUS_DND*/) {
+	// 			if ((popupType == PsiPopup::AlertChat &amp;&amp; PsiOptions::instance()-&gt;getOption(&quot;options.ui.notifications.passive-popups.incoming-chat&quot;).toBool()) /*&amp;&amp; makeSTATUS(status()) != STATUS_DND*/) {
 	// 				PsiPopup *popup = new PsiPopup(popupType, pa_);
 	// 				popup-&gt;setData(j, r, u, e);
 	// 			}
@@ -178,7 +178,7 @@ WbDlg* WbManager::negotiateSession(const Message &amp;message) {
 	if(session.isEmpty())
 		return 0;
 
-	if(option.ignoreNonRoster &amp;&amp; message.type() != &quot;groupchat&quot;) {
+	if(PsiOptions::instance()-&gt;getOption(&quot;options.messages.ignore-non-roster-contacts&quot;).toBool() &amp;&amp; message.type() != &quot;groupchat&quot;) {
 		// Ignore the message if contact not in roster
 		if(!pa_-&gt;find(message.from())) {
 			qDebug(&quot;Whiteboard invitation received from contact that is not in roster.&quot;);</diff>
      <filename>src/wbmanager.cpp</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>719e1a7ad7896239b7f83d7a538bd280cc2e357c</id>
    </parent>
  </parents>
  <author>
    <name>Martin H</name>
    <email>textshell-I1QKlO@neutronstar.dyndns.org</email>
  </author>
  <url>http://github.com/psi-im/psi/commit/c2fb1244f09f804ca64c7f0b9aaa86379920eb98</url>
  <id>c2fb1244f09f804ca64c7f0b9aaa86379920eb98</id>
  <committed-date>2008-01-11T16:45:25-08:00</committed-date>
  <authored-date>2008-01-11T16:45:25-08:00</authored-date>
  <message>Migration from options stored in config.xml to options.xml and account.xml
And all that got clumped into this patch because of interdepencies or because
it could take advantage of the clean migration point.</message>
  <tree>8fa9017398bdeadb2aa6fa5bcc5b9b97719d690c</tree>
  <committer>
    <name>Martin H</name>
    <email>textshell-I1QKlO@neutronstar.dyndns.org</email>
  </committer>
</commit>
