--- chrome/browser/gtk/dialogs_gtk.cc
+++ chrome/browser/gtk/dialogs_gtk.cc.plague
@@ -71,13 +71,13 @@
       const FilePath& default_path, gfx::NativeWindow parent);
 
   GtkWidget* CreateFileOpenDialog(const std::string& title,
-      const FilePath& default_path, gfx::NativeWindow parent);
+      const FilePath& default_path, gfx::NativeWindow parent, gint* response_id, char** filename);
 
   GtkWidget* CreateMultiFileOpenDialog(const std::string& title,
       const FilePath& default_path, gfx::NativeWindow parent);
 
   GtkWidget* CreateSaveAsDialog(const std::string& title,
-      const FilePath& default_path, gfx::NativeWindow parent);
+      const FilePath& default_path, gfx::NativeWindow parent, gint* response_id, char** filename);
 
   // Removes and returns the |params| associated with |dialog| from
   // |params_map_|.
@@ -94,19 +94,20 @@
   // OnSelectSingleFolderDialogResponse.
   void SelectSingleFileHelper(GtkWidget* dialog,
                               gint response_id,
+                              char* filename,
                               bool allow_folder);
 
   // Callback for when the user responds to a Save As or Open File dialog.
-  CHROMEGTK_CALLBACK_1(SelectFileDialogImpl, void,
-                       OnSelectSingleFileDialogResponse, gint);
+  CHROMEGTK_CALLBACK_2(SelectFileDialogImpl, void,
+                       OnSelectSingleFileDialogResponse, gint, char*);
 
   // Callback for when the user responds to a Select Folder dialog.
-  CHROMEGTK_CALLBACK_1(SelectFileDialogImpl, void,
-                       OnSelectSingleFolderDialogResponse, gint);
+  CHROMEGTK_CALLBACK_2(SelectFileDialogImpl, void,
+                       OnSelectSingleFolderDialogResponse, gint, char*);
 
   // Callback for when the user responds to a Open Multiple Files dialog.
-  CHROMEGTK_CALLBACK_1(SelectFileDialogImpl, void,
-                       OnSelectMultiFileDialogResponse, gint);
+  CHROMEGTK_CALLBACK_2(SelectFileDialogImpl, void,
+                       OnSelectMultiFileDialogResponse, gint, char*);
 
   // Callback for when the file chooser gets destroyed.
   CHROMEGTK_CALLBACK_0(SelectFileDialogImpl, void, OnFileChooserDestroy);
@@ -205,20 +206,25 @@
     file_types_.include_all_files = true;
 
   GtkWidget* dialog = NULL;
+	gint response_id = GTK_RESPONSE_CANCEL;
+	char* filename = NULL;
+	bool kde = false;
   switch (type) {
     case SELECT_FOLDER:
       dialog = CreateSelectFolderDialog(title_string, default_path,
                                         owning_window);
       break;
     case SELECT_OPEN_FILE:
-      dialog = CreateFileOpenDialog(title_string, default_path, owning_window);
+		dialog = CreateFileOpenDialog(title_string, default_path, owning_window, &response_id, &filename);
+		kde = true;
       break;
     case SELECT_OPEN_MULTI_FILE:
       dialog = CreateMultiFileOpenDialog(title_string, default_path,
                                          owning_window);
       break;
     case SELECT_SAVEAS_FILE:
-      dialog = CreateSaveAsDialog(title_string, default_path, owning_window);
+		dialog = CreateSaveAsDialog(title_string, default_path, owning_window, &response_id, &filename);
+		kde = true;
       break;
     default:
       NOTREACHED();
@@ -226,22 +232,25 @@
   }
   dialogs_.insert(dialog);
 
-  preview_ = gtk_image_new();
-  g_signal_connect(dialog, "destroy",
-                   G_CALLBACK(OnFileChooserDestroyThunk), this);
-  g_signal_connect(dialog, "update-preview",
-                   G_CALLBACK(OnUpdatePreviewThunk), this);
-  gtk_file_chooser_set_preview_widget(GTK_FILE_CHOOSER(dialog), preview_);
-
-  params_map_[dialog] = params;
-
-  // Set window-to-parent modality by adding the dialog to the same window
-  // group as the parent.
-  gtk_window_group_add_window(gtk_window_get_group(owning_window),
-                              GTK_WINDOW(dialog));
-  gtk_window_set_modal(GTK_WINDOW(dialog), TRUE);
-
-  gtk_widget_show_all(dialog);
+	if (kde) {
+		g_signal_connect(dialog, "destroy", G_CALLBACK(OnFileChooserDestroyThunk), this);
+		params_map_[dialog] = params;
+		OnSelectSingleFileDialogResponse(dialog, response_id, filename);
+	} else {
+		preview_ = gtk_image_new();
+		g_signal_connect(dialog, "destroy",
+						G_CALLBACK(OnFileChooserDestroyThunk), this);
+		g_signal_connect(dialog, "update-preview",
+						G_CALLBACK(OnUpdatePreviewThunk), this);
+		gtk_file_chooser_set_preview_widget(GTK_FILE_CHOOSER(dialog), preview_);
+		params_map_[dialog] = params;
+		//   Set window-to-parent modality by adding the dialog to the same window
+		//   group as the parent.
+		gtk_window_group_add_window(gtk_window_get_group(owning_window),
+									GTK_WINDOW(dialog));
+		gtk_window_set_modal(GTK_WINDOW(dialog), TRUE);
+		gtk_widget_show_all(dialog);
+	}
 }
 
 void SelectFileDialogImpl::AddFilters(GtkFileChooser* chooser) {
@@ -355,7 +364,7 @@
 }
 
 GtkWidget* SelectFileDialogImpl::CreateFileOpenDialog(const std::string& title,
-    const FilePath& default_path, gfx::NativeWindow parent) {
+    const FilePath& default_path, gfx::NativeWindow parent, gint* response_id, char** filename) {
   std::string title_string = !title.empty() ? title :
         l10n_util::GetStringUTF8(IDS_OPEN_FILE_DIALOG_TITLE);
 
@@ -367,18 +376,35 @@
                                   NULL);
 
   AddFilters(GTK_FILE_CHOOSER(dialog));
-  if (!default_path.empty()) {
-    // If the file doesn't exist, this will just switch to the correct
-    // directory. That's good enough.
-    gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(dialog),
-                                  default_path.value().c_str());
-  } else if (!last_opened_path_->empty()) {
-    gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog),
-                                        last_opened_path_->value().c_str());
-  }
-  gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(dialog), FALSE);
-  g_signal_connect(dialog, "response",
-                   G_CALLBACK(OnSelectSingleFileDialogResponseThunk), this);
+
+	const char* start_path = "/";
+	if (!default_path.empty())
+		start_path = default_path.value().c_str();
+	else if (!last_saved_path_->empty())
+		start_path = last_opened_path_->value().c_str();
+
+	gchar* cmd[] = {
+		(gchar*)"kdialog",
+		(gchar*)"--getopenfilename",
+		(gchar*)start_path,
+		(gchar*)"*",
+		(gchar*)"--title",
+		(gchar*)title_string.c_str(),
+		NULL
+	};
+	gchar* output;
+	gint retval;
+	g_spawn_sync(NULL, cmd, NULL, (GSpawnFlags)(G_SPAWN_SEARCH_PATH | G_SPAWN_STDERR_TO_DEV_NULL), NULL, NULL, &output, NULL, &retval, NULL);
+	int outlen = strlen(output);
+	if (outlen > 1) {
+		output[outlen-1] = 0;  // \n at the end
+		*response_id = !retval ? GTK_RESPONSE_ACCEPT : GTK_RESPONSE_CANCEL;
+		*filename = output;
+	} else {  // no path -> error
+		*response_id = GTK_RESPONSE_CANCEL;
+		*filename = NULL;
+	}
+
   return dialog;
 }
 
@@ -388,7 +414,24 @@
     gfx::NativeWindow parent) {
   std::string title_string = !title.empty() ? title :
         l10n_util::GetStringUTF8(IDS_OPEN_FILES_DIALOG_TITLE);
-  GtkWidget* dialog = CreateFileOpenHelper(title_string, default_path, parent);
+
+  GtkWidget* dialog =
+      gtk_file_chooser_dialog_new(title_string.c_str(), parent,
+                                  GTK_FILE_CHOOSER_ACTION_OPEN,
+                                  GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+                                  GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
+                                  NULL);
+
+  AddFilters(GTK_FILE_CHOOSER(dialog));
+  if (!default_path.empty()) {
+    // If the file doesn't exist, this will just switch to the correct
+    // directory. That's good enough.
+    gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(dialog),
+                                  default_path.value().c_str());
+  } else if (!last_opened_path_->empty()) {
+    gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog),
+                                        last_opened_path_->value().c_str());
+  }
   gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(dialog), TRUE);
   g_signal_connect(dialog, "response",
                    G_CALLBACK(OnSelectMultiFileDialogResponseThunk), this);
@@ -396,7 +439,7 @@
 }
 
 GtkWidget* SelectFileDialogImpl::CreateSaveAsDialog(const std::string& title,
-    const FilePath& default_path, gfx::NativeWindow parent) {
+    const FilePath& default_path, gfx::NativeWindow parent, gint* response_id, char** filename) {
   std::string title_string = !title.empty() ? title :
         l10n_util::GetStringUTF8(IDS_SAVE_AS_DIALOG_TITLE);
 
@@ -408,23 +451,46 @@
                                   NULL);
 
   AddFilters(GTK_FILE_CHOOSER(dialog));
-  if (!default_path.empty()) {
-    // Since the file may not already exist, we use
-    // set_current_folder() followed by set_current_name(), as per the
-    // recommendation of the GTK docs.
-    gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog),
-        default_path.DirName().value().c_str());
-    gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dialog),
-        default_path.BaseName().value().c_str());
-  } else if (!last_saved_path_->empty()) {
-    gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog),
-                                        last_saved_path_->value().c_str());
-  }
-  gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(dialog), FALSE);
-  gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(dialog),
-                                                 TRUE);
-  g_signal_connect(dialog, "response",
-                   G_CALLBACK(OnSelectSingleFileDialogResponseThunk), this);
+
+	const char* start_path = "/";
+	if (!default_path.empty())
+		start_path = default_path.value().c_str();
+	else if (!last_saved_path_->empty())
+		start_path = last_saved_path_->value().c_str();
+
+	gchar* cmd[] = {
+		(gchar*)"kdialog",
+		(gchar*)"--getsavefilename",
+		(gchar*)start_path,
+		(gchar*)"*",
+		(gchar*)"--title",
+		(gchar*)title_string.c_str(),
+		NULL
+	};
+	gchar* output;
+	gint retval;
+	g_spawn_sync(NULL, cmd, NULL, (GSpawnFlags)(G_SPAWN_SEARCH_PATH | G_SPAWN_STDERR_TO_DEV_NULL), NULL, NULL, &output, NULL, &retval, NULL);
+	int outlen = strlen(output);
+	if (outlen > 1) {
+		output[outlen-1] = 0;  // \n at the end
+		// confirm overwrite
+		FilePath path(output);
+		if (file_util::PathExists(path)) {
+			gchar* cmd[] = {
+				(gchar*)"kdialog",
+				(gchar*)"--yesno",
+				(gchar*)"This file already exists. Do you want to replace it?",
+				NULL
+			};
+			g_spawn_sync(NULL, cmd, NULL, (GSpawnFlags)(G_SPAWN_SEARCH_PATH | G_SPAWN_STDERR_TO_DEV_NULL | G_SPAWN_STDOUT_TO_DEV_NULL), NULL, NULL, NULL, NULL, &retval, NULL);
+		}
+		*response_id = !retval ? GTK_RESPONSE_ACCEPT : GTK_RESPONSE_CANCEL;
+		*filename = output;
+	} else {  // no path -> error
+		*response_id = GTK_RESPONSE_CANCEL;
+		*filename = NULL;
+	}
+
   return dialog;
 }
 
@@ -465,15 +531,15 @@
 }
 
 void SelectFileDialogImpl::SelectSingleFileHelper(GtkWidget* dialog,
-    gint response_id,
+    gint response_id, char* filename,
     bool allow_folder) {
-  if (IsCancelResponse(response_id)) {
+
+  if (!filename || !*filename) {
     FileNotSelected(dialog);
     return;
   }
 
-  gchar* filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
-  if (!filename) {
+  if (IsCancelResponse(response_id)) {
     FileNotSelected(dialog);
     return;
   }
@@ -496,17 +562,17 @@
 }
 
 void SelectFileDialogImpl::OnSelectSingleFileDialogResponse(
-    GtkWidget* dialog, gint response_id) {
-  return SelectSingleFileHelper(dialog, response_id, false);
+    GtkWidget* dialog, gint response_id, char* filename) {
+  return SelectSingleFileHelper(dialog, response_id, filename, false);
 }
 
 void SelectFileDialogImpl::OnSelectSingleFolderDialogResponse(
-    GtkWidget* dialog, gint response_id) {
-  return SelectSingleFileHelper(dialog, response_id, true);
+    GtkWidget* dialog, gint response_id, char* filename) {
+  return SelectSingleFileHelper(dialog, response_id, filename, true);
 }
 
 void SelectFileDialogImpl::OnSelectMultiFileDialogResponse(
-    GtkWidget* dialog, gint response_id) {
+    GtkWidget* dialog, gint response_id, char* filename) {
   if (IsCancelResponse(response_id)) {
     FileNotSelected(dialog);
     return;
