diff --git a/Makefile b/Makefile
index f7c883999..ab933c5ce 100644
--- a/Makefile
+++ b/Makefile
@@ -97,7 +97,8 @@ else ifeq ($(UNAME), darwin)
 	OSSUPPORT_CFLAGS = $(GTK2CFLAGS)
 	MACOSXINSTALL = /Applications/Subsurface.app
 	MACOSXFILES = packaging/macosx
-	EXTRALIBS = -framework CoreFoundation
+	EXTRALIBS = `$(PKGCONFIG) --libs gtk-mac-integration` -framework CoreFoundation
+	CFLAGS += `$(PKGCONFIG) --cflags gtk-mac-integration`
 else
 	OSSUPPORT = windows
 	OSSUPPORT_CFLAGS = $(GTK2CFLAGS)
diff --git a/display-gtk.h b/display-gtk.h
index 23fea912a..35380fa27 100644
--- a/display-gtk.h
+++ b/display-gtk.h
@@ -34,6 +34,9 @@ extern void subsurface_close_conf(void);
 
 extern const char *subsurface_USB_name(void);
 extern const char *subsurface_icon_name(void);
+extern void subsurface_ui_setup(GtkSettings *settings, GtkWidget *menubar, GtkWidget *vbox);
+
+extern const char *divelist_font;
 
 extern visible_cols_t visible_cols;
 
diff --git a/gtk-gui.c b/gtk-gui.c
index acaa9c4f6..f17120319 100644
--- a/gtk-gui.c
+++ b/gtk-gui.c
@@ -22,7 +22,6 @@ GtkWidget *error_label;
 GtkWidget *vpane, *hpane;
 int        error_count;
 
-#define DIVELIST_DEFAULT_FONT "Sans 8"
 const char *divelist_font;
 
 struct units output_units;
@@ -681,9 +680,6 @@ void init_ui(int *argcp, char ***argvp)
 
 	divelist_font = subsurface_get_conf("divelist_font", PREF_STRING);
 
-	if (!divelist_font)
-		divelist_font = DIVELIST_DEFAULT_FONT;
-
 	error_info_bar = NULL;
 	win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
 	g_set_application_name ("subsurface");
@@ -709,7 +705,8 @@ void init_ui(int *argcp, char ***argvp)
 	main_vbox = vbox;
 
 	menubar = get_menubar_menu(win);
-	gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 0);
+
+	subsurface_ui_setup(settings, menubar, vbox);
 
 	vpane = gtk_vpaned_new();
 	gtk_box_pack_start(GTK_BOX(vbox), vpane, TRUE, TRUE, 3);
diff --git a/linux.c b/linux.c
index d2a92596e..bec4f08fb 100644
--- a/linux.c
+++ b/linux.c
@@ -2,6 +2,7 @@
 /* implements Linux specific functions */
 #include "display-gtk.h"
 #include <gconf/gconf-client.h>
+#define DIVELIST_DEFAULT_FONT "Sans 8"
 
 GConfClient *gconf;
 
@@ -56,3 +57,11 @@ const char *subsurface_icon_name()
 {
 	return "subsurface.svg";
 }
+
+void subsurface_ui_setup(GtkSettings *settings, GtkWidget *menubar,
+		GtkWidget *vbox)
+{
+	if (!divelist_font)
+		divelist_font = DIVELIST_DEFAULT_FONT;
+	gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 0);
+}
diff --git a/macos.c b/macos.c
index 4c856ce03..47ad09e18 100644
--- a/macos.c
+++ b/macos.c
@@ -3,10 +3,13 @@
 #include "display-gtk.h"
 #include <CoreFoundation/CoreFoundation.h>
 #include <mach-o/dyld.h>
+#include "gtkosxapplication.h"
+
 
 static CFURLRef fileURL;
 static CFPropertyListRef propertyList;
 static CFMutableDictionaryRef dict = NULL;
+static GtkOSXApplication *theApp;
 
 /* macos defines CFSTR to create a CFString object from a constant,
  * but no similar macros if a C string variable is supposed to be
@@ -16,6 +19,37 @@ static CFMutableDictionaryRef dict = NULL;
 					(_var), kCFStringEncodingMacRoman,	\
 					kCFAllocatorNull)
 
+#define SUBSURFACE_PREFERENCES "~/Library/Preferences/org.hohndel.subsurface.plist"
+#define REL_ICON_PATH "Resources/Subsurface.icns"
+#define UI_FONT "Arial Unicode MS 12"
+#define DIVELIST_MAC_DEFAULT_FONT "Arial Unicode MS 9"
+
+static void show_error(SInt32 errorCode, char *action)
+{
+	char *errortext;
+
+	switch(errorCode) {
+	case -11: errortext = "kCFURLUnknownSchemeError";
+		break;
+	case -12: errortext = "kCFURLResourceNotFoundError";
+		break;
+	case -13: errortext = "kCFURLResourceAccessViolationError";
+		break;
+	case -14: errortext = "kCFURLRemoteHostUnavailableError";
+		break;
+	case -15: errortext = "kCFURLImproperArgumentsError";
+		break;
+	case -16: errortext = "kCFURLUnknownPropertyKeyError";
+		break;
+	case -17: errortext = "kCFURLPropertyKeyUnavailableError";
+		break;
+	case -18: errortext = "kCFURLTimeoutError";
+		break;
+	default: errortext = "kCFURLUnknownError";
+	};
+	fprintf(stderr, "Error %s preferences: %s\n", action, errortext);
+}
+
 void subsurface_open_conf(void)
 {
 	CFStringRef errorString;
@@ -24,7 +58,7 @@ void subsurface_open_conf(void)
 	SInt32 errorCode;
 
 	fileURL = CFURLCreateWithFileSystemPath(kCFAllocatorDefault,
-						CFSTR("subsurface.pref"),// file path name
+						CFSTR(SUBSURFACE_PREFERENCES),// file path name
 						kCFURLPOSIXPathStyle,    // interpret as POSIX path
 						false );                 // is it a directory?
 
@@ -36,6 +70,8 @@ void subsurface_open_conf(void)
 							resourceData, kCFPropertyListImmutable,
 							&errorString);
 		CFRelease(resourceData);
+	} else {
+		show_error(errorCode, "reading");
 	}
 }
 
@@ -86,7 +122,9 @@ void subsurface_close_conf(void)
 	dict = NULL;
 	xmlData = CFPropertyListCreateXMLData(kCFAllocatorDefault, propertyList);
 	status = CFURLWriteDataAndPropertiesToResource (fileURL, xmlData, NULL, &errorCode);
-	// some error handling - but really, what can we do?
+	if (!status) {
+		show_error(errorCode, "writing");
+	}
 	CFRelease(xmlData);
 	CFRelease(propertyList);
 }
@@ -96,7 +134,6 @@ const char *subsurface_USB_name()
 	return "/dev/tty.SLAB_USBtoUART";
 }
 
-#define REL_ICON_PATH "Resources/Subsurface.icns"
 const char *subsurface_icon_name()
 {
 	static char path[1024];
@@ -115,3 +152,18 @@ const char *subsurface_icon_name()
 	}
 	return "packaging/macosx/Subsurface.icns";
 }
+
+void subsurface_ui_setup(GtkSettings *settings, GtkWidget *menubar,
+		GtkWidget *vbox)
+{
+	if (!divelist_font)
+		divelist_font = DIVELIST_MAC_DEFAULT_FONT;
+	g_object_set(G_OBJECT(settings), "gtk-font-name", UI_FONT, NULL);
+
+	theApp = g_object_new(GTK_TYPE_OSX_APPLICATION, NULL);
+	gtk_widget_hide (menubar);
+	gtk_osxapplication_set_menu_bar(theApp, GTK_MENU_SHELL(menubar));
+	gtk_osxapplication_set_use_quartz_accelerators(theApp, TRUE);
+	gtk_osxapplication_ready(theApp);
+
+}
diff --git a/packaging/macosx/Info.plist b/packaging/macosx/Info.plist
index 4ee12438b..e69d5b02d 100644
--- a/packaging/macosx/Info.plist
+++ b/packaging/macosx/Info.plist
@@ -15,6 +15,6 @@
 	<key>CFBundleExecutable</key>
 	<string>subsurface.sh</string>
 	<key>CFBundleIdentifier</key>
-	<string>torvalds.subsurface</string>
+	<string>org.hohndel.subsurface</string>
 </dict>
 </plist>
diff --git a/windows.c b/windows.c
index beb775aa6..53531cd01 100644
--- a/windows.c
+++ b/windows.c
@@ -2,6 +2,7 @@
 /* implements Windows specific functions */
 #include "display-gtk.h"
 #include <windows.h>
+#define DIVELIST_DEFAULT_FONT "Sans 8"
 
 static HKEY hkey;
 
@@ -88,3 +89,11 @@ const char *subsurface_icon_name()
 {
 	return "subsurface.ico";
 }
+
+void subsurface_ui_setup(GtkSettings *settings, GtkWidget *menubar,
+		GtkWidget *vbox)
+{
+	if (!divelist_font)
+		divelist_font = DIVELIST_DEFAULT_FONT;
+	gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 0);
+}