diff --git a/src/libs/core/score/tscoreobject.cpp b/src/libs/core/score/tscoreobject.cpp
index bd199c208d9d36cece041a103f83dd43a438486a..dfaabb666b3d3b864240144d495b497d80b1cbea 100644
--- a/src/libs/core/score/tscoreobject.cpp
+++ b/src/libs/core/score/tscoreobject.cpp
@@ -216,7 +216,7 @@ void solveList(const Tnote& n, int dur, QList<Tnote>& outList) {
   }
 }
 
-void TscoreObject::addNote(const Tnote& newNote) {
+void TscoreObject::addNote(const Tnote& newNote, bool fromQML) {
 CHECKTIME (
 
   auto lastMeasure = m_measures.last();
@@ -274,6 +274,11 @@ CHECKTIME (
       lastMeasure->appendNewNotes(lastNoteId, 1);
   }
   emitLastNote();
+  if (fromQML) {
+    if (!m_recordMode)
+      setSelectedItem(lastNote());
+    emit noteWasAdded();
+  }
 )
 }
 
@@ -365,6 +370,8 @@ void TscoreObject::setNote(TnoteObject* no, const Tnote& n) {
           m_segments[2]->item()->setVisible(false);
     }
   }
+  if (m_recordMode)
+    setSelectedItem(no);
 }
 
 
@@ -557,6 +564,13 @@ void TscoreObject::setSingleNote(bool singleN) {
 }
 
 
+void TscoreObject::setRecordMode(bool r) {
+  if (r != m_recordMode) {
+    m_recordMode = r;
+    emit recordModeChanged();
+  }
+}
+
 
 qreal TscoreObject::stavesHeight() {
   if (m_staves.isEmpty())
@@ -712,6 +726,7 @@ void TscoreObject::deleteLastNote() {
     emitLastNote();
     if (tempActiveBar != m_activeBarNr)
       emitActiveBarChanged();
+    setSelectedItem(nullptr);
   }
 }
 
@@ -731,6 +746,8 @@ void TscoreObject::clearScore() {
       m_activeNote = nullptr;
       adjustScoreWidth();
       emitLastNote();
+      setSelectedItem(nullptr);
+      emit scoreWasCleared();
   }
 }
 
diff --git a/src/libs/core/score/tscoreobject.h b/src/libs/core/score/tscoreobject.h
index b835050558841b79858dd48ac4e60b9f3b57d543..fcc69e4a6a7e4ae2412f982c38b19de9e0dd0d55 100644
--- a/src/libs/core/score/tscoreobject.h
+++ b/src/libs/core/score/tscoreobject.h
@@ -76,6 +76,7 @@ class NOOTKACORE_EXPORT  TscoreObject : public QObject
   Q_PROPERTY(bool readOnly READ readOnly WRITE setReadOnly)
   Q_PROPERTY(bool singleNote READ singleNote WRITE setSingleNote NOTIFY singleNoteChanged)
   Q_PROPERTY(bool enharmNotesEnabled READ enharmNotesEnabled WRITE setEnharmNotesEnabled)
+  Q_PROPERTY(bool recordMode READ recordMode WRITE setRecordMode NOTIFY recordModeChanged)
                         /* Helper variables */
   Q_PROPERTY(qreal stavesHeight READ stavesHeight NOTIFY stavesHeightChanged)
   Q_PROPERTY(qreal width READ width WRITE setWidth)
@@ -119,7 +120,13 @@ public:
   int keySignature() const { return static_cast<int>(m_keySignature); }
   void setKeySignature(int k);
 
-  Q_INVOKABLE void addNote(const Tnote& newNote);
+      /**
+       * Adds note @p newNote to score.
+       * in some situations QML part has to take additional actions (scrolls score to make added note visible).
+       * @p fromQML has to be set to @p TRUE then - signal @p noteWaAdded() is emitted
+       * and QML performs required routines
+       */
+  Q_INVOKABLE void addNote(const Tnote& newNote, bool fromQML = false);
   Q_INVOKABLE void setNote(TnoteObject* no, const Tnote& n);
 
       /**
@@ -180,6 +187,9 @@ public:
   bool enharmNotesEnabled() const { return m_enharmNotesEnabled; }
   void setEnharmNotesEnabled(bool enEn) { m_enharmNotesEnabled = enEn; }
 
+  bool recordMode() const { return m_recordMode; }
+  void setRecordMode(bool r);
+
   /* ------------------ Lists with score content (staves, measures notes) ------------------ */
 
   int notesCount() const { return m_notes.count(); }
@@ -351,12 +361,15 @@ signals:
        * QML score depends on it
        */
   void lastNoteChanged();
+  void noteWasAdded();
+  void scoreWasCleared();
 
   void workRtmTextChanged();
 
   void selectedItemChanged();
   void selectedNoteChanged();
   void singleNoteChanged();
+  void recordModeChanged();
 
 protected:
       /**
@@ -476,6 +489,7 @@ private:
   bool                              m_readOnly = false;
   bool                              m_singleNote = false;
   bool                              m_enharmNotesEnabled = false;
+  bool                              m_recordMode = false;
                               /* Lists with notes, measures, staves, meter groups */
   QList<TnotePair*>                 m_segments;
   QList<TnotePair*>                 m_spareSegments;
diff --git a/src/libs/core/tnootkaqml.cpp b/src/libs/core/tnootkaqml.cpp
index 29bf3da35ba15308643b302995b0233684c6a6aa..7819bbfde54571c171bb66767573f4703febf87c 100755
--- a/src/libs/core/tnootkaqml.cpp
+++ b/src/libs/core/tnootkaqml.cpp
@@ -374,6 +374,11 @@ QString TnootkaQML::pix(const QString& imageFileName) {
 }
 
 
+QString TnootkaQML::TR(const QString& context, const QString& text, const QString& disambiguation, int n) {
+  return qTR(qPrintable(context), qPrintable(text), qPrintable(disambiguation), n);
+}
+
+
 QColor TnootkaQML::alpha(const QColor& c, int a) {
   return Tcolor::alpha(c, a);
 }
@@ -503,16 +508,14 @@ void TnootkaQML::instrumentChangesNoteSlot() {
     rawNote = rawNote.showWithFlat();
 
   if (m_scoreObject->singleNote()) {
-      QMetaObject::invokeMethod(m_mainScore, "setNote", Q_ARG(QVariant, QVariant::fromValue(m_scoreObject->note(0))),
-                                Q_ARG(QVariant, QVariant::fromValue(rawNote)));
+      m_scoreObject->setNote(m_scoreObject->note(0), rawNote);
   } else {
       if (m_scoreObject->selectedItem()) {
           rawNote.setRhythm(m_scoreObject->selectedItem()->note()->rtm);
-          QMetaObject::invokeMethod(m_mainScore, "setNote", Q_ARG(QVariant, QVariant::fromValue(m_scoreObject->selectedItem())),
-                                                            Q_ARG(QVariant, QVariant::fromValue(rawNote)));
+          m_scoreObject->setNote(m_scoreObject->selectedItem(), rawNote);
       } else {
           rawNote.setRhythm(m_scoreObject->workRhythm());
-          QMetaObject::invokeMethod(m_mainScore, "addNote", Q_ARG(QVariant, QVariant::fromValue(rawNote)));
+          m_scoreObject->addNote(rawNote, true);
       }
   }
 }
@@ -544,11 +547,6 @@ void TnootkaQML::scoreChangedNote() {
 }
 
 
-QString TnootkaQML::TR(const QString& context, const QString& text, const QString& disambiguation, int n) {
-  return qTR(qPrintable(context), qPrintable(text), qPrintable(disambiguation), n);
-}
-
-
 int TnootkaQML::selectedNoteId() const {
   return m_scoreObject->selectedItem() ? m_scoreObject->selectedItem()->index() : -1;
 }
diff --git a/src/main/texamexecutor.cpp b/src/main/texamexecutor.cpp
index 1ec93858eeacc4cc2b61efa10bf176799f1e58ba..a4f1f424ecf4f978957154874790c57a5cf74a72 100755
--- a/src/main/texamexecutor.cpp
+++ b/src/main/texamexecutor.cpp
@@ -1170,7 +1170,7 @@ void TexamExecutor::disableWidgets() {
 
 
 void TexamExecutor::clearWidgets() {
-  QMetaObject::invokeMethod(SCORE_ITEM, "clearScore");
+  SCORE->clearScore();
   if (NOTENAME)
     NOTENAME->setNote(Tnote());
 //   INSTRUMENT->clearFingerBoard();
diff --git a/src/qml/score/Score.qml b/src/qml/score/Score.qml
index 879a481786d78c5f7d50feae8cfa5a9b0cdc5b2d..629d318bb93a89328bd1eb2c9fbf78a5c0b65513 100644
--- a/src/qml/score/Score.qml
+++ b/src/qml/score/Score.qml
@@ -27,7 +27,7 @@ Flickable {
   property alias note: scoreObj.selectedNote
   property alias readOnly: scoreObj.readOnly
   property alias singleNote: scoreObj.singleNote
-  property bool recordMode: false
+  property alias recordMode: scoreObj.recordMode
 
   // private
   property var staves: [ staff0 ]
@@ -73,6 +73,14 @@ Flickable {
           workRhythm = Noo.rhythm(Trhythm.NoRhythm, false, false, false)
     }
     function removeStaff(nr) { staves.splice(nr, 1); lastStaff = staves[staves.length - 1] }
+    onNoteWasAdded: {
+      if (staves.length > 1)
+        ensureVisible(lastNote.staffItem.y, lastNote.staffItem.height * scale)
+    }
+    onScoreWasCleared: {
+      accidControl.show = false
+      rtmControl.show = false
+    }
   }
 
   onCurrentNoteChanged: {
@@ -176,30 +184,11 @@ Flickable {
       contentY = yy + hh - height
   }
 
-  function addNote(n) {
-    scoreObj.addNote(n)
-    var lastNote = scoreObj.lastNote
-    if (staves.length > 1)
-      ensureVisible(lastNote.staffItem.y, lastNote.staffItem.height * scale)
-    if (!recordMode)
-      currentNote = lastNote
-  }
+  function addNote(n) { scoreObj.addNote(n ,true) }
 
-  function setNote(noteItem, note) {
-    scoreObj.setNote(noteItem, note)
-    if (recordMode)
-      currentNote = scoreObj.getNext(currentNote)
-  }
+  function setNote(noteItem, note) { scoreObj.setNote(noteItem, note) }
 
-  function clearScore() {
-    scoreObj.clearScore()
-    currentNote = null
-    accidControl.show = false
-    rtmControl.show = false
-  }
+  function clearScore() { scoreObj.clearScore() }
 
-  function deleteLast() {
-    scoreObj.deleteLastNote()
-    currentNote = null
-  }
+  function deleteLast() { scoreObj.deleteLastNote() }
 }