Index: /applications/editors/josm/plugins/importvec/src/com/kitfox/svg/SVGElement.java
===================================================================
--- /applications/editors/josm/plugins/importvec/src/com/kitfox/svg/SVGElement.java	(revision 23711)
+++ /applications/editors/josm/plugins/importvec/src/com/kitfox/svg/SVGElement.java	(revision 23712)
@@ -419,4 +419,12 @@
     public void loaderEndElement(SVGLoaderHelper helper) throws SVGParseException
     {
+        try
+        {
+            build();
+        }
+        catch (SVGException se)
+        {
+            throw new SVGParseException(se);
+        }
     }
     
Index: /applications/editors/josm/plugins/importvec/src/com/kitfox/svg/Use.java
===================================================================
--- /applications/editors/josm/plugins/importvec/src/com/kitfox/svg/Use.java	(revision 23711)
+++ /applications/editors/josm/plugins/importvec/src/com/kitfox/svg/Use.java	(revision 23712)
@@ -103,9 +103,9 @@
         if (getPres(sty.setName("height"))) height = sty.getFloatValueWithUnits();
 
-        /*if (getPres(sty.setName("xlink:href")))
+        if (getPres(sty.setName("xlink:href")))
         {
             URI src = sty.getURIValue(getXMLBase());
-            href = diagram.getUniverse().getElement(src);
-        }*/
+            href = diagram.getElement(src.getFragment());
+        }
         
         //Determine use offset/scale
Index: /applications/editors/josm/plugins/importvec/src/org/openstreetmap/josm/plugins/importvec/ImportDialog.java
===================================================================
--- /applications/editors/josm/plugins/importvec/src/org/openstreetmap/josm/plugins/importvec/ImportDialog.java	(revision 23711)
+++ /applications/editors/josm/plugins/importvec/src/org/openstreetmap/josm/plugins/importvec/ImportDialog.java	(revision 23712)
@@ -73,5 +73,5 @@
     public int getCurveSteps() {
         try {
-            int result = NumberFormat.getIntegerInstance().parse(tsdiv.getText()).intValue();
+            int result = NumberFormat.getIntegerInstance().parse(tsteps.getText()).intValue();
             if (result < 1)
                 return 1;
Index: /applications/editors/josm/plugins/importvec/src/org/openstreetmap/josm/plugins/importvec/ImportVectorAction.java
===================================================================
--- /applications/editors/josm/plugins/importvec/src/org/openstreetmap/josm/plugins/importvec/ImportVectorAction.java	(revision 23711)
+++ /applications/editors/josm/plugins/importvec/src/org/openstreetmap/josm/plugins/importvec/ImportVectorAction.java	(revision 23712)
@@ -7,5 +7,7 @@
 import java.awt.geom.PathIterator;
 import java.awt.geom.Point2D;
+import java.awt.geom.Rectangle2D;
 import java.io.File;
+import java.io.FileInputStream;
 import java.io.IOException;
 import java.net.URI;
@@ -17,10 +19,6 @@
 import javax.swing.JFileChooser;
 import javax.swing.filechooser.FileFilter;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.parsers.SAXParserFactory;
 
 import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.actions.DiskAccessAction;
-import org.openstreetmap.josm.actions.ExtensionFileFilter;
 import org.openstreetmap.josm.actions.JosmAction;
 import org.openstreetmap.josm.command.AddCommand;
@@ -30,5 +28,4 @@
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.osm.Node;
-import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.data.projection.Mercator;
@@ -37,10 +34,11 @@
 import org.openstreetmap.josm.io.OsmTransferException;
 import org.openstreetmap.josm.tools.Shortcut;
+import org.xml.sax.InputSource;
 import org.xml.sax.SAXException;
+import org.xml.sax.XMLReader;
+import org.xml.sax.helpers.XMLReaderFactory;
 
 import com.kitfox.svg.SVGDiagram;
-import com.kitfox.svg.SVGElement;
 import com.kitfox.svg.SVGLoader;
-import com.kitfox.svg.SVGRoot;
 import com.kitfox.svg.ShapeElement;
 
@@ -69,5 +67,5 @@
             public boolean accept(File f) {
                 if (f.isDirectory())
-                    return false;
+                    return true;
                 else {
                     String name = f.getName().toLowerCase();
@@ -77,5 +75,5 @@
             @Override
             public String getDescription() {
-                return tr("SVG images (*.svg)");
+                return tr("SVG Drawings (*.svg)");
             }
 
@@ -117,4 +115,5 @@
         if (dlg.getValue() != 1)
             return;
+        dlg.saveSettings();
 
         File[] files = fc.getSelectedFiles();
@@ -155,5 +154,5 @@
             if (currentway == null)
                 throw new IOException("Shape is started incorectly");
-            Node nd = new Node(projection.eastNorth2latlon(center.add(x*scale, y*scale)));
+            Node nd = new Node(projection.eastNorth2latlon(center.add(x*scale, -y*scale)));
             if (nd.getCoor().isOutSideWorld())
                 throw new IOException("Shape goes outside the world");
@@ -189,6 +188,6 @@
                 double t) {
             return new Point2D.Double(
-                    cube(1-t)*ax+3*sqr(1-t)*t*bx+3*(1-5)*t*t*cx+t*t*t*dx,
-                    cube(1-t)*ay+3*sqr(1-t)*t*by+3*(1-5)*t*t*cy+t*t*t*dy);
+                    cube(1-t)*ax+3*sqr(1-t)*t*bx+3*(1-t)*t*t*cx+t*t*t*dx,
+                    cube(1-t)*ay+3*sqr(1-t)*t*by+3*(1-t)*t*t*cy+t*t*t*dy);
         }
 
@@ -201,54 +200,58 @@
             try {
                 for (File f : files) {
-                    SVGLoader loader = new SVGLoader(new URI("about:blank"));
-                    SAXParserFactory.newInstance().newSAXParser().parse(f, loader);
+                    SVGLoader loader = new SVGLoader(new URI("about:blank"),true);
+                    XMLReader rdr = XMLReaderFactory.createXMLReader();
+                    rdr.setContentHandler(loader);
+                    FileInputStream in = new FileInputStream(f);
+                    try {
+                        rdr.parse(new InputSource(in));
+                    } finally {
+                        in.close();
+                    }
                 
                     SVGDiagram diagram = loader.getLoadedDiagram();
-                    SVGRoot root = diagram.getRoot();
-                    for (SVGElement el : root.getChildren(null)) {
-                        if (el instanceof ShapeElement) {
-                            ShapeElement shape = (ShapeElement)el;
-                            PathIterator it = shape.getShape().getPathIterator(null);
-                            
-                            while (!it.isDone()) {
-                                double[] coords = new double[6];
-                                switch (it.currentSegment(coords)) {
-                                case PathIterator.SEG_MOVETO:
-                                    currentway = new Way();
-                                    ways.add(currentway);
-                                    appendNode(coords[0],coords[1]);
-                                    break;
-                                case PathIterator.SEG_LINETO:
-                                    appendNode(coords[0],coords[1]);
-                                    break;
-                                case PathIterator.SEG_CLOSE:
-                                    currentway.addNode(currentway.firstNode());
-                                    break;
-                                case PathIterator.SEG_QUADTO:
-                                    double lastx = lastX;
-                                    double lasty = lastY;
-                                    for (int i = 1;i<Settings.getCurveSteps();i++) {
-                                        appendNode(interpolate_quad(lastx,lasty,coords[0],coords[1],coords[2],coords[3],(double)i/Settings.getCurveSteps()));
-                                    }
-                                    appendNode(coords[2],coords[3]);
-                                    break;
-                                case PathIterator.SEG_CUBICTO:
-                                    lastx = lastX;
-                                    lasty = lastY;
-                                    for (int i = 1;i<Settings.getCurveSteps();i++) {
-                                        appendNode(interpolate_cubic(lastx,lasty,coords[0],coords[1],coords[2],coords[3],coords[4],coords[5],(double)i/Settings.getCurveSteps()));
-                                    }
-                                    appendNode(coords[4],coords[5]);
-                                    break;
-                                }
+                    ShapeElement shape = diagram.getRoot();
+                    Rectangle2D bbox = shape.getBoundingBox();
+                    this.center = this.center.add(-bbox.getCenterX()*scale, bbox.getCenterY()*scale);
+                    PathIterator it = shape.getShape().getPathIterator(null);
+                    while (!it.isDone()) {
+                        double[] coords = new double[6];
+                        switch (it.currentSegment(coords)) {
+                        case PathIterator.SEG_MOVETO:
+                            currentway = new Way();
+                            ways.add(currentway);
+                            appendNode(coords[0],coords[1]);
+                            break;
+                        case PathIterator.SEG_LINETO:
+                            appendNode(coords[0],coords[1]);
+                            break;
+                        case PathIterator.SEG_CLOSE:
+                            currentway.addNode(currentway.firstNode());
+                            break;
+                        case PathIterator.SEG_QUADTO:
+                            double lastx = lastX;
+                            double lasty = lastY;
+                            for (int i = 1;i<Settings.getCurveSteps();i++) {
+                                appendNode(interpolate_quad(lastx,lasty,coords[0],coords[1],coords[2],coords[3],(double)i/Settings.getCurveSteps()));
                             }
-                            
-                        } 
-                        
+                            appendNode(coords[2],coords[3]);
+                            break;
+                        case PathIterator.SEG_CUBICTO:
+                            lastx = lastX;
+                            lasty = lastY;
+                            for (int i = 1;i<Settings.getCurveSteps();i++) {
+                                appendNode(interpolate_cubic(lastx,lasty,coords[0],coords[1],coords[2],coords[3],coords[4],coords[5],(double)i/Settings.getCurveSteps()));
+                            }
+                            appendNode(coords[4],coords[5]);
+                            break;
+                        }
+                        it.next();
                     }
                     if (cancelled) return;
                 }
-            } catch(ParserConfigurationException e) {
-                throw new IOException(e.getMessage(), e);
+            } catch(SAXException e) {
+                throw e;
+            } catch(IOException e) {
+                throw e;
             } catch(Exception e) {
                 throw new IOException(e);
