diff -urN cvs/src/game.cpp cvs_gerd/src/game.cpp
--- cvs/src/game.cpp	2010-09-27 20:31:10.000000000 +1000
+++ cvs_gerd/src/game.cpp	2010-09-27 20:31:15.000000000 +1000
@@ -2778,7 +2778,15 @@
             eco_ToExtendedString (EcoCode, ecoStr);
             tb->PrintString (ecoStr);
         }
-        tb->PrintString (newline);
+        for (uint i=0; i < NumTags; i++) {
+			if( !strcmp(TagList[i].tag, "Annotator"))
+			{
+				sprintf (temp, " (%s)", TagList[i].value);
+                tb->PrintString (temp);
+			}
+		}
+
+		tb->PrintString (newline);
 
         // Print FEN if non-standard start:
 
diff -urN cvs/src/game.h cvs_gerd/src/game.h
--- cvs/src/game.h	2010-09-27 20:31:10.000000000 +1000
+++ cvs_gerd/src/game.h	2010-09-27 20:31:15.000000000 +1000
@@ -323,7 +323,6 @@
     inline moveT *    NewMove();
     inline void       FreeMove (moveT * move);
 
-    errorT     DecodeTags (ByteBuffer * buf, bool storeTags);
     errorT     DecodeVariation (ByteBuffer * buf, byte flags, uint level);
 
     //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -573,6 +572,7 @@
     errorT    DecodeStart (ByteBuffer * buf);
     errorT    DecodeNextMove (ByteBuffer * buf, simpleMoveT * sm);
     errorT    Decode (ByteBuffer * buf, byte flags);
+    errorT    DecodeTags (ByteBuffer * buf, bool storeTags);
 
     // StoredLine codes:
     static ushort GetStoredLineCount (void);
diff -urN cvs/src/namebase.h cvs_gerd/src/namebase.h
--- cvs/src/namebase.h	2010-09-27 20:31:10.000000000 +1000
+++ cvs_gerd/src/namebase.h	2010-09-27 20:31:15.000000000 +1000
@@ -27,16 +27,17 @@
 // There are three NameBases, one each for player, event and site tags.
 //
 const nameT
-    NAME_PLAYER = 0,  NAME_EVENT = 1,  NAME_SITE = 2, NAME_ROUND = 3,
+    NAME_PLAYER = 0,  NAME_EVENT = 1,  NAME_SITE = 2, NAME_ROUND = 3, NAME_ANNOTATOR = 4,
     NAME_FIRST = 0, NAME_LAST = 3, NAME_INVALID = 99;
 
-const uint NUM_NAME_TYPES = 4;
+const uint NUM_NAME_TYPES = 5;
 
-const char NAME_TYPE_STRING [NUM_NAME_TYPES][8] = {
+const char NAME_TYPE_STRING [NUM_NAME_TYPES][10] = {
     "player",
     "event",
     "site",
-    "round"
+    "round",
+	"annotator"
 };
 
 
diff -urN cvs/src/tkscid.cpp cvs_gerd/src/tkscid.cpp
--- cvs/src/tkscid.cpp	2010-09-27 20:31:09.000000000 +1000
+++ cvs_gerd/src/tkscid.cpp	2010-09-27 20:31:15.000000000 +1000
@@ -15119,6 +15119,7 @@
     char * sEvent = NULL;
     char * sSite  = NULL;
     char * sRound = NULL;
+	char * sAnnotator = NULL;
 
     bool * mWhite = NULL;
     bool * mBlack = NULL;
@@ -15195,7 +15196,7 @@
     char ** sPgnText = NULL;
 
     const char * options[] = {
-        "white", "black", "event", "site", "round",
+        "white", "black", "event", "site", "round", "annotator",
         "date", "results", "welo", "belo", "delo",
         "wtitles", "btitles", "toMove",
         "eco", "length", "gameNumber", "flip", "filter",
@@ -15207,7 +15208,7 @@
         "fCustom4" , "fCustom5" , "fCustom6" , "pgn", NULL
     };
     enum {
-        OPT_WHITE, OPT_BLACK, OPT_EVENT, OPT_SITE, OPT_ROUND,
+        OPT_WHITE, OPT_BLACK, OPT_EVENT, OPT_SITE, OPT_ROUND, OPT_ANNOTATOR,
         OPT_DATE, OPT_RESULTS, OPT_WELO, OPT_BELO, OPT_DELO,
         OPT_WTITLES, OPT_BTITLES, OPT_TOMOVE,
         OPT_ECO, OPT_LENGTH, OPT_GAMENUMBER, OPT_FLIP, OPT_FILTER,
@@ -15250,6 +15251,10 @@
             sRound = strDuplicate (value);
             break;
 
+		case OPT_ANNOTATOR:
+			sAnnotator = strDuplicate(value);
+			break;
+
         case OPT_DATE:
             // Extract two whitespace-separated dates:
             value = strFirstWord (value);
@@ -15700,36 +15705,68 @@
             }
         }
 
+
+		// Without annotations the search for annotator can be skipped
+		// This elinimates 90% of the effort, if an annotator is queried
+		if( sAnnotator != NULL && !ie->GetCommentsFlag() && !ie->GetVariationsFlag())
+			match = false;
+
         // Now try to match the comment text if applicable:
         // Note that it is not worth using a faster staring search
         // algorithm like Boyer-Moore or Knuth-Morris-Pratt since
         // profiling showed most that most of the time is spent
         // generating the PGN representation of each game.
 
-        if (match  &&  pgnTextCount > 0) {
+        if (match  &&  (pgnTextCount > 0 || sAnnotator != NULL)) {
             if (match  &&  db->gfile->ReadGame (db->bbuf, ie->GetOffset(),
                                                 ie->GetLength()) != OK) {
                 match = false;
             }
-            if (match  &&  scratchGame->Decode (db->bbuf, GAME_DECODE_ALL) != OK) {
-                match = false;
-            }
-            if (match) {
-                db->tbuf->Empty();
-                db->tbuf->SetWrapColumn (99999);
-                scratchGame->LoadStandardTags (ie, db->nb);
-                scratchGame->ResetPgnStyle ();
-                scratchGame->AddPgnStyle (PGN_STYLE_TAGS);
-                scratchGame->AddPgnStyle (PGN_STYLE_COMMENTS);
-                scratchGame->AddPgnStyle (PGN_STYLE_VARS);
-                scratchGame->AddPgnStyle (PGN_STYLE_SYMBOLS);
-                scratchGame->SetPgnFormat (PGN_FORMAT_Plain);
-                scratchGame->WriteToPGN(db->tbuf);
-                const char * buf = db->tbuf->GetBuffer();
-                for (int m=0; m < pgnTextCount; m++) {
-                   if (match) { match = strContains (buf, sPgnText[m]); }
-                }
-            }
+
+			if(sAnnotator != NULL)
+			{
+				// Need the annotator flag, so decode the flags
+				if (match  &&  scratchGame->DecodeTags (db->bbuf, GAME_DECODE_ALL) != OK)
+					match = false;
+				if(match)
+				{
+					match = false;
+		            uint numtags = scratchGame->GetNumExtraTags();
+					tagT *tag = scratchGame->GetExtraTags();
+					for( int i=0; i<numtags; i++, tag++){
+						// Returning all games where the search string matchs with the prefix 
+						// of the annotator string
+						if( !strcmp(tag->tag, "Annotator")){
+							match = strContainsIndex(tag->value, sAnnotator) >= 0;
+							break;
+						}
+					}
+				}
+				scratchGame->Clear();
+			}
+
+			if(pgnTextCount > 0)
+			{
+				if (match  &&  scratchGame->Decode (db->bbuf, GAME_DECODE_ALL) != OK) {
+					match = false;
+				}
+				if (match) {
+					db->tbuf->Empty();
+					db->tbuf->SetWrapColumn (99999);
+					scratchGame->LoadStandardTags (ie, db->nb);
+					scratchGame->ResetPgnStyle ();
+					scratchGame->AddPgnStyle (PGN_STYLE_TAGS);
+					scratchGame->AddPgnStyle (PGN_STYLE_COMMENTS);
+					scratchGame->AddPgnStyle (PGN_STYLE_VARS);
+					scratchGame->AddPgnStyle (PGN_STYLE_SYMBOLS);
+					scratchGame->SetPgnFormat (PGN_FORMAT_Plain);
+					scratchGame->WriteToPGN(db->tbuf);
+					const char * buf = db->tbuf->GetBuffer();
+					for (int m=0; m < pgnTextCount; m++) {
+					   if (match) { match = strContains (buf, sPgnText[m]); }
+					}
+				}
+			}
         }
 
         if (match) {
@@ -15749,6 +15786,7 @@
     if (sEvent != NULL) { my_Tcl_Free((char*) sEvent); }
     if (sSite  != NULL) { my_Tcl_Free((char*) sSite);  }
     if (sRound != NULL) { my_Tcl_Free((char*) sRound); }
+	if (sAnnotator != NULL) { my_Tcl_Free((char*) sAnnotator); }
     if (mWhite != NULL) { my_Tcl_Free((char*) mWhite); }
     if (mBlack != NULL) { my_Tcl_Free((char*) mBlack); }
     if (mEvent != NULL) { my_Tcl_Free((char*) mEvent); }
@@ -15762,6 +15800,7 @@
     if (sEvent != NULL) { delete[] sEvent; }
     if (sSite  != NULL) { delete[] sSite;  }
     if (sRound != NULL) { delete[] sRound; }
+	if (sAnnotator != NULL) { delete[] sAnnotator; }
     if (mWhite != NULL) { delete[] mWhite; }
     if (mBlack != NULL) { delete[] mBlack; }
     if (mEvent != NULL) { delete[] mEvent; }
diff -urN cvs/tcl/lang/deutsch.tcl cvs_gerd/tcl/lang/deutsch.tcl
--- cvs/tcl/lang/deutsch.tcl	2010-09-27 20:31:09.000000000 +1000
+++ cvs_gerd/tcl/lang/deutsch.tcl	2010-09-27 20:31:15.000000000 +1000
@@ -849,6 +849,9 @@
 translate D BlunderFlag {Grober Fehler}
 translate D UserFlag {Benutzer}
 translate D PgnContains {PGN enthält Text}
+translate D Annotator {Kommentator}
+translate D Vars {Varianten}
+translate D Cmnts {Kommentare}
 
 # Game list window:
 translate D GlistNumber {Nummer}
diff -urN cvs/tcl/lang/english.tcl cvs_gerd/tcl/lang/english.tcl
--- cvs/tcl/lang/english.tcl	2010-09-27 20:31:09.000000000 +1000
+++ cvs_gerd/tcl/lang/english.tcl	2010-09-27 20:31:15.000000000 +1000
@@ -857,6 +857,9 @@
 translate E BlunderFlag {Blunder}
 translate E UserFlag {User}
 translate E PgnContains {PGN contains text}
+translate E Annotator {Annotator}
+translate D Vars {Vars}
+translate D Cmnts {Comments}
 
 # Game list window:
 translate E GlistNumber {Number}
diff -urN cvs/tcl/search/header.tcl cvs_gerd/tcl/search/header.tcl
--- cvs/tcl/search/header.tcl	2010-09-27 20:31:09.000000000 +1000
+++ cvs_gerd/tcl/search/header.tcl	2010-09-27 20:31:15.000000000 +1000
@@ -4,7 +4,7 @@
 
 namespace eval ::search::header {}
 
-set sWhite "";  set sBlack "";  set sEvent ""; set sSite "";  set sRound ""
+set sWhite "";  set sBlack "";  set sEvent ""; set sSite "";  set sRound ""; set sAnnotator "";
 set sWhiteEloMin 0; set sWhiteEloMax [sc_info limit elo]
 set sBlackEloMin 0; set sBlackEloMax [sc_info limit elo]
 set sEloDiffMin "-[sc_info limit elo]"; set sEloDiffMax "+[sc_info limit elo]"
@@ -68,7 +68,7 @@
 }
 
 proc ::search::header::defaults {} {
-  global sWhite sBlack sEvent sSite sRound sDateMin sDateMax sIgnoreCol sSideToMove
+  global sWhite sBlack sEvent sSite sRound sAnnotator sDateMin sDateMax sIgnoreCol sSideToMove
   global sWhiteEloMin sWhiteEloMax sBlackEloMin sBlackEloMax
   global sEloDiffMin sEloDiffMax
   global sEco sEcoMin sEcoMax sHeaderFlags sGlMin sGlMax
@@ -77,7 +77,7 @@
   global sPgntext sTitles
   
   set sWhite "";  set sBlack ""
-  set sEvent ""; set sSite "";  set sRound ""
+  set sEvent ""; set sSite "";  set sRound ""; set sAnnotator ""
   set sWhiteEloMin 0; set sWhiteEloMax [sc_info limit elo]
   set sBlackEloMin 0; set sBlackEloMax [sc_info limit elo]
   set sEloDiffMin "-[sc_info limit elo]"
@@ -106,7 +106,7 @@
 #   Opens the window for searching by header information.
 #
 proc search::header {} {
-  global sWhite sBlack sEvent sSite sRound sDateMin sDateMax sIgnoreCol
+  global sWhite sBlack sEvent sSite sRound sAnnotator sDateMin sDateMax sIgnoreCol
   global sWhiteEloMin sWhiteEloMax sBlackEloMin sBlackEloMax
   global sEloDiffMin sEloDiffMax sSideToMove
   global sEco sEcoMin sEcoMax sHeaderFlags sGlMin sGlMax sTitleList sTitles
@@ -121,7 +121,7 @@
   
   toplevel $w
   wm title $w "Scid: $::tr(HeaderSearch)"
-  foreach frame {cWhite cBlack ignore tw tb eventsite dateround res gl ends eco} {
+  foreach frame {cWhite cBlack ignore tw tb eventsite dateround res ano gl ends eco} {
     ttk::frame $w.$frame
   }
   
@@ -266,6 +266,19 @@
   pack $w.ends.label $w.ends.white $w.ends.sep1 $w.ends.black $w.ends.sep2 $w.ends.both -side left
   pack $w.ends -side top -fill x
   
+  addHorizontalRule $w
+  
+  pack .sh.ano -side top -fill x
+  ttk::label $w.ano.a1 -textvar ::tr(Annotations:) -font $bold
+  ttk::label $w.ano.a2 -textvar ::tr(Annotator:) -font $bold
+  ttk::checkbutton $w.ano.var -textvar ::tr(Vars:) -variable sHeaderFlags(Variations) -offvalue both -onvalue yes
+  ttk::checkbutton $w.ano.cmnts -textvar ::tr(Cmnts:) -variable sHeaderFlags(Annotations) -offvalue both -onvalue yes
+  ttk::entry $w.ano.aname -textvariable sAnnotator -width 20 -font $regular
+  pack $w.ano.a1 $w.ano.var $w.ano.cmnts -side left
+  pack $w.ano.aname $w.ano.a2 -side right
+
+  addHorizontalRule $w
+  
   ttk::label $w.eco.l1 -textvar ::tr(ECOCode:) -font $bold
   ttk::label $w.eco.l2 -text "-" -font $regular
   ttk::label $w.eco.l3 -text " " -font $regular
@@ -584,6 +597,7 @@
           -eco [list $sEcoMin $sEcoMax $sEco] \
           -length [list $sGlMin $sGlMax] \
           -toMove $sSideToMove \
+		-annotator $sAnnotator \
           -gameNumber [list $sGnumMin $sGnumMax] \
           -flip $sIgnoreCol -filter $::search::filter::operation \
           -fStdStart $sHeaderFlags(StdStart) \
@@ -652,7 +666,7 @@
 }
 
 proc ::search::header::save {} {
-  global sWhite sBlack sEvent sSite sRound sDateMin sDateMax sIgnoreCol
+  global sWhite sBlack sEvent sSite sRound sAnnotator sDateMin sDateMax sIgnoreCol
   global sWhiteEloMin sWhiteEloMax sBlackEloMin sBlackEloMax
   global sEloDiffMin sEloDiffMax sGlMin sGlMax
   global sEco sEcoMin sEcoMax sHeaderFlags sSideToMove
@@ -675,7 +689,7 @@
   puts $searchF "set searchType Header"
   
   # First write the regular variables:
-  foreach i {sWhite sBlack sEvent sSite sRound sDateMin sDateMax sResWin
+  foreach i {sWhite sBlack sEvent sSite sRound sAnnotator sDateMin sDateMax sResWin
     sResLoss sResDraw sResOther sWhiteEloMin sWhiteEloMax sBlackEloMin
     sBlackEloMax sEcoMin sEcoMax sEloDiffMin sEloDiffMax
     sIgnoreCol sSideToMove sGlMin sGlMax ::search::filter::operation} {
