Index: trunk/src/org/openstreetmap/josm/gui/history/HistoryLoadTask.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/history/HistoryLoadTask.java	(revision 5858)
+++ trunk/src/org/openstreetmap/josm/gui/history/HistoryLoadTask.java	(revision 5859)
@@ -161,6 +161,4 @@
     protected void cancel() {
         System.out.println("Cancel!");
-        //OsmApi.getOsmApi().cancel();
-        // fix #8601 : could not cancel when server is extremely slow
         if (reader!=null) reader.cancel();
         canceled = true;
Index: trunk/src/org/openstreetmap/josm/io/OsmBzip2Importer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/OsmBzip2Importer.java	(revision 5858)
+++ trunk/src/org/openstreetmap/josm/io/OsmBzip2Importer.java	(revision 5859)
@@ -22,5 +22,5 @@
     @Override
     public void importData(File file, ProgressMonitor progressMonitor) throws IOException, IllegalDataException {
-        importData(getBZip2InputStream(new FileInputStream(file)), file);
+        importData(getBZip2InputStream(new FileInputStream(file)), file, progressMonitor);
     }
 }
Index: trunk/src/org/openstreetmap/josm/io/OsmChangeImporter.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/OsmChangeImporter.java	(revision 5858)
+++ trunk/src/org/openstreetmap/josm/io/OsmChangeImporter.java	(revision 5859)
@@ -38,9 +38,9 @@
             
             if (file.getName().endsWith(".osc")) {
-                importData(in, file);
+                importData(in, file, progressMonitor);
             } else if (file.getName().endsWith(".gz")) {
-                importData(getGZipInputStream(in), file);
+                importData(getGZipInputStream(in), file, progressMonitor);
             } else {
-                importData(getBZip2InputStream(in), file);
+                importData(getBZip2InputStream(in), file, progressMonitor);
             }
             
@@ -52,5 +52,9 @@
 
     protected void importData(InputStream in, final File associatedFile) throws IllegalDataException {
-        final DataSet dataSet = OsmChangeReader.parseDataSet(in, NullProgressMonitor.INSTANCE);
+        importData(in, associatedFile, NullProgressMonitor.INSTANCE);
+    }
+    
+    protected void importData(InputStream in, final File associatedFile, ProgressMonitor  progressMonitor) throws IllegalDataException {
+        final DataSet dataSet = OsmChangeReader.parseDataSet(in, progressMonitor);
         final OsmDataLayer layer = new OsmDataLayer(dataSet, associatedFile.getName(), associatedFile);
         addDataLayer(dataSet, layer, associatedFile.getPath()); 
Index: trunk/src/org/openstreetmap/josm/io/OsmGzipImporter.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/OsmGzipImporter.java	(revision 5858)
+++ trunk/src/org/openstreetmap/josm/io/OsmGzipImporter.java	(revision 5859)
@@ -22,5 +22,5 @@
     @Override
     public void importData(File file, ProgressMonitor progressMonitor) throws IOException, IllegalDataException {
-        importData(getGZipInputStream(new FileInputStream(file)), file);
+        importData(getGZipInputStream(new FileInputStream(file)), file, progressMonitor);
     }
 }
Index: trunk/src/org/openstreetmap/josm/io/OsmImporter.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/OsmImporter.java	(revision 5858)
+++ trunk/src/org/openstreetmap/josm/io/OsmImporter.java	(revision 5859)
@@ -52,4 +52,8 @@
     }
 
+    /**
+     * Imports OSM data from file @param file
+     * This method supports progress monitoring and canceling by using @param progressMonitor
+     */
     @Override
     public void importData(File file, ProgressMonitor progressMonitor) throws IOException, IllegalDataException {
@@ -57,5 +61,5 @@
         try {
             in = new FileInputStream(file);
-            importData(in, file);
+            importData(in, file, progressMonitor);
         } catch (FileNotFoundException e) {
             e.printStackTrace();
@@ -68,7 +72,18 @@
     }
 
+    /**
+     * Imports OSM data from stream @param in , sitle will be generated from name of file @param associatedFile
+     */
     protected void importData(InputStream in, final File associatedFile) throws IllegalDataException {
+        importData(in, associatedFile, NullProgressMonitor.INSTANCE);
+    }
+    
+    /**
+     * Imports OSM data from stream @param in , layer name will be generated from name of file @param associatedFile
+     * This method supports progress monitoring and canceling by using @param progressMonitor
+     */
+    protected void importData(InputStream in, final File associatedFile, ProgressMonitor pm) throws IllegalDataException {
         final OsmImporterData data = loadLayer(in, associatedFile,
-                associatedFile == null ? OsmDataLayer.createNewName() : associatedFile.getName(), NullProgressMonitor.INSTANCE);
+                associatedFile == null ? OsmDataLayer.createNewName() : associatedFile.getName(), pm);
 
         // FIXME: remove UI stuff from IO subsystem
Index: trunk/src/org/openstreetmap/josm/io/OsmReader.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/OsmReader.java	(revision 5858)
+++ trunk/src/org/openstreetmap/josm/io/OsmReader.java	(revision 5859)
@@ -50,4 +50,6 @@
     protected XMLStreamReader parser;
 
+    protected boolean cancel;
+
     /** Used by plugins to register themselves as data postprocessors. */
     public static ArrayList<OsmServerReadPostprocessor> postprocessors;
@@ -128,4 +130,10 @@
         while (true) {
             int event = parser.next();
+            
+            if (cancel) {
+                cancel = false;
+                throwException(tr("Reading was canceled"));
+            }
+            
             if (event == XMLStreamConstants.START_ELEMENT) {
                 if (parser.getLocalName().equals("bounds")) {
@@ -561,4 +569,10 @@
             progressMonitor = NullProgressMonitor.INSTANCE;
         }
+        ProgressMonitor.CancelListener cancelListener = new ProgressMonitor.CancelListener() {
+            @Override public void operationCanceled() {
+                cancel = true;
+            }
+        };
+        progressMonitor.addCancelListener(cancelListener);
         CheckParameterUtil.ensureParameterNotNull(source, "source");
         try {
@@ -603,4 +617,5 @@
         } finally {
             progressMonitor.finishTask();
+            progressMonitor.removeCancelListener(cancelListener);
         }
     }
