Index: trunk/src/org/openstreetmap/josm/actions/JoinNodeWayAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/JoinNodeWayAction.java	(revision 1923)
+++ trunk/src/org/openstreetmap/josm/actions/JoinNodeWayAction.java	(revision 1924)
@@ -59,5 +59,5 @@
         for (Map.Entry<Way, List<Integer>> insertPoint : insertPoints.entrySet()) {
             Way w = insertPoint.getKey();
-            List<Node> nodesToAdd = new ArrayList<Node>(w.getNodes());
+            List<Node> nodesToAdd = w.getNodes();
             List<Integer> is = insertPoint.getValue();
             pruneSuccsAndReverse(is);
Index: trunk/src/org/openstreetmap/josm/actions/PasteTagsAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/PasteTagsAction.java	(revision 1923)
+++ trunk/src/org/openstreetmap/josm/actions/PasteTagsAction.java	(revision 1924)
@@ -39,10 +39,6 @@
         for (Iterator<? extends OsmPrimitive> it = pasteBufferSubset.iterator(); it.hasNext();) {
             OsmPrimitive osm = it.next();
-            Map<String, String> m = osm.keys;
-            if(m == null) {
-                continue;
-            }
 
-            for (String key : m.keySet()) {
+            for (String key : osm.keySet()) {
                 clist.add(new ChangePropertyCommand(selectionSubset, key, osm.get(key)));
             }
Index: trunk/src/org/openstreetmap/josm/actions/SplitWayAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/SplitWayAction.java	(revision 1923)
+++ trunk/src/org/openstreetmap/josm/actions/SplitWayAction.java	(revision 1924)
@@ -281,7 +281,5 @@
         while (chunkIt.hasNext()) {
             Way wayToAdd = new Way();
-            if (selectedWay.keys != null) {
-                wayToAdd.keys = new HashMap<String, String>(selectedWay.keys);
-            }
+            wayToAdd.setKeys(selectedWay.getKeys());
             newWays.add(wayToAdd);
             wayToAdd.setNodes(chunkIt.next());
Index: trunk/src/org/openstreetmap/josm/actions/UnGlueAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/UnGlueAction.java	(revision 1923)
+++ trunk/src/org/openstreetmap/josm/actions/UnGlueAction.java	(revision 1924)
@@ -152,5 +152,5 @@
 
         Node c = new Node(selectedNode);
-        c.keys = null;
+        c.removeAll();
         c.setSelected(false);
         cmds.add(new ChangeCommand(selectedNode, c));
Index: trunk/src/org/openstreetmap/josm/actions/search/SearchCompiler.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/search/SearchCompiler.java	(revision 1923)
+++ trunk/src/org/openstreetmap/josm/actions/search/SearchCompiler.java	(revision 1924)
@@ -236,5 +236,5 @@
                 return osm.get(key) != null;
             case ANY_KEY:
-                for (String v:osm.keys.values()) {
+                for (String v:osm.getKeys().values()) {
                     if (v.equals(value))
                         return true;
@@ -244,5 +244,5 @@
                 return value.equals(osm.get(key));
             case ANY_KEY_REGEXP:
-                for (String v:osm.keys.values()) {
+                for (String v:osm.getKeys().values()) {
                     if (valuePattern.matcher(v).matches())
                         return true;
Index: trunk/src/org/openstreetmap/josm/command/DeleteCommand.java
===================================================================
--- trunk/src/org/openstreetmap/josm/command/DeleteCommand.java	(revision 1923)
+++ trunk/src/org/openstreetmap/josm/command/DeleteCommand.java	(revision 1924)
@@ -394,7 +394,5 @@
 
             Way wnew2 = new Way();
-            if (wnew.keys != null) {
-                wnew2.keys = new HashMap<String, String>(wnew.keys);
-            }
+            wnew2.setKeys(wnew.getKeys());
             wnew2.setNodes(n2);
             cmds.add(new AddCommand(wnew2));
Index: trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java	(revision 1923)
+++ trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java	(revision 1924)
@@ -236,6 +236,31 @@
     /**
      * The key/value list for this primitive.
-     */
+     * @deprecated This field will became private or protected in future, use api instead
+     */
+    @Deprecated
     public Map<String, String> keys;
+
+    /**
+     *
+     * @return Keys of this primitive. Changes made in returned map are not mapped
+     * back to the primitive, use setKeys() to modify the keys
+     * @since 1924
+     */
+    public Map<String, String> getKeys() {
+        // TODO More effective map
+        return new HashMap<String, String>(keys);
+    }
+
+    /**
+     *
+     * @since 1924
+     */
+    public void setKeys(Map<String, String> keys) {
+        if (keys == null) {
+            this.keys = null;
+        } else {
+            this.keys = new HashMap<String, String>(keys);
+        }
+    }
 
     /**
@@ -269,6 +294,6 @@
 
     /**
-     * Added in revision 1843
-     * Please do not use in plug-ins until this version becomes JOSM tested
+     *
+     * @since 1843
      */
     public final void removeAll() {
@@ -294,6 +319,6 @@
 
     /**
-     * Added in revision 1843
-     * Please do not use in plug-ins until this version becomes JOSM tested
+     *
+     * @since 1843
      */
     public final boolean hasKeys() {
Index: trunk/src/org/openstreetmap/josm/gui/mappaint/ElemStyle.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/mappaint/ElemStyle.java	(revision 1923)
+++ trunk/src/org/openstreetmap/josm/gui/mappaint/ElemStyle.java	(revision 1924)
@@ -2,5 +2,4 @@
 
 import java.util.Collection;
-import java.util.Map;
 
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
@@ -31,5 +30,5 @@
         return code;
     }
-    public boolean check(Map<String, String> keys)
+    public boolean check(OsmPrimitive primitive)
     {
         if(rules == null)
@@ -37,5 +36,5 @@
         for(Rule r : rules)
         {
-            String k = keys.get(r.key);
+            String k = primitive.get(r.key);
             String bv = OsmUtils.getNamedOsmBoolean(r.boolValue);
             if(k == null || (r.value != null && !k.equals(r.value))
Index: trunk/src/org/openstreetmap/josm/gui/mappaint/ElemStyles.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/mappaint/ElemStyles.java	(revision 1923)
+++ trunk/src/org/openstreetmap/josm/gui/mappaint/ElemStyles.java	(revision 1924)
@@ -7,5 +7,5 @@
 import java.util.LinkedList;
 import java.util.List;
-import java.util.Map;
+import java.util.Map.Entry;
 
 import org.openstreetmap.josm.Main;
@@ -37,12 +37,10 @@
             areasList = new LinkedList<AreaElemStyle>();
         }
-        private IconElemStyle getNode(Map<String, String> keys)
+        private IconElemStyle getNode(OsmPrimitive primitive)
         {
             IconElemStyle ret = null;
-            Iterator<String> iterator = keys.keySet().iterator();
-            while(iterator.hasNext())
-            {
-                String key = iterator.next();
-                String val = keys.get(key);
+            for (Entry<String, String> entry:primitive.entrySet()) {
+                String key = entry.getKey();
+                String val = entry.getValue();
                 IconElemStyle style;
                 if((style = icons.get("n" + key + "=" + val)) != null)
@@ -64,10 +62,10 @@
             for(IconElemStyle s : iconsList)
             {
-                if((ret == null || s.priority > ret.priority) && s.check(keys))
+                if((ret == null || s.priority > ret.priority) && s.check(primitive))
                     ret = s;
             }
             return ret;
         }
-        private ElemStyle get(Map<String, String> keys, boolean noclosed)
+        private ElemStyle get(OsmPrimitive primitive, boolean noclosed)
         {
             AreaElemStyle retArea = null;
@@ -75,9 +73,7 @@
             String linestring = null;
             HashMap<String, LineElemStyle> over = new HashMap<String, LineElemStyle>();
-            Iterator<String> iterator = keys.keySet().iterator();
-            while(iterator.hasNext())
-            {
-                String key = iterator.next();
-                String val = keys.get(key);
+            for (Entry<String, String> entry:primitive.entrySet()) {
+                String key = entry.getKey();
+                String val = entry.getValue();
                 AreaElemStyle styleArea;
                 LineElemStyle styleLine;
@@ -125,5 +121,5 @@
             {
                 if((retArea == null || s.priority > retArea.priority)
-                && (!noclosed || !s.closed) && s.check(keys))
+                && (!noclosed || !s.closed) && s.check(primitive))
                     retArea = s;
             }
@@ -131,10 +127,10 @@
             {
                 if((retLine == null || s.priority > retLine.priority)
-                && s.check(keys))
+                && s.check(primitive))
                     retLine = s;
             }
             for(LineElemStyle s : modifiersList)
             {
-                if(s.check(keys))
+                if(s.check(primitive))
                     over.put(s.getCode(), s);
             }
@@ -158,6 +154,6 @@
         public ElemStyle get(OsmPrimitive osm)
         {
-            return (osm.keys == null) ? null :
-            ((osm instanceof Node) ? getNode(osm.keys) : get(osm.keys,
+            return (!osm.hasKeys()) ? null :
+            ((osm instanceof Node) ? getNode(osm) : get(osm,
             osm instanceof Way && !((Way)osm).isClosed()));
         }
@@ -165,8 +161,8 @@
         public ElemStyle getArea(Way osm)
         {
-            if(osm.keys != null)
+            if(osm.hasKeys())
             {
                 /* force area mode also for unclosed ways */
-                ElemStyle style = get(osm.keys, false);
+                ElemStyle style = get(osm, false);
                 if(style != null && style instanceof AreaElemStyle)
                     return style;
@@ -177,10 +173,10 @@
         public IconElemStyle getIcon(OsmPrimitive osm)
         {
-            return (osm.keys == null) ? null : getNode(osm.keys);
+            return osm.hasKeys() ? getNode(osm): null;
         }
 
         public boolean isArea(OsmPrimitive o)
         {
-            if(o.keys != null && !(o instanceof Node))
+            if(o.hasKeys() && !(o instanceof Node))
             {
                 boolean noclosed = o instanceof Way && !((Way)o).isClosed();
@@ -200,5 +196,5 @@
                 for(AreaElemStyle s : areasList)
                 {
-                    if(!(s.closed && noclosed) && s.check(o.keys))
+                    if(!(s.closed && noclosed) && s.check(o))
                         return true;
                 }
Index: trunk/src/org/openstreetmap/josm/io/OsmReader.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/OsmReader.java	(revision 1923)
+++ trunk/src/org/openstreetmap/josm/io/OsmReader.java	(revision 1924)
@@ -85,5 +85,5 @@
         public void copyTo(OsmPrimitive osm) {
             osm.id = id;
-            osm.keys = keys;
+            osm.setKeys(keys);
             osm.modified = modified;
             osm.setSelected(selected);
