diff --git a/src/exam/tcanvas.cpp b/src/exam/tcanvas.cpp
index 7b704672b19e55ff554eff9ec8ec656ab7e9094b..1dd2b5d6a25f0a0f18cf70267eaaff47d848df63 100644
--- a/src/exam/tcanvas.cpp
+++ b/src/exam/tcanvas.cpp
@@ -172,6 +172,9 @@ void Tcanvas::startTip() {
 
 
 void Tcanvas::certificateTip() {
+  if (m_certifyTip)
+    return;
+
   delete m_questionTip;
   clearResultTip();
   clearWhatNextTip();
@@ -377,7 +380,7 @@ void Tcanvas::clearCanvas() {
   }
 	delete m_startTip;
 	delete m_questionTip;
-	delete m_certifyTip;
+  clearCertificate();
   delete m_outTuneTip;
   clearMelodyCorrectMessage();
 }
@@ -532,7 +535,7 @@ bool Tcanvas::eventFilter(QObject* obj, QEvent* event) {
     QMouseEvent *me = static_cast<QMouseEvent *>(event);
     if (event->type() == QEvent::MouseButtonPress) {
 			if (me->button() == Qt::MiddleButton && me->modifiers() | Qt::ShiftModifier &&  me->modifiers() | Qt::AltModifier) {
-					if (m_exam)
+          if (m_exam && !m_certifyTip)
 						emit certificateMagicKeys();
 			}
     }
diff --git a/src/exam/tcanvas.h b/src/exam/tcanvas.h
index 14ec4cfe2614b463db7e3d58b805316c9542085a..07c827f18f090cbaa6a3e1efaf2fbcfa5315a1b3 100644
--- a/src/exam/tcanvas.h
+++ b/src/exam/tcanvas.h
@@ -1,5 +1,5 @@
 /***************************************************************************
- *   Copyright (C) 2012-2015 by Tomasz Bojczuk                             *
+ *   Copyright (C) 2012-2016 by Tomasz Bojczuk                             *
  *   tomaszbojczuk@gmail.com                                               *
  *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
@@ -103,7 +103,9 @@ public:
 	void detectedNoteTip(const Tnote& note);
   
   QString detectedText(const QString& txt); /** Returns bigger @p txt in question color. Used for 'detected'  message. */
-	
+
+  bool hasCertificate() { return m_certifyTip != 0; }
+
 public slots:
 	void clearResultTip(); // clears tip with results
 	void clearTryAgainTip();
@@ -149,7 +151,7 @@ private:
 	QPointer<TgraphicsTextTip>		 m_resultTip, m_whatTip, m_startTip, m_tryAgainTip;
 	QPointer<TgraphicsTextTip>		 m_confirmTip, m_outTuneTip;
 	QPointer<TquestionTip>				 m_questionTip;
-	QPointer<TnootkaCertificate>	 m_certifyTip;
+	TnootkaCertificate         	  *m_certifyTip;
 	Texam 												*m_exam;
 	QPointer<TcombinedAnim>				 m_correctAnim;
 	QTimer 												*m_timerToConfirm;
diff --git a/src/exam/texamexecutor.cpp b/src/exam/texamexecutor.cpp
index b740c17e18272fee317b8c6eedfa8d79a80bdf91..81ee3843bf3b133413482d5f9887800488ba6425 100755
--- a/src/exam/texamexecutor.cpp
+++ b/src/exam/texamexecutor.cpp
@@ -242,6 +242,9 @@ void TexamExecutor::initializeExecuting() {
 
 void TexamExecutor::askQuestion(bool isAttempt) {
 	m_askingTimer->stop();
+  if (m_canvas->hasCertificate()) // in auto mode new question can be asked "under" certificate
+    return;
+
 	m_lockRightButt = false; // release mouse button events
 	if (m_exercise && !gl->E->showCorrected) // hide correct action button
       mW->bar->removeAction(mW->bar->correctAct);
@@ -677,6 +680,8 @@ void TexamExecutor::checkAnswer(bool showResults) {
 
 	markAnswer(curQ);
 	int waitTime = gl->E->questionDelay;
+  if (m_melody) // increase minimal delay before next question for melodies to 500ms
+    waitTime = qMax(waitTime, 500);
 	if (m_exercise) {
     if ((gl->E->autoNextQuest && gl->E->afterMistake != TexamParams::e_continue) || !gl->E->autoNextQuest || gl->E->showCorrected)
       waitTime = gl->E->correctPreview; // user has to have time to see his mistake and correct answer
@@ -701,7 +706,7 @@ void TexamExecutor::checkAnswer(bool showResults) {
           stopExamSlot();
       else {
 				if (curQ->isCorrect()) {
-          m_askingTimer->start(gl->E->questionDelay);
+          m_askingTimer->start(m_melody ? qMax(gl->E->questionDelay, 500) : gl->E->questionDelay);
       } else {
 					if (gl->E->repeatIncorrect && !m_incorrectRepeated) {
 						if (curQ->melody())
@@ -1418,6 +1423,9 @@ void TexamExecutor::noteOfMelodyStarted(const TnoteStruct& n) {
 void TexamExecutor::noteOfMelodyFinished(const TnoteStruct& n) {
 //   Tnote nn = n.pitch;
 //   qDebug() << "[TexamExecutor] note finished" << nn.toText();
+  if (m_melody->currentIndex() < 0) // meanwhile new question melody was asked - some undesired note was finished
+    return;
+
   m_melody->setNote(n);
   if (m_melody->currentIndex() == m_exam->curQ()->melody()->length() - 1) {
     if (gl->E->expertsAnswerEnable)