diff --git a/katarakt.pro b/katarakt.pro
index 3da73f5afe651357f2a73df1db8926d48dbc07b5..a632713db2ce46be72d072857c0c197c50419eeb 100644
--- a/katarakt.pro
+++ b/katarakt.pro
@@ -26,6 +26,8 @@ unix {
     DEFINES += POPPLER_VERSION_MICRO=$$POPPLER_VERSION_MICRO
 }
 
+DEFINES += QT_NO_CAST_FROM_ASCII QT_NO_CAST_TO_ASCII
+
 QMAKE_CXXFLAGS_DEBUG += -DDEBUG
 
 # Input
diff --git a/src/canvas.cpp b/src/canvas.cpp
index f81f58bb0a293b69f62910d5ba29cefdbeb84c76..724c36e7010b9bec89a5ffb8e084b4ea0e779917 100644
--- a/src/canvas.cpp
+++ b/src/canvas.cpp
@@ -87,9 +87,9 @@ Canvas::Canvas(Viewer *v, QWidget *parent) :
 	presenter_layout = new PresenterLayout(viewer, 1);
 
 	QString default_layout = config->get_value("Settings/default_layout").toString();
-	if (default_layout == "grid") {
+	if (default_layout == QString::fromUtf8("grid")) {
 		cur_layout = grid_layout;
-	} else if (default_layout == "presenter") {
+	} else if (default_layout == QString::fromUtf8("presenter")) {
 		cur_layout = presenter_layout;
 	} else { // "single" and everything else
 		cur_layout = single_layout;
@@ -170,7 +170,7 @@ Layout *Canvas::get_layout() const {
 void Canvas::update_page_overlay() {
 	QString frozen_text;
 	if (viewer->get_beamer()->is_frozen()) {
-		frozen_text = QString("Frozen: %1, ").arg(viewer->get_beamer()->get_layout()->get_page() + 1);
+		frozen_text = QString::fromUtf8("Frozen: %1, ").arg(viewer->get_beamer()->get_layout()->get_page() + 1);
 	}
 	QString overlay_text = CFG::get_instance()->get_value("Settings/page_overlay_text").toString()
 		.arg(cur_layout->get_page() + 1)
diff --git a/src/config.cpp b/src/config.cpp
index a900a2a5deb384817f2573e7bfa2c6609da6dd43..fb0720e177f20a3e6aa496fc13a80507f9b390ab 100644
--- a/src/config.cpp
+++ b/src/config.cpp
@@ -7,105 +7,129 @@ using namespace std;
 
 
 CFG::CFG() :
-		settings(QSettings::IniFormat, QSettings::UserScope, "katarakt") {
+		settings(QSettings::IniFormat, QSettings::UserScope, QString::fromUtf8("katarakt")) {
 	// TODO warn about invalid user input
 	init_defaults();
 }
 
 CFG::CFG(const char* file) :
-		settings(file, QSettings::IniFormat) {
+		// file comes from the command line, use locale
+		settings(QString::fromLocal8Bit(file), QSettings::IniFormat) {
 	init_defaults();
 }
 
+// explicitly interpret all strings as utf8
+void CFG::default_setting(const char *name, const char *value) {
+	vd.push_back(QString::fromUtf8(name));
+	defaults[vd.back()] = QString::fromUtf8(value);
+}
+
+// explicitly interpret all strings as utf8
+template <typename T>
+void CFG::default_setting(const char *name, const T value) {
+	vd.push_back(QString::fromUtf8(name));
+	defaults[vd.back()] = value;
+}
+
+// explicitly interpret all strings as utf8
+void CFG::default_key(const char *action, const char *key1, const char *key2 = NULL) {
+	vk.push_back(QString::fromUtf8(action));
+	keys[vk.back()] = QStringList() << QString::fromUtf8(key1);
+	if (key2 != NULL) {
+		keys[vk.back()] << QString::fromUtf8(key2);
+	}
+}
+
 void CFG::init_defaults() {
 	// settings
 	// canvas
-	vd.push_back("Settings/default_layout"); defaults[vd.back()] = "single";
-	vd.push_back("Settings/background_color"); defaults[vd.back()] = "0xDF202020";
-	vd.push_back("Settings/background_color_fullscreen"); defaults[vd.back()] = "0xFF000000";
-	vd.push_back("Settings/unrendered_page_color"); defaults[vd.back()] = "0x40FFFFFF";
-	vd.push_back("Settings/click_link_button"); defaults[vd.back()] = 1;
-	vd.push_back("Settings/drag_view_button"); defaults[vd.back()] = 2;
-	vd.push_back("Settings/select_text_button"); defaults[vd.back()] = 1;
-	vd.push_back("Settings/hide_mouse_timeout"); defaults[vd.back()] = 2000;
-	vd.push_back("Settings/smooth_scroll_delta"); defaults[vd.back()] = 30; // pixel scroll offset
-	vd.push_back("Settings/screen_scroll_factor"); defaults[vd.back()] = 0.9; // creates overlap for scrolling 1 screen down, should be <= 1
-	vd.push_back("Settings/jump_padding"); defaults[vd.back()] = 0.2; // must be <= 0.5
-	vd.push_back("Settings/rect_margin"); defaults[vd.back()] = 2;
-	vd.push_back("Settings/useless_gap"); defaults[vd.back()] = 2;
-	vd.push_back("Settings/min_zoom"); defaults[vd.back()] = -14;
-	vd.push_back("Settings/max_zoom"); defaults[vd.back()] = 30;
-	vd.push_back("Settings/zoom_factor"); defaults[vd.back()] = 0.05;
-	vd.push_back("Settings/min_page_width"); defaults[vd.back()] = 50;
-	vd.push_back("Settings/presenter_slide_ratio"); defaults[vd.back()] = 0.67;
+	default_setting("Settings/default_layout", "single");
+	default_setting("Settings/background_color", "0xDF202020");
+	default_setting("Settings/background_color_fullscreen", "0xFF000000");
+	default_setting("Settings/unrendered_page_color", "0x40FFFFFF");
+
+	default_setting("Settings/click_link_button", 1);
+	default_setting("Settings/drag_view_button", 2);
+	default_setting("Settings/select_text_button", 1);
+	default_setting("Settings/hide_mouse_timeout", 2000);
+	default_setting("Settings/smooth_scroll_delta", 30); // pixel scroll offset
+	default_setting("Settings/screen_scroll_factor", 0.9); // creates overlap for scrolling 1 screen down, should be <= 1
+	default_setting("Settings/jump_padding", 0.2); // must be <= 0.5
+	default_setting("Settings/rect_margin", 2);
+	default_setting("Settings/useless_gap", 2);
+	default_setting("Settings/min_zoom", -14);
+	default_setting("Settings/max_zoom", 30);
+	default_setting("Settings/zoom_factor", 0.05);
+	default_setting("Settings/min_page_width", 50);
+	default_setting("Settings/presenter_slide_ratio", 0.67);
 	// viewer
-	vd.push_back("Settings/quit_on_init_fail"); defaults[vd.back()] = false;
-	vd.push_back("Settings/single_instance_per_file"); defaults[vd.back()] = false;
-	vd.push_back("Settings/stylesheet"); defaults[vd.back()] = "";
-	vd.push_back("Settings/page_overlay_text"); defaults[vd.back()] = "Page %1/%2";
-	vd.push_back("Settings/icon_theme"); defaults[vd.back()] = "";
+	default_setting("Settings/quit_on_init_fail", false);
+	default_setting("Settings/single_instance_per_file", false);
+	default_setting("Settings/stylesheet", "");
+	default_setting("Settings/page_overlay_text", "Page %1/%2");
+	default_setting("Settings/icon_theme", "");
 	// internal
-	vd.push_back("Settings/prefetch_count"); defaults[vd.back()] = 4;
-	vd.push_back("Settings/inverted_color_contrast"); defaults[vd.back()] = 0.5;
-	vd.push_back("Settings/inverted_color_brightening"); defaults[vd.back()] = 0.15;
-	vd.push_back("Settings/mouse_wheel_factor"); defaults[vd.back()] = 120; // (qt-)delta for turning the mouse wheel 1 click
-	vd.push_back("Settings/thumbnail_filter"); defaults[vd.back()] = true; // filter when creating thumbnail image
-	vd.push_back("Settings/thumbnail_size"); defaults[vd.back()] = 32;
+	default_setting("Settings/prefetch_count", 4);
+	default_setting("Settings/inverted_color_contrast", 0.5);
+	default_setting("Settings/inverted_color_brightening", 0.15);
+	default_setting("Settings/mouse_wheel_factor", 120); // (qt-)delta for turning the mouse wheel 1 click
+	default_setting("Settings/thumbnail_filter", true); // filter when creating thumbnail image
+	default_setting("Settings/thumbnail_size", 32);
 
 	// keys
 	// movement
-	vk.push_back("Keys/page_up"); keys[vk.back()] = QStringList() << "PgUp";
-	vk.push_back("Keys/page_down"); keys[vk.back()] = QStringList() << "PgDown";
-	vk.push_back("Keys/top"); keys[vk.back()] = QStringList() << "Home" << "G";
-	vk.push_back("Keys/bottom"); keys[vk.back()] = QStringList() << "End" << "Shift+G";
-	vk.push_back("Keys/goto_page"); keys[vk.back()] = QStringList() << "Ctrl+G";
-	vk.push_back("Keys/half_screen_up"); keys[vk.back()] = QStringList() << "Ctrl+U";
-	vk.push_back("Keys/half_screen_down"); keys[vk.back()] = QStringList() << "Ctrl+D";
-	vk.push_back("Keys/screen_up"); keys[vk.back()] = QStringList() << "Backspace" << "Ctrl+B";
-	vk.push_back("Keys/screen_down"); keys[vk.back()] = QStringList() << "Space" << "Ctrl+F";
-	vk.push_back("Keys/smooth_up"); keys[vk.back()] = QStringList() << "Up" << "K";
-	vk.push_back("Keys/smooth_down"); keys[vk.back()] = QStringList() << "Down" << "J";
-	vk.push_back("Keys/smooth_left"); keys[vk.back()] = QStringList() << "Left" << "H";
-	vk.push_back("Keys/smooth_right"); keys[vk.back()] = QStringList() << "Right" << "L";
-	vk.push_back("Keys/search"); keys[vk.back()] = QStringList() << "/";
-	vk.push_back("Keys/search_backward"); keys[vk.back()] = QStringList() << "?";
-	vk.push_back("Keys/next_hit"); keys[vk.back()] = QStringList() << "N";
-	vk.push_back("Keys/previous_hit"); keys[vk.back()] = QStringList() << "Shift+N";
-	vk.push_back("Keys/next_invisible_hit"); keys[vk.back()] = QStringList() << "Ctrl+N";
-	vk.push_back("Keys/previous_invisible_hit"); keys[vk.back()] = QStringList() << "Ctrl+Shift+N";
-	vk.push_back("Keys/jump_back"); keys[vk.back()] = QStringList() << "Ctrl+O" << "Alt+Left";
-	vk.push_back("Keys/jump_forward"); keys[vk.back()] = QStringList() << "Ctrl+I" << "Alt+Right";
-	vk.push_back("Keys/mark_jump"); keys[vk.back()] = QStringList() << "M";
+	default_key("Keys/page_up", "PgUp");
+	default_key("Keys/page_down", "PgDown");
+	default_key("Keys/top", "Home", "G");
+	default_key("Keys/bottom", "End", "Shift+G");
+	default_key("Keys/goto_page", "Ctrl+G");
+	default_key("Keys/half_screen_up", "Ctrl+U");
+	default_key("Keys/half_screen_down", "Ctrl+D");
+	default_key("Keys/screen_up", "Backspace", "Ctrl+B");
+	default_key("Keys/screen_down", "Space", "Ctrl+F");
+	default_key("Keys/smooth_up", "Up", "K");
+	default_key("Keys/smooth_down", "Down", "J");
+	default_key("Keys/smooth_left", "Left", "H");
+	default_key("Keys/smooth_right", "Right", "L");
+	default_key("Keys/search", "/");
+	default_key("Keys/search_backward", "?");
+	default_key("Keys/next_hit", "N");
+	default_key("Keys/previous_hit", "Shift+N");
+	default_key("Keys/next_invisible_hit", "Ctrl+N");
+	default_key("Keys/previous_invisible_hit", "Ctrl+Shift+N");
+	default_key("Keys/jump_back", "Ctrl+O", "Alt+Left");
+	default_key("Keys/jump_forward", "Ctrl+I", "Alt+Right");
+	default_key("Keys/mark_jump", "M");
 	// layout
-	vk.push_back("Keys/set_single_layout"); keys[vk.back()] = QStringList() << "1";
-	vk.push_back("Keys/set_grid_layout"); keys[vk.back()] = QStringList() << "2";
-	vk.push_back("Keys/set_presenter_layout"); keys[vk.back()] = QStringList() << "3";
-	vk.push_back("Keys/zoom_in"); keys[vk.back()] = QStringList() << "=" << "+";
-	vk.push_back("Keys/zoom_out"); keys[vk.back()] = QStringList() << "-";
-	vk.push_back("Keys/reset_zoom"); keys[vk.back()] = QStringList() << "Z";
-	vk.push_back("Keys/increase_columns"); keys[vk.back()] = QStringList() << "]";
-	vk.push_back("Keys/decrease_columns"); keys[vk.back()] = QStringList() << "[";
-	vk.push_back("Keys/increase_offset"); keys[vk.back()] = QStringList() << "}";
-	vk.push_back("Keys/decrease_offset"); keys[vk.back()] = QStringList() << "{";
-	vk.push_back("Keys/rotate_left"); keys[vk.back()] = QStringList() << ",";
-	vk.push_back("Keys/rotate_right"); keys[vk.back()] = QStringList() << ".";
+	default_key("Keys/set_single_layout", "1");
+	default_key("Keys/set_grid_layout", "2");
+	default_key("Keys/set_presenter_layout", "3");
+	default_key("Keys/zoom_in", "=", "+");
+	default_key("Keys/zoom_out", "-");
+	default_key("Keys/reset_zoom", "Z");
+	default_key("Keys/increase_columns", "]");
+	default_key("Keys/decrease_columns", "[");
+	default_key("Keys/increase_offset", "}");
+	default_key("Keys/decrease_offset", "{");
+	default_key("Keys/rotate_left", ",");
+	default_key("Keys/rotate_right", ".");
 	// viewer
-	vk.push_back("Keys/toggle_overlay"); keys[vk.back()] = QStringList() << "T";
-	vk.push_back("Keys/quit"); keys[vk.back()] = QStringList() << "Q" << "W,E,E,E";
-	vk.push_back("Keys/close_search"); keys[vk.back()] = QStringList() << "Esc";
-	vk.push_back("Keys/invert_colors"); keys[vk.back()] = QStringList() << "I";
-	vk.push_back("Keys/copy_to_clipboard"); keys[vk.back()] = QStringList() << "Ctrl+C";
-	vk.push_back("Keys/swap_selection_and_panning_buttons"); keys[vk.back()] = QStringList() << "V";
-	vk.push_back("Keys/toggle_fullscreen"); keys[vk.back()] = QStringList() << "F";
-	vk.push_back("Keys/reload"); keys[vk.back()] = QStringList() << "R";
-	vk.push_back("Keys/open"); keys[vk.back()] = QStringList() << "O";
-	vk.push_back("Keys/save"); keys[vk.back()] = QStringList() << "S";
-	vk.push_back("Keys/toggle_toc"); keys[vk.back()] = QStringList() << "F9";
-	vk.push_back("Keys/freeze_presentation"); keys[vk.back()] = QStringList() << "X";
+	default_key("Keys/toggle_overlay", "T");
+	default_key("Keys/quit", "Q", "W,E,E,E");
+	default_key("Keys/close_search", "Esc");
+	default_key("Keys/invert_colors", "I");
+	default_key("Keys/copy_to_clipboard", "Ctrl+C");
+	default_key("Keys/swap_selection_and_panning_buttons", "V");
+	default_key("Keys/toggle_fullscreen", "F");
+	default_key("Keys/reload", "R");
+	default_key("Keys/open", "O");
+	default_key("Keys/save", "S");
+	default_key("Keys/toggle_toc", "F9");
+	default_key("Keys/freeze_presentation", "X");
 
 	// tmp values
-	tmp_values["start_page"] = 0;
-	tmp_values["fullscreen"] = false;
+	tmp_values[QString::fromUtf8("start_page")] = 0;
+	tmp_values[QString::fromUtf8("fullscreen")] = false;
 }
 
 CFG::CFG(const CFG &/*other*/) {
@@ -147,7 +171,8 @@ void CFG::write_defaults(const char *file) {
 	get_instance();
 }
 
-QVariant CFG::get_value(const char *key) const {
+QVariant CFG::get_value(const char *_key) const {
+	QString key = QString::fromUtf8(_key);
 #ifdef DEBUG
 	if (defaults.find(key) == defaults.end()) {
 		cout << "missing key " << key << endl;
@@ -157,22 +182,23 @@ QVariant CFG::get_value(const char *key) const {
 }
 
 void CFG::set_value(const char *key, QVariant value) {
-	settings.setValue(key, value);
+	settings.setValue(QString::fromUtf8(key), value);
 }
 
 QVariant CFG::get_tmp_value(const char *key) const {
-	return tmp_values[key];
+	return tmp_values[QString::fromUtf8(key)];
 }
 
 void CFG::set_tmp_value(const char *key, QVariant value) {
-	tmp_values[key] = value;
+	tmp_values[QString::fromUtf8(key)] = value;
 }
 
 bool CFG::has_tmp_value(const char *key) const {
-	return tmp_values.contains(key);
+	return tmp_values.contains(QString::fromUtf8(key));
 }
 
-QVariant CFG::get_most_current_value(const char *key) const {
+QVariant CFG::get_most_current_value(const char *_key) const {
+	QString key = QString::fromUtf8(_key);
 	if (tmp_values.contains(key)) {
 		return tmp_values[key];
 	} else {
@@ -185,7 +211,8 @@ QVariant CFG::get_most_current_value(const char *key) const {
 	}
 }
 
-QStringList CFG::get_keys(const char *action) const {
+QStringList CFG::get_keys(const char *_action) const {
+	QString action = QString::fromUtf8(_action);
 	return settings.value(action, keys[action]).toStringList();
 }
 
diff --git a/src/config.h b/src/config.h
index 9ed81a0bd845fa947961f6652510e9a23811406f..ee972963cd891d3b1b5bed6346d1821c5cdcc6c7 100644
--- a/src/config.h
+++ b/src/config.h
@@ -27,6 +27,12 @@ private:
 	QHash<QString,QVariant> tmp_values; // not persistent
 	QHash<QString,QStringList> keys;
 
+	void default_setting(const char* name, const char *value);
+	template <typename T>
+	void default_setting(const char* name, const T value);
+
+	void default_key(const char* action, const char *key1, const char *key2);
+
 public:
 	static CFG *get_instance();
 	static void write_defaults(const char *file); // write defaults to file
diff --git a/src/dbus/dbus.cpp b/src/dbus/dbus.cpp
index 901d49aa57564f7df23ad03099b843527ece8846..ee936adf6015d667f75c1a4bb8dc94534d60b35a 100644
--- a/src/dbus/dbus.cpp
+++ b/src/dbus/dbus.cpp
@@ -25,14 +25,14 @@ void dbus_init(Viewer *viewer) {
 	 */
 	new SourceCorrelate(viewer);
 
-	QString bus_name = QString("katarakt.pid%1").arg(QApplication::applicationPid());
+	QString bus_name = QString::fromUtf8("katarakt.pid%1").arg(QApplication::applicationPid());
 
 	if (!QDBusConnection::sessionBus().registerService(bus_name)) {
 #ifdef DEBUG
 		cerr << "Failed to register DBus service" << endl;
 #endif	
 	} else {
-		if (!QDBusConnection::sessionBus().registerObject("/", viewer)) {
+		if (!QDBusConnection::sessionBus().registerObject(QString::fromUtf8("/"), viewer)) {
 #ifdef DEBUG
 			cerr << "Failed to register viewer object on DBus" << endl;
 #endif
@@ -49,13 +49,13 @@ bool activate_katarakt_with_file(QString file) {
 	QString filepath = QFileInfo(file).absoluteFilePath();
 	QDBusConnection bus = QDBusConnection::sessionBus();
 	QStringList services = bus.interface()->registeredServiceNames().value();
-	QStringList katarakts = services.filter(QRegExp("^katarakt\\.pid"));
+	QStringList katarakts = services.filter(QRegExp(QString::fromUtf8("^katarakt\\.pid")));
 	foreach (const QString& katarakt_service, katarakts) {
-		QDBusInterface dbus_iface(katarakt_service, "/", "katarakt.SourceCorrelate", bus);
-		QDBusReply<QString> reply = dbus_iface.call("filepath");
+		QDBusInterface dbus_iface(katarakt_service, QString::fromUtf8("/"), QString::fromUtf8("katarakt.SourceCorrelate"), bus);
+		QDBusReply<QString> reply = dbus_iface.call(QString::fromUtf8("filepath"));
 		if (reply.isValid()) {
 			if (reply.value() == filepath) {
-				dbus_iface.call("focus");
+				dbus_iface.call(QString::fromUtf8("focus"));
 				return true;
 			}
 		}
diff --git a/src/layout/layout.cpp b/src/layout/layout.cpp
index fc3e53cff732fa5a71a5dfc333b3e12e7266b7ca..32ba3afe009a11d7fff8b8315c7cea6795b0f495 100644
--- a/src/layout/layout.cpp
+++ b/src/layout/layout.cpp
@@ -256,7 +256,7 @@ void Layout::clear_selection() {
 	selection.deactivate();
 
 	QClipboard *clipboard = QApplication::clipboard();
-	clipboard->setText("", QClipboard::Selection);
+	clipboard->setText(QString(), QClipboard::Selection);
 }
 
 void Layout::render_search_rects(QPainter *painter, int cur_page, QPoint offset, float size) {
diff --git a/src/main.cpp b/src/main.cpp
index 7af3b07c52768f7e63754a5b7832c24b5e872ed3..3c3dce84efefe27cba59029f614ba9248003db02 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -67,7 +67,8 @@ int main(int argc, char *argv[]) {
 				CFG::get_instance()->set_tmp_value("fullscreen", true);
 				break;
 			case 'q':
-				CFG::get_instance()->set_tmp_value("Settings/quit_on_init_fail", optarg);
+				// use locale for everything from the command line
+				CFG::get_instance()->set_tmp_value("Settings/quit_on_init_fail", QString::fromLocal8Bit(optarg));
 				break;
 			case 'h':
 				print_help(argv[0]);
@@ -75,7 +76,7 @@ int main(int argc, char *argv[]) {
 			case 's':
 				// (according to QVariant) any string can be converted to
 				// bool, so no type check needed here
-				CFG::get_instance()->set_tmp_value("Settings/single_instance_per_file", optarg);
+				CFG::get_instance()->set_tmp_value("Settings/single_instance_per_file", QString::fromLocal8Bit(optarg));
 				break;
 			case 'c':
 				CFG::write_defaults(optarg);
@@ -90,18 +91,18 @@ int main(int argc, char *argv[]) {
 	if (optind < argc - 1) {
 		QStringList l;
 		for (int i = optind + 1; i < argc; i++) {
-			l << argv[i];
+			l << QString::fromLocal8Bit(argv[i]);
 		}
-		QProcess::startDetached(argv[0], l);
+		QProcess::startDetached(QString::fromLocal8Bit(argv[0]), l);
 	}
 
 	QString file;
 	Download download;
 	if (argv[optind] != NULL) {
 		if (download_url) {
-			file = download.load(QString::fromUtf8(argv[optind]));
+			file = download.load(QString::fromLocal8Bit(argv[optind]));
 		} else {
-			file = QString::fromUtf8(argv[optind]);
+			file = QString::fromLocal8Bit(argv[optind]);
 		}
 		if (file.isNull()) {
 			return 1;
diff --git a/src/resourcemanager.cpp b/src/resourcemanager.cpp
index d0d7d128df179da2438ac50fa5692ef1aed0049e..1da3e6a4b298d48eeb06cae8d84353c0d5418100 100644
--- a/src/resourcemanager.cpp
+++ b/src/resourcemanager.cpp
@@ -372,7 +372,7 @@ void ResourceManager::inotify_slot() {
 			struct inotify_event *event = reinterpret_cast<struct inotify_event *>(&buf[offset]);
 
 			QFileInfo info(file);
-			if (info.fileName() == event->name) {
+			if (info.fileName() == QString::fromLocal8Bit(event->name)) {
 				viewer->reload(false); // don't clamp
 				i_notifier->setEnabled(true);
 				return;
diff --git a/src/search.cpp b/src/search.cpp
index 2357518ca64600bd57546f2910acfc6e67e1fee1..4c15e679e3e94fe005cdf7ce4761ce053e9255ca 100644
--- a/src/search.cpp
+++ b/src/search.cpp
@@ -33,7 +33,7 @@ void SearchWorker::run() {
 		bar->term_mutex.lock();
 		if (bar->term.isEmpty()) {
 			bar->term_mutex.unlock();
-			emit update_label_text("done.");
+			emit update_label_text(QString::fromUtf8("done."));
 			continue;
 		}
 		int start = bar->start_page;
@@ -53,8 +53,8 @@ void SearchWorker::run() {
 #ifdef DEBUG
 		cerr << "'" << search_term.toUtf8().constData() << "'" << endl;
 #endif
-		emit update_label_text(QString("[%1] 0\% searched, 0 hits")
-			.arg(has_upper_case ? "Case" : "no case"));
+		emit update_label_text(QString::fromUtf8("[%1] 0\% searched, 0 hits")
+			.arg(has_upper_case ? QString::fromUtf8("Case") : QString::fromUtf8("no case")));
 
 		// search all pages
 		int hit_count = 0;
@@ -116,8 +116,8 @@ void SearchWorker::run() {
 				percent = start + bar->doc->numPages() - page;
 			}
 			percent = (percent % bar->doc->numPages()) * 100 / bar->doc->numPages();
-			QString progress = QString("[%1] %2\% searched, %3 hits")
-				.arg(has_upper_case ? "Case" : "no case")
+			QString progress = QString::fromUtf8("[%1] %2\% searched, %3 hits")
+				.arg(has_upper_case ? QString::fromUtf8("Case") : QString::fromUtf8("no case"))
 				.arg(percent)
 				.arg(hit_count);
 			emit update_label_text(progress);
@@ -135,8 +135,8 @@ void SearchWorker::run() {
 #ifdef DEBUG
 		cerr << "done!" << endl;
 #endif
-		emit update_label_text(QString("[%1] done, %2 hits")
-				.arg(has_upper_case ? "Case" : "no case")
+		emit update_label_text(QString::fromUtf8("[%1] done, %2 hits")
+				.arg(has_upper_case ? QString::fromUtf8("Case") : QString::fromUtf8("no case"))
 				.arg(hit_count));
 	}
 }
@@ -149,7 +149,7 @@ SearchBar::SearchBar(const QString &file, Viewer *v, QWidget *parent) :
 	setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
 	line = new QLineEdit(parent);
 
-	progress = new QLabel("done.");
+	progress = new QLabel(QString::fromUtf8("done."));
 	progress->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
 
 	layout = new QHBoxLayout();
@@ -252,8 +252,8 @@ bool SearchBar::event(QEvent *event) {
 
 void SearchBar::reset_search() {
 	clear_hits();
-	term = "";
-	progress->setText("done.");
+	term = QString();
+	progress->setText(QString::fromUtf8("done."));
 	viewer->get_canvas()->set_search_visible(false);
 	viewer->get_canvas()->setFocus(Qt::OtherFocusReason);
 	hide();
diff --git a/src/selection.cpp b/src/selection.cpp
index 7896f165149c4ece656847150c964b6666a3cc1b..ea932ea61a92334909969a7b6efbd06d408daf62 100644
--- a/src/selection.cpp
+++ b/src/selection.cpp
@@ -441,13 +441,13 @@ QString MouseSelection::get_selection_text(int page, const QList<SelectionLine *
 							}
 
 							if (add_space) {
-								text += " ";
+								text += QChar::fromLatin1(' ');
 								add_space = false;
 							}
 							// big gap in front of current box, add <tab>
 							if (word == 0 && part == last_x_index + 1) {
 								if (box->boundingBox().left() - last_x > box->boundingBox().height()) {
-									text += "\t";
+									text += QChar::fromLatin1('\t');
 								}
 							}
 
@@ -467,7 +467,7 @@ QString MouseSelection::get_selection_text(int page, const QList<SelectionLine *
 				if (line + 1 < lines->size()) {
 					from.set_beginning_of_line(lines->at(line + 1), true);
 					if (line < to.line) {
-						text += "\n";
+						text += QChar::fromLatin1('\n');
 					}
 				}
 			}
diff --git a/src/toc.cpp b/src/toc.cpp
index 7d7f5c87e3ed84d1551ef6086bfa87958822aeb0..2a4723c6262b1a828d4fcb013aabe538994b433b 100644
--- a/src/toc.cpp
+++ b/src/toc.cpp
@@ -28,7 +28,7 @@ Toc::Toc(Viewer *v, QWidget *parent) :
 	h->setResizeMode(1, QHeaderView::ResizeToContents);
 #endif
 
-	QStringList list = QStringList() << "Contents" << QString();
+	QStringList list = QStringList() << QString::fromUtf8("Contents") << QString();
 	setHeaderLabels(list);
 
 	setAlternatingRowColors(true);
@@ -49,7 +49,7 @@ void Toc::init() {
 
 	// indicate empty toc
 	if (topLevelItemCount() == 0) {
-		QTreeWidgetItem *item = new QTreeWidgetItem(invisibleRootItem(), QStringList("(empty)"));
+		QTreeWidgetItem *item = new QTreeWidgetItem(invisibleRootItem(), QStringList(QString::fromUtf8("(empty)")));
 		item->setFlags(Qt::NoItemFlags);
 	}
 }
@@ -122,13 +122,13 @@ void Toc::build(QDomNode *node, QTreeWidgetItem *parent) {
 		QStringList strings;
 		strings << n.nodeName();
 		QDomNamedNodeMap attributes = n.attributes();
-		QDomNode dest = attributes.namedItem("Destination");
+		QDomNode dest = attributes.namedItem(QString::fromUtf8("Destination"));
 		Poppler::LinkDestination *link = NULL;
 		if (!dest.isNull()) {
 //			strings << dest.nodeValue();
 			link = new Poppler::LinkDestination(dest.nodeValue());
 		} else {
-			dest = attributes.namedItem("DestinationName");
+			dest = attributes.namedItem(QString::fromUtf8("DestinationName"));
 			if (!dest.isNull()) {
 				link = viewer->get_res()->resolve_link_destination(dest.nodeValue());
 //				if (dest_page >= 0) {
diff --git a/src/viewer.cpp b/src/viewer.cpp
index 1d12690e3954e88267e4f14df74cb7f900a2f2a4..60ab62004da39b902dbc9561034badc15c128dd6 100644
--- a/src/viewer.cpp
+++ b/src/viewer.cpp
@@ -214,14 +214,14 @@ void Viewer::open(QString new_file) {
 }
 
 void Viewer::open() {
-	QString new_file = QFileDialog::getOpenFileName(this, "Open File", "", "PDF Files (*.pdf)");
+	QString new_file = QFileDialog::getOpenFileName(this, QString::fromUtf8("Open File"), QString(), QString::fromUtf8("PDF Files (*.pdf)"));
 	if (!new_file.isNull()) {
 		open(new_file);
 	}
 }
 
 void Viewer::save() {
-	QString new_file = QFileDialog::getSaveFileName(this, "Save File", "", "PDF Files (*.pdf)");
+	QString new_file = QFileDialog::getSaveFileName(this, QString::fromUtf8("Save File"), QString(), QString::fromUtf8("PDF Files (*.pdf)"));
 	if (!new_file.isNull()) {
 		// file exists? Remove it (qt doesn't overwrite)
 		QFile f(new_file);
@@ -458,25 +458,25 @@ void Viewer::update_info_widget() {
 		QIcon icon;
 		const QString file = res->get_file();
 
-		if (file == "") {
-			icon = QIcon::fromTheme("dialog-information");
+		if (file.isEmpty()) {
+			icon = QIcon::fromTheme(QString::fromUtf8("dialog-information"));
 
 			info_label_text.setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
-			info_label_text.setText("No file opened.");
+			info_label_text.setText(QString::fromUtf8("No file opened."));
 			info_password.hide();
 		} else if (!res->is_locked()) {
-			icon = QIcon::fromTheme("dialog-error");
+			icon = QIcon::fromTheme(QString::fromUtf8("dialog-error"));
 
 			info_label_text.setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
 			info_label_text.setText(
-				QString("Failed to open file '") + file + QString("'."));
+				QString::fromUtf8("Failed to open file '") + file + QString::fromUtf8("'."));
 
 			info_password.hide();
 		} else {
-			icon = QIcon::fromTheme("dialog-password");
+			icon = QIcon::fromTheme(QString::fromUtf8("dialog-password"));
 
 			info_label_text.setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
-			info_label_text.setText("password:");
+			info_label_text.setText(QString::fromUtf8("password:"));
 
 			info_password.show();
 			info_password.setFocus(Qt::OtherFocusReason);