Index: trunk/src/org/openstreetmap/josm/data/gpx/GpxExtensionCollection.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/gpx/GpxExtensionCollection.java	(revision 17845)
+++ trunk/src/org/openstreetmap/josm/data/gpx/GpxExtensionCollection.java	(revision 17846)
@@ -23,5 +23,5 @@
     private static final long serialVersionUID = 1L;
 
-    private final Stack<GpxExtension> childStack = new Stack<>();
+    private Stack<GpxExtension> childStack;
     private IWithAttributes parent;
 
@@ -47,4 +47,7 @@
      */
     public void openChild(String namespaceURI, String qName, Attributes atts) {
+        if (childStack == null) {
+            childStack = new Stack<>();
+        }
         GpxExtension child = new GpxExtension(namespaceURI, qName, atts);
         if (!childStack.isEmpty()) {
@@ -63,5 +66,5 @@
      */
     public void closeChild(String qName, String value) {
-        if (childStack.isEmpty())
+        if (childStack == null || childStack.isEmpty())
             throw new InvalidArgumentException("Can't close child " + qName + ", no element in stack.");
 
@@ -259,5 +262,8 @@
     @Override
     public void clear() {
-        childStack.clear();
+        if (childStack != null) {
+            childStack.clear();
+            childStack = null;
+        }
         super.clear();
     }
Index: trunk/src/org/openstreetmap/josm/data/gpx/GpxTrack.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/gpx/GpxTrack.java	(revision 17845)
+++ trunk/src/org/openstreetmap/josm/data/gpx/GpxTrack.java	(revision 17846)
@@ -105,4 +105,7 @@
 
     private Color getColorFromExtension() {
+        if (!hasExtensions()) {
+            return null;
+        }
         GpxExtension gpxd = getExtensions().find("gpxd", "color");
         if (gpxd != null) {
Index: trunk/src/org/openstreetmap/josm/data/gpx/IWithAttributes.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/gpx/IWithAttributes.java	(revision 17845)
+++ trunk/src/org/openstreetmap/josm/data/gpx/IWithAttributes.java	(revision 17846)
@@ -58,4 +58,13 @@
 
     /**
+     * Returns whether the {@link GpxExtensionCollection} instance has been created yet, should be overridden.
+     * The instance will usually be created on first call of {@link #getExtensions()}.
+     * @return whether the {@link GpxExtensionCollection} instance has been created yet
+     */
+    default boolean hasExtensions() {
+        return getExtensions() != null;
+    }
+
+    /**
      * Returns the extensions
      * @return the extensions
Index: trunk/src/org/openstreetmap/josm/data/gpx/WithAttributes.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/gpx/WithAttributes.java	(revision 17845)
+++ trunk/src/org/openstreetmap/josm/data/gpx/WithAttributes.java	(revision 17846)
@@ -25,5 +25,5 @@
      * The "exts" collection contains all extensions.
      */
-    private final GpxExtensionCollection exts = new GpxExtensionCollection(this);
+    private GpxExtensionCollection exts;
 
     /**
@@ -87,5 +87,13 @@
 
     @Override
+    public boolean hasExtensions() {
+        return exts != null;
+    }
+
+    @Override
     public GpxExtensionCollection getExtensions() {
+        if (exts == null) {
+            exts = new GpxExtensionCollection(this);
+        }
         return exts;
     }
Index: trunk/src/org/openstreetmap/josm/io/GpxReader.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/GpxReader.java	(revision 17845)
+++ trunk/src/org/openstreetmap/josm/io/GpxReader.java	(revision 17846)
@@ -507,5 +507,7 @@
                     if (!currentTrackSeg.isEmpty()) {
                         GpxTrackSegment seg = new GpxTrackSegment(currentTrackSeg);
-                        seg.getExtensions().addAll(currentExtensionCollection);
+                        if (!currentExtensionCollection.isEmpty()) {
+                            seg.getExtensions().addAll(currentExtensionCollection);
+                        }
                         currentTrack.add(seg);
                     }
@@ -519,5 +521,7 @@
                     convertUrlToLink(currentTrackAttr);
                     GpxTrack trk = new GpxTrack(new ArrayList<>(currentTrack), currentTrackAttr);
-                    trk.getExtensions().addAll(currentTrackExtensionCollection);
+                    if (!currentTrackExtensionCollection.isEmpty()) {
+                        trk.getExtensions().addAll(currentTrackExtensionCollection);
+                    }
                     data.addTrack(trk);
                     currentTrackExtensionCollection.clear();
