diff --git a/src/Instrumentation/KLN89/kln89.cxx b/src/Instrumentation/KLN89/kln89.cxx
index 48b69a043..aa7b734e4 100644
--- a/src/Instrumentation/KLN89/kln89.cxx
+++ b/src/Instrumentation/KLN89/kln89.cxx
@@ -206,9 +206,8 @@ KLN89::KLN89(RenderArea2D* instrument)
 	}
 	_activeFP = _flightPlans[0];
 	
-	// Hackish
-	_entJump = -1;
-	_entRestoreCrsr = false;
+	_entJump = _clrJump = -1;
+	_jumpRestoreCrsr = false;
 	
 	_dispMsg = false;
 	
@@ -490,8 +489,8 @@ void KLN89::CrsrPressed() {
 		_pages[(unsigned int)_cleanUpPage]->CleanUp();
 		_cleanUpPage = -1;
 	}
-	_entRestoreCrsr = false;
-	_entJump = -1;
+	_jumpRestoreCrsr = false;
+	_entJump = _clrJump = -1;
 	((KLN89Page*)_activePage)->SetEntInvert(false);
 	if(_mode == KLN89_MODE_DISP) {
 		_mode = KLN89_MODE_CRSR;
@@ -512,8 +511,8 @@ void KLN89::EntPressed() {
 		}
 		_curPage = _entJump;
 		_activePage = _pages[(unsigned int)_entJump];
-		if(_entRestoreCrsr) _mode = KLN89_MODE_CRSR;
-		_entJump = -1;
+		if(_jumpRestoreCrsr) _mode = KLN89_MODE_CRSR;
+		_entJump = _clrJump = -1;
 	}
 	if(_activePage == _dir_page) {
 		_dir_page->EntPressed();
@@ -525,6 +524,12 @@ void KLN89::EntPressed() {
 }
 
 void KLN89::ClrPressed() {
+	if(_clrJump >= 0) {
+		_curPage = _clrJump;
+		_activePage = _pages[(unsigned int)_clrJump];
+		if(_jumpRestoreCrsr) _mode = KLN89_MODE_CRSR;
+		_entJump = _clrJump = -1;
+	}
 	_activePage->ClrPressed();
 }
 
diff --git a/src/Instrumentation/KLN89/kln89.hxx b/src/Instrumentation/KLN89/kln89.hxx
index b0a879c25..c3542f4cb 100644
--- a/src/Instrumentation/KLN89/kln89.hxx
+++ b/src/Instrumentation/KLN89/kln89.hxx
@@ -213,9 +213,12 @@ private:
 	// And a facility to save the immediately preceeding active page
 	KLN89Page* _lastActivePage;
 	
-	// Hackish
-	int _entJump;	// The page to jump back to if ent is pressed.  -1 indicates no jump
-	bool _entRestoreCrsr;	// Indicates that pressing ENT at this point should restore cursor mode
+	// Ugly hack.  Housekeeping to allow us to temporarily display one page, while remembering which
+	// other page to "jump" back to.  Used when the waypoint pages are used to review waypoint entry
+	// from the flightplan page.
+	int _entJump;	// The page to jump back to if ENT is pressed.  -1 indicates no jump.
+	int _clrJump;	// The page to jump back to if CLR is pressed.  -1 indicates no jump.
+	bool _jumpRestoreCrsr;	// Indicates that jump back at this point should restore cursor mode.
 	
 	// Misc pages that aren't in the cyclic list.
 	// Direct To
diff --git a/src/Instrumentation/KLN89/kln89_page_fpl.cxx b/src/Instrumentation/KLN89/kln89_page_fpl.cxx
index ec9161d4d..0cb8d13b8 100644
--- a/src/Instrumentation/KLN89/kln89_page_fpl.cxx
+++ b/src/Instrumentation/KLN89/kln89_page_fpl.cxx
@@ -295,15 +295,20 @@ void KLN89FplPage::Update(double dt) {
                 }
             } else if(_kln89->_mode == KLN89_MODE_CRSR && _bEntWp && _uLinePos == i+4) {
                 if(!_kln89->_blink) {
-                    if(_wLinePos >= _entWp->id.size()) {
-                        _kln89->DrawText(_entWp->id, 2, 4, 3-i);
+                    if(_wLinePos >= _entWpStr.size()) {
+                        _kln89->DrawText(_entWpStr, 2, 4, 3-i);
                         _kln89->DrawChar(' ', 2, 4+_wLinePos, 3-i, false, true);
                     } else {
-                        _kln89->DrawText(_entWp->id.substr(0, _wLinePos), 2, 4, 3-i);
-                        _kln89->DrawChar(_entWp->id[_wLinePos], 2, 4+_wLinePos, 3-i, false, true);
-                        _kln89->DrawText(_entWp->id.substr(_wLinePos+1, _entWp->id.size()-_wLinePos-1), 2, 5+_wLinePos, 3-i);
+                        _kln89->DrawText(_entWpStr.substr(0, _wLinePos), 2, 4, 3-i);
+                        _kln89->DrawChar(_entWpStr[_wLinePos], 2, 4+_wLinePos, 3-i, false, true);
+                        _kln89->DrawText(_entWpStr.substr(_wLinePos+1, _entWpStr.size()-_wLinePos-1), 2, 5+_wLinePos, 3-i);
                     }
                 }
+                // Draw the param - this is "----" during waypoint entry (not for the first row though or we draw through the label!)
+                if(i != 0) {
+                    _kln89->DrawText("----", 2, 12, 3-i);
+                }
+                
                 drawID = false;
             }
             if(drawID) {
@@ -316,10 +321,16 @@ void KLN89FplPage::Update(double dt) {
                     //cout << "last_pos = " << last_pos << endl;
                     if(last_pos > 0 && last_pos < waylist.size() && i > 0) {
                         // Draw the param
-                        if(_actFpMode == 0) {
-                            string s = _params[last_pos - 1];
-                            _kln89->DrawText(s, 2, 16-s.size(), 3-i);
-                        } else if(_actFpMode == 3) {
+                        if(_actFpMode == 0) {   // DIS
+                            if(_kln89->_mode == KLN89_MODE_CRSR && _bEntWp && _uLinePos < i+4) {
+                                // This means that we are beyond the waypoint being entered.  In DIS mode
+                                // this means that we dash out the field.
+                                _kln89->DrawText("----", 2, 12, 3-i);
+                            } else {
+                                string s = _params[last_pos - 1];
+                                _kln89->DrawText(s, 2, 16-s.size(), 3-i);
+                            }
+                        } else if(_actFpMode == 3) {    // DTK
                             string s = _params[last_pos - 1];
                             _kln89->DrawText(s, 2, 15-s.size(), 3-i);
                             _kln89->DrawSpecialChar(0, 2, 15, 3-i);
@@ -348,10 +359,19 @@ void KLN89FplPage::Update(double dt) {
                 if(i > 0) {
                     // Draw the param
                     //cout << "i > 0 param draw...\n";
-                    if(_actFpMode == 0) {
-                        string s = _params[_fplPos + i - 1];
-                        _kln89->DrawText(s, 2, 16-s.size(), 3-i);
-                    } else if(_actFpMode == 3) {
+                    if(_actFpMode == 0) {   // DIS
+                        if(_kln89->_mode == KLN89_MODE_CRSR && _bEntWp && _uLinePos < i+4) {
+                            // This means that we are beyond the waypoint being entered.  In DIS mode
+                            // this means that we dash out the field.
+                            _kln89->DrawText("----", 2, 12, 3-i);
+                        } else {
+                            string s = _params[_fplPos + i - 1];
+                            _kln89->DrawText(s, 2, 16-s.size(), 3-i);
+                        }
+                    } else if(_actFpMode == 3) {    // DTK
+                        // TODO - figure out properly what to do in DTK mode when beyond a waypoint being entered.
+                        // I *think* it is OK to do the same as here, but maybe not for the waypoint immediately
+                        // beyond the one being entered - need to check.
                         string s = _params[_fplPos + i - 1];
                         _kln89->DrawText(s, 2, 15-s.size(), 3-i);
                         _kln89->DrawSpecialChar(0, 2, 15, 3-i);
@@ -437,16 +457,22 @@ void KLN89FplPage::Update(double dt) {
                     _kln89->DrawEnt();
                 }
             } else if(_kln89->_mode == KLN89_MODE_CRSR && _bEntWp && _uLinePos == i+4) {
+                // This means that we are drawing a waypoint currently being entered
                 if(!_kln89->_blink) {
-                    if(_wLinePos >= _entWp->id.size()) {
-                        _kln89->DrawText(_entWp->id, 2, 4, 2-i);
+                    if(_wLinePos >= _entWpStr.size()) {
+                        _kln89->DrawText(_entWpStr, 2, 4, 2-i);
                         _kln89->DrawChar(' ', 2, 4+_wLinePos, 2-i, false, true);
                     } else {
-                        _kln89->DrawText(_entWp->id.substr(0, _wLinePos), 2, 4, 2-i);
-                        _kln89->DrawChar(_entWp->id[_wLinePos], 2, 4+_wLinePos, 2-i, false, true);
-                        _kln89->DrawText(_entWp->id.substr(_wLinePos+1, _entWp->id.size()-_wLinePos-1), 2, 5+_wLinePos, 2-i);
+                        _kln89->DrawText(_entWpStr.substr(0, _wLinePos), 2, 4, 2-i);
+                        _kln89->DrawChar(_entWpStr[_wLinePos], 2, 4+_wLinePos, 2-i, false, true);
+                        _kln89->DrawText(_entWpStr.substr(_wLinePos+1, _entWpStr.size()-_wLinePos-1), 2, 5+_wLinePos, 2-i);
                     }
                 }
+                // Draw the param - this is "----" during waypoint entry (not for the first row though or we draw through the label!)
+                if(i != 0) {
+                    _kln89->DrawText("----", 2, 12, 2-i);
+                }
+                
                 drawID = false;
             }
             if(drawID) {
@@ -456,9 +482,16 @@ void KLN89FplPage::Update(double dt) {
                     }
                     if(last_pos > 0 && last_pos < waylist.size() && i > 0) {
                         // Draw the param
-                        if(_fpMode == 0) {
-                            string s = _params[last_pos - 1];
-                            _kln89->DrawText(s, 2, 16-s.size(), 2-i);
+                        // TODO - we should also handle DTK mode params here.
+                        if(_fpMode == 0) {  // DIS
+                            if(_kln89->_mode == KLN89_MODE_CRSR && _bEntWp && _uLinePos < i+4) {
+                                // This means that we are beyond the waypoint being entered.  In DIS mode
+                                // this means that we dash out the field.
+                                _kln89->DrawText("----", 2, 12, 2-i);
+                            } else {
+                                string s = _params[last_pos - 1];
+                                _kln89->DrawText(s, 2, 16-s.size(), 2-i);
+                            }
                         }
                     }
                     break;
@@ -468,9 +501,16 @@ void KLN89FplPage::Update(double dt) {
                     }
                     if(i > 0) {
                         // Draw the param
-                        if(_fpMode == 0) {
-                            string s = _params[_fplPos + i - 1];
-                            _kln89->DrawText(s, 2, 16-s.size(), 2-i);
+                        // TODO - we should also handle DTK mode params here.
+                        if(_fpMode == 0) {  // DIS
+                            if(_kln89->_mode == KLN89_MODE_CRSR && _bEntWp && _uLinePos < i+4) {
+                                // This means that we are beyond the waypoint being entered.  In DIS mode
+                                // this means that we dash out the field.
+                                _kln89->DrawText("----", 2, 12, 2-i);
+                            } else {
+                                string s = _params[_fplPos + i - 1];
+                                _kln89->DrawText(s, 2, 16-s.size(), 2-i);
+                            }
                         }
                     }
                 }
@@ -600,8 +640,27 @@ void KLN89FplPage::ClrPressed() {
             // TODO - see if we need to delete a waypoint
             if(_uLinePos >= 4) {
                 if(_delWp) {
+                    // If we are already displaying a clear waypoint dialog in response to the CLR button,
+                    // then a further press of the CLR button cancels the dialog.
                     _kln89->_mode = KLN89_MODE_DISP;
                     _delWp = false;
+                } else if(_bEntWp) {
+                    // If we are currently entering a waypoint, then CLR deletes it unconditionally
+                    // without a confirmation dialog and cancels waypoint entry.
+                    int pos = _uLinePos - 4 + _fplPos;
+                    // Sanity check - the calculated wp position should never be off the end of the waypoint list.
+                    if(pos > static_cast<int>(_kln89->_flightPlans[_subPage]->waypoints.size()) - 1) {
+                        SG_LOG(SG_GENERAL, SG_ALERT, "ERROR - _uLinePos too big in KLN89FplPage::ClrPressed!\n");
+                        return;
+                    }
+                    _kln89->_flightPlans[_subPage]->waypoints.erase(_kln89->_flightPlans[_subPage]->waypoints.begin() + pos);
+                    _bEntWp = false;
+                    _entWp = NULL;
+                    _entWpStr.clear();
+                    _wLinePos = 0;
+                    // We can also get here from the waypoint review page, so clear _bEntExp as well
+                    _bEntExp = false;
+                    // Do we need to re-calc _fplPos here?                    
                 } else {
                     // First check that we're not trying to delete an approach waypoint.  Note that we can delete the approach by deleting the header though.
                     // Check for approach waypoints or header/fences in flightplan 0
@@ -685,22 +744,30 @@ void KLN89FplPage::EntPressed() {
         int pos = _uLinePos - 4 + _fplPos;
         // Sanity check - the calculated wp position should never be off the end of the waypoint list.
         if(pos > static_cast<int>(_kln89->_flightPlans[_subPage]->waypoints.size()) - 1) {
-            cout << "ERROR - _uLinePos too big in KLN89FplPage::EntPressed!\n";
+            SG_LOG(SG_GENERAL, SG_ALERT, "ERROR - _uLinePos too big in KLN89FplPage::EntPressed!\n");
             return;
         }
         _kln89->_flightPlans[_subPage]->waypoints.erase(_kln89->_flightPlans[_subPage]->waypoints.begin() + pos);
         _delWp = false;
         // Do we need to re-calc _fplPos here?
     } else if(_bEntExp) {
+        // We get here if we have just approved a waypoint review for addition with the ENT button
         _bEntWp = false;
         _bEntExp = false;
         _entWp = NULL;  // DON'T delete it! - it's been pushed onto the waypoint list at this point.
         _entWpStr.clear();
         _kln89->_cleanUpPage = -1;
         _wLinePos = 0;
-        // TODO - in actual fact the previously underlined waypoint stays in the same position and underlined
-        // in some or possibly all circumstances - need to check this out and match it, but not too important
-        // for now.
+        // The cursor should be moved either to the next waypoint in the list, or to the empty position at
+        // the end of the list if the waypoint just entered was the last one in the list.  Unfortunately
+        // that means that we have to deal with the horrible _uLinePos / _fplPos interaction yet again :-(
+        if(_uLinePos == 4) {
+            // We can't handle this case by calling K1R1, since we want to jump the field type
+            _uLinePos = 5;
+        } else {
+            // Just call Knob1Right1 and let that handle the horrible logic :-)
+            Knob1Right1();
+        }
     } else if(_bEntWp) {
         if(_entWp != NULL) {
             // TODO - should be able to get rid of this switch I think and use the enum values.
@@ -731,12 +798,12 @@ void KLN89FplPage::EntPressed() {
                 ((KLN89Page*)_kln89->_pages[4])->SetEntInvert(true);
                 break;
             default:
-                cout << "Error - unknown waypoint type found in KLN89::FplPage::EntPressed()\n";
+                SG_LOG(SG_GENERAL, SG_ALERT, "Error - unknown waypoint type found in KLN89::FplPage::EntPressed()\n");
             }
             _kln89->_activePage->SetId(_entWp->id);
-            _kln89->_entJump = 7;
+            _kln89->_entJump = _kln89->_clrJump = 7;
             _kln89->_cleanUpPage = 7;
-            _kln89->_entRestoreCrsr = true;
+            _kln89->_jumpRestoreCrsr = true;
             _kln89->_mode = KLN89_MODE_DISP;
         }
         _bEntExp = true;
@@ -867,7 +934,7 @@ void KLN89FplPage::Knob1Right1() {
                 }
                 if(_kln89->_flightPlans[_subPage]->waypoints.size() == 1 || _fplPos == _kln89->_flightPlans[_subPage]->waypoints.size() + hfcount - 1) {
                     // 1: Don't move
-                } else if(_fplPos >= _kln89->_flightPlans[_subPage]->waypoints.size() + hfcount - (_subPage == 0 ? 4 : 3)) {
+                } else if((int)_fplPos >= static_cast<int>(_kln89->_flightPlans[_subPage]->waypoints.size()) + hfcount - (_subPage == 0 ? 4 : 3)) {
                     _uLinePos++;
                 } else {
                     _fplPos++;
@@ -956,8 +1023,15 @@ void KLN89FplPage::Knob2Left1() {
                 
                 GPSWaypoint* wp = _kln89->FindFirstById(_entWpStr.substr(0, _wLinePos+1));
                 if(NULL == wp) {
-                    // no-op
+                    // No ID matches the partial ID entered so _entWpStr must be shortened to the cursor
+                    // position if it was longer due to a match on the previous character.
+                    if(_entWpStr.size() > _wLinePos+1) {
+                        _entWpStr = _entWpStr.substr(0, _wLinePos+1);
+                    }
                 } else {
+                    // There is a matching full ID to the entered partial ID, so copy the full ID
+                    // into _entWpStr
+                    _entWpStr = wp->id;
                     if(_entWp) {
                         *_entWp = *wp; // copy
                         delete wp;
@@ -1029,8 +1103,15 @@ void KLN89FplPage::Knob2Right1() {
                 
                 GPSWaypoint* wp = _kln89->FindFirstById(_entWpStr.substr(0, _wLinePos+1));
                 if(NULL == wp) {
-                    // no-op
+                    // No ID matches the partial ID entered so _entWpStr must be shortened to the cursor
+                    // position if it was longer due to a match on the previous character.
+                    if(_entWpStr.size() > _wLinePos+1) {
+                        _entWpStr = _entWpStr.substr(0, _wLinePos+1);
+                    }
                 } else {
+                    // There is a matching full ID to the entered partial ID, so copy the full ID
+                    // into _entWpStr
+                    _entWpStr = wp->id;
                     if(_entWp) {
                         *_entWp = *wp; // copy
                         delete wp;