diff --git a/src/app/main.cpp b/src/app/main.cpp
index af205c30fbdcf36979c4a9c4f35147d647f674e2..efbbd311deb7bda77f59331cc9d88179b61afe5e 100644
--- a/src/app/main.cpp
+++ b/src/app/main.cpp
@@ -173,7 +173,8 @@ int main(int argc, char **argv)
     // increase the number of file that can be opened in Qt Creator.
     struct rlimit rl;
     getrlimit(RLIMIT_NOFILE, &rl);
-    rl.rlim_cur = rl.rlim_max;
+
+    rl.rlim_cur = qMin((rlim_t)OPEN_MAX, rl.rlim_max);
     setrlimit(RLIMIT_NOFILE, &rl);
 #endif
 
diff --git a/src/plugins/qmlprojectmanager/fileformat/filesystemwatcher.cpp b/src/plugins/qmlprojectmanager/fileformat/filesystemwatcher.cpp
index 1f898ff48f5d857fc93c6df7dc5ac77980c9d1f1..eb4b79f1a83986b7e4c4270db8bab771e0eb2a7c 100644
--- a/src/plugins/qmlprojectmanager/fileformat/filesystemwatcher.cpp
+++ b/src/plugins/qmlprojectmanager/fileformat/filesystemwatcher.cpp
@@ -72,6 +72,19 @@ void FileSystemWatcher::addFile(const QString &file)
     addFiles(QStringList(file));
 }
 
+
+#ifdef Q_OS_MAC
+
+// Returns upper limit of file handles that can be opened by this process at once. Exceeding it will probably result in crashes!
+static rlim_t getFileLimit()
+{
+    struct rlimit rl;
+    getrlimit(RLIMIT_NOFILE, &rl);
+    return rl.rlim_cur;
+}
+
+#endif
+
 void FileSystemWatcher::addFiles(const QStringList &files)
 {
     QStringList toAdd;
@@ -84,6 +97,17 @@ void FileSystemWatcher::addFiles(const QStringList &files)
             qWarning() << "FileSystemWatcher: File" << file << "is already being watched";
             continue;
         }
+
+#ifdef Q_OS_MAC
+        static rlim_t maxFileOpen = getFileLimit();
+        // We're potentially watching a _lot_ of directories. This might crash qtcreator when we hit the upper limit.
+        // Heuristic is therefore: Don't use more than half of the file handles available in this watcher
+        if ((rlim_t)m_directories.size() + (rlim_t)m_files.size() > maxFileOpen / 2) {
+            qWarning() << "File" << file << "is not watched: Too many file handles are already open (max is" << maxFileOpen;
+            break;
+        }
+#endif
+
         m_files.append(file);
 
         const int count = ++m_fileCount[file];
@@ -149,6 +173,17 @@ void FileSystemWatcher::addDirectories(const QStringList &directories)
             qWarning() << "Directory" << directory << "is already being watched";
             continue;
         }
+
+#ifdef Q_OS_MAC
+        static rlim_t maxFileOpen = getFileLimit();
+        // We're potentially watching a _lot_ of directories. This might crash qtcreator when we hit the upper limit.
+        // Heuristic is therefore: Don't use more than half of the file handles available in this watcher
+        if ((rlim_t)m_directories.size() + (rlim_t)m_files.size() > maxFileOpen / 2) {
+            qWarning() << "Directory" << directory << "is not watched: Too many file handles are already open (max is" << maxFileOpen;
+            break;
+        }
+#endif
+
         m_directories.append(directory);
 
         const int count = ++m_directoryCount[directory];