diff --git a/src/plugins/bookmarks/bookmarkmanager.cpp b/src/plugins/bookmarks/bookmarkmanager.cpp
index 4396f78646341f32e94f96c3447db4763611b74a..4fc8c040105ee04b23c01791da693bdc8b6eca3f 100644
--- a/src/plugins/bookmarks/bookmarkmanager.cpp
+++ b/src/plugins/bookmarks/bookmarkmanager.cpp
@@ -279,7 +279,10 @@ void BookmarkView::setModel(QAbstractItemModel *model)
 
 void BookmarkView::gotoBookmark(const QModelIndex &index)
 {
-    static_cast<BookmarkManager *>(model())->gotoBookmark(index);
+    BookmarkManager *bm = static_cast<BookmarkManager *>(model());
+    Bookmark *bk = bm->bookmarkForIndex(index);
+    if (!bm->gotoBookmark(bk))
+        bm->removeBookmark(bk);
 }
 
 ////
@@ -479,15 +482,14 @@ Bookmark *BookmarkManager::bookmarkForIndex(QModelIndex index)
     return m_bookmarksList.at(index.row());
 }
 
-void BookmarkManager::gotoBookmark(const QModelIndex &idx)
-{
-    gotoBookmark(m_bookmarksList.at(idx.row()));
-}
 
-void BookmarkManager::gotoBookmark(Bookmark* bookmark)
+bool BookmarkManager::gotoBookmark(Bookmark* bookmark)
 {
-    TextEditor::BaseTextEditor::openEditorAt(bookmark->filePath(),
-                                             bookmark->lineNumber());
+    if (!TextEditor::BaseTextEditor::openEditorAt(bookmark->filePath(), bookmark->lineNumber())) {
+        // Could not open editor
+        return false;
+    }
+    return true;
 }
 
 void BookmarkManager::nextInDocument()
@@ -546,12 +548,22 @@ void BookmarkManager::next()
     QModelIndex current = selectionModel()->currentIndex();
     if (!current.isValid())
         return;
-    int row = current.row() + 1;
-    if (row == m_bookmarksList.size())
-        row = 0;
-    QModelIndex newIndex = current.sibling(row, current.column());
-    selectionModel()->setCurrentIndex(newIndex, QItemSelectionModel::Select | QItemSelectionModel::Clear);
-    gotoBookmark(newIndex);
+    int row = current.row();
+    ++row;
+    while (true) {
+        if (row == m_bookmarksList.size())
+            row = 0;
+
+        Bookmark *bk = m_bookmarksList.at(row);
+        if (gotoBookmark(bk)) {
+            QModelIndex newIndex = current.sibling(row, current.column());
+            selectionModel()->setCurrentIndex(newIndex, QItemSelectionModel::Select | QItemSelectionModel::Clear);
+            return;
+        }
+        removeBookmark(bk);
+        if (m_bookmarksList.isEmpty()) // No bookmarks anymore ...
+            return;
+    }
 }
 
 void BookmarkManager::prev()
@@ -559,13 +571,22 @@ void BookmarkManager::prev()
     QModelIndex current = selectionModel()->currentIndex();
     if (!current.isValid())
         return;
+
     int row = current.row();
-    if (row == 0)
-        row = m_bookmarksList.size();
-     --row;
-    QModelIndex newIndex = current.sibling(row, current.column());
-    selectionModel()->setCurrentIndex(newIndex, QItemSelectionModel::Select | QItemSelectionModel::Clear);
-    gotoBookmark(newIndex);
+    while (true) {
+        if (row == 0)
+            row = m_bookmarksList.size();
+        --row;
+        Bookmark *bk = m_bookmarksList.at(row);
+        if (gotoBookmark(bk)) {
+            QModelIndex newIndex = current.sibling(row, current.column());
+            selectionModel()->setCurrentIndex(newIndex, QItemSelectionModel::Select | QItemSelectionModel::Clear);
+            return;
+        }
+        removeBookmark(bk);
+        if (m_bookmarksList.isEmpty())
+            return;
+    }
 }
 
 TextEditor::ITextEditor *BookmarkManager::currentTextEditor() const
diff --git a/src/plugins/bookmarks/bookmarkmanager.h b/src/plugins/bookmarks/bookmarkmanager.h
index 18562b6e508dfca12be2aaf749a892b55d7cb015..7056868f0796d6750e8c45d1175a8c10728b1113 100644
--- a/src/plugins/bookmarks/bookmarkmanager.h
+++ b/src/plugins/bookmarks/bookmarkmanager.h
@@ -80,8 +80,6 @@ public:
     int columnCount(const QModelIndex &parent = QModelIndex()) const;
     QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
 
-    void gotoBookmark(const QModelIndex &);
-
     // this QItemSelectionModel is shared by all views
     QItemSelectionModel *selectionModel() const;
 
@@ -101,6 +99,7 @@ public slots:
     void prev();
     void moveUp();
     void moveDown();
+    bool gotoBookmark(Bookmark *bookmark);
 
 signals:
     void updateActions(int state);
@@ -108,7 +107,6 @@ signals:
 
 private slots:
     void updateActionStatus();
-    void gotoBookmark(Bookmark *bookmark);
     void loadBookmarks();
 
 private: