diff --git a/TODO b/TODO
index 373d3b0e5ea19f4696e1c2187202ce25d9fec86e..792decf96c9184ecfc09518fe2dae38ecdae4da9 100644
--- a/TODO
+++ b/TODO
@@ -29,7 +29,6 @@ TRANSLATION CONTEXT CHANGES
 ============================================================================
 
 small glitches:
- - clef is not approved when settings were accepted
  - sometimes setting a note doesn't scale tie - probably due to note width is not refreshed
  - meter can be too close to key signature - probably related with clef change
 
diff --git a/src/libs/core/score/tscoreobject.cpp b/src/libs/core/score/tscoreobject.cpp
index 6039ad8e05a7852d4eb21b1d64fae88f43ed7a98..59a64a838326cac9dee62147631047d3a420c445 100644
--- a/src/libs/core/score/tscoreobject.cpp
+++ b/src/libs/core/score/tscoreobject.cpp
@@ -175,8 +175,8 @@ int TscoreObject::meterToInt() const { return static_cast<int>(m_meter->meter())
 
 
 void TscoreObject::setKeySignature(int k) {
-  if (m_keySignEnabled) {
-    qint8 key = static_cast<qint8>(k);
+  qint8 key = static_cast<qint8>(k);
+  if (m_keySignEnabled && key != m_keySignature) {
     if (key != m_keySignature) {
       m_keySignature = key;
       for (int i = 1; i < 8; i++) {
@@ -192,6 +192,7 @@ void TscoreObject::setKeySignature(int k) {
         m->keySignatureChanged();
       if (notesCount() > 0)
         adjustScoreWidth();
+      emit keySignatureChanged();
     }
   }
 }
@@ -426,12 +427,9 @@ void TscoreObject::openMusicXml(const QString& musicFile) {
       }
       int newKey = static_cast<int>(melody->key().value());
       if (newKey != keySignature()) {
-        if (!m_keySignEnabled && qAbs(newKey) != 0) {
-          m_keySignEnabled = true;
-          emit keySignatureEnabledChanged();
-        }
+        if (!m_keySignEnabled && qAbs(newKey) != 0)
+          setKeySignatureEnabled(true);
         setKeySignature(newKey);
-        emit keySignatureChanged();
       }
       for (int n = 0; n < melody->length(); ++n) {
         addNote(melody->note(n)->p());
@@ -452,6 +450,8 @@ void TscoreObject::saveMusicXml(const QString& musicFile) {
     auto melody = new Tmelody(QStringLiteral("Nootka melody"), TkeySignature(static_cast<char>(keySignature())));
     melody->setClef(clefType());
     melody->setMeter(m_meter->meter());
+    if (m_keySignEnabled)
+      melody->setKey(TkeySignature(static_cast<char>(m_keySignature)));
     for (int n = 0; n < notesCount(); ++n) {
       melody->addNote(Tchunk(m_notes[n]));
     }
@@ -467,8 +467,9 @@ void TscoreObject::saveMusicXml(const QString& musicFile) {
 void TscoreObject::setKeySignatureEnabled(bool enKey) {
   if (enKey != m_keySignEnabled) {
     if (!enKey)
-      setKeySignature(0);
+      m_keySignature = 0;
     m_keySignEnabled = enKey;
+    emit keySignatureEnabledChanged();
     if (notesCount() > 0)
       adjustScoreWidth();
   }
@@ -531,6 +532,7 @@ CHECKTIME(
 void TscoreObject::setReadOnly(bool ro) {
   if (m_readOnly != ro) {
     m_readOnly = ro;
+    emit readOnlyChanged();
   }
 }
 
diff --git a/src/libs/core/score/tscoreobject.h b/src/libs/core/score/tscoreobject.h
index 483704106eb4100cbeb401a01e6117828d3d4ac9..cb3839a414a47afc6a15b8e8639a1be2d2f15e0c 100644
--- a/src/libs/core/score/tscoreobject.h
+++ b/src/libs/core/score/tscoreobject.h
@@ -73,7 +73,7 @@ class NOOTKACORE_EXPORT  TscoreObject : public QObject
   Q_PROPERTY(bool showNoteNames READ showNoteNames WRITE setShowNoteNames)
   Q_PROPERTY(QColor nameColor READ nameColor WRITE setNameColor)
   Q_PROPERTY(int nameStyle READ nameStyle WRITE setNameStyle)
-  Q_PROPERTY(bool readOnly READ readOnly WRITE setReadOnly)
+  Q_PROPERTY(bool readOnly READ readOnly WRITE setReadOnly NOTIFY readOnlyChanged)
   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)
@@ -371,6 +371,7 @@ signals:
 
   void selectedItemChanged();
   void selectedNoteChanged();
+  void readOnlyChanged();
   void singleNoteChanged();
   void recordModeChanged();
   void scaleFactorChanged();
diff --git a/src/libs/core/tglobals.cpp b/src/libs/core/tglobals.cpp
index 1eb54490e9df82823a536a0e21f9a219f08d87cd..632050d6fb112e2d197da74a53d8dd8ee8df5eb1 100755
--- a/src/libs/core/tglobals.cpp
+++ b/src/libs/core/tglobals.cpp
@@ -164,10 +164,20 @@ bool Tglobals::enableDoubleAccids() const { return S->doubleAccidentalsEnabled;
 void Tglobals::setEnableDoubleAccids(bool dblAcc) { S->doubleAccidentalsEnabled = dblAcc; emit enableDoubleAccidsChanged(); }
 
 bool Tglobals::keySignatureEnabled() const { return S->keySignatureEnabled; }
-void Tglobals::setKeySignatureEnabled(bool enKey) { S->keySignatureEnabled = enKey; emit enableKeySignatureChanged(); }
+void Tglobals::setKeySignatureEnabled(bool enKey) {
+  if (enKey != S->keySignatureEnabled) {
+    S->keySignatureEnabled = enKey;
+    emit enableKeySignatureChanged();
+  }
+}
 
 int Tglobals::clefType() const { return static_cast<int>(S->clef); }
-void Tglobals::setClefType(int clType) { S->clef = static_cast<Tclef::EclefType>(clType); emit clefTypeChanged(); }
+void Tglobals::setClefType(int clType) {
+  if (static_cast<Tclef::EclefType>(clType) != S->clef) {
+    S->clef = static_cast<Tclef::EclefType>(clType);
+    emit clefTypeChanged();
+  }
+}
 
 QString Tglobals::majorKeyNameSufix() const { return S->majKeyNameSufix; }
 void Tglobals::setMajorKeyNameSufix(const QString& mkns) { S->majKeyNameSufix = mkns; }
diff --git a/src/qml/MainScore.qml b/src/qml/MainScore.qml
index e5d256dd7fb52294110e1bb0edcb9b6b275bcdd7..9ecc906626e261fdb004be4f5d6feaee238ceb5a 100644
--- a/src/qml/MainScore.qml
+++ b/src/qml/MainScore.qml
@@ -37,7 +37,6 @@ Score {
 
   clef: GLOB.clefType
   enableDoubleAccids: GLOB.enableDoubleAccids
-  enableKeySign: GLOB.keySignatureEnabled
   scoreObj.showNoteNames: GLOB.namesOnScore
   scoreObj.nameColor: GLOB.nameColor
   scoreObj.nameStyle: GLOB.noteNameStyle
@@ -98,14 +97,16 @@ Score {
   Connections {
     target: SOUND
     onInitialized: {
-      scoreObj.singleNote = GLOB.singleNoteMode
+      singleNote = GLOB.singleNoteMode
       scoreObj.allowAdding = Qt.binding(function() { return !GLOB.singleNoteMode })
+      enableKeySign = Qt.binding(function() { return GLOB.keySignatureEnabled })
       updateScord()
     }
   }
   Connections {
     target: GLOB
     onKeyNameChanged: keyName.text = Qt.binding(keyName.getKeyNameText)
+    onClefTypeChanged: score.clef = GLOB.clefType
     onSingleNoteModeChanged: {
       scoreObj.singleNote = GLOB.singleNoteMode
       if (GLOB.singleNoteMode) {
diff --git a/src/qml/score/KeySignature.qml b/src/qml/score/KeySignature.qml
index 5bf91054715365e1967d408602e5df9ced3e48ea..2ad4270a23cd98c58db6d63002b703965b280dae 100644
--- a/src/qml/score/KeySignature.qml
+++ b/src/qml/score/KeySignature.qml
@@ -11,24 +11,17 @@ import Score 1.0
 Item {
   id: keySig
 
-  property int key: 0
-
 // private
   readonly property var sharpPos: [ 0, 3, -1, 2, 5, 1,  4 ]
   readonly property var flatPos: [ 4, 1, 5, 2, 6, 3, 7 ]
 
   x: staff.clef.x + staff.clef.width + 1
-  width: Math.max(6, (Math.abs(key) + 1) * 1.8)
+  width: Math.max(6, (Math.abs(score.keySignature) + 1) * 1.8)
   height: 10
 
-  signal keySignatureChanged(var k)
-
-  onKeyChanged: keySignatureChanged(key)
-
   function accidOffset(c) {
       var accidOff = 1
       switch (c) {
-
         case Tclef.Bass_F:
         case Tclef.Bass_F_8down:
           accidOff = -1; break;
@@ -48,12 +41,12 @@ Item {
       Text {
         font { family: "Scorek"; pixelSize: 8 }
         color: activPal.text
-        text: key < 0 ? "\ue260" : (key > 0 ? "\ue262" : "") // flat or sharp symbols
+        text: score.keySignature < 0 ? "\ue260" : (score.keySignature > 0 ? "\ue262" : "") // flat or sharp symbols
         x: index * 1.8
-        y: (key < 0 ? flatPos[index] : sharpPos[index]) - accidOffset(score.clef)
-                          + (score.clef === Tclef.Tenor_C && key > 0 && (index === 0 || index === 2) ? 7 : 0)
-        opacity: index < Math.abs(key) ? 1.0 : 0.0
-        Behavior on opacity { enabled: GLOB.useAnimations; NumberAnimation { property: "opacity"; duration: 200 }}
+        y: (score.keySignature < 0 ? flatPos[index] : sharpPos[index]) - accidOffset(score.clef)
+                          + (score.clef === Tclef.Tenor_C && score.keySignature > 0 && (index === 0 || index === 2) ? 7 : 0)
+        opacity: index < Math.abs(score.keySignature) ? 1.0 : 0.0
+        Behavior on opacity { enabled: GLOB.useAnimations; NumberAnimation { property: "opacity"; duration: 300 }}
       }
   }
 
@@ -63,12 +56,13 @@ Item {
       Repeater {
         model: 7
         Text { // accidentals at lower staff
+          property var upperAccid: accidRep.itemAt(index)
           font { family: "Scorek"; pixelSize: 8 }
           color: activPal.text
-          text: accidRep.itemAt(index).text
-          y: accidRep.itemAt(index).y + 16
-          x: accidRep.itemAt(index).x
-          opacity: accidRep.itemAt(index).opacity
+          text: upperAccid ? upperAccid.text : ""
+          y: upperAccid ? upperAccid.y + 16 : 0
+          x: upperAccid ? upperAccid.x : 0
+          opacity: upperAccid ? upperAccid.opacity : 0
         }
       }
   }
@@ -115,8 +109,8 @@ Item {
   // stops switching keys too quick (by wheel on touch pad)
   Timer { id: wheelTimer; interval: 250 }
 
-  function keyUp() { if (key < 7) ++key }
-  function keyDown() { if (key > -7) --key }
+  function keyUp() { if (score.keySignature < 7) ++score.keySignature }
+  function keyDown() { if (score.keySignature > -7) --score.keySignature }
 
   function deltaUp() {
     if (!wheelTimer.running) {
diff --git a/src/qml/score/Meter.qml b/src/qml/score/Meter.qml
index c16862b54ec073d4f179095646e5f6363de079c0..dde27cd4c09f456cbb68e86e19c4ad399ee39db9 100644
--- a/src/qml/score/Meter.qml
+++ b/src/qml/score/Meter.qml
@@ -20,7 +20,7 @@ Text {
   color: activPal.text
   text: Noo.meter(score.meter).symbol()
   y: score.upperLine - 9
-  x: (parent.keySignature ? parent.keySignature.x + parent.keySignature.width : 0.5 + parent.clef.width) + 1.0
+  x: (staff0.keySignItem ? staff0.keySignItem.x + staff0.keySignItem.width : staff0.clef.x + staff0.clef.width) + 1.0
 
   Loader { sourceComponent: score.clef === Tclef.PianoStaffClefs ? lowerMeter : null }
   Component {
diff --git a/src/qml/score/Score.qml b/src/qml/score/Score.qml
index 016844bf7bb5d9ad096dd5b2df15843a8eb9870e..a8cec14a3b9b2cf711c9b7ff27a62fd47f69b518 100644
--- a/src/qml/score/Score.qml
+++ b/src/qml/score/Score.qml
@@ -18,7 +18,8 @@ Flickable {
   property alias upperLine: staff0.upperLine
   property alias meter: scoreObj.meter
   property alias bgColor: bgRect.color
-  property bool enableKeySign: scoreObj.keySignatureEnabled
+  property alias enableKeySign: scoreObj.keySignatureEnabled
+  property alias keySignature: scoreObj.keySignature
   property bool enableDoubleAccids: false
   property alias workRhythm: scoreObj.workRhythm
   property alias scaleFactor: scoreObj.scaleFactor
@@ -49,18 +50,12 @@ Flickable {
 
     onStaffCreate: {
       var c = Qt.createComponent("qrc:/Staff.qml")
-      var lastStaff = c.createObject(score.contentItem/*, { "clef.type": score.clef }*/)
+      var lastStaff = c.createObject(score.contentItem)
       staves.push(lastStaff)
-      lastStaff.enableKeySignature(enableKeySign && score.clef !== Tclef.NoClef)
       lastStaff.onDestroing.connect(removeStaff)
-      if (enableKeySign && score.clef !== Tclef.NoClef) {
-        lastStaff.keySignature.onKeySignatureChanged.connect(setKeySignature)
-        lastStaff.keySignature.key = staff0.keySignature.key
-      }
       score.lastStaff = lastStaff
     }
     onStavesHeightChanged: score.contentHeight = Math.max(stavesHeight, score.height)
-    onKeySignatureChanged: setKeySignature(scoreObj.keySignature)
     onMeterChanged: {
       if (rtmControl && meter !== Tmeter.NoMeter) {
           rtmControl.rtm = meter <= Tmeter.Meter_7_4 ? Trhythm.Quarter : Trhythm.Eighth
@@ -139,28 +134,6 @@ Flickable {
     }
   }
 
-  onEnableKeySignChanged: {
-    staff0.enableKeySignature(enableKeySign)
-    if (enableKeySign)
-      staff0.keySignature.onKeySignatureChanged.connect(setKeySignature)
-    for (var s = 1; s < staves.length; ++s) {
-      staves[s].enableKeySignature(enableKeySign)
-      if (enableKeySign)
-        staff0.keySignature.onKeySignatureChanged.connect(setKeySignature)
-    }
-    scoreObj.keySignatureEnabled = enableKeySign
-  }
-
-  function setKeySignature(key) {
-    if (enableKeySign) {
-      for (var s = 0; s < staves.length; ++s) {
-        if (key !== staves[s].keySignature.key)
-          staves[s].keySignature.key = key
-      }
-      scoreObj.keySignature = key
-    }
-  }
-
   function ensureVisible(yy, hh) {
     if (contentY >= yy)
       contentY = yy
diff --git a/src/qml/score/Staff.qml b/src/qml/score/Staff.qml
index b88a850409e8f6cb9d29328dccdfe38fb7f69125..4663e03a429add0ce8badbadea14bc7e2bf290a1 100644
--- a/src/qml/score/Staff.qml
+++ b/src/qml/score/Staff.qml
@@ -16,9 +16,9 @@ Item {
 
   property alias upperLine: staffObj.upperLine
   property real linesCount: score.clef === Tclef.PianoStaffClefs ? 44 : 38
-  property var keySignature: null
+  property var keySignItem: null
   property var meter: null
-  property real firstNoteX: (meter ? meter.x + meter.width : (keySignature ? keySignature.x + keySignature.width : 0.5 + clef.width)) + 1.0
+  property real firstNoteX: (meter ? meter.x + meter.width : (keySignItem ? keySignItem.x + keySignItem.width : clef.x + clef.width)) + 1.0
   property alias scordSpace: staffObj.scordSpace
 
   signal destroing(var nr)
@@ -71,10 +71,7 @@ Item {
 
   Connections {
     target: score
-    onClefChanged: {
-      if (keySignature && meter)
-        updateMeterPos()
-    }
+    onEnableKeySignChanged: checkIsKeyEnabled()
   }
 
   Text { // measure number
@@ -87,29 +84,20 @@ Item {
       color: activPal.text
   }
 
-  function enableKeySignature(en) { // key signature created on demand
-      if (en) {
-          if (!keySignature) {
-            var c = Qt.createComponent("qrc:/KeySignature.qml")
-            keySignature = c.createObject(staff)
-            if (meter) {
-              keySignature.onWidthChanged.connect(updateMeterPos)
-              updateMeterPos()
-            }
-          }
-      } else {
-          if (keySignature) {
-            keySignature.destroy()
-            keySignature = null
-          }
-          if (meter)
-            meter.x = clef.x + clef.width
-      }
-  }
-
-  function updateMeterPos() {
-      meter.x = keySignature.x + keySignature.width
+  function checkIsKeyEnabled() { // key signature created on demand
+    if (score.enableKeySign) {
+        if (!keySignItem) {
+          var c = Qt.createComponent("qrc:/KeySignature.qml")
+          keySignItem = c.createObject(staff)
+        }
+    } else {
+        if (keySignItem) {
+          keySignItem.destroy()
+          keySignItem = null
+        }
+    }
   }
 
-  Component.onDestruction: { destroing(staffObj.number) }
+  Component.onCompleted: checkIsKeyEnabled()
+  Component.onDestruction: destroing(staffObj.number)
 }
diff --git a/src/qml/shared/InstrumentSelector.qml b/src/qml/shared/InstrumentSelector.qml
index ab983a436b3327c73bbe4daeeee336ac1628da68..05c1f707a1690404ea7150b95cba447e396394d6 100644
--- a/src/qml/shared/InstrumentSelector.qml
+++ b/src/qml/shared/InstrumentSelector.qml
@@ -25,6 +25,10 @@ Tumbler {
         text: Noo.instr(modelData).glyph
         anchors.horizontalCenter: parent.horizontalCenter
         color: instrTumb.currentIndex === modelData ? activPal.highlightedText : activPal.text
+        MouseArea {
+          anchors.fill: parent
+          onClicked: instrTumb.currentIndex = modelData
+        }
       }
       Text {
         anchors.horizontalCenter: parent.horizontalCenter