Index: mscore/mscore/mscore/layout.cpp
===================================================================
--- mscore/mscore/mscore/layout.cpp	(revision 3782)
+++ mscore/mscore/mscore/layout.cpp	(working copy)
@@ -1306,7 +1306,19 @@
                               Staff* staff = _staves[staffIdx];
                               KeySigEvent key1 = staff->key(tick - 1);
                               KeySigEvent key2 = staff->key(tick);
-                              if (key1 != key2) {
+
+                              // locate a key sig. in next measure and, if found, check it has court. sig turned off
+                              Measure * nm = m->nextMeasure();
+                              Segment * pKeySigSegm;
+                              Element * pKeySigElem;
+                              bool bShowCourtesySig = true;	// assume this key change has court. sig turned on
+                              if(nm && (pKeySigSegm = nm->findSegment(SegKeySig, tick)) != 0) {
+                                    pKeySigElem = pKeySigSegm->element(staffIdx*VOICES);
+                                    if(pKeySigElem != 0 && !((KeySig*)pKeySigElem)->showCourtesySig())
+                                    bShowCourtesySig = false;
+                                    }
+
+                              if (key1 != key2 && bShowCourtesySig) {
                                     hasCourtesyKeysig = true;
                                     Segment* s  = m->getSegment(SegKeySigAnnounce, tick);
                                     int track = staffIdx * VOICES;
Index: mscore/mscore/mscore/keysig.cpp
===================================================================
--- mscore/mscore/mscore/keysig.cpp	(revision 3782)
+++ mscore/mscore/mscore/keysig.cpp	(working copy)
@@ -26,6 +26,7 @@
 #include "segment.h"
 #include "measure.h"
 #include "score.h"
+#include "undo.h"
 
 const char* keyNames[15] = {
       QT_TRANSLATE_NOOP("MuseScore", "G major, E minor"),   QT_TRANSLATE_NOOP("MuseScore", "Cb major, Ab minor"),
@@ -45,10 +46,15 @@
 KeySig::KeySig(Score* s)
   : Element(s)
       {
-      }
+      _showCourtesySig = true;
+      _showNaturals = true;
+	  }
+
 KeySig::KeySig(const KeySig& k)
    : Element(k)
       {
+      _showCourtesySig = k.showCourtesySig();
+      _showNaturals = k.showNaturals();
       foreach(KeySym* ks, k.keySymbols)
             keySymbols.append(new KeySym(*ks));
       }
@@ -161,12 +167,13 @@
       if (!((t1 > 0) ^ (t2 > 0)))
             naturals &= ~accidentals;
 
-      for (int i = 0; i < 7; ++i) {
-            if (naturals & (1 << i)) {
-                  addLayout(naturalSym, xo, clefTable[clef].lines[i + coffset]);
-                  xo += 1.0;
+      if(_showNaturals)
+            for (int i = 0; i < 7; ++i) {
+                  if (naturals & (1 << i)) {
+                        addLayout(naturalSym, xo, clefTable[clef].lines[i + coffset]);
+                        xo += 1.0;
+                        }
                   }
-            }
       switch(t1) {
             case 7:  addLayout(sharpSym, xo + 6.0, clefTable[clef].lines[6]);
             case 6:  addLayout(sharpSym, xo + 5.0, clefTable[clef].lines[5]);
@@ -244,6 +251,40 @@
       }
 
 //---------------------------------------------------------
+//   genPropertyMenu
+//---------------------------------------------------------
+
+bool KeySig::genPropertyMenu(QMenu* popup) const
+      {
+      Element::genPropertyMenu(popup);
+      if (!generated()) {
+            QAction* a = popup->addAction(_showCourtesySig
+                  ? QT_TRANSLATE_NOOP("KeySig", "Hide courtesy sig.")
+                  : QT_TRANSLATE_NOOP("KeySig", "Show courtesy sig.") );
+            a->setData("courtesy");
+            a = popup->addAction(_showNaturals
+                  ? QT_TRANSLATE_NOOP("KeySig", "Hide naturals")
+                  : QT_TRANSLATE_NOOP("KeySig", "Show naturals") );
+            a->setData("naturals");
+            }
+      return true;
+      }
+
+//---------------------------------------------------------
+//   propertyAction
+//---------------------------------------------------------
+
+void KeySig::propertyAction(ScoreView* viewer, const QString& s)
+      {
+      if (s == "courtesy")
+            score()->undo()->push(new ChangeKeySig(this, keySigEvent(), !_showCourtesySig, _showNaturals));
+      else if (s == "naturals")
+            score()->undo()->push(new ChangeKeySig(this, keySigEvent(), _showCourtesySig, !_showNaturals));
+      else
+      Element::propertyAction(viewer, s);
+      }
+
+//---------------------------------------------------------
 //   setSig
 //---------------------------------------------------------
 
@@ -289,6 +330,8 @@
             xml.tag("pos", ks->spos);
             xml.etag();
             }
+      xml.tag("showCourtesySig", _showCourtesySig);
+      xml.tag("showNaturals",    _showNaturals);
       xml.etag();
       }
 
@@ -314,6 +357,10 @@
                         }
                   keySymbols.append(ks);
                   }
+            else if (tag == "showCourtesySig")
+                  _showCourtesySig = e.text().toInt();
+            else if (tag == "showNaturals")
+                  _showNaturals = e.text().toInt();
             else if (!Element::readProperties(e))
                   domError(e);
             }
Index: mscore/mscore/mscore/keysig.h
===================================================================
--- mscore/mscore/mscore/keysig.h	(revision 3782)
+++ mscore/mscore/mscore/keysig.h	(working copy)
@@ -42,6 +42,8 @@
       };
 
 class KeySig : public Element {
+      bool	_showCourtesySig;
+      bool	_showNaturals;
       QList<KeySym*> keySymbols;
       void addLayout(int sym, double x, int y);
 
@@ -70,6 +72,13 @@
       bool operator==(const KeySig&) const;
       void changeType(KeySigEvent);
       void setSubtype(KeySigEvent e)  { Element::setSubtype(e.subtype); }
+
+      bool showCourtesySig() const    { return _showCourtesySig; };
+      bool showNaturals() const       { return _showNaturals;    };
+      void setShowCourtesySig(bool v) { _showCourtesySig = v;    };
+      void setShowNaturals(bool v)    { _showNaturals = v;       };
+      virtual bool genPropertyMenu(QMenu*) const;
+      virtual void propertyAction(ScoreView*, const QString&);
       };
 
 extern const char* keyNames[15];
Index: mscore/mscore/mscore/transposedialog.cpp
===================================================================
--- mscore/mscore/mscore/transposedialog.cpp	(revision 3782)
+++ mscore/mscore/mscore/transposedialog.cpp	(working copy)
@@ -230,7 +230,8 @@
                         KeySigEvent key  = km->key(ks->tick());
                         KeySigEvent okey = km->key(ks->tick() - 1);
                         key.setNaturalType(okey.accidentalType());
-                        _undo->push(new ChangeKeySig(ks, key));
+                        _undo->push(new ChangeKeySig(ks, key, ks->showCourtesySig(),
+                             ks->showNaturals()));
                         }
                   }
             return;
@@ -387,7 +388,8 @@
                         KeySigEvent key  = km->key(s->tick());
                         KeySigEvent okey = km->key(s->tick() - 1);
                         key.setNaturalType(okey.accidentalType());
-                        _undo->push(new ChangeKeySig(ks, key));
+                        _undo->push(new ChangeKeySig(ks, key, ks->showCourtesySig(),
+                              ks->showNaturals()));
                         }
                   }
             }
Index: mscore/mscore/mscore/undo.cpp
===================================================================
--- mscore/mscore/mscore/undo.cpp	(revision 3782)
+++ mscore/mscore/mscore/undo.cpp	(working copy)
@@ -1351,10 +1351,12 @@
 //   ChangeKeySig
 //---------------------------------------------------------
 
-ChangeKeySig::ChangeKeySig(KeySig* _keysig, KeySigEvent _ks)
+ChangeKeySig::ChangeKeySig(KeySig* _keysig, KeySigEvent _ks, bool sc, bool sn)
       {
       keysig = _keysig;
       ks     = _ks;
+      showCourtesy = sc;
+      showNaturals = sn;
       }
 
 //---------------------------------------------------------
@@ -1364,8 +1366,16 @@
 void ChangeKeySig::flip()
       {
       KeySigEvent oe = keysig->keySigEvent();
+      bool sc        = keysig->showCourtesySig();
+      bool sn        = keysig->showNaturals();
+
       keysig->setSubtype(ks);
-      ks = oe;
+      keysig->setShowCourtesySig(showCourtesy);
+      keysig->setShowNaturals(showNaturals);
+
+      showCourtesy = sc;
+      showNaturals = sn;
+      ks           = oe;
       }
 
 //---------------------------------------------------------
Index: mscore/mscore/mscore/undo.h
===================================================================
--- mscore/mscore/mscore/undo.h	(revision 3782)
+++ mscore/mscore/mscore/undo.h	(working copy)
@@ -425,6 +425,24 @@
       };
 
 //---------------------------------------------------------
+//   ChangeKeySig
+//---------------------------------------------------------
+
+class ChangeKeySig : public UndoCommand {
+	  KeySig* keysig;
+	  KeySigEvent ks;
+	  bool showCourtesy;
+	  bool showNaturals;
+
+	  void flip();
+
+   public:
+	  ChangeKeySig(KeySig*, KeySigEvent newKeySig, bool sc, bool sn);
+	  virtual void undo() { flip(); }
+	  virtual void redo() { flip(); }
+	  };
+
+//---------------------------------------------------------
 //   FlipTupletDirection
 //---------------------------------------------------------
 
@@ -455,22 +473,6 @@
       };
 
 //---------------------------------------------------------
-//   ChangeKeySig
-//---------------------------------------------------------
-
-class ChangeKeySig : public UndoCommand {
-      KeySig* keysig;
-      KeySigEvent ks;
-
-      void flip();
-
-   public:
-      ChangeKeySig(KeySig*, KeySigEvent newKeySig);
-      virtual void undo() { flip(); }
-      virtual void redo() { flip(); }
-      };
-
-//---------------------------------------------------------
 //   ChangeClef
 //---------------------------------------------------------
 
