diff --git a/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetTagsPanel.java b/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetTagsPanel.java
index 69e6860..4f540ec 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetTagsPanel.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetTagsPanel.java
@@ -25,7 +25,7 @@ protected void build() {
         setLayout(new BorderLayout());
         setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
         model = new TagEditorModel();
-        TagTable tblTags = new TagTable(model);
+        TagTable tblTags = new TagTable(model, 0);
         tblTags.setEnabled(false);
         add(new JScrollPane(tblTags), BorderLayout.CENTER);
     }
diff --git a/src/org/openstreetmap/josm/gui/io/TagSettingsPanel.java b/src/org/openstreetmap/josm/gui/io/TagSettingsPanel.java
index 3eee75d..4537314 100644
--- a/src/org/openstreetmap/josm/gui/io/TagSettingsPanel.java
+++ b/src/org/openstreetmap/josm/gui/io/TagSettingsPanel.java
@@ -21,7 +21,7 @@
 public class TagSettingsPanel extends JPanel implements TableModelListener {
 
     /** checkbox for selecting whether an atomic upload is to be used  */
-    private final TagEditorPanel pnlTagEditor = new TagEditorPanel(null);
+    private final TagEditorPanel pnlTagEditor = new TagEditorPanel(null, null, Changeset.MAX_CHANGESET_TAG_LENGTH);
     /** the model for the changeset comment */
     private final transient ChangesetCommentModel changesetCommentModel;
     private final transient ChangesetCommentModel changesetSourceModel;
diff --git a/src/org/openstreetmap/josm/gui/tagging/TagCellEditor.java b/src/org/openstreetmap/josm/gui/tagging/TagCellEditor.java
index caf2312..9d22738 100644
--- a/src/org/openstreetmap/josm/gui/tagging/TagCellEditor.java
+++ b/src/org/openstreetmap/josm/gui/tagging/TagCellEditor.java
@@ -29,9 +29,13 @@
 
     /**
      * constructor
+     * @param maxCharacters maximum number of characters allowed, 0 for unlimited
      */
-    public TagCellEditor() {
+    public TagCellEditor(int maxCharacters) {
         editor = new AutoCompletingTextField(0, false);
+        if (maxCharacters > 0) {
+            editor.setMaxChars(maxCharacters);
+        }
         editor.setBorder(BorderFactory.createEmptyBorder(1, 1, 1, 1));
     }
 
diff --git a/src/org/openstreetmap/josm/gui/tagging/TagEditorPanel.java b/src/org/openstreetmap/josm/gui/tagging/TagEditorPanel.java
index fe4eaf1..88b4742 100644
--- a/src/org/openstreetmap/josm/gui/tagging/TagEditorPanel.java
+++ b/src/org/openstreetmap/josm/gui/tagging/TagEditorPanel.java
@@ -35,7 +35,7 @@
     /** the tag editor model */
     private TagEditorModel model;
     /** the tag table */
-    private TagTable tagTable;
+    private final TagTable tagTable;
 
     private PresetListPanel presetListPanel;
     private final transient PresetHandler presetHandler;
@@ -47,7 +47,6 @@
      */
     protected JPanel buildTagTableEditorPanel() {
         JPanel pnl = new JPanel();
-        tagTable = new TagTable(model);
         pnl.setLayout(new BorderLayout());
         pnl.add(new JScrollPane(tagTable), BorderLayout.CENTER);
         if (presetHandler != null) {
@@ -141,7 +140,7 @@ public void tableChanged(TableModelEvent e) {
      * internally and can be retrieved with {@link #getModel()}.
      */
     public TagEditorPanel(PresetHandler presetHandler) {
-        this(null, presetHandler);
+        this(null, presetHandler, 0);
     }
 
     /**
@@ -149,13 +148,15 @@ public TagEditorPanel(PresetHandler presetHandler) {
      * {@code model} is null, a new model is created.
      *
      * @param model the tag editor model
+     * @param maxCharacters maximum number of characters allowed, 0 for unlimited
      */
-    public TagEditorPanel(TagEditorModel model, PresetHandler presetHandler) {
+    public TagEditorPanel(TagEditorModel model, PresetHandler presetHandler, int maxCharacters) {
         this.model = model;
         this.presetHandler = presetHandler;
         if (this.model == null) {
             this.model = new TagEditorModel();
         }
+        this.tagTable = new TagTable(this.model, maxCharacters);
         build();
     }
 
diff --git a/src/org/openstreetmap/josm/gui/tagging/TagTable.java b/src/org/openstreetmap/josm/gui/tagging/TagTable.java
index 98c91bb..0193f21 100644
--- a/src/org/openstreetmap/josm/gui/tagging/TagTable.java
+++ b/src/org/openstreetmap/josm/gui/tagging/TagTable.java
@@ -392,8 +392,9 @@ public RunnableAction getPasteAction() {
 
     /**
      * initialize the table
+     * @param maxCharacters maximum number of characters allowed for keys and values, 0 for unlimited
      */
-    protected final void init() {
+    protected final void init(int maxCharacters) {
         setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
         setRowSelectionAllowed(true);
         setColumnSelectionAllowed(true);
@@ -425,7 +426,7 @@ protected final void init() {
 
         // create the table cell editor and set it to key and value columns
         //
-        TagCellEditor tmpEditor = new TagCellEditor();
+        TagCellEditor tmpEditor = new TagCellEditor(maxCharacters);
         setRowHeight(tmpEditor.getEditor().getPreferredSize().height);
         setTagCellEditor(tmpEditor);
     }
@@ -434,11 +435,12 @@ protected final void init() {
      * Creates a new tag table
      *
      * @param model the tag editor model
+     * @param maxCharacters maximum number of characters allowed for keys and values, 0 for unlimited
      */
-    public TagTable(TagEditorModel model) {
+    public TagTable(TagEditorModel model, int maxCharacters) {
         super(model, new TagTableColumnModel(model.getColumnSelectionModel()), model.getRowSelectionModel());
         this.model = model;
-        init();
+        init(maxCharacters);
     }
 
     @Override
