Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java	(revision 6063)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java	(revision 6064)
@@ -189,4 +189,5 @@
         tabbedPane.addChangeListener(
                 new ChangeListener() {
+                    @Override
                     public void stateChanged(ChangeEvent e) {
                         JTabbedPane sourceTabbedPane = (JTabbedPane) e.getSource();
@@ -214,5 +215,7 @@
                 }
         );
-
+        
+        tagEditorPanel.setNextFocusComponent(memberTable);
+        selectionTable.setFocusable(false);
         memberTableModel.setSelectedMembers(selectedMembers);
         HelpUtil.setHelpContext(getRootPane(),ht("/Dialog/RelationEditor"));
@@ -606,4 +609,5 @@
                 addToWindowMenu();
             }
+            tagEditorPanel.requestFocusInWindow();
         } else {
             // make sure all registered listeners are unregistered
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTable.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTable.java	(revision 6063)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTable.java	(revision 6064)
@@ -6,4 +6,5 @@
 import java.awt.Container;
 import java.awt.Dimension;
+import java.awt.KeyboardFocusManager;
 import java.awt.event.ActionEvent;
 import java.awt.event.KeyEvent;
@@ -176,4 +177,9 @@
                 col = 0;
                 row++;
+            } else {
+                // go to next component, no more rows in this table
+                KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager();
+                manager.focusNextComponent();
+                return;
             }
             changeSelection(row, col, false, false);
Index: /trunk/src/org/openstreetmap/josm/gui/tagging/TagEditorModel.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/tagging/TagEditorModel.java	(revision 6063)
+++ /trunk/src/org/openstreetmap/josm/gui/tagging/TagEditorModel.java	(revision 6064)
@@ -113,12 +113,15 @@
     }
 
+    @Override
     public int getColumnCount() {
         return 2;
     }
 
+    @Override
     public int getRowCount() {
         return tags.size();
     }
 
+    @Override
     public Object getValueAt(int rowIndex, int columnIndex) {
         if (rowIndex >= getRowCount())
@@ -335,5 +338,5 @@
      */
     public void ensureOneTag() {
-        if (tags.size() == 0) {
+        if (tags.isEmpty()) {
             appendNewTag();
         }
@@ -528,4 +531,5 @@
                 tags,
                 new Comparator<TagModel>() {
+                    @Override
                     public int compare(TagModel self, TagModel other) {
                         return self.getName().compareTo(other.getName());
Index: /trunk/src/org/openstreetmap/josm/gui/tagging/TagEditorPanel.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/tagging/TagEditorPanel.java	(revision 6063)
+++ /trunk/src/org/openstreetmap/josm/gui/tagging/TagEditorPanel.java	(revision 6064)
@@ -3,7 +3,10 @@
 
 import java.awt.BorderLayout;
+import java.awt.Component;
 import java.awt.GridBagConstraints;
 import java.awt.GridBagLayout;
 import java.awt.Insets;
+import java.awt.event.FocusAdapter;
+import java.awt.event.FocusEvent;
 import java.util.EnumSet;
 
@@ -58,4 +61,8 @@
     }
 
+    public void setNextFocusComponent(Component nextFocusComponent) {
+        tagTable.setNextFocusComponent(nextFocusComponent);
+    }
+    
     /**
      * builds the panel with the button row
@@ -116,4 +123,10 @@
             });
         }
+        
+        addFocusListener(new FocusAdapter() {
+            @Override public void focusGained(FocusEvent e) {
+                tagTable.requestFocusInCell(0, 0);
+            }
+        });
     }
 
Index: /trunk/src/org/openstreetmap/josm/gui/tagging/TagTable.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/tagging/TagTable.java	(revision 6063)
+++ /trunk/src/org/openstreetmap/josm/gui/tagging/TagTable.java	(revision 6064)
@@ -45,5 +45,7 @@
     /** the table cell editor used by this table */
     private TagCellEditor editor = null;
-
+    private final TagEditorModel model;
+    private Component nextFocusComponent;
+        
     /** a list of components to which focus can be transferred without stopping
      * cell editing this table.
@@ -91,4 +93,5 @@
      */
     class SelectNextColumnCellAction extends AbstractAction  {
+        @Override
         public void actionPerformed(ActionEvent e) {
             run();
@@ -101,5 +104,10 @@
                 getCellEditor().stopCellEditing();
             }
-
+            
+            if (row==-1 && col==-1) {
+                requestFocusInCell(0, 0);
+                return;
+            }
+        
             if (col == 0) {
                 col++;
@@ -110,10 +118,16 @@
                 // we are at the end. Append an empty row and move the focus
                 // to its second column
-                TagEditorModel model = (TagEditorModel)getModel();
-                model.appendNewTag();
-                col=0;
-                row++;
-            }
-            changeSelection(row, col, false, false);
+                String key = ((TagModel)model.getValueAt(row, 0)).getName();
+                if (!key.trim().isEmpty()) {
+                    model.appendNewTag();
+                    col=0;
+                    row++;
+                } else {
+                    clearSelection();
+                    if (nextFocusComponent!=null)
+                        nextFocusComponent.requestFocusInWindow();
+                    return;
+                }
+            }
             requestFocusInCell(row,col);
         }
@@ -143,5 +157,4 @@
                 row--;
             }
-            changeSelection(row, col, false, false);
             requestFocusInCell(row,col);
         }
@@ -184,5 +197,4 @@
         protected void deleteTagNames() {
             int[] rows = getSelectedRows();
-            TagEditorModel model = (TagEditorModel)getModel();
             model.deleteTagNames(rows);
         }
@@ -193,5 +205,4 @@
         protected void deleteTagValues() {
             int[] rows = getSelectedRows();
-            TagEditorModel model = (TagEditorModel)getModel();
             model.deleteTagValues(rows);
         }
@@ -202,5 +213,4 @@
         protected void deleteTags() {
             int[] rows = getSelectedRows();
-            TagEditorModel model = (TagEditorModel)getModel();
             model.deleteTags(rows);
         }
@@ -230,5 +240,4 @@
             }
 
-            TagEditorModel model = (TagEditorModel)getModel();
             if (model.getRowCount() == 0) {
                 model.ensureOneTag();
@@ -277,9 +286,12 @@
                 getCellEditor().stopCellEditing();
             }
-            ((TagEditorModel)getModel()).appendNewTag();
-            final int rowIdx = getModel().getRowCount()-1;
-            requestFocusInCell(rowIdx, 0);
-        }
-
+            final int rowIdx = model.getRowCount()-1;
+            String key = ((TagModel)model.getValueAt(rowIdx, 0)).getName();
+            if (!key.trim().isEmpty()) {
+                model.appendNewTag();
+            } 
+            requestFocusInCell(model.getRowCount()-1, 0);
+        }
+            
         protected void updateEnabledState() {
             setEnabled(TagTable.this.isEnabled());
@@ -356,4 +368,5 @@
     public TagTable(TagEditorModel model) {
         super(model, new TagTableColumnModel(model.getColumnSelectionModel()), model.getRowSelectionModel());
+        this.model = model;
         init();
     }
@@ -419,4 +432,8 @@
     }
 
+    public void setNextFocusComponent(Component nextFocusComponent) {
+        this.nextFocusComponent = nextFocusComponent;
+    }
+    
     public TagCellEditor getTableCellEditor() {
         return editor;
@@ -445,4 +462,5 @@
 
     public void requestFocusInCell(final int row, final int col) {
+        changeSelection(row, col, false, false);
         editCellAt(row, col);
         Component c = getEditorComponent();
