diff --git a/src/libs/utils/unixutils.cpp b/src/libs/utils/unixutils.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..2acbd163f29c089f901ae2bc801efb6c6278d318
--- /dev/null
+++ b/src/libs/utils/unixutils.cpp
@@ -0,0 +1,99 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
+
+
+#include "unixutils.h"
+#include <QtCore/QSettings>
+#include <QtCore/QObject>
+#include <QtCore/QFileInfo>
+#include <QtCore/QCoreApplication>
+
+using namespace Utils;
+
+QString UnixUtils::defaultFileBrowser()
+{
+    return QLatin1String("xdg-open %d");
+}
+
+QString UnixUtils::fileBrowser(const QSettings *settings)
+{
+    const QString dflt = defaultFileBrowser();
+    if (!settings)
+        return dflt;
+    return settings->value(QLatin1String("General/FileBrowser"), dflt).toString();
+}
+
+void UnixUtils::setFileBrowser(QSettings *settings, const QString &term)
+{
+    return settings->setValue(QLatin1String("General/FileBrowser"), term);
+}
+
+
+QString UnixUtils::fileBrowserHelpText()
+{
+    QString help = QCoreApplication::translate("Utils::UnixTools",
+            "<table border=1 cellspacing=0 cellpadding=3>"
+            "<tr><th>Variable</th><th>Expands to</th></tr>"
+            "<tr><td>%d</td><td>directory of current file</td></tr>"
+            "<tr><td>%f</td><td>file name (with full path)</td></tr>"
+            "<tr><td>%n</td><td>file name (without path)</td></tr>"
+            "<tr><td>%%</td><td>%</td></tr>"
+            "</table>");
+    return help;
+}
+
+QString UnixUtils::substituteFileBrowserParameters(const QString &pre, const QString &file)
+{
+    QString cmd;
+    for (int i = 0; i < pre.size(); ++i) {
+        QChar c = pre.at(i);
+        if (c == QLatin1Char('%') && i < pre.size()-1) {
+            c = pre.at(++i);
+            QString s;
+            if (c == QLatin1Char('d'))
+                s = QFileInfo(file).path();
+            else if (c == QLatin1Char('f'))
+                s = file;
+            else if (c == QLatin1Char('n'))
+                s = QFileInfo(file).fileName();
+            else if (c == QLatin1Char('%'))
+                s = c;
+            else {
+                s = QLatin1Char('%');
+                s += c;
+            }
+            cmd += s;
+            continue;
+
+        }
+        cmd += c;
+    }
+
+    return cmd;
+}
diff --git a/src/libs/utils/unixutils.h b/src/libs/utils/unixutils.h
new file mode 100644
index 0000000000000000000000000000000000000000..7deebc3c66a81992056ed4510bea66f090793ab7
--- /dev/null
+++ b/src/libs/utils/unixutils.h
@@ -0,0 +1,56 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
+
+#ifndef UNIXUTILS_H
+#define UNIXUTILS_H
+
+#include "utils_global.h"
+
+#include <QtCore/QString>
+
+QT_BEGIN_NAMESPACE
+class QSettings;
+QT_END_NAMESPACE
+
+namespace Utils {
+
+class QTCREATOR_UTILS_EXPORT UnixUtils
+{
+public:
+    static QString defaultFileBrowser();
+    static QString fileBrowser(const QSettings *settings);
+    static void setFileBrowser(QSettings *settings, const QString &term);
+    static QString fileBrowserHelpText();
+    static QString substituteFileBrowserParameters(const QString &command,
+                                                   const QString &file);
+};
+
+};
+
+#endif // UNIXUTILS_H
diff --git a/src/libs/utils/utils.pro b/src/libs/utils/utils.pro
index 61e5659451df9ab90eed05390943c2c342ca6308..2c823cfd621c5b851eeec93f54ab8f1d7962f9c8 100644
--- a/src/libs/utils/utils.pro
+++ b/src/libs/utils/utils.pro
@@ -46,6 +46,11 @@ win32 {
     HEADERS += winutils.h
 }
 else:SOURCES += consoleprocess_unix.cpp
+
+unix:!macx {
+    HEADERS += unixutils.h
+    SOURCES += unixutils.cpp
+}
 HEADERS += utils_global.h \
     reloadpromptutils.h \
     stringutils.h \
diff --git a/src/plugins/coreplugin/generalsettings.cpp b/src/plugins/coreplugin/generalsettings.cpp
index 21123685cf0aef943542f08c0f6eb3cd078df853..97f9dc97fa12bde9f592884ccd0e36e2525e5603 100644
--- a/src/plugins/coreplugin/generalsettings.cpp
+++ b/src/plugins/coreplugin/generalsettings.cpp
@@ -33,6 +33,7 @@
 #include <utils/stylehelper.h>
 #include <utils/qtcolorbutton.h>
 #include <utils/consoleprocess.h>
+#include <utils/unixutils.h>
 #include <coreplugin/editormanager/editormanager.h>
 #include <coreplugin/icore.h>
 
@@ -46,6 +47,7 @@
 using namespace Utils;
 using namespace Core::Internal;
 
+
 GeneralSettings::GeneralSettings():
     m_dialog(0)
 {
@@ -77,17 +79,26 @@ QWidget *GeneralSettings::createPage(QWidget *parent)
     QWidget *w = new QWidget(parent);
     m_page->setupUi(w);
 
+    QSettings* settings = Core::ICore::instance()->settings();
     m_page->colorButton->setColor(StyleHelper::baseColor());
     m_page->externalEditorEdit->setText(EditorManager::instance()->externalEditor());
     m_page->reloadBehavior->setCurrentIndex(EditorManager::instance()->reloadBehavior());
 #ifdef Q_OS_UNIX
-    m_page->terminalEdit->setText(ConsoleProcess::terminalEmulator(Core::ICore::instance()->settings()));
+    m_page->terminalEdit->setText(ConsoleProcess::terminalEmulator(settings));
 #else
     m_page->terminalLabel->hide();
     m_page->terminalEdit->hide();
     m_page->resetTerminalButton->hide();
 #endif
 
+#if defined(Q_OS_UNIX) && !defined(Q_OS_MAC)
+    m_page->externalFileBrowserEdit->setText(UnixUtils::fileBrowser(settings));
+#else
+    m_page->externalFileBrowserLabel->hide();
+    m_page->externalFileBrowserEdit->hide();
+    m_page->resetFileBrowserButton->hide();
+#endif
+
     connect(m_page->resetButton, SIGNAL(clicked()),
             this, SLOT(resetInterfaceColor()));
     connect(m_page->resetEditorButton, SIGNAL(clicked()),
@@ -97,6 +108,12 @@ QWidget *GeneralSettings::createPage(QWidget *parent)
 #ifdef Q_OS_UNIX
     connect(m_page->resetTerminalButton, SIGNAL(clicked()),
             this, SLOT(resetTerminal()));
+#ifndef Q_OS_MAC
+    connect(m_page->resetFileBrowserButton, SIGNAL(clicked()),
+            this, SLOT(resetFileBrowser()));
+    connect(m_page->helpExternalFileBrowserButton, SIGNAL(clicked()),
+            this, SLOT(showHelpForFileBrowser()));
+#endif
 #endif
 
     if (m_searchKeywords.isEmpty()) {
@@ -122,6 +139,9 @@ void GeneralSettings::apply()
 #ifdef Q_OS_UNIX
 	ConsoleProcess::setTerminalEmulator(Core::ICore::instance()->settings(),
                                         m_page->terminalEdit->text());
+#ifndef Q_OS_MAC
+        Utils::UnixUtils::setFileBrowser(Core::ICore::instance()->settings(), m_page->externalFileBrowserEdit->text());
+#endif
 #endif
 }
 
@@ -145,9 +165,17 @@ void GeneralSettings::resetTerminal()
 {
     m_page->terminalEdit->setText(ConsoleProcess::defaultTerminalEmulator() + QLatin1String(" -e"));
 }
+
+#ifndef Q_OS_MAC
+void GeneralSettings::resetFileBrowser()
+{
+    m_page->externalFileBrowserEdit->setText(UnixUtils::defaultFileBrowser());
+}
+#endif
 #endif
 
-void GeneralSettings::showHelpForExternalEditor()
+
+void GeneralSettings::variableHelpDialogCreator(const QString& helpText)
 {
     if (m_dialog) {
         m_dialog->show();
@@ -157,10 +185,23 @@ void GeneralSettings::showHelpForExternalEditor()
     }
     QMessageBox *mb = new QMessageBox(QMessageBox::Information,
                                   tr("Variables"),
-                                  EditorManager::instance()->externalEditorHelpText(),
-                                  QMessageBox::Cancel,
+                                  helpText,
+                                  QMessageBox::Close,
                                   m_page->helpExternalEditorButton);
     mb->setWindowModality(Qt::NonModal);
     m_dialog = mb;
     mb->show();
 }
+
+
+void GeneralSettings::showHelpForExternalEditor()
+{
+    variableHelpDialogCreator(EditorManager::instance()->externalEditorHelpText());
+}
+
+#if defined(Q_OS_UNIX) && !defined(Q_OS_MAC)
+void GeneralSettings::showHelpForFileBrowser()
+{
+    variableHelpDialogCreator(UnixUtils::fileBrowserHelpText());
+}
+#endif
diff --git a/src/plugins/coreplugin/generalsettings.h b/src/plugins/coreplugin/generalsettings.h
index 6c2e4ee45c1e088784dd540bf0149af0f527d637..fb13a88ed43b6ba18c9a4e044aa4012263415a53 100644
--- a/src/plugins/coreplugin/generalsettings.h
+++ b/src/plugins/coreplugin/generalsettings.h
@@ -62,10 +62,15 @@ private slots:
     void resetExternalEditor();
     void showHelpForExternalEditor();
 #ifdef Q_OS_UNIX
+#  ifndef Q_OS_MAC
+    void showHelpForFileBrowser();
+    void resetFileBrowser();
+#  endif
     void resetTerminal();
 #endif
 
 private:
+    void variableHelpDialogCreator(const QString& helpText);
     Ui::GeneralSettings *m_page;
     QString m_searchKeywords;
     QPointer<QWidget> m_dialog;
diff --git a/src/plugins/coreplugin/generalsettings.ui b/src/plugins/coreplugin/generalsettings.ui
index a128edbc155c124caeb58e5cb65e9eb6356a1c91..fad3f5222aeb71c4038d8700ca805c71daafe6db 100644
--- a/src/plugins/coreplugin/generalsettings.ui
+++ b/src/plugins/coreplugin/generalsettings.ui
@@ -14,6 +14,9 @@
    <item>
     <widget class="QGroupBox" name="groupBox">
      <layout class="QFormLayout" name="formLayout">
+      <property name="fieldGrowthPolicy">
+       <enum>QFormLayout::AllNonFixedFieldsGrow</enum>
+      </property>
       <property name="rowWrapPolicy">
        <enum>QFormLayout::WrapLongRows</enum>
       </property>
@@ -43,7 +46,7 @@
             <height>0</height>
            </size>
           </property>
-          <property name="alphaAllowed">
+          <property name="alphaAllowed" stdset="0">
            <bool>false</bool>
           </property>
          </widget>
@@ -141,6 +144,13 @@
        </layout>
       </item>
       <item row="3" column="0">
+       <widget class="QLabel" name="externalFileBrowserLabel">
+        <property name="text">
+         <string>External file browser:</string>
+        </property>
+       </widget>
+      </item>
+      <item row="4" column="0">
        <widget class="QLabel" name="modifiedLabel">
         <property name="text">
          <string>When files are externally modified:</string>
@@ -150,7 +160,7 @@
         </property>
        </widget>
       </item>
-      <item row="3" column="1">
+      <item row="4" column="1">
        <widget class="QComboBox" name="reloadBehavior">
         <property name="sizePolicy">
          <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
@@ -178,6 +188,38 @@
         </item>
        </widget>
       </item>
+      <item row="3" column="1">
+       <layout class="QHBoxLayout" name="horizontalLayout">
+        <item>
+         <layout class="QHBoxLayout" name="horizontalLayout_2">
+          <item>
+           <widget class="QLineEdit" name="externalFileBrowserEdit"/>
+          </item>
+          <item>
+           <widget class="QToolButton" name="resetFileBrowserButton">
+            <property name="toolTip">
+             <string>Reset to default</string>
+            </property>
+            <property name="text">
+             <string>R</string>
+            </property>
+            <property name="icon">
+             <iconset resource="core.qrc">
+              <normaloff>:/core/images/reset.png</normaloff>:/core/images/reset.png</iconset>
+            </property>
+           </widget>
+          </item>
+          <item>
+           <widget class="QToolButton" name="helpExternalFileBrowserButton">
+            <property name="text">
+             <string>?</string>
+            </property>
+           </widget>
+          </item>
+         </layout>
+        </item>
+       </layout>
+      </item>
      </layout>
     </widget>
    </item>
diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp
index fcb3fc9ee1af415b8aeff0f3c6d03c4a3c6f58e1..7c05d2add4dc4280aec067243e118ff928f67efa 100644
--- a/src/plugins/projectexplorer/projectexplorer.cpp
+++ b/src/plugins/projectexplorer/projectexplorer.cpp
@@ -86,6 +86,7 @@
 #include <extensionsystem/pluginmanager.h>
 #include <utils/qtcassert.h>
 #include <utils/parameteraction.h>
+#include <utils/unixutils.h>
 
 #include <QtCore/QtPlugin>
 #include <QtCore/QDateTime>
@@ -1842,6 +1843,21 @@ void ProjectExplorerPlugin::openFile()
     em->ensureEditorManagerVisible();
 }
 
+void ProjectExplorerPlugin::graphicalShellHasError(const QString &app, const QString &error)
+{
+    QWidget *w = Core::ICore::instance()->mainWindow();
+    QMessageBox mbox(w);
+    mbox.setIcon(QMessageBox::Warning);
+    mbox.setWindowTitle(tr("Launching a file browser failed"));
+    mbox.setText(tr("Unable to start the file manager:\n\n%1\n\n"
+                             "Do you want to change the current file manager?").arg(app));
+    if (!error.isEmpty()) {
+        mbox.setDetailedText(tr("'%1' returned the following error:\n\n%2").arg(app, error));
+    }
+    if (mbox.exec() == QMessageBox::Accepted)
+        Core::ICore::instance()->showOptionsDialog("environment", QString(), w);
+}
+
 void ProjectExplorerPlugin::showInGraphicalShell()
 {
     QTC_ASSERT(d->m_currentNode, return)
@@ -1865,14 +1881,14 @@ void ProjectExplorerPlugin::showInGraphicalShell()
 #else
     // we cannot select a file here, because no file browser really supports it...
     const QFileInfo fileInfo(d->m_currentNode->path());
-    const QString xdgopen = Environment::systemEnvironment().searchInPath("xdg-open");
-    if (xdgopen.isEmpty()) {
-        QMessageBox::warning(Core::ICore::instance()->mainWindow(),
-                             tr("Launching a file explorer failed"),
-                             tr("Could not find xdg-open to launch the native file explorer."));
-        return;
+    QString app = Utils::UnixUtils::fileBrowser(Core::ICore::instance()->settings());
+    QProcess browserProc;
+    bool success = browserProc.startDetached(Utils::UnixUtils::substituteFileBrowserParameters(app, fileInfo.filePath()));
+    QString error = QString::fromLocal8Bit(browserProc.readAllStandardError());
+    success = success && error.isEmpty();
+    if (!success) {
+        graphicalShellHasError(app, error);
     }
-    QProcess::startDetached(xdgopen, QStringList(fileInfo.path()));
 #endif
 }
 
diff --git a/src/plugins/projectexplorer/projectexplorer.h b/src/plugins/projectexplorer/projectexplorer.h
index 7b62bcfefd31366bab7168f21ac8cb11ddc5248d..6f194f6335a55c4f3b105dda5846adc49cab49f1 100644
--- a/src/plugins/projectexplorer/projectexplorer.h
+++ b/src/plugins/projectexplorer/projectexplorer.h
@@ -213,6 +213,7 @@ private slots:
     void currentModeChanged(Core::IMode *mode);
 
 private:
+    void graphicalShellHasError(const QString &app, const QString &error);
     void runProjectImpl(Project *pro, QString mode);
     void executeRunConfiguration(RunConfiguration *, const QString &mode);
     bool showBuildConfigDialog();