diff --git a/make/sun/xawt/FILES_c_unix.gmk b/make/sun/xawt/FILES_c_unix.gmk
--- a/make/sun/xawt/FILES_c_unix.gmk
+++ b/make/sun/xawt/FILES_c_unix.gmk
@@ -79,4 +79,5 @@
 	gtk2_interface.c \
         swing_GTKEngine.c \
         swing_GTKStyle.c \
-        rect.c
+        rect.c \
+	sun_awt_X11_GtkFileDialogPeer.c
diff --git a/make/sun/xawt/FILES_export_unix.gmk b/make/sun/xawt/FILES_export_unix.gmk
--- a/make/sun/xawt/FILES_export_unix.gmk
+++ b/make/sun/xawt/FILES_export_unix.gmk
@@ -33,4 +33,5 @@
       sun/awt/X11/XDesktopPeer.java \
       sun/awt/X11/XToolkit.java \
       sun/awt/X11/XComponentPeer.java \
-      sun/awt/X11/XInputMethod.java
+      sun/awt/X11/XInputMethod.java \
+      sun/awt/X11/GtkFileDialogPeer.java
diff --git a/make/sun/xawt/mapfile-vers b/make/sun/xawt/mapfile-vers
--- a/make/sun/xawt/mapfile-vers
+++ b/make/sun/xawt/mapfile-vers
@@ -396,6 +396,8 @@
         Java_com_sun_java_swing_plaf_gtk_GTKStyle_nativeGetClassValue;
         Java_com_sun_java_swing_plaf_gtk_GTKStyle_nativeGetPangoFontName;
 
+	Java_sun_awt_X11_GtkFileDialogPeer_start;
+
 	Java_sun_print_CUPSPrinter_initIDs;
 	Java_sun_print_CUPSPrinter_getCupsServer;
 	Java_sun_print_CUPSPrinter_getCupsPort;
diff --git a/src/solaris/classes/sun/awt/X11/GtkFileDialogPeer.java b/src/solaris/classes/sun/awt/X11/GtkFileDialogPeer.java
new file mode 100644
--- /dev/null
+++ b/src/solaris/classes/sun/awt/X11/GtkFileDialogPeer.java
@@ -0,0 +1,66 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package sun.awt.X11;
+
+import java.awt.FileDialog;
+import java.io.File;
+import java.io.FilenameFilter;
+
+/**
+ *
+ * @author c.cerbo
+ */
+class GtkFileDialogPeer extends XFileDialogPeer {
+
+    public GtkFileDialogPeer(FileDialog target) {
+        super(target);
+    }
+
+    native void start(String title, int mode, String dir, String file, FilenameFilter filter);
+
+    void setFileInternal(String filename) {
+        if (filename == null || filename.trim().isEmpty()) {
+            target.setFile(null);
+            target.setDirectory(null);
+        } else {
+            File filen = new File(filename);
+            target.setFile(filen.getName());
+            target.setDirectory(filen.getParent() + File.separator);
+        }
+    }
+
+    boolean filenameFilterCallback(String fullname) {
+        if (target.getFilenameFilter() == null) {
+            // no filter, accept all.
+            return true;
+        }
+
+        File filen = new File(fullname);
+        return target.getFilenameFilter().accept(new File(filen.getParent()), filen.getName());
+    }
+
+    @Override
+    public void setDirectory(String dir) {
+        this.dir = dir;
+    }
+
+    @Override
+    public void setFile(String file) {
+        this.file = file;
+    }
+
+    @Override
+    public void setVisible(boolean b) {
+        if (b) {
+            XToolkit.awtLock();
+            try {
+                start(target.getTitle(), target.getMode(), target.getDirectory(),
+                        target.getFile(), target.getFilenameFilter());
+            } finally {
+                XToolkit.awtUnlock();
+            }
+        }
+    }
+}
diff --git a/src/solaris/classes/sun/awt/X11/XToolkit.java b/src/solaris/classes/sun/awt/X11/XToolkit.java
--- a/src/solaris/classes/sun/awt/X11/XToolkit.java
+++ b/src/solaris/classes/sun/awt/X11/XToolkit.java
@@ -1041,7 +1041,7 @@
     }
 
     public FileDialogPeer createFileDialog(FileDialog target) {
-        FileDialogPeer peer = new XFileDialogPeer(target);
+        FileDialogPeer peer = loadGTK() ?  new GtkFileDialogPeer(target) : new XFileDialogPeer(target);
         targetCreatedPeer(target, peer);
         return peer;
     }
diff --git a/src/solaris/native/sun/awt/gtk2_interface.c b/src/solaris/native/sun/awt/gtk2_interface.c
--- a/src/solaris/native/sun/awt/gtk2_interface.c
+++ b/src/solaris/native/sun/awt/gtk2_interface.c
@@ -30,6 +30,7 @@
 #include <string.h>
 #include "gtk2_interface.h"
 #include "java_awt_Transparency.h"
+#include "gtk_file_chooser_interface.h"
 
 #define GTK2_LIB "libgtk-x11-2.0.so.0"
 
@@ -150,7 +151,6 @@
 /*************************
  * Glib function pointers
  *************************/
-static void     (*fp_g_free)(gpointer mem);
 
 static gboolean (*fp_g_main_context_iteration)(GMainContext *context,
                                              gboolean may_block);
@@ -204,9 +204,6 @@
 /************************
  * Gtk function pointers
  ************************/
-static gchar*   (*fp_gtk_check_version)(guint required_major,
-                                        guint required_minor,
-                                        guint required_micro);
 static gboolean (*fp_gtk_init_check)(int* argc, char** argv);
 
 /* Painting */
@@ -330,7 +327,6 @@
 static void (*fp_gtk_menu_item_set_submenu)(GtkMenuItem *menu_item,
         GtkWidget *submenu);
 static void (*fp_gtk_widget_realize)(GtkWidget *widget);
-static void (*fp_gtk_widget_destroy)(GtkWidget *widget);
 static GdkPixbuf* (*fp_gtk_widget_render_icon)(GtkWidget *widget,
         const gchar *stock_id, GtkIconSize size, const gchar *detail);
 static void (*fp_gtk_widget_set_name)(GtkWidget *widget, const gchar *name);
@@ -414,6 +410,26 @@
     }
 }
 
+/**
+ * Functions for sun_awt_X11_GtkFileDialogPeer.c
+ */
+void gtk_file_chooser_load() {
+	fp_gtk_file_chooser_get_filename = dl_symbol("gtk_file_chooser_get_filename");
+	fp_gtk_widget_hide = dl_symbol("gtk_widget_hide");
+	fp_gtk_main_quit = dl_symbol("gtk_main_quit");
+	fp_gtk_file_chooser_dialog_new = dl_symbol("gtk_file_chooser_dialog_new");
+	fp_gtk_file_chooser_set_current_folder = dl_symbol("gtk_file_chooser_set_current_folder");
+	fp_gtk_file_chooser_set_filename = dl_symbol("gtk_file_chooser_set_filename");
+	fp_gtk_file_filter_add_custom = dl_symbol("gtk_file_filter_add_custom");
+	fp_gtk_file_chooser_set_filter = dl_symbol("gtk_file_chooser_set_filter");
+	fp_gtk_file_chooser_get_type = dl_symbol("gtk_file_chooser_get_type");
+	fp_gtk_file_filter_new = dl_symbol("gtk_file_filter_new");
+	fp_gtk_file_chooser_set_do_overwrite_confirmation = dl_symbol("gtk_file_chooser_set_do_overwrite_confirmation");
+	fp_g_signal_connect_data = dl_symbol("g_signal_connect_data");
+	fp_gtk_widget_show = dl_symbol("gtk_widget_show");
+	fp_gtk_main = dl_symbol("gtk_main");
+}
+
 gboolean gtk2_load()
 {
     gboolean result;
@@ -423,6 +439,7 @@
     char *gtk_modules_env;
 
     gtk2_libhandle = dlopen(GTK2_LIB, RTLD_LAZY | RTLD_LOCAL);
+
     if (gtk2_libhandle == NULL)
         return FALSE;
 
@@ -597,6 +614,11 @@
         fp_gtk_range_get_adjustment =
             dl_symbol("gtk_range_get_adjustment");
 
+        /**
+         * Functions for sun_awt_X11_GtkFileDialogPeer.c
+         */
+        gtk_file_chooser_load();
+
         /* Some functions may be missing in pre-2.4 GTK.
            We handle them specially here.
          */
diff --git a/src/solaris/native/sun/awt/gtk2_interface.h b/src/solaris/native/sun/awt/gtk2_interface.h
--- a/src/solaris/native/sun/awt/gtk2_interface.h
+++ b/src/solaris/native/sun/awt/gtk2_interface.h
@@ -569,6 +569,13 @@
  */
 gboolean gtk2_check_version();
 
+/**
+ * Returns :
+ *	NULL if the GTK+ library is compatible with the given version, or a string
+ *	describing the version mismatch.
+ */
+gchar* (*fp_gtk_check_version)(guint required_major, guint required_minor,
+		                       guint required_micro);
 /*
  * Load the gtk2 library.  If the library is already loaded this method has no
  * effect and returns success.
@@ -651,6 +658,7 @@
 void gtk2_set_range_value(WidgetType widget_type, jdouble value,
                           jdouble min, jdouble max, jdouble visible);
 
+void (*fp_g_free)(gpointer mem);
 void (*fp_g_object_unref)(gpointer object);
 int (*fp_gdk_pixbuf_get_bits_per_sample)(const GdkPixbuf *pixbuf);
 guchar *(*fp_gdk_pixbuf_get_pixels)(const GdkPixbuf *pixbuf);
@@ -660,5 +668,6 @@
 int (*fp_gdk_pixbuf_get_rowstride)(const GdkPixbuf *pixbuf);
 int (*fp_gdk_pixbuf_get_width)(const GdkPixbuf *pixbuf);
 GdkPixbuf *(*fp_gdk_pixbuf_new_from_file)(const char *filename, GError **error);
+void (*fp_gtk_widget_destroy)(GtkWidget *widget);
 
 #endif /* !_GTK2_INTERFACE_H */
diff --git a/src/solaris/native/sun/awt/gtk_file_chooser_interface.h b/src/solaris/native/sun/awt/gtk_file_chooser_interface.h
new file mode 100644
--- /dev/null
+++ b/src/solaris/native/sun/awt/gtk_file_chooser_interface.h
@@ -0,0 +1,109 @@
+#ifndef _GTK_FILE_CHOOSER_INTERFACE_H
+#define _GTK_FILE_CHOOSER_INTERFACE_H
+
+#include <stdlib.h>
+#include <jni.h>
+
+#define _G_TYPE_CIC(ip, gt, ct)       ((ct*) ip)
+#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
+#define GTK_TYPE_FILE_CHOOSER             (fp_gtk_file_chooser_get_type ())
+#define GTK_FILE_CHOOSER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_FILE_CHOOSER, GtkFileChooser))
+#define fp_g_signal_connect(instance, detailed_signal, c_handler, data) \
+    fp_g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, (GConnectFlags) 0)
+#define	G_CALLBACK(f) ((GCallback) (f))
+#define	G_TYPE_FUNDAMENTAL_SHIFT	(2)
+#define	G_TYPE_MAKE_FUNDAMENTAL(x)	((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
+#define G_TYPE_OBJECT G_TYPE_MAKE_FUNDAMENTAL (20)
+#define G_OBJECT(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), G_TYPE_OBJECT, GObject))
+#define GTK_STOCK_CANCEL           "gtk-cancel"
+#define GTK_STOCK_SAVE             "gtk-save"
+#define GTK_STOCK_OPEN             "gtk-open"
+
+typedef enum {
+	GTK_RESPONSE_NONE = -1,
+	GTK_RESPONSE_REJECT = -2,
+	GTK_RESPONSE_ACCEPT = -3,
+	GTK_RESPONSE_DELETE_EVENT = -4,
+	GTK_RESPONSE_OK = -5,
+	GTK_RESPONSE_CANCEL = -6,
+	GTK_RESPONSE_CLOSE = -7,
+	GTK_RESPONSE_YES = -8,
+	GTK_RESPONSE_NO = -9,
+	GTK_RESPONSE_APPLY = -10,
+	GTK_RESPONSE_HELP = -11
+} GtkResponseType;
+
+typedef struct _GtkWindow GtkWindow;
+
+typedef struct _GtkFileChooser GtkFileChooser;
+
+typedef enum {
+	GTK_FILE_CHOOSER_ACTION_OPEN,
+	GTK_FILE_CHOOSER_ACTION_SAVE,
+	GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
+	GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER
+} GtkFileChooserAction;
+
+typedef struct _GtkFileFilter GtkFileFilter;
+
+typedef enum {
+	GTK_FILE_FILTER_FILENAME = 1 << 0,
+	GTK_FILE_FILTER_URI = 1 << 1,
+	GTK_FILE_FILTER_DISPLAY_NAME = 1 << 2,
+	GTK_FILE_FILTER_MIME_TYPE = 1 << 3
+} GtkFileFilterFlags;
+
+typedef struct {
+	GtkFileFilterFlags contains;
+
+	const gchar *filename;
+	const gchar *uri;
+	const gchar *display_name;
+	const gchar *mime_type;
+} GtkFileFilterInfo;
+
+typedef gboolean (*GtkFileFilterFunc)(const GtkFileFilterInfo *filter_info,
+		gpointer data);
+
+typedef void (*GDestroyNotify)(gpointer data);
+
+typedef void (*GCallback)(void);
+
+typedef struct _GClosure GClosure;
+
+typedef void (*GClosureNotify)(gpointer data, GClosure *closure);
+
+typedef enum {
+	G_CONNECT_AFTER = 1 << 0, G_CONNECT_SWAPPED = 1 << 1
+} GConnectFlags;
+
+
+/**
+ * Function Pointers for GtkFileChooser
+ */
+gchar* (*fp_gtk_file_chooser_get_filename)(GtkFileChooser *chooser);
+void (*fp_gtk_widget_hide)(GtkWidget *widget);
+void (*fp_gtk_main_quit)(void);
+GtkWidget* (*fp_gtk_file_chooser_dialog_new)(const gchar *title,
+		GtkWindow *parent, GtkFileChooserAction action,
+		const gchar *first_button_text, ...);
+gboolean (*fp_gtk_file_chooser_set_current_folder)(GtkFileChooser *chooser,
+		const gchar *filename);
+gboolean (*fp_gtk_file_chooser_set_filename)(GtkFileChooser *chooser,
+		const char *filename);
+void (*fp_gtk_file_filter_add_custom)(GtkFileFilter *filter,
+		GtkFileFilterFlags needed, GtkFileFilterFunc func, gpointer data,
+		GDestroyNotify notify);
+void (*fp_gtk_file_chooser_set_filter)(GtkFileChooser *chooser,
+		GtkFileFilter *filter);
+GType (*fp_gtk_file_chooser_get_type)(void);
+GtkFileFilter* (*fp_gtk_file_filter_new)(void);
+void (*fp_gtk_file_chooser_set_do_overwrite_confirmation)(
+		GtkFileChooser *chooser, gboolean do_overwrite_confirmation);
+gulong (*fp_g_signal_connect_data)(gpointer instance,
+		const gchar *detailed_signal, GCallback c_handler, gpointer data,
+		GClosureNotify destroy_data, GConnectFlags connect_flags);
+void (*fp_gtk_widget_show)(GtkWidget *widget);
+void (*fp_gtk_main)(void);
+
+#endif /* !_GTK_FILE_CHOOSER_INTERFACE_H */
diff --git a/src/solaris/native/sun/awt/sun_awt_X11_GtkFileDialogPeer.c b/src/solaris/native/sun/awt/sun_awt_X11_GtkFileDialogPeer.c
new file mode 100644
--- /dev/null
+++ b/src/solaris/native/sun/awt/sun_awt_X11_GtkFileDialogPeer.c
@@ -0,0 +1,122 @@
+#include <jni.h>
+#include <stdio.h>
+#include "gtk2_interface.h"
+#include "gtk_file_chooser_interface.h"
+#include "sun_awt_X11_GtkFileDialogPeer.h"
+
+static JavaVM *java_vm;
+
+union env_union {
+	void *void_env;
+	JNIEnv *jni_env;
+};
+
+JNIEnv *env() {
+	union env_union tmp;
+	(*java_vm)->GetEnv(java_vm, &tmp.void_env, JNI_VERSION_1_2) == JNI_OK;
+	return tmp.jni_env;
+}
+
+static gboolean filenameFilterCallback(const GtkFileFilterInfo *filter_info,
+		gpointer obj) {
+	jclass cx = (*env())->GetObjectClass(env(), (jobject) obj);
+
+	jmethodID id = (*env())->GetMethodID(env(), cx, "filenameFilterCallback",
+			"(Ljava/lang/String;)Z");
+
+	jstring filename = (*env())->NewStringUTF(env(), filter_info->filename);
+
+	return (*env())->CallBooleanMethod(env(), obj, id, filename);
+}
+
+static void handle_response(GtkWidget *dialog, gint responseId, gpointer obj) {
+	char *filename = NULL;
+
+	if (responseId == GTK_RESPONSE_ACCEPT) {
+		filename = fp_gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
+	}
+
+	jclass cx = (*env())->GetObjectClass(env(), (jobject) obj);
+
+	jmethodID id = (*env())->GetMethodID(env(), cx, "setFileInternal",
+			"(Ljava/lang/String;)V");
+
+	jstring jfilename = (*env())->NewStringUTF(env(), filename);
+
+	(*env())->CallVoidMethod(env(), obj, id, jfilename);
+	fp_g_free(filename);
+
+	fp_gtk_widget_hide(dialog);
+	fp_gtk_widget_destroy(dialog);
+	fp_gtk_main_quit();
+}
+
+void init_GtkFileDialogPeer(JNIEnv *env) {
+	if (java_vm == NULL) {
+		(*env)->GetJavaVM(env, &java_vm);
+		gtk2_load();
+	}
+}
+
+/*
+ * Class:     sun_awt_X11_GtkFileDialogPeer
+ * Method:    start
+ * Signature: (Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/io/FilenameFilter;)V
+ */
+JNIEXPORT void JNICALL Java_sun_awt_X11_GtkFileDialogPeer_start(JNIEnv *env,
+		jobject jpeer, jstring jtitle, jint mode, jstring jdir, jstring jfile,
+		jobject jfilter) {
+
+	init_GtkFileDialogPeer(env);
+
+	const char *title = (*env)->GetStringUTFChars(env, jtitle, 0);
+
+	GtkWidget *dialog;
+	if (mode == 1) {
+		// Save action
+		dialog = fp_gtk_file_chooser_dialog_new(title, NULL,
+				GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL,
+				GTK_RESPONSE_CANCEL, GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, NULL);
+	} else {
+		// Default action OPEN
+		dialog = fp_gtk_file_chooser_dialog_new(title, NULL,
+				GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL,
+				GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL);
+	}
+
+	(*env)->ReleaseStringUTFChars(env, jtitle, title);
+
+	// Set the directory
+	if (jdir != NULL) {
+		const char *dir = (*env)->GetStringUTFChars(env, jdir, 0);
+		fp_gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog), dir);
+		(*env)->ReleaseStringUTFChars(env, jdir, dir);
+	}
+
+	// Set the filename
+	if (jfile != NULL) {
+		const char *filename = (*env)->GetStringUTFChars(env, jfile, 0);
+		fp_gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(dialog), filename);
+		(*env)->ReleaseStringUTFChars(env, jfile, filename);
+	}
+
+	// Set the file filter
+	if (jfilter != NULL) {
+		GtkFileFilter *filter;
+		filter = fp_gtk_file_filter_new();
+		fp_gtk_file_filter_add_custom(filter, GTK_FILE_FILTER_FILENAME,
+				filenameFilterCallback, jpeer, NULL);
+		fp_gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(dialog), filter);
+	}
+
+	//Other Properties
+	if (fp_gtk_check_version(2, 8, 0) == NULL) {
+		fp_gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER(dialog), TRUE);
+	}
+
+	fp_g_signal_connect(G_OBJECT(dialog), "response", G_CALLBACK(handle_response),
+			jpeer);
+	fp_gtk_widget_show(dialog);
+
+	fp_gtk_main();
+}
diff --git a/src/solaris/native/sun/awt/sun_awt_X11_GtkFileDialogPeer.h b/src/solaris/native/sun/awt/sun_awt_X11_GtkFileDialogPeer.h
new file mode 100644
--- /dev/null
+++ b/src/solaris/native/sun/awt/sun_awt_X11_GtkFileDialogPeer.h
@@ -0,0 +1,21 @@
+/* DO NOT EDIT THIS FILE - it is machine generated */
+#include <jni.h>
+/* Header for class sun_awt_X11_GtkFileDialogPeer */
+
+#ifndef _Included_sun_awt_X11_GtkFileDialogPeer
+#define _Included_sun_awt_X11_GtkFileDialogPeer
+#ifdef __cplusplus
+extern "C" {
+#endif
+/*
+ * Class:     sun_awt_X11_GtkFileDialogPeer
+ * Method:    start
+ * Signature: (Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/io/FilenameFilter;)V
+ */
+JNIEXPORT void JNICALL Java_sun_awt_X11_GtkFileDialogPeer_start
+  (JNIEnv *, jobject, jstring, jint, jstring, jstring, jobject);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
