diff -urN old/src/game.h new/src/game.h
--- old/src/game.h	2009-12-01 22:06:56.000000000 +0000
+++ new/src/game.h	2010-10-02 16:12:52.000000000 +0000
@@ -422,6 +422,7 @@
     char *   GetMoveComment () { return CurrentMove->prev->comment; }
 
     inline errorT AddNag (byte nag);
+    inline errorT RemoveNag (bool isMoveNag);
     byte *   GetNags () { return CurrentMove->prev->nags; }
     byte *   GetNextNags () { return CurrentMove->nags; }
     void     ClearNags () {
@@ -602,10 +603,61 @@
     moveT * m = CurrentMove->prev;
     if (m->nagCount + 1 >= MAX_NAGS) { return ERROR_GameFull; }
     if (nag == 0) { /* Nags cannot be zero! */ return OK; }
-    m->nags[m->nagCount] = nag;
-    m->nagCount += 1;
-    m->nags[m->nagCount] = 0;
-    //if (nag > 0) NagsFlag = 1;
+	// If it is a move nag replace an existing
+	if( nag >= 1 && nag <= 6)
+		for( int i=0; i<m->nagCount; i++)
+			if( m->nags[i] >= 1 && m->nags[i] <= 6)
+			{
+				m->nags[i] = nag;
+				return OK;
+			}
+	// If it is a position nag replace an existing
+	if( nag >= 10 && nag <= 21)
+		for( int i=0; i<m->nagCount; i++)
+			if( m->nags[i] >= 10 && m->nags[i] <= 21)
+			{
+				m->nags[i] = nag;
+				return OK;
+			}
+	if( nag >= 1 && nag <= 6)
+	{
+		// Put Move Nags at the beginning
+		for( int i=m->nagCount; i>0; i--)  m->nags[i] =  m->nags[i-1];
+		m->nags[0] = nag;
+	}
+	else
+		m->nags[m->nagCount] = nag;
+	m->nagCount += 1;
+	m->nags[m->nagCount] = 0;
+    return OK;
+}
+
+inline errorT
+Game::RemoveNag (bool isMoveNag)
+{
+    moveT * m = CurrentMove->prev;
+	if( isMoveNag)
+	{
+		for( int i=0; i<m->nagCount; i++)
+			if( m->nags[i] >= 1 && m->nags[i] <= 6)
+			{
+				m->nagCount -= 1;
+				for( int j=i; j<m->nagCount; j++)  m->nags[j] =  m->nags[j+1];
+				m->nags[m->nagCount] = 0;
+				return OK;
+			}
+	}
+	else
+	{
+		for( int i=0; i<m->nagCount; i++)
+			if( m->nags[i] >= 10 && m->nags[i] <= 21)
+			{
+				m->nagCount -= 1;
+				for( int j=i; j<m->nagCount; j++)  m->nags[j] =  m->nags[j+1];
+				m->nags[m->nagCount] = 0;
+				return OK;
+			}
+	}
     return OK;
 }
 
diff -urN old/src/tkscid.cpp new/src/tkscid.cpp
--- old/src/tkscid.cpp	2010-07-17 16:03:22.000000000 +0000
+++ new/src/tkscid.cpp	2010-10-02 16:20:30.000000000 +0000
@@ -9927,6 +9927,7 @@
     return TCL_OK;
 }
 
+
 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 // sc_pos_addNag:
 //    Adds a NAG (annotation symbol) for the current move.
@@ -9937,14 +9938,22 @@
         return errorResult (ti, "Usage: sc_pos addNag <nagvalue>");
     }
     const char * nagStr = argv[2];
-    byte nag = game_parseNag (nagStr);
-    if (nag != 0) {
-        db->game->AddNag ((byte) nag);
-    }
-    db->gameAltered = true;
+	if( strcmp(nagStr, "X") == 0)
+		db->game->RemoveNag( true);
+	else if( strcmp(nagStr, "Y") == 0)
+		db->game->RemoveNag( false);
+	else
+	{
+		byte nag = game_parseNag (nagStr);
+		if (nag != 0) {
+			db->game->AddNag ((byte) nag);
+		}
+		db->gameAltered = true;
+	}
     return TCL_OK;
 }
 
+
 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 // sc_pos_analyze:
 //    Analyzes the current position for the specified number of
diff -urN old/tcl/windows/pgn.tcl new/tcl/windows/pgn.tcl
--- old/tcl/windows/pgn.tcl	2010-06-30 22:41:46.000000000 +0000
+++ new/tcl/windows/pgn.tcl	2010-09-29 16:10:38.000000000 +0000
@@ -223,7 +223,28 @@
     } else  {
       set state normal
     }
+	
     menu $mctxt
+
+    menu $mctxt.evals1
+    $mctxt.evals1 add command -label "Clear" -command {sc_pos addNag X; ::pgn::Refresh 1}
+    $mctxt.evals1 add command -label "!" -command {sc_pos addNag ! ; ::pgn::Refresh 1}
+    $mctxt.evals1 add command -label "?" -command {sc_pos addNag ? ; ::pgn::Refresh 1}
+    $mctxt.evals1 add command -label "!?" -command {sc_pos addNag !? ; ::pgn::Refresh 1}
+    $mctxt.evals1 add command -label "?!" -command {sc_pos addNag ?! ; ::pgn::Refresh 1}
+    $mctxt.evals1 add command -label "!!" -command {sc_pos addNag !! ; ::pgn::Refresh 1}
+    $mctxt.evals1 add command -label "??" -command {sc_pos addNag ?? ; ::pgn::Refresh 1}
+
+    menu $mctxt.evals2
+    $mctxt.evals2 add command -label "Clear" -command {sc_pos addNag Y ; ::pgn::Refresh 1}
+    $mctxt.evals2 add command -label "=" -command {sc_pos addNag = ; ::pgn::Refresh 1}
+    $mctxt.evals2 add command -label "+=" -command {sc_pos addNag += ; ::pgn::Refresh 1}
+    $mctxt.evals2 add command -label "=+" -command {sc_pos addNag =+ ; ::pgn::Refresh 1}
+    $mctxt.evals2 add command -label "+/-" -command {sc_pos addNag +/- ; ::pgn::Refresh 1}
+    $mctxt.evals2 add command -label "-/+" -command {sc_pos addNag -/+ ; ::pgn::Refresh 1}
+    $mctxt.evals2 add command -label "+-" -command {sc_pos addNag +- ; ::pgn::Refresh 1}
+    $mctxt.evals2 add command -label "-+" -command {sc_pos addNag -+ ; ::pgn::Refresh 1}
+	
     $mctxt add command -label [tr EditDelete] -state $state -command "::pgn::deleteVar [sc_var number]"
     $mctxt add command -label [tr EditFirst] -state $state -command "::pgn::firstVar [sc_var number]"
     $mctxt add command -label [tr EditMain] -state $state -command "::pgn::mainVar [sc_var number]"
@@ -234,12 +255,14 @@
     $mctxt add command -label "[tr EditStrip]:[tr EditStripComments]" -command {::game::Strip comments}
     $mctxt add command -label "[tr EditStrip]:[tr EditStripVars]" -command {::game::Strip variations}
     $mctxt add separator
+    $mctxt add cascade -label "!  ?  ..." -menu $mctxt.evals1
+    $mctxt add cascade -label "+-  +/-  ..." -menu $mctxt.evals2
     $mctxt add command -label "[tr WindowsComment]" -command {makeCommentWin}
     
     $mctxt post [winfo pointerx .] [winfo pointery .]
     
   }
-  
+
   proc deleteVar { var } {
     sc_var exit
     sc_var delete $var
