diff --git a/src/plugins/bazaar/bazaarcontrol.cpp b/src/plugins/bazaar/bazaarcontrol.cpp
index 80b6be448f3686e3b8a0c882744d363bb3b0c632..28d174831e41d2d564778910cddb8fec6b1abbc7 100644
--- a/src/plugins/bazaar/bazaarcontrol.cpp
+++ b/src/plugins/bazaar/bazaarcontrol.cpp
@@ -85,7 +85,6 @@ bool BazaarControl::supportsOperation(Operation operation) const
     case Core::IVersionControl::GetRepositoryRootOperation:
         break;
     case Core::IVersionControl::CheckoutOperation:
-    case Core::IVersionControl::OpenOperation:
     case Core::IVersionControl::SnapshotOperations:
         supported = false;
         break;
diff --git a/src/plugins/clearcase/clearcasecontrol.cpp b/src/plugins/clearcase/clearcasecontrol.cpp
index f16e1063b969639e8249d6275f6d42b772c68b94..45d04b5b4358ee634ecbd8ca60402c05db60f889 100644
--- a/src/plugins/clearcase/clearcasecontrol.cpp
+++ b/src/plugins/clearcase/clearcasecontrol.cpp
@@ -68,7 +68,6 @@ bool ClearCaseControl::supportsOperation(Operation operation) const
 {
     bool rc = isConfigured();
     switch (operation) {
-    case OpenOperation:
     case AddOperation:
     case DeleteOperation:
     case MoveOperation:
@@ -84,6 +83,14 @@ bool ClearCaseControl::supportsOperation(Operation operation) const
     return rc;
 }
 
+Core::IVersionControl::OpenSupportMode ClearCaseControl::openSupportMode() const
+{
+    if (m_plugin->isDynamic())
+        return IVersionControl::OpenMandatory; // Checkout is the only option for dynamic views
+    else
+        return IVersionControl::OpenOptional; // Snapshot views supports Hijack and check out
+}
+
 bool ClearCaseControl::vcsOpen(const QString &fileName)
 {
     const QFileInfo fi(fileName);
diff --git a/src/plugins/clearcase/clearcasecontrol.h b/src/plugins/clearcase/clearcasecontrol.h
index f921518464b609cd5e19f8e273b0881ca2b7c3cb..f4a0fb5743c1327cc02fb23a165013af559a9db3 100644
--- a/src/plugins/clearcase/clearcasecontrol.h
+++ b/src/plugins/clearcase/clearcasecontrol.h
@@ -52,6 +52,7 @@ public:
     bool isConfigured() const;
 
     bool supportsOperation(Operation operation) const;
+    OpenSupportMode openSupportMode() const;
     bool vcsOpen(const QString &fileName);
     SettingsFlags settingsFlags() const;
     bool vcsAdd(const QString &fileName);
diff --git a/src/plugins/clearcase/clearcaseplugin.h b/src/plugins/clearcase/clearcaseplugin.h
index 823f0a103a52f6119a719307e8849652232f33b5..0a469b69daae63eb72ccba6ddd79b5ce2c8621f2 100644
--- a/src/plugins/clearcase/clearcaseplugin.h
+++ b/src/plugins/clearcase/clearcaseplugin.h
@@ -158,6 +158,7 @@ public:
     QString currentView() const { return m_viewData.name; }
     void refreshActivities();
     inline bool isUcm() const { return m_viewData.isUcm; }
+    inline bool isDynamic() const { return m_viewData.isDynamic; }
     void setStatus(const QString &file, FileStatus::Status status, bool update = true);
 
     bool ccCheckUcm(const QString &viewname, const QString &workingDir) const;
diff --git a/src/plugins/coreplugin/documentmanager.cpp b/src/plugins/coreplugin/documentmanager.cpp
index 3beb2ad9641cb0e6f7288275bfd6c15fdc11b3be..9e60f95d33d02735a401bf83f24b5a108b8f7b90 100644
--- a/src/plugins/coreplugin/documentmanager.cpp
+++ b/src/plugins/coreplugin/documentmanager.cpp
@@ -813,7 +813,7 @@ DocumentManager::ReadOnlyAction
 {
     // Version Control: If automatic open is desired, open right away.
     bool promptVCS = false;
-    if (versionControl && versionControl->supportsOperation(IVersionControl::OpenOperation)) {
+    if (versionControl && versionControl->openSupportMode() != IVersionControl::NoOpen) {
         if (versionControl->settingsFlags() & IVersionControl::AutoOpen)
             return RO_OpenVCS;
         promptVCS = true;
@@ -824,22 +824,30 @@ DocumentManager::ReadOnlyAction
                        tr("The file <i>%1</i> is read only.").arg(QDir::toNativeSeparators(fileName)),
                        QMessageBox::Cancel, parent);
 
-    QString makeWritableText;
     QPushButton *vcsButton = 0;
     if (promptVCS) {
         vcsButton = msgBox.addButton(versionControl->vcsOpenText(), QMessageBox::AcceptRole);
-        makeWritableText = versionControl->vcsMakeWritableText();
     }
-    if (makeWritableText.isEmpty())
-        makeWritableText = tr("Make &Writable");
 
-    QPushButton *makeWritableButton =  msgBox.addButton(makeWritableText, QMessageBox::AcceptRole);
+    QString makeWritableText;
+    QPushButton *makeWritableButton = 0;
+    // If the VCS has OpenMandatory we don't show "Make Writable"
+    if (versionControl->openSupportMode() != IVersionControl::OpenMandatory) {
+        makeWritableText = versionControl->vcsMakeWritableText();
+        if (makeWritableText.isEmpty())
+            makeWritableText = tr("Make &Writable");
+        makeWritableButton = msgBox.addButton(makeWritableText, QMessageBox::AcceptRole);
+    }
 
     QPushButton *saveAsButton = 0;
     if (displaySaveAsButton)
         saveAsButton = msgBox.addButton(tr("&Save As..."), QMessageBox::ActionRole);
 
-    msgBox.setDefaultButton(vcsButton ? vcsButton : makeWritableButton);
+    if (vcsButton)
+        msgBox.setDefaultButton(vcsButton);
+    else if (makeWritableButton)
+        msgBox.setDefaultButton(makeWritableButton);
+
     msgBox.exec();
 
     QAbstractButton *clickedButton = msgBox.clickedButton();
diff --git a/src/plugins/coreplugin/editormanager/editormanager.cpp b/src/plugins/coreplugin/editormanager/editormanager.cpp
index b066e54cd294e6f6ce1abc98f5b045b77d94fe33..52f37ad9d806895c0f6857b1ec19b24f50955034 100644
--- a/src/plugins/coreplugin/editormanager/editormanager.cpp
+++ b/src/plugins/coreplugin/editormanager/editormanager.cpp
@@ -1709,7 +1709,7 @@ void EditorManager::vcsOpenCurrentEditor()
 
     const QString directory = QFileInfo(curEditor->document()->fileName()).absolutePath();
     IVersionControl *versionControl = ICore::vcsManager()->findVersionControlForDirectory(directory);
-    if (!versionControl || !versionControl->supportsOperation(IVersionControl::OpenOperation))
+    if (!versionControl || versionControl->openSupportMode() == IVersionControl::NoOpen)
         return;
 
     if (!versionControl->vcsOpen(curEditor->document()->fileName())) {
@@ -1763,7 +1763,7 @@ void EditorManager::updateMakeWritableWarning()
         bool promptVCS = false;
         const QString directory = QFileInfo(curEditor->document()->fileName()).absolutePath();
         IVersionControl *versionControl = ICore::vcsManager()->findVersionControlForDirectory(directory);
-        if (versionControl && versionControl->supportsOperation(IVersionControl::OpenOperation)) {
+        if (versionControl && versionControl->openSupportMode() != IVersionControl::NoOpen) {
             if (versionControl->settingsFlags() & IVersionControl::AutoOpen) {
                 vcsOpenCurrentEditor();
                 ww = false;
diff --git a/src/plugins/coreplugin/iversioncontrol.cpp b/src/plugins/coreplugin/iversioncontrol.cpp
index cfa303327261875121bbb41fc315fb7d5b0cf2f9..814bee6859fbbdaa7e311b96291e08c15309cb38 100644
--- a/src/plugins/coreplugin/iversioncontrol.cpp
+++ b/src/plugins/coreplugin/iversioncontrol.cpp
@@ -46,4 +46,9 @@ QString IVersionControl::vcsTopic(const QString &)
     return QString();
 }
 
+IVersionControl::OpenSupportMode IVersionControl::openSupportMode() const
+{
+    return NoOpen;
+}
+
 }
diff --git a/src/plugins/coreplugin/iversioncontrol.h b/src/plugins/coreplugin/iversioncontrol.h
index acee0f9cb18f9eae2cc179964957625486e07895..4ba0277a712931e95bf5b85ba1ad96fdbd96a575 100644
--- a/src/plugins/coreplugin/iversioncontrol.h
+++ b/src/plugins/coreplugin/iversioncontrol.h
@@ -50,7 +50,7 @@ public:
     Q_DECLARE_FLAGS(SettingsFlags, SettingsFlag)
 
     enum Operation {
-        AddOperation, DeleteOperation, OpenOperation, MoveOperation,
+        AddOperation, DeleteOperation, MoveOperation,
         CreateRepositoryOperation,
         SnapshotOperations,
         AnnotateOperation,
@@ -58,6 +58,12 @@ public:
         GetRepositoryRootOperation
         };
 
+    enum OpenSupportMode {
+        NoOpen,        /*!< Files can be edited without noticing the VCS */
+        OpenOptional,  /*!< Files can be opened by the VCS, or hijacked */
+        OpenMandatory  /*!< Files must always be opened by the VCS */
+    };
+
     explicit IVersionControl(QObject *parent = 0) : QObject(parent) {}
     virtual ~IVersionControl() {}
 
@@ -85,6 +91,11 @@ public:
      */
     virtual bool supportsOperation(Operation operation) const = 0;
 
+    /*!
+     * Returns the open support mode.
+     */
+    virtual OpenSupportMode openSupportMode() const;
+
     /*!
      * Called prior to save, if the file is read only. Should be implemented if
      * the scc requires a operation before editing the file, e.g. 'p4 edit'
diff --git a/src/plugins/cvs/cvscontrol.cpp b/src/plugins/cvs/cvscontrol.cpp
index 5c4cea214fc4bf70dff08d8389fbbfaeba017c87..e4ddcfd3804d5f8f357cd3bb73ad6c4f1106b9e0 100644
--- a/src/plugins/cvs/cvscontrol.cpp
+++ b/src/plugins/cvs/cvscontrol.cpp
@@ -69,7 +69,6 @@ bool CvsControl::supportsOperation(Operation operation) const
     case AddOperation:
     case DeleteOperation:
     case AnnotateOperation:
-    case OpenOperation:
         break;
     case MoveOperation:
     case CreateRepositoryOperation:
@@ -82,6 +81,11 @@ bool CvsControl::supportsOperation(Operation operation) const
     return rc;
 }
 
+Core::IVersionControl::OpenSupportMode CvsControl::openSupportMode() const
+{
+    return OpenOptional;
+}
+
 bool CvsControl::vcsOpen(const QString &fileName)
 {
     const QFileInfo fi(fileName);
diff --git a/src/plugins/cvs/cvscontrol.h b/src/plugins/cvs/cvscontrol.h
index 7196e079296aefd1a2bf0c8c58133f055925d4e1..586296fa4df9563fffb5d727b99357a8e550becd 100644
--- a/src/plugins/cvs/cvscontrol.h
+++ b/src/plugins/cvs/cvscontrol.h
@@ -51,6 +51,7 @@ public:
 
     bool isConfigured() const;
     bool supportsOperation(Operation operation) const;
+    OpenSupportMode openSupportMode() const;
     bool vcsOpen(const QString &fileName);
     bool vcsAdd(const QString &fileName);
     bool vcsDelete(const QString &filename);
diff --git a/src/plugins/git/gitversioncontrol.cpp b/src/plugins/git/gitversioncontrol.cpp
index be8a42190ccff005c10cfd69af983f706e20a560..ecf823aaf9ef3a9cdfc5d514fc1daca620202a53 100644
--- a/src/plugins/git/gitversioncontrol.cpp
+++ b/src/plugins/git/gitversioncontrol.cpp
@@ -80,8 +80,6 @@ bool GitVersionControl::supportsOperation(Operation operation) const
     case CheckoutOperation:
     case GetRepositoryRootOperation:
         return true;
-    case OpenOperation:
-        break;
     }
     return false;
 }
diff --git a/src/plugins/mercurial/mercurialcontrol.cpp b/src/plugins/mercurial/mercurialcontrol.cpp
index 558021f93ab9e83d73b6b87c82e985fa4784bdce..8eaa73dce19b93e53fbffe7e408fc340a1e26d0a 100644
--- a/src/plugins/mercurial/mercurialcontrol.cpp
+++ b/src/plugins/mercurial/mercurialcontrol.cpp
@@ -85,7 +85,6 @@ bool MercurialControl::supportsOperation(Operation operation) const
     case Core::IVersionControl::CheckoutOperation:
     case Core::IVersionControl::GetRepositoryRootOperation:
         break;
-    case Core::IVersionControl::OpenOperation:
     case Core::IVersionControl::SnapshotOperations:
         supported = false;
         break;
diff --git a/src/plugins/perforce/perforceversioncontrol.cpp b/src/plugins/perforce/perforceversioncontrol.cpp
index 6d119960365cd81ac8e3b883f9229179eca11827..85acdebbce80684cff2b9d53eb8ff0df1bc3e4b9 100644
--- a/src/plugins/perforce/perforceversioncontrol.cpp
+++ b/src/plugins/perforce/perforceversioncontrol.cpp
@@ -71,7 +71,6 @@ bool PerforceVersionControl::supportsOperation(Operation operation) const
     case AddOperation:
     case DeleteOperation:
     case MoveOperation:
-    case OpenOperation:
     case AnnotateOperation:
         return supported;
     case CreateRepositoryOperation:
@@ -83,6 +82,11 @@ bool PerforceVersionControl::supportsOperation(Operation operation) const
     return false;
 }
 
+Core::IVersionControl::OpenSupportMode PerforceVersionControl::openSupportMode() const
+{
+    return OpenOptional;
+}
+
 bool PerforceVersionControl::vcsOpen(const QString &fileName)
 {
     const QFileInfo fi(fileName);
diff --git a/src/plugins/perforce/perforceversioncontrol.h b/src/plugins/perforce/perforceversioncontrol.h
index ba5bcaf25e48b5f5a216ecaace09703f7510ce60..888ce898501425902d30e91e74cf94935beeb912 100644
--- a/src/plugins/perforce/perforceversioncontrol.h
+++ b/src/plugins/perforce/perforceversioncontrol.h
@@ -50,6 +50,7 @@ public:
 
     bool isConfigured() const;
     bool supportsOperation(Operation operation) const;
+    OpenSupportMode openSupportMode() const;
     bool vcsOpen(const QString &fileName);
     SettingsFlags settingsFlags() const;
     bool vcsAdd(const QString &fileName);
diff --git a/src/plugins/subversion/subversioncontrol.cpp b/src/plugins/subversion/subversioncontrol.cpp
index 6d407491f83a9059a2a8a3b36150290b6ce1c4b1..3b11ef8acac422e6c6a5bcd05d1c8d84f9ea922f 100644
--- a/src/plugins/subversion/subversioncontrol.cpp
+++ b/src/plugins/subversion/subversioncontrol.cpp
@@ -73,7 +73,6 @@ bool SubversionControl::supportsOperation(Operation operation) const
     case CheckoutOperation:
     case GetRepositoryRootOperation:
         break;
-    case OpenOperation:
     case CreateRepositoryOperation:
     case SnapshotOperations:
         rc = false;