diff --git a/src/plugins/debugger/breakhandler.cpp b/src/plugins/debugger/breakhandler.cpp
index e0428f8cf5642d1986b7ffe53b4c602bff530d01..88c17306e59f80a547bb2c68df3dc52532832637 100644
--- a/src/plugins/debugger/breakhandler.cpp
+++ b/src/plugins/debugger/breakhandler.cpp
@@ -65,6 +65,8 @@ BreakHandler::BreakHandler(Debugger::DebuggerEngine *engine)
     //m_emptyIcon(_(":/debugger/images/debugger_empty_14.png")),
     m_watchpointIcon(_(":/debugger/images/watchpoint.png")),
     m_engine(engine),
+    m_bp(0),
+    m_masterList(false),
     m_lastFound(0),
     m_lastFoundQueried(false)
 {
@@ -73,6 +75,11 @@ BreakHandler::BreakHandler(Debugger::DebuggerEngine *engine)
 
 BreakHandler::~BreakHandler()
 {
+    if (m_bp && m_masterList) {
+        qDeleteAll(*m_bp);
+        m_bp->clear();
+        delete m_bp;
+    }
     clear();
 }
 
@@ -97,20 +104,20 @@ bool BreakHandler::hasPendingBreakpoints() const
 BreakpointData *BreakHandler::at(int index) const
 {
     QTC_ASSERT(index < size(), return 0);
-    return m_bp.at(index);
+    QTC_ASSERT(m_bp,/**/);
+    return m_bp->at(index);
 }
 
 void BreakHandler::removeAt(int index)
 {
+    QTC_ASSERT(m_bp,/**/);
     BreakpointData *data = at(index);
-    m_bp.removeAt(index);
+    m_bp->removeAt(index);
     delete data;
 }
 
 void BreakHandler::clear()
 {
-    qDeleteAll(m_bp);
-    m_bp.clear();
     m_enabled.clear();
     m_disabled.clear();
     m_removed.clear();
@@ -119,9 +126,10 @@ void BreakHandler::clear()
 
 BreakpointData *BreakHandler::findSimilarBreakpoint(const BreakpointData *needle) const
 {
+    QTC_ASSERT(m_bp, /**/);
     // Search a breakpoint we might refer to.
     for (int index = 0; index != size(); ++index) {
-        BreakpointData *data = m_bp[index];
+        BreakpointData *data = (*m_bp)[index];
         if (data->isSimilarTo(needle))
             return data;
     }
@@ -516,8 +524,9 @@ void BreakHandler::reinsertBreakpoint(BreakpointData *data)
 
 void BreakHandler::append(BreakpointData *data)
 {
+    QTC_ASSERT(m_bp,/**/);
     data->m_handler = this;
-    m_bp.append(data);
+    m_bp->append(data);
     m_inserted.append(data);
 }
 
@@ -554,8 +563,9 @@ Breakpoints BreakHandler::takeDisabledBreakpoints()
 
 void BreakHandler::removeBreakpointHelper(int index)
 {
-    BreakpointData *data = m_bp.at(index);
-    m_bp.removeAt(index);
+    QTC_ASSERT(m_bp,/**/);
+    BreakpointData *data = m_bp->at(index);
+    m_bp->removeAt(index);
     data->removeMarker();
     m_removed.append(data);
 }
@@ -570,7 +580,8 @@ void BreakHandler::removeBreakpoint(int index)
 
 void BreakHandler::removeBreakpoint(BreakpointData *data)
 {
-    removeBreakpointHelper(m_bp.indexOf(data));
+    QTC_ASSERT(m_bp,/**/);
+    removeBreakpointHelper(m_bp->indexOf(data));
     emit layoutChanged();
 }
 
@@ -614,7 +625,8 @@ void BreakHandler::removeAllBreakpoints()
 
 BreakpointData *BreakHandler::findBreakpoint(quint64 address) const
 {
-    foreach (BreakpointData *data, m_bp)
+    QTC_ASSERT(m_bp,/**/);
+    foreach (BreakpointData *data, *m_bp)
         if (data->address == address)
             return data;
     return 0;
@@ -623,7 +635,8 @@ BreakpointData *BreakHandler::findBreakpoint(quint64 address) const
 BreakpointData *BreakHandler::findBreakpoint(const QString &fileName,
     int lineNumber, bool useMarkerPosition)
 {
-    foreach (BreakpointData *data, m_bp)
+    QTC_ASSERT(m_bp,/**/);
+    foreach (BreakpointData *data, *m_bp)
         if (data->isLocatedAt(fileName, lineNumber, useMarkerPosition))
             return data;
     return 0;
@@ -633,15 +646,14 @@ void BreakHandler::toggleBreakpoint(const QString &fileName, int lineNumber,
                                     quint64 address /* = 0 */)
 {
     BreakpointData *data = 0;
-    do {
-        if (address) {
-            data = findBreakpoint(address);
-            break;
-        }
+
+    if (address) {
+        data = findBreakpoint(address);
+    } else {
         data = findBreakpoint(fileName, lineNumber, true);
         if (!data)
             data = findBreakpoint(fileName, lineNumber, false);
-    } while (false);
+    }
 
     if (data) {
         removeBreakpoint(data);
@@ -667,9 +679,19 @@ void BreakHandler::saveSessionData()
     saveBreakpoints();
 }
 
+void BreakHandler::initMasterList()
+{
+    if (m_bp) {
+        delete m_bp;
+    }
+    m_masterList = true;
+    m_bp = new Breakpoints;
+}
+
 void BreakHandler::loadSessionData()
 {
     QTC_ASSERT(m_engine->isSessionEngine(), return);
+    initMasterList();
     loadBreakpoints();
     updateMarkers();
 }
@@ -697,23 +719,33 @@ bool BreakHandler::isActive() const
     return m_engine->isActive();
 }
 
+bool BreakHandler::isMasterList() const
+{
+    return m_masterList;
+}
+
 void BreakHandler::initializeFromTemplate(BreakHandler *other)
 {
-    QTC_ASSERT(m_bp.isEmpty(), /**/);
-    foreach (BreakpointData *data, other->m_bp) {
-        append(data->clone());
-        data->removeMarker();
+    QTC_ASSERT(other->isMasterList(), /**/);
+    QTC_ASSERT(!isMasterList(), /**/);
+    QTC_ASSERT(other->m_bp,/**/);
+
+    m_bp = other->m_bp;
+    foreach(BreakpointData *data, *m_bp) {
+        if (m_engine->acceptsBreakpoint(data))
+            data->m_handler = this;
     }
-    updateMarkers();
+
 }
 
 void BreakHandler::storeToTemplate(BreakHandler *other)
 {
-    other->removeAllBreakpoints();
-    foreach (const BreakpointData *data, m_bp)
-        other->append(data->clone());
-    removeAllBreakpoints();
-    other->updateMarkers();
+    QTC_ASSERT(m_bp,/**/);
+    foreach (BreakpointData *data, *m_bp) {
+            data->m_handler = other;
+    }
+    m_bp = 0;
+
     other->saveSessionData();
 }
 
diff --git a/src/plugins/debugger/breakhandler.h b/src/plugins/debugger/breakhandler.h
index 9a9aa30289c79e498f5d249e9b5c8fe21756988e..26e4e0eea6e478fb17bcfa7ba4c6fd77dca10444 100644
--- a/src/plugins/debugger/breakhandler.h
+++ b/src/plugins/debugger/breakhandler.h
@@ -64,11 +64,11 @@ public:
     QAbstractItemModel *model() { return this; }
 
     BreakpointData *at(int index) const;
-    int size() const { return m_bp.size(); }
+    int size() const { return m_bp?m_bp->size():0; }
     bool hasPendingBreakpoints() const;
     void removeAt(int index); // This also deletes the marker.
     void clear(); // This also deletes all the marker.
-    int indexOf(BreakpointData *data) { return m_bp.indexOf(data); }
+    int indexOf(BreakpointData *data) { return m_bp?m_bp->indexOf(data):-1; }
     // Find a breakpoint matching approximately the data in needle.
     BreakpointData *findSimilarBreakpoint(const BreakpointData *needle) const;
     BreakpointData *findBreakpointByNumber(int bpNumber) const;
@@ -76,6 +76,7 @@ public:
     bool watchPointAt(quint64 address) const;
     void updateMarkers();
     bool isActive() const;
+    bool isMasterList() const;
 
     Breakpoints insertedBreakpoints() const;
     void takeInsertedBreakPoint(BreakpointData *);
@@ -121,6 +122,8 @@ private:
     void removeBreakpointHelper(int index);
     void append(BreakpointData *data);
 
+    void initMasterList();
+
     const QIcon m_breakpointIcon;
     const QIcon m_disabledBreakpointIcon;
     const QIcon m_pendingBreakPointIcon;
@@ -128,12 +131,14 @@ private:
     const QIcon m_watchpointIcon;
 
     Debugger::DebuggerEngine *m_engine; // Not owned.
-    Breakpoints m_bp;
+    Breakpoints *m_bp;
     Breakpoints m_inserted; // Lately inserted breakpoints.
     Breakpoints m_removed; // Lately removed breakpoints.
     Breakpoints m_enabled; // Lately enabled breakpoints.
     Breakpoints m_disabled; // Lately disabled breakpoints.
 
+    bool m_masterList;
+
     // Hack for BreakWindow::findSimilarBreakpoint
     mutable BreakpointData *m_lastFound;
     mutable bool m_lastFoundQueried;
diff --git a/src/plugins/debugger/debuggerengine.cpp b/src/plugins/debugger/debuggerengine.cpp
index 59a77d55cc0a075a20e183fdf206193a3ad5f135..39ab69eb98ab68d0f875f06016690ccca389dde4 100644
--- a/src/plugins/debugger/debuggerengine.cpp
+++ b/src/plugins/debugger/debuggerengine.cpp
@@ -1696,6 +1696,11 @@ void DebuggerEngine::attemptBreakpointSynchronization()
 {
 }
 
+bool DebuggerEngine::acceptsBreakpoint(const BreakpointData *)
+{
+    return true;
+}
+
 void DebuggerEngine::selectThread(int)
 {
 }
diff --git a/src/plugins/debugger/debuggerengine.h b/src/plugins/debugger/debuggerengine.h
index 2753a6545b0704551bfb1497d7bf3bb43814295c..199d7c6626060fde3456a0879b6c4ce42c423d10 100644
--- a/src/plugins/debugger/debuggerengine.h
+++ b/src/plugins/debugger/debuggerengine.h
@@ -130,6 +130,7 @@ class StackFrame;
 class SourceFilesHandler;
 class ThreadsHandler;
 class WatchHandler;
+class BreakpointData;
 
 struct WatchUpdateFlags
 {
@@ -183,6 +184,7 @@ public:
     virtual void updateAll();
 
     virtual void attemptBreakpointSynchronization();
+    virtual bool acceptsBreakpoint(const Internal::BreakpointData *);
     virtual void selectThread(int index);
 
     virtual void assignValueInDebugger(const Internal::WatchData *w, const QString &expr, const QVariant &value);
diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp
index b00dbc9287266ff3cff28fa0ad933fabfa2f3f8e..14b0400a893233b2f321d0102f847715a639480f 100644
--- a/src/plugins/debugger/gdb/gdbengine.cpp
+++ b/src/plugins/debugger/gdb/gdbengine.cpp
@@ -2608,6 +2608,11 @@ void GdbEngine::attemptBreakpointSynchronization()
     handler->updateMarkers();
 }
 
+bool GdbEngine::acceptsBreakpoint(const Internal::BreakpointData *br)
+{
+    return !( br->fileName.endsWith(QLatin1String("js")) || br->fileName.endsWith(QLatin1String("qml")) );
+}
+
 
 //////////////////////////////////////////////////////////////////////
 //
diff --git a/src/plugins/debugger/gdb/gdbengine.h b/src/plugins/debugger/gdb/gdbengine.h
index 210b1c678174aa3c5dcc80a4395f55faf1a03844..bc9a357af7fd5c43bae0477e26983241b2efae2e 100644
--- a/src/plugins/debugger/gdb/gdbengine.h
+++ b/src/plugins/debugger/gdb/gdbengine.h
@@ -309,6 +309,7 @@ private: ////////// Inferior Management //////////
 
     // This should be always the last call in a function.
     Q_SLOT virtual void attemptBreakpointSynchronization();
+    bool acceptsBreakpoint(const Internal::BreakpointData *br);
 
     virtual void executeStep();
     virtual void executeStepOut();
diff --git a/src/plugins/debugger/qml/qmlcppengine.cpp b/src/plugins/debugger/qml/qmlcppengine.cpp
index 90489310c9bc1ee953f98fc4ecf5482f1dbe1862..6b232a69e57b20c201bef26686c3af64d47c10d6 100644
--- a/src/plugins/debugger/qml/qmlcppengine.cpp
+++ b/src/plugins/debugger/qml/qmlcppengine.cpp
@@ -222,6 +222,11 @@ void QmlCppEngine::attemptBreakpointSynchronization()
     static_cast<DebuggerEngine*>(d->m_qmlEngine)->attemptBreakpointSynchronization();
 }
 
+bool QmlCppEngine::acceptsBreakpoint(const Internal::BreakpointData *br)
+{
+    return d->m_cppEngine->acceptsBreakpoint(br) || d->m_qmlEngine->acceptsBreakpoint(br);
+}
+
 void QmlCppEngine::selectThread(int index)
 {
     d->m_cppEngine->selectThread(index);
diff --git a/src/plugins/debugger/qml/qmlcppengine.h b/src/plugins/debugger/qml/qmlcppengine.h
index 9bdf2a6781bf399f5cea19b7766b805735a62e43..d3bb72056d3c4c65e5a94925e1f55b907c58e372 100644
--- a/src/plugins/debugger/qml/qmlcppengine.h
+++ b/src/plugins/debugger/qml/qmlcppengine.h
@@ -52,6 +52,7 @@ public:
     virtual void updateAll();
 
     virtual void attemptBreakpointSynchronization();
+    virtual bool acceptsBreakpoint(const Internal::BreakpointData *br);
     virtual void selectThread(int index);
 
     virtual void assignValueInDebugger(const Internal::WatchData *w, const QString &expr, const QVariant &value);
diff --git a/src/plugins/debugger/qml/qmlengine.cpp b/src/plugins/debugger/qml/qmlengine.cpp
index a0b2be774689582a77551da5549c1afa28701cc4..be920e5dc9dff0678bd4f91d7744b42a1f6df7ec 100644
--- a/src/plugins/debugger/qml/qmlengine.cpp
+++ b/src/plugins/debugger/qml/qmlengine.cpp
@@ -460,6 +460,11 @@ void QmlEngine::attemptBreakpointSynchronization()
     }
 }
 
+bool QmlEngine::acceptsBreakpoint(const Internal::BreakpointData *br)
+{
+    return (br->fileName.endsWith(QLatin1String("qml")) || br->fileName.endsWith(QLatin1String("js")));
+}
+
 void QmlEngine::loadSymbols(const QString &moduleName)
 {
     Q_UNUSED(moduleName)
diff --git a/src/plugins/debugger/qml/qmlengine.h b/src/plugins/debugger/qml/qmlengine.h
index 5f12e25eee55ca3ac3e68ae40437339517b111c0..6a4c9c639b2316f7d1e49a5483b2c083e2f589b5 100644
--- a/src/plugins/debugger/qml/qmlengine.h
+++ b/src/plugins/debugger/qml/qmlengine.h
@@ -93,6 +93,7 @@ private:
     void selectThread(int index);
 
     void attemptBreakpointSynchronization();
+    bool acceptsBreakpoint(const Internal::BreakpointData *br);
 
     void assignValueInDebugger(const Internal::WatchData *w, const QString &expr, const QVariant &value);
     void loadSymbols(const QString &moduleName);