Index: applications/editors/josm/plugins/ColumbusCSV/.settings/org.eclipse.jdt.core.prefs
===================================================================
--- applications/editors/josm/plugins/ColumbusCSV/.settings/org.eclipse.jdt.core.prefs	(revision 30767)
+++ applications/editors/josm/plugins/ColumbusCSV/.settings/org.eclipse.jdt.core.prefs	(revision 30768)
@@ -1,7 +1,100 @@
 eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
+org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
+org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
+org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
+org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
 org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
 org.eclipse.jdt.core.compiler.compliance=1.7
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
 org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
+org.eclipse.jdt.core.compiler.problem.deadCode=warning
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
 org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
+org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
+org.eclipse.jdt.core.compiler.problem.nullReference=warning
+org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
+org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
+org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warning
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=enabled
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
 org.eclipse.jdt.core.compiler.source=1.7
Index: applications/editors/josm/plugins/ColumbusCSV/.settings/org.eclipse.jdt.ui.prefs
===================================================================
--- applications/editors/josm/plugins/ColumbusCSV/.settings/org.eclipse.jdt.ui.prefs	(revision 30768)
+++ applications/editors/josm/plugins/ColumbusCSV/.settings/org.eclipse.jdt.ui.prefs	(revision 30768)
@@ -0,0 +1,60 @@
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_missing_override_annotations_interface_methods=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_functional_interfaces=false
+sp_cleanup.convert_to_enhanced_for_loop=false
+sp_cleanup.correct_indentation=false
+sp_cleanup.format_source_code=false
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.insert_inferred_type_arguments=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_type_abstract_if_missing_method=false
+sp_cleanup.make_variable_declarations_final=true
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_redundant_type_arguments=false
+sp_cleanup.remove_trailing_whitespaces=false
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=false
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_anonymous_class_creation=false
+sp_cleanup.use_blocks=false
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_lambda=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
+sp_cleanup.use_type_arguments=false
Index: applications/editors/josm/plugins/ColumbusCSV/build.xml
===================================================================
--- applications/editors/josm/plugins/ColumbusCSV/build.xml	(revision 30767)
+++ applications/editors/josm/plugins/ColumbusCSV/build.xml	(revision 30768)
@@ -1,22 +1,22 @@
 <?xml version="1.0" encoding="utf-8"?>
 <project name="ColumbusCSV" default="dist" basedir=".">
-	<!-- enter the SVN commit message -->
-	<property name="commit.message" value="Commit message"/>
+    <!-- enter the SVN commit message -->
+    <property name="commit.message" value="Commit message"/>
     <!-- Enter the *lowest* JOSM version this plugin is currently compatible with -->
     <property name="plugin.main.version" value="7001"/>
-	
-	<!-- Plugin meta data -->
+    
+    <!-- Plugin meta data -->
     <property name="plugin.author" value="Oliver Wieland"/>
     <property name="plugin.class" value="org.openstreetmap.josm.plugins.columbusCSV.ColumbusCSVPlugin"/>
     <property name="plugin.description" value="Imports proprietary CSV files of the Columbus/Visiontac V-900 GPS logger into a GPX layer."/>
     <property name="plugin.link" value="http://wiki.openstreetmap.org/wiki/JOSM/Plugins/ColumbusCSV"/>
-	<!-- Plugin icon -->
+    <!-- Plugin icon -->
     <property name="plugin.icon" value="images/colcsvicon.png"/>
-	
-	<!-- Plugin version info -->
-	<property name="plugin.version" value="${version.entry.commit.revision}"/>
-	<property name="plugin.stage" value="60"/>
+    
+    <!-- Plugin version info -->
+    <property name="plugin.version" value="${version.entry.commit.revision}"/>
+    <property name="plugin.stage" value="60"/>
     
     <!-- ** include targets that all plugins have in common ** -->
-    <import file="../build-common.xml"/>	
+    <import file="../build-common.xml"/>    
 </project>
Index: applications/editors/josm/plugins/ColumbusCSV/src/org/openstreetmap/josm/plugins/columbusCSV/ColumbusCSVImporter.java
===================================================================
--- applications/editors/josm/plugins/ColumbusCSV/src/org/openstreetmap/josm/plugins/columbusCSV/ColumbusCSVImporter.java	(revision 30767)
+++ applications/editors/josm/plugins/ColumbusCSV/src/org/openstreetmap/josm/plugins/columbusCSV/ColumbusCSVImporter.java	(revision 30768)
@@ -40,111 +40,97 @@
     public static final String COLUMBUS_FILE_EXT_DOT = "." + COLUMBUS_FILE_EXT;
 
+    /**
+     * Constructs a new {@code ColumbusCSVImporter}.
+     */
     public ColumbusCSVImporter() {
-	super(new ExtensionFileFilter(COLUMBUS_FILE_EXT, COLUMBUS_FILE_EXT,
-		tr("Columbus V-900 CSV Files") + " (*" + COLUMBUS_FILE_EXT_DOT
-			+ ")"));
+        super(new ExtensionFileFilter(COLUMBUS_FILE_EXT, COLUMBUS_FILE_EXT,
+            tr("Columbus V-900 CSV Files") + " (*" + COLUMBUS_FILE_EXT_DOT + ")"));
     }
 
     @Override
     public boolean acceptFile(File pathname) {
-	try {
-	    // do some deep packet inspection...
-	    boolean ok = super.acceptFile(pathname)
-		    && ColumbusCSVReader.isColumbusFile(pathname);
-	    return ok;
-	} catch (Exception ex) {
-	    return false;
-	}
+        try {
+            // do some deep packet inspection...
+            return super.acceptFile(pathname)
+                && ColumbusCSVReader.isColumbusFile(pathname);
+        } catch (Exception ex) {
+            return false;
+        }
     }
 
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.openstreetmap.josm.io.FileImporter#importData(java.io.File,
-     * org.openstreetmap.josm.gui.progress.ProgressMonitor)
-     */
     @Override
     public void importData(File file, ProgressMonitor progressMonitor)
-	    throws IOException, IllegalDataException {
-	String fn = file.getPath();
-
-	if (progressMonitor == null) { // make sure that there is a progress
-				       // monitor...
-	    progressMonitor = NullProgressMonitor.INSTANCE;
-	}
-
-	progressMonitor.beginTask(String.format(
-		tr("Importing CSV file ''%s''..."), file.getName(), 4));
-	progressMonitor.setTicksCount(1);
-
-	if (fn.toLowerCase().endsWith(COLUMBUS_FILE_EXT_DOT)) {
-	    try {
-		ColumbusCSVReader r = new ColumbusCSVReader();
-
-		// transform CSV into GPX
-		GpxData gpxData = r.transformColumbusCSV(fn);
-		assert (gpxData != null);
-		progressMonitor.setTicksCount(1);
-
-		r.dropBufferLists();
-
-		progressMonitor.setTicksCount(2);
-
-		GpxLayer gpxLayer = new GpxLayer(gpxData, file.getName());
-		assert (gpxLayer != null);
-
-		// add layer to show way points
-		Main.main.addLayer(gpxLayer);
-
-		progressMonitor.setTicksCount(3);
-
-		// ... and scale view appropriately - if wished by user
-		if (ColumbusCSVPreferences.zoomAfterImport()) {
-		    AutoScaleAction action = new AutoScaleAction("data");
-		    action.autoScale();
-		}
-		progressMonitor.setTicksCount(4);
-
-		if (Main.pref.getBoolean("marker.makeautomarkers", true)) {
-		    try {
-			MarkerLayer ml = new MarkerLayer(gpxData,
-				tr("Markers of ") + file.getName(), file,
-				gpxLayer);
-
-			assert (ml != null);
-			assert (ml.data != null);
-
-			System.out.println("Layer: " + ml);
-			System.out.println("Data: " + ml.data != null);
-			System.out.println("Data size: " + ml.data.size());
-
-			Main.main.addLayer(ml);
-			if (ml.data.size() > 0) {
-
-			} else {
-			    System.out
-				    .println("Warning: File contains no markers.");
-			}
-		    } catch (Exception exLayer) {
-			System.out.println(exLayer);
-			exLayer.printStackTrace(System.err);
-		    }
-		} else {
-		    System.out
-			    .println("Warning: Option 'marker.makeautomarkers' is not set; audio marker layer is not created.");
-		}
-	    } catch (Exception e) {
-		// catch and forward exception
-		e.printStackTrace(System.err);
-		throw new IllegalDataException(e);
-	    } finally { // take care of monitor...
-		progressMonitor.finishTask();
-	    }
-	} else {
-	    throw new IOException(
-		    tr(String
-			    .format("Unsupported file extension (file '%s' does not end with '%s')!",
-				    file.getName(), COLUMBUS_FILE_EXT)));
-	}
+        throws IOException, IllegalDataException {
+        String fn = file.getPath();
+    
+        if (progressMonitor == null) { // make sure that there is a progress monitor...
+            progressMonitor = NullProgressMonitor.INSTANCE;
+        }
+    
+        progressMonitor.beginTask(String.format(
+            tr("Importing CSV file ''%s''..."), file.getName(), 4));
+        progressMonitor.setTicksCount(1);
+    
+        if (fn.toLowerCase().endsWith(COLUMBUS_FILE_EXT_DOT)) {
+            try {
+                ColumbusCSVReader r = new ColumbusCSVReader();
+        
+                // transform CSV into GPX
+                GpxData gpxData = r.transformColumbusCSV(fn);
+                assert gpxData != null;
+                progressMonitor.setTicksCount(1);
+        
+                r.dropBufferLists();
+        
+                progressMonitor.setTicksCount(2);
+        
+                GpxLayer gpxLayer = new GpxLayer(gpxData, file.getName());
+                assert gpxLayer != null;
+        
+                // add layer to show way points
+                Main.main.addLayer(gpxLayer);
+        
+                progressMonitor.setTicksCount(3);
+        
+                // ... and scale view appropriately - if wished by user
+                if (ColumbusCSVPreferences.zoomAfterImport()) {
+                    AutoScaleAction action = new AutoScaleAction("data");
+                    action.autoScale();
+                }
+                progressMonitor.setTicksCount(4);
+        
+                if (Main.pref.getBoolean("marker.makeautomarkers", true)) {
+                    try {
+                        MarkerLayer ml = new MarkerLayer(gpxData,
+                            tr("Markers of ") + file.getName(), file, gpxLayer);
+            
+                        assert ml != null;
+                        assert ml.data != null;
+            
+                        Main.info("Layer: " + ml);
+                        Main.info("Data size: " + ml.data.size());
+            
+                        Main.main.addLayer(ml);
+                        if (ml.data.isEmpty()) {
+                            Main.warn("File contains no markers.");
+                        }
+                    } catch (Exception exLayer) {
+                        Main.error(exLayer);
+                    }
+                } else {
+                    Main.warn("Option 'marker.makeautomarkers' is not set; audio marker layer is not created.");
+                }
+            } catch (Exception e) {
+                // catch and forward exception
+                Main.error(e);
+                throw new IllegalDataException(e);
+            } finally { // take care of monitor...
+                progressMonitor.finishTask();
+            }
+        } else {
+            throw new IOException(
+                tr(String.format("Unsupported file extension (file '%s' does not end with '%s')!",
+                        file.getName(), COLUMBUS_FILE_EXT)));
+        }
     }
 }
Index: applications/editors/josm/plugins/ColumbusCSV/src/org/openstreetmap/josm/plugins/columbusCSV/ColumbusCSVPlugin.java
===================================================================
--- applications/editors/josm/plugins/ColumbusCSV/src/org/openstreetmap/josm/plugins/columbusCSV/ColumbusCSVPlugin.java	(revision 30767)
+++ applications/editors/josm/plugins/ColumbusCSV/src/org/openstreetmap/josm/plugins/columbusCSV/ColumbusCSVPlugin.java	(revision 30768)
@@ -27,23 +27,23 @@
  */
 public class ColumbusCSVPlugin extends Plugin {
-	private static PreferenceSetting columbusSettings;
-	/*
-	 * Plugin constructor (adds menu entry to file menu).
-	 */
-	public ColumbusCSVPlugin(PluginInformation info) {
-		super(info);
-		
-		ExtensionFileFilter.importers.add(new ColumbusCSVImporter());
-	}
-	
-	/**
+    private static PreferenceSetting columbusSettings;
+    /*
+     * Plugin constructor (adds menu entry to file menu).
+     */
+    public ColumbusCSVPlugin(PluginInformation info) {
+        super(info);
+        
+        ExtensionFileFilter.importers.add(new ColumbusCSVImporter());
+    }
+    
+    /**
      * Called in the preferences dialog to create a preferences page for the plugin,
      * if any available.
      */
     public PreferenceSetting getPreferenceSetting() {
-    	if (columbusSettings == null) {
-    		columbusSettings = new ColumbusCSVPreferences();
-    	}
-    	return columbusSettings;
+        if (columbusSettings == null) {
+            columbusSettings = new ColumbusCSVPreferences();
+        }
+        return columbusSettings;
     } 
 }
Index: applications/editors/josm/plugins/ColumbusCSV/src/org/openstreetmap/josm/plugins/columbusCSV/ColumbusCSVPreferences.java
===================================================================
--- applications/editors/josm/plugins/ColumbusCSV/src/org/openstreetmap/josm/plugins/columbusCSV/ColumbusCSVPreferences.java	(revision 30767)
+++ applications/editors/josm/plugins/ColumbusCSV/src/org/openstreetmap/josm/plugins/columbusCSV/ColumbusCSVPreferences.java	(revision 30768)
@@ -77,5 +77,5 @@
         Main.pref.put(IGNORE_VDOP, colCSVIgnoreVDOP.isSelected());
         Main.pref.put(WARN_CONVERSION_ERRORS, colCSVWarnConversionErrors.isSelected());
-        Main.pref.put(WARN_MISSING_AUDIO, colCSVWarnMissingAudio.isSelected());		
+        Main.pref.put(WARN_MISSING_AUDIO, colCSVWarnMissingAudio.isSelected());        
         return false;
     }
@@ -86,5 +86,5 @@
      */
     public static boolean showSummary() {
-	    return Main.pref.getBoolean(SHOW_SUMMARY, true);
+        return Main.pref.getBoolean(SHOW_SUMMARY, true);
     }
     
@@ -94,5 +94,5 @@
      */
     public static boolean zoomAfterImport() {
-	    return Main.pref.getBoolean(ZOOM_AFTER_IMPORT, true);
+        return Main.pref.getBoolean(ZOOM_AFTER_IMPORT, true);
     }
     
@@ -150,7 +150,7 @@
     }
 
-	public boolean isExpert() {
-		return false;
-	}
+    public boolean isExpert() {
+        return false;
+    }
     
 }
Index: applications/editors/josm/plugins/ColumbusCSV/src/org/openstreetmap/josm/plugins/columbusCSV/ColumbusCSVReader.java
===================================================================
--- applications/editors/josm/plugins/ColumbusCSV/src/org/openstreetmap/josm/plugins/columbusCSV/ColumbusCSVReader.java	(revision 30767)
+++ applications/editors/josm/plugins/ColumbusCSV/src/org/openstreetmap/josm/plugins/columbusCSV/ColumbusCSVReader.java	(revision 30768)
@@ -30,7 +30,9 @@
 import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.StringTokenizer;
 import java.util.zip.DataFormatException;
 
+import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.gpx.GpxData;
@@ -96,8 +98,8 @@
     private int firstVoxNumber = -1, lastVoxNumber = -1;
 
-    private HashMap<String, WayPoint> voxFiles = new HashMap<String, WayPoint>();
-    private Collection<Collection<WayPoint>> allTrackPts = new ArrayList<Collection<WayPoint>>();
-    private List<WayPoint> trackPts = new ArrayList<WayPoint>();
-    private List<WayPoint> allWpts = new ArrayList<WayPoint>();
+    private final Map<String, WayPoint> voxFiles = new HashMap<>();
+    private final Collection<Collection<WayPoint>> allTrackPts = new ArrayList<>();
+    private final List<WayPoint> trackPts = new ArrayList<>();
+    private final List<WayPoint> allWpts = new ArrayList<>();
     private String fileDir;
 
@@ -110,115 +112,113 @@
      * @throws DataFormatException
      */
-    public GpxData transformColumbusCSV(String fileName) throws IOException,
-	    IllegalDataException {
-	if (fileName == null || fileName.length() == 0) {
-	    throw new IllegalArgumentException(
-		    "File name must not be null or empty");
-	}
-
-	// GPX data structures
-	GpxData gpxData = new GpxData();
-
-	File f = new File(fileName);
-	fileDir = f.getParent();
-	FileInputStream fstream = new FileInputStream(fileName);
-	// Get the object of DataInputStream
-	DataInputStream in = new DataInputStream(fstream);
-	BufferedReader br = new BufferedReader(new InputStreamReader(in));
-	String strLine;
-	// Initial values
-	int line = 1;
-	initImport();
-	dropBufferLists();
-
-	int waypts = 0, trkpts = 0, audiopts = 0, missaudio = 0, rescaudio = 0;
-	try {
-	    // Read File Line By Line
-	    while ((strLine = br.readLine()) != null) {
-		String[] csvFields = getCSVLine(strLine); // Get the columns of
-							  // the current line
-		if (csvFields.length == 0 || line <= 1) { // Skip, if line is
-							  // header or contains
-							  // no data
-		    ++line;
-		    continue;
-		}
-
-		try {
-		    WayPoint wpt = createWayPoint(csvFields, fileDir);
-		    String wptType = (String) wpt.attr.get(TYPE_TAG);
-		    String oldWptType = csvFields[1];
-
-		    if ("T".equals(wptType)) { // point of track (T)
-			trackPts.add(wpt);
-			trkpts++;
-		    } else { // way point (C) / have voice file: V)
-			if (!wptType.equals(oldWptType)) { // type changed?
-			    if ("V".equals(oldWptType)) { // missing audiofile
-				missaudio++;
-			    }
-			    if ("C".equals(oldWptType)) { // rescued audiofile
-				rescaudio++;
-			    }
-			} else {
-			    if ("V".equals(wptType)) { // wpt with vox
-				audiopts++;
-			    }
-			}
-
-			gpxData.waypoints.add(wpt); // add the waypoint to the
-						    // track
-			waypts++;
-		    }
-
-		    allWpts.add(wpt);
-
-		    wpt.attr.remove(TYPE_TAG);
-		} catch (Exception ex) {
-		    br.close();
-		    throw new IllegalDataException(tr("Error in line " + line
-			    + ": " + ex.toString()));
-		}
-		++line;
-	    }
-	} finally {
-	    // Close the input stream
-	    br.close();
-	}
-
-	// do some sanity checks
-	assert (trackPts.size() == trkpts);
-	assert (gpxData.waypoints.size() == waypts);
-	assert (firstVoxNumber <= lastVoxNumber);
-
-	rescaudio += searchForLostAudioFiles(gpxData);
-
-	// compose the track
-	allTrackPts.add(trackPts);
-	GpxTrack trk = new ImmutableGpxTrack(allTrackPts,
-		Collections.<String, Object> emptyMap());
-	gpxData.tracks.add(trk);
-
-	assert (gpxData.routes.size() == 1);
-
-	// Issue conversion warning, if needed
-	if (ColumbusCSVPreferences.warnConversion()
-		&& (dateConversionErrors > 0 || dopConversionErrors > 0)) {
-	    String message = String.format(
-		    "%d date conversion faults and %d DOP conversion errors",
-		    dateConversionErrors, dopConversionErrors);
-	    ColumbusCSVUtils.showWarningMessage(tr(message));
-	}
-	// Show summary
-	if (ColumbusCSVPreferences.showSummary()) {
-	    showSummary(waypts, trkpts, audiopts, missaudio, rescaudio);
-	}
-
-	String desc = String.format(
-		"Converted by ColumbusCSV plugin from track file '%s'",
-		f.getName());
-	gpxData.attr.put(GpxData.META_DESC, desc);
-	gpxData.storageFile = f;
-	return gpxData;
+    public GpxData transformColumbusCSV(String fileName) throws IOException, IllegalDataException {
+        if (fileName == null || fileName.length() == 0) {
+            throw new IllegalArgumentException(
+                "File name must not be null or empty");
+        }
+    
+        // GPX data structures
+        GpxData gpxData = new GpxData();
+    
+        File f = new File(fileName);
+        fileDir = f.getParent();
+        FileInputStream fstream = new FileInputStream(fileName);
+        // Get the object of DataInputStream
+        DataInputStream in = new DataInputStream(fstream);
+        BufferedReader br = new BufferedReader(new InputStreamReader(in));
+        String strLine;
+        // Initial values
+        int line = 1;
+        initImport();
+        dropBufferLists();
+    
+        int waypts = 0, trkpts = 0, audiopts = 0, missaudio = 0, rescaudio = 0;
+        try {
+            // Read File Line By Line
+            while ((strLine = br.readLine()) != null) {
+                String[] csvFields = getCSVLine(strLine); // Get the columns of
+                                      // the current line
+                if (csvFields.length == 0 || line <= 1) { // Skip, if line is
+                                      // header or contains
+                                      // no data
+                    ++line;
+                    continue;
+                }
+    
+                try {
+                    WayPoint wpt = createWayPoint(csvFields, fileDir);
+                    String wptType = (String) wpt.attr.get(TYPE_TAG);
+                    String oldWptType = csvFields[1];
+        
+                    if ("T".equals(wptType)) { // point of track (T)
+                        trackPts.add(wpt);
+                        trkpts++;
+                    } else { // way point (C) / have voice file: V)
+                        if (!wptType.equals(oldWptType)) { // type changed?
+                            if ("V".equals(oldWptType)) { // missing audiofile
+                                missaudio++;
+                            }
+                            if ("C".equals(oldWptType)) { // rescued audiofile
+                                rescaudio++;
+                            }
+                        } else {
+                            if ("V".equals(wptType)) { // wpt with vox
+                                audiopts++;
+                            }
+                        }
+            
+                        gpxData.waypoints.add(wpt); // add the waypoint to the track
+                        waypts++;
+                    }
+        
+                    allWpts.add(wpt);
+        
+                    wpt.attr.remove(TYPE_TAG);
+                } catch (Exception ex) {
+                    br.close();
+                    throw new IllegalDataException(tr("Error in line " + line
+                        + ": " + ex.toString()), ex);
+                }
+                ++line;
+            }
+        } finally {
+            // Close the input stream
+            br.close();
+        }
+    
+        // do some sanity checks
+        assert trackPts.size() == trkpts;
+        assert gpxData.waypoints.size() == waypts;
+        assert firstVoxNumber <= lastVoxNumber;
+    
+        rescaudio += searchForLostAudioFiles(gpxData);
+    
+        // compose the track
+        allTrackPts.add(trackPts);
+        GpxTrack trk = new ImmutableGpxTrack(allTrackPts,
+            Collections.<String, Object> emptyMap());
+        gpxData.tracks.add(trk);
+    
+        assert gpxData.routes.size() == 1;
+    
+        // Issue conversion warning, if needed
+        if (ColumbusCSVPreferences.warnConversion()
+            && (dateConversionErrors > 0 || dopConversionErrors > 0)) {
+            String message = String.format(
+                "%d date conversion faults and %d DOP conversion errors",
+                dateConversionErrors, dopConversionErrors);
+            ColumbusCSVUtils.showWarningMessage(tr(message));
+        }
+        // Show summary
+        if (ColumbusCSVPreferences.showSummary()) {
+            showSummary(waypts, trkpts, audiopts, missaudio, rescaudio);
+        }
+    
+        String desc = String.format(
+            "Converted by ColumbusCSV plugin from track file '%s'",
+            f.getName());
+        gpxData.attr.put(GpxData.META_DESC, desc);
+        gpxData.storageFile = f;
+        return gpxData;
     }
 
@@ -232,42 +232,42 @@
      */
     public static boolean isColumbusFile(File file) throws IOException {
-	if (file == null) return false; 
-	
-	FileInputStream fstream = new FileInputStream(file);
-	// Get the object of DataInputStream
-	DataInputStream in = new DataInputStream(fstream);
-	BufferedReader br = new BufferedReader(new InputStreamReader(in));
-	String strLine;
-	// Initial values
-	int line = 0;
-	int columbusLines = 0;
-	try {
-	    // Read File Line By Line until we either exceed the maximum scan
-	    // lines or we are sure that we have a columbus file
-	    while ((strLine = br.readLine()) != null
-		    && (line < MAX_SCAN_LINES || columbusLines > MIN_SCAN_LINES)) {
-		String[] csvFields = getCSVLine(strLine); // Get the columns of
-							  // the current line
-		++line;
-		if (csvFields.length == 0 || line <= 1) { // Skip, if line is
-							  // header or contains
-							  // no data
-		    continue;
-		}
-
-		String wptType = csvFields[1];
-		// Check for columbus tag
-		if ("T".equals(wptType) || "V".equals(wptType)
-			|| "C".equals(wptType)) {
-		    // ok, we found one line but still not convinced ;-)
-		    columbusLines++;
-		}
-	    }
-	} finally {
-	    // Close the input stream
-	    br.close();
-	}
-
-	return columbusLines > MIN_SCAN_LINES;
+        if (file == null) return false; 
+        
+        FileInputStream fstream = new FileInputStream(file);
+        // Get the object of DataInputStream
+        DataInputStream in = new DataInputStream(fstream);
+        BufferedReader br = new BufferedReader(new InputStreamReader(in));
+        String strLine;
+        // Initial values
+        int line = 0;
+        int columbusLines = 0;
+        try {
+            // Read File Line By Line until we either exceed the maximum scan
+            // lines or we are sure that we have a columbus file
+            while ((strLine = br.readLine()) != null
+                && (line < MAX_SCAN_LINES || columbusLines > MIN_SCAN_LINES)) {
+                String[] csvFields = getCSVLine(strLine); // Get the columns of
+                                      // the current line
+                ++line;
+                if (csvFields.length == 0 || line <= 1) { // Skip, if line is
+                                      // header or contains
+                                      // no data
+                    continue;
+                }
+        
+                String wptType = csvFields[1];
+                // Check for columbus tag
+                if ("T".equals(wptType) || "V".equals(wptType)
+                    || "C".equals(wptType)) {
+                    // ok, we found one line but still not convinced ;-)
+                    columbusLines++;
+                }
+            }
+        } finally {
+            // Close the input stream
+            br.close();
+        }
+    
+        return columbusLines > MIN_SCAN_LINES;
     }
 
@@ -281,67 +281,62 @@
      */
     private int searchForLostAudioFiles(GpxData gpx) {
-	HashMap<String, WayPoint> voxFiles = getVoxFileMap();
-
-	int first, last;
-	first = getFirstVoxNumber();
-	last = getLastVoxNumber();
-
-	int rescuedFiles = 0;
-
-	for (int i = first; i < last; i++) {
-	    String voxFile = String.format("vox%05d.wav", i);
-	    String nextVoxFile = String.format("vox%05d.wav", i + 1);
-	    if (!voxFiles.containsKey(voxFile)) {
-		System.out.println("Found lost vox file " + voxFile);
-
-		File f = getVoxFilePath(voxFile);
-		WayPoint nearestWpt = null;
-		List<WayPoint> wpts = getAllWayPoints();
-		// Attach recording to the way point right before the next vox
-		// file
-		if (voxFiles.containsKey(nextVoxFile)) {
-		    WayPoint nextWpt = voxFiles.get(nextVoxFile);
-		    int idx = getAllWayPoints().indexOf(nextWpt) - 5;
-		    if (idx >= 0) {
-			nearestWpt = wpts.get(idx);
-		    } else {
-			nearestWpt = wpts.get(0);
-		    }
-		} else { // attach to last way point
-		    nearestWpt = wpts.get(wpts.size() - 1);
-		}
-
-		// Add link to found way point
-		if (nearestWpt != null) {
-		    if (addLinkToWayPoint(nearestWpt, "*" + voxFile + "*", f)) {
-			System.out.println(String.format(
-				"Linked file %s to position %s", voxFile,
-				nearestWpt.getCoor().toDisplayString()));
-			// Add linked way point to way point list of GPX;
-			// otherwise
-			// it would not be shown correctly
-			gpx.waypoints.add(nearestWpt);
-			rescuedFiles++;
-		    } else {
-			System.err
-				.println(String
-					.format("Could not link vox file %s due to invalid parameters.",
-						voxFile));
-		    }
-		}
-	    }
-	}
-
-	return rescuedFiles;
-    }
-
-    /**
-	 * 
-	 */
+        Map<String, WayPoint> voxFiles = getVoxFileMap();
+    
+        int first, last;
+        first = getFirstVoxNumber();
+        last = getLastVoxNumber();
+    
+        int rescuedFiles = 0;
+    
+        for (int i = first; i < last; i++) {
+            String voxFile = String.format("vox%05d.wav", i);
+            String nextVoxFile = String.format("vox%05d.wav", i + 1);
+            if (!voxFiles.containsKey(voxFile)) {
+                Main.info("Found lost vox file " + voxFile);
+        
+                File f = getVoxFilePath(voxFile);
+                WayPoint nearestWpt = null;
+                List<WayPoint> wpts = getAllWayPoints();
+                // Attach recording to the way point right before the next vox
+                // file
+                if (voxFiles.containsKey(nextVoxFile)) {
+                    WayPoint nextWpt = voxFiles.get(nextVoxFile);
+                    int idx = getAllWayPoints().indexOf(nextWpt) - 5;
+                    if (idx >= 0) {
+                        nearestWpt = wpts.get(idx);
+                    } else {
+                        nearestWpt = wpts.get(0);
+                    }
+                } else { // attach to last way point
+                    nearestWpt = wpts.get(wpts.size() - 1);
+                }
+        
+                // Add link to found way point
+                if (nearestWpt != null) {
+                    if (addLinkToWayPoint(nearestWpt, "*" + voxFile + "*", f)) {
+                        Main.info(String.format(
+                            "Linked file %s to position %s", voxFile,
+                            nearestWpt.getCoor().toDisplayString()));
+                        // Add linked way point to way point list of GPX; otherwise it would not be shown correctly
+                        gpx.waypoints.add(nearestWpt);
+                        rescuedFiles++;
+                    } else {
+                        Main.error(String.format("Could not link vox file %s due to invalid parameters.", voxFile));
+                    }
+                }
+            }
+        }
+    
+        return rescuedFiles;
+    }
+
+    /**
+     * 
+     */
     private void initImport() {
-	dateConversionErrors = 0;
-	dopConversionErrors = 0;
-	firstVoxNumber = Integer.MAX_VALUE;
-	lastVoxNumber = Integer.MIN_VALUE;
+        dateConversionErrors = 0;
+        dopConversionErrors = 0;
+        firstVoxNumber = Integer.MAX_VALUE;
+        lastVoxNumber = Integer.MIN_VALUE;
     }
 
@@ -350,7 +345,7 @@
      */
     void dropBufferLists() {
-	allTrackPts.clear();
-	trackPts.clear();
-	voxFiles.clear();
+        allTrackPts.clear();
+        trackPts.clear();
+        voxFiles.clear();
     }
 
@@ -370,16 +365,17 @@
      */
     private void showSummary(int waypts, int trkpts, int audiopts,
-	    int missaudio, int rescaudio) {
-	String message = "";
-	if (missaudio > 0) {
-	    message = String
-		    .format("Imported %d track points and %d way points (%d with audio, %d rescued).\nNote: %d audio files could not be found, please check marker comments!",
-			    trkpts, waypts, audiopts, rescaudio, missaudio);
-	} else {
-	    message = String
-		    .format("Imported %d track points and %d way points (%d with audio, %d rescued).",
-			    trkpts, waypts, audiopts, rescaudio);
-	}
-	ColumbusCSVUtils.showInfoMessage(tr(message));
+        int missaudio, int rescaudio) {
+        String message = "";
+        if (missaudio > 0) {
+            message = String
+                .format("Imported %d track points and %d way points (%d with audio, %d rescued).%n"+
+                        "Note: %d audio files could not be found, please check marker comments!",
+                    trkpts, waypts, audiopts, rescaudio, missaudio);
+        } else {
+            message = String
+                .format("Imported %d track points and %d way points (%d with audio, %d rescued).",
+                    trkpts, waypts, audiopts, rescaudio);
+        }
+        ColumbusCSVUtils.showInfoMessage(tr(message));
     }
 
@@ -394,106 +390,102 @@
      * @throws DataFormatException
      */
-    private WayPoint createWayPoint(String[] csvLine, String fileDir)
-	    throws IOException {
-	// Sample line in simple mode
-	// INDEX,TAG,DATE,TIME,LATITUDE N/S,LONGITUDE
-	// E/W,HEIGHT,SPEED,HEADING,VOX
-	// 1,T,090430,194134,48.856330N,009.089779E,318,20,0,
-
-	// Sample line in extended mode
-	// INDEX,TAG,DATE,TIME,LATITUDE N/S,LONGITUDE
-	// E/W,HEIGHT,SPEED,HEADING,FIX MODE,VALID,PDOP,HDOP,VDOP,VOX
-	// 1,T,090508,191448,48.856928N,009.091153E,330,3,0,3D,SPS ,1.4,1.2,0.8,
-	if (csvLine.length != 10 && csvLine.length != 15)
-	    throw new IOException("Invalid number of tokens: " + csvLine.length);
-	boolean isExtMode = csvLine.length > 10;
-
-	// Extract latitude/longitude first
-	String lat = csvLine[4];
-	double latVal = Double.parseDouble(lat.substring(0, lat.length() - 1));
-	if (lat.endsWith("S")) {
-	    latVal = -latVal;
-	}
-
-	String lon = csvLine[5];
-	double lonVal = Double.parseDouble(lon.substring(0, lon.length() - 1));
-	if (lon.endsWith("W")) {
-	    lonVal = -lonVal;
-	}
-	LatLon pos = new LatLon(latVal, lonVal);
-	WayPoint wpt = new WayPoint(pos);
-
-	// set wpt type
-	wpt.attr.put(TYPE_TAG, csvLine[1]);
-
-	// Check for audio file and link it, if present
-	String voxFile = null;
-	if (isExtMode) {
-	    voxFile = csvLine[14];
-	} else {
-	    voxFile = csvLine[9];
-	}
-
-	if (!ColumbusCSVUtils.isStringNullOrEmpty(voxFile)) {
-	    voxFile = voxFile + ".wav";
-	    File file = getVoxFilePath(fileDir, voxFile);
-	    if (file != null && file.exists()) {
-		// link vox file
-		int voxNum = getNumberOfVoxfile(voxFile);
-		lastVoxNumber = Math.max(voxNum, lastVoxNumber);
-		firstVoxNumber = Math.min(voxNum, firstVoxNumber);
-
-		addLinkToWayPoint(wpt, voxFile, file);
-
-		if (!"V".equals(csvLine[1])) {
-		    System.out
-			    .println("Rescued unlinked audio file " + voxFile);
-		}
-		voxFiles.put(voxFile, wpt);
-
-		// set type to way point with vox
-		wpt.attr.put(TYPE_TAG, "V");
-	    } else { // audio file not found -> issue warning
-		System.err.println("File " + voxFile + " not found!");
-		String warnMsg = tr("Missing audio file") + ": " + voxFile;
-		System.err.println(warnMsg);
-		if (ColumbusCSVPreferences.warnMissingAudio()) {
-		    ColumbusCSVUtils.showInfoMessage(warnMsg);
-		}
-		wpt.attr.put(ColumbusCSVReader.COMMENT_TAG, warnMsg);
-		// set type to ordinary way point
-		wpt.attr.put(TYPE_TAG, "C");
-	    }
-
-	}
-
-	// Extract date/time
-	SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyMMdd/HHmmss");
-	Date d = null;
-
-	try {
-
-	    d = sdf.parse(csvLine[2] + "/" + csvLine[3]);
-	    // format date according to GPX
-	    SimpleDateFormat f = new SimpleDateFormat(
-		    "yyyy-MM-dd'T'HH:mm:ss'Z'");
-
-	    wpt.attr.put(ColumbusCSVReader.TIME_TAG, f.format(d).toString());
-	    wpt.setTime();
-	} catch (ParseException ex) {
-	    dateConversionErrors++;
-	    System.err.println(ex);
-	}
-
-	// Add further attributes
-	// Elevation height (altitude provided by GPS signal)
-	wpt.attr.put(ColumbusCSVReader.ELEVATIONHEIGHT_TAG, csvLine[6]);
-
-	// Add data of extended mode, if applicable
-	if (isExtMode && !ColumbusCSVPreferences.ignoreDOP()) {
-	    addExtendedGPSData(csvLine, wpt);
-	}
-
-	return wpt;
+    private WayPoint createWayPoint(String[] csvLine, String fileDir) throws IOException {
+        // Sample line in simple mode
+        // INDEX,TAG,DATE,TIME,LATITUDE N/S,LONGITUDE
+        // E/W,HEIGHT,SPEED,HEADING,VOX
+        // 1,T,090430,194134,48.856330N,009.089779E,318,20,0,
+    
+        // Sample line in extended mode
+        // INDEX,TAG,DATE,TIME,LATITUDE N/S,LONGITUDE
+        // E/W,HEIGHT,SPEED,HEADING,FIX MODE,VALID,PDOP,HDOP,VDOP,VOX
+        // 1,T,090508,191448,48.856928N,009.091153E,330,3,0,3D,SPS ,1.4,1.2,0.8,
+        if (csvLine.length != 10 && csvLine.length != 15)
+            throw new IOException("Invalid number of tokens: " + csvLine.length);
+        boolean isExtMode = csvLine.length > 10;
+    
+        // Extract latitude/longitude first
+        String lat = csvLine[4];
+        double latVal = Double.parseDouble(lat.substring(0, lat.length() - 1));
+        if (lat.endsWith("S")) {
+            latVal = -latVal;
+        }
+    
+        String lon = csvLine[5];
+        double lonVal = Double.parseDouble(lon.substring(0, lon.length() - 1));
+        if (lon.endsWith("W")) {
+            lonVal = -lonVal;
+        }
+        LatLon pos = new LatLon(latVal, lonVal);
+        WayPoint wpt = new WayPoint(pos);
+    
+        // set wpt type
+        wpt.attr.put(TYPE_TAG, csvLine[1]);
+    
+        // Check for audio file and link it, if present
+        String voxFile = null;
+        if (isExtMode) {
+            voxFile = csvLine[14];
+        } else {
+            voxFile = csvLine[9];
+        }
+    
+        if (!ColumbusCSVUtils.isStringNullOrEmpty(voxFile)) {
+            voxFile = voxFile + ".wav";
+            File file = getVoxFilePath(fileDir, voxFile);
+            if (file != null && file.exists()) {
+                // link vox file
+                int voxNum = getNumberOfVoxfile(voxFile);
+                lastVoxNumber = Math.max(voxNum, lastVoxNumber);
+                firstVoxNumber = Math.min(voxNum, firstVoxNumber);
+        
+                addLinkToWayPoint(wpt, voxFile, file);
+        
+                if (!"V".equals(csvLine[1])) {
+                    Main.info("Rescued unlinked audio file " + voxFile);
+                }
+                voxFiles.put(voxFile, wpt);
+        
+                // set type to way point with vox
+                wpt.attr.put(TYPE_TAG, "V");
+            } else { // audio file not found -> issue warning
+                Main.error("File " + voxFile + " not found!");
+                String warnMsg = tr("Missing audio file") + ": " + voxFile;
+                Main.error(warnMsg);
+                if (ColumbusCSVPreferences.warnMissingAudio()) {
+                    ColumbusCSVUtils.showInfoMessage(warnMsg);
+                }
+                wpt.attr.put(ColumbusCSVReader.COMMENT_TAG, warnMsg);
+                // set type to ordinary way point
+                wpt.attr.put(TYPE_TAG, "C");
+            }
+        }
+    
+        // Extract date/time
+        SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyMMdd/HHmmss");
+        Date d = null;
+    
+        try {
+            d = sdf.parse(csvLine[2] + "/" + csvLine[3]);
+            // format date according to GPX
+            SimpleDateFormat f = new SimpleDateFormat(
+                "yyyy-MM-dd'T'HH:mm:ss'Z'");
+    
+            wpt.attr.put(ColumbusCSVReader.TIME_TAG, f.format(d).toString());
+            wpt.setTime();
+        } catch (ParseException ex) {
+            dateConversionErrors++;
+            Main.error(ex);
+        }
+    
+        // Add further attributes
+        // Elevation height (altitude provided by GPS signal)
+        wpt.attr.put(ColumbusCSVReader.ELEVATIONHEIGHT_TAG, csvLine[6]);
+    
+        // Add data of extended mode, if applicable
+        if (isExtMode && !ColumbusCSVPreferences.ignoreDOP()) {
+            addExtendedGPSData(csvLine, wpt);
+        }
+    
+        return wpt;
     }
 
@@ -508,5 +500,5 @@
      */
     public File getVoxFilePath(String voxFile) {
-	return getVoxFilePath(getWorkingDirOfImport(), voxFile);
+        return getVoxFilePath(getWorkingDirOfImport(), voxFile);
     }
 
@@ -521,18 +513,17 @@
      */
     public File getVoxFilePath(String fileDir, String voxFile) {
-	// The FAT16 file name is interpreted differently from case-sensitive
-	// file systems, so we
-	// have to test several variants
-	String[] fileNameVariants = new String[] { voxFile,
-		voxFile.toLowerCase(), voxFile.toUpperCase() };
-
-	for (int i = 0; i < fileNameVariants.length; i++) {
-	    File file = new File(fileDir + File.separator + fileNameVariants[i]);
-	    if (file.exists()) {
-		return file;
-	    }
-	}
-	return null; // give up...
-
+        // The FAT16 file name is interpreted differently from case-sensitive
+        // file systems, so we
+        // have to test several variants
+        String[] fileNameVariants = new String[] { voxFile,
+            voxFile.toLowerCase(), voxFile.toUpperCase() };
+    
+        for (int i = 0; i < fileNameVariants.length; i++) {
+            File file = new File(fileDir + File.separator + fileNameVariants[i]);
+            if (file.exists()) {
+                return file;
+            }
+        }
+        return null; // give up...
     }
 
@@ -544,29 +535,29 @@
      */
     private void addExtendedGPSData(String[] csvLine, WayPoint wpt) {
-	// Fix mode
-	wpt.attr.put(FIX_TAG, csvLine[9].toLowerCase());
-
-	Float f;
-	// Position errors (dop = dilution of position)
-	f = ColumbusCSVUtils.floatFromString(csvLine[11]);
-	if (f != Float.NaN) {
-	    wpt.attr.put(ColumbusCSVReader.PDOP_TAG, f);
-	} else {
-	    dopConversionErrors++;
-	}
-
-	f = ColumbusCSVUtils.floatFromString(csvLine[12]);
-	if (f != Float.NaN) {
-	    wpt.attr.put(ColumbusCSVReader.HDOP_TAG, f);
-	} else {
-	    dopConversionErrors++;
-	}
-
-	f = ColumbusCSVUtils.floatFromString(csvLine[13]);
-	if (f != Float.NaN) {
-	    wpt.attr.put(ColumbusCSVReader.VDOP_TAG, f);
-	} else {
-	    dopConversionErrors++;
-	}
+        // Fix mode
+        wpt.attr.put(FIX_TAG, csvLine[9].toLowerCase());
+    
+        Float f;
+        // Position errors (dop = dilution of position)
+        f = ColumbusCSVUtils.floatFromString(csvLine[11]);
+        if (f != Float.NaN) {
+            wpt.attr.put(ColumbusCSVReader.PDOP_TAG, f);
+        } else {
+            dopConversionErrors++;
+        }
+    
+        f = ColumbusCSVUtils.floatFromString(csvLine[12]);
+        if (f != Float.NaN) {
+            wpt.attr.put(ColumbusCSVReader.HDOP_TAG, f);
+        } else {
+            dopConversionErrors++;
+        }
+    
+        f = ColumbusCSVUtils.floatFromString(csvLine[13]);
+        if (f != Float.NaN) {
+            wpt.attr.put(ColumbusCSVReader.VDOP_TAG, f);
+        } else {
+            dopConversionErrors++;
+        }
     }
 
@@ -581,19 +572,19 @@
      */
     public boolean addLinkToWayPoint(WayPoint wpt, String voxFile, File file) {
-	if (file == null || wpt == null || voxFile == null)
-	    return false;
-
-	GpxLink lnk = new GpxLink(file.toURI().toString());
-	lnk.type = ColumbusCSVReader.AUDIO_WAV_LINK;
-	lnk.text = voxFile;
-
-	// JOSM expects a collection of links here...
-	Collection<GpxLink> linkList = new ArrayList<GpxLink>(1);
-	linkList.add(lnk);
-
-	wpt.attr.put(GpxData.META_LINKS, linkList);
-	wpt.attr.put(ColumbusCSVReader.COMMENT_TAG, "Audio recording");
-	wpt.attr.put(ColumbusCSVReader.DESC_TAG, voxFile);
-	return true;
+        if (file == null || wpt == null || voxFile == null)
+            return false;
+    
+        GpxLink lnk = new GpxLink(file.toURI().toString());
+        lnk.type = ColumbusCSVReader.AUDIO_WAV_LINK;
+        lnk.text = voxFile;
+    
+        // JOSM expects a collection of links here...
+        Collection<GpxLink> linkList = new ArrayList<>(1);
+        linkList.add(lnk);
+    
+        wpt.attr.put(GpxData.META_LINKS, linkList);
+        wpt.attr.put(ColumbusCSVReader.COMMENT_TAG, "Audio recording");
+        wpt.attr.put(ColumbusCSVReader.DESC_TAG, voxFile);
+        return true;
     }
 
@@ -605,15 +596,15 @@
      */
     private static String[] getCSVLine(String line) {
-	if (line == null || line.length() == 0)
-	    return EMPTY_LINE;
-
-	StringTokenizer st = new StringTokenizer(line, SEPS, false);
-	int n = st.countTokens();
-
-	String[] res = new String[n];
-	for (int i = 0; i < n; i++) {
-	    res[i] = st.nextToken().trim();
-	}
-	return res;
+        if (line == null || line.length() == 0)
+            return EMPTY_LINE;
+    
+        StringTokenizer st = new StringTokenizer(line, SEPS, false);
+        int n = st.countTokens();
+    
+        String[] res = new String[n];
+        for (int i = 0; i < n; i++) {
+            res[i] = st.nextToken().trim();
+        }
+        return res;
     }
 
@@ -628,14 +619,13 @@
      */
     private int getNumberOfVoxfile(String fileName) {
-	if (fileName == null)
-	    return -1;
-
-	try {
-	    String num = fileName.substring(3);
-	    int val = Integer.parseInt(num);
-	    return val;
-	} catch (NumberFormatException e) {
-	    return -1;
-	}
+        if (fileName == null)
+            return -1;
+    
+        try {
+            String num = fileName.substring(3);
+            return Integer.parseInt(num);
+        } catch (NumberFormatException e) {
+            return -1;
+        }
     }
 
@@ -646,5 +636,5 @@
      */
     public int getNumberOfDateConversionErrors() {
-	return dateConversionErrors;
+        return dateConversionErrors;
     }
 
@@ -655,5 +645,5 @@
      */
     public int getNumberOfDOPConversionErrors() {
-	return dopConversionErrors;
+        return dopConversionErrors;
     }
 
@@ -664,5 +654,5 @@
      */
     public int getFirstVoxNumber() {
-	return firstVoxNumber;
+        return firstVoxNumber;
     }
 
@@ -673,5 +663,5 @@
      */
     public int getLastVoxNumber() {
-	return lastVoxNumber;
+        return lastVoxNumber;
     }
 
@@ -681,6 +671,6 @@
      * @return
      */
-    public HashMap<String, WayPoint> getVoxFileMap() {
-	return voxFiles;
+    public Map<String, WayPoint> getVoxFileMap() {
+        return voxFiles;
     }
 
@@ -691,5 +681,5 @@
      */
     public List<WayPoint> getAllWayPoints() {
-	return allWpts;
+        return allWpts;
     }
 
@@ -700,5 +690,5 @@
      */
     public String getWorkingDirOfImport() {
-	return fileDir;
+        return fileDir;
     }
 }
Index: applications/editors/josm/plugins/ColumbusCSV/src/org/openstreetmap/josm/plugins/columbusCSV/ColumbusCSVUtils.java
===================================================================
--- applications/editors/josm/plugins/ColumbusCSV/src/org/openstreetmap/josm/plugins/columbusCSV/ColumbusCSVUtils.java	(revision 30767)
+++ applications/editors/josm/plugins/ColumbusCSV/src/org/openstreetmap/josm/plugins/columbusCSV/ColumbusCSVUtils.java	(revision 30768)
@@ -20,75 +20,80 @@
 import org.openstreetmap.josm.Main;
 
+/**
+ * Utility functions. 
+ * @author Oliver Wieland <oliver.wieland@online.de>
+ * 
+ */
 public class ColumbusCSVUtils {
-	/**
-	 * Private constructor for the utility class.
-	 */
-	private ColumbusCSVUtils() {
-		
-	}
-	
-	/**
-	 * Shows an error message.
-	 * @param txt Message to show.
-	 */
-	public static void showErrorMessage(String txt) {
-		showMessage(txt, tr("Error"), JOptionPane.ERROR_MESSAGE);
-	}
-	
-	/**
-	 * Shows an information message.
-	 * @param txt Message to show.
-	 */
-	public static void showInfoMessage(String txt) {
-		showMessage(txt, tr("Information"), JOptionPane.INFORMATION_MESSAGE);
-	}
-	
-	/**
-	 * Shows a warning message.
-	 * @param txt Message to show.
-	 */
-	public static void showWarningMessage(String txt) {
-		showMessage(txt, tr("Warning"), JOptionPane.WARNING_MESSAGE);
-	}
-	
-	/**
-	 * Generic method to show a message.
-	 * @param txt Message to show
-	 * @param caption Title of message box
-	 * @param icon Icon to show (question, warning,...)
-	 */
-	public static void showMessage(String txt, String caption, int icon) {
-		if (isStringNullOrEmpty(txt)) return;
-		
-		JOptionPane.showMessageDialog(Main.parent, tr(txt), caption, icon);
-	}
-	
-	/**
-	 * Check, if a string is either null or empty.
-	 * 
-	 * @param txt
-	 *            . The text to check for.
-	 * @return True, if given text is either null or empty.
-	 */
-	public static boolean isStringNullOrEmpty(String txt) {
-		return txt == null || txt.length() == 0;
-	}
-	
-	/**
-	 * Parses a float number from a string.
-	 * @param txt
-	 * @return The corresponding float instance or Float.NaN, if txt was empty or contained an invalid float number.
-	 */
-	public static Float floatFromString(String txt) {
-		Float f;
-		
-		if (isStringNullOrEmpty(txt)) return Float.NaN;
-		
-		try {
-			f = Float.parseFloat(txt);
-		} catch (NumberFormatException nex) {
-			f = Float.NaN;
-		}
-		return f;
-	}	
+    /**
+     * Private constructor for the utility class.
+     */
+    private ColumbusCSVUtils() {
+        
+    }
+    
+    /**
+     * Shows an error message.
+     * @param txt Message to show.
+     */
+    public static void showErrorMessage(String txt) {
+        showMessage(txt, tr("Error"), JOptionPane.ERROR_MESSAGE);
+    }
+    
+    /**
+     * Shows an information message.
+     * @param txt Message to show.
+     */
+    public static void showInfoMessage(String txt) {
+        showMessage(txt, tr("Information"), JOptionPane.INFORMATION_MESSAGE);
+    }
+    
+    /**
+     * Shows a warning message.
+     * @param txt Message to show.
+     */
+    public static void showWarningMessage(String txt) {
+        showMessage(txt, tr("Warning"), JOptionPane.WARNING_MESSAGE);
+    }
+    
+    /**
+     * Generic method to show a message.
+     * @param txt Message to show
+     * @param caption Title of message box
+     * @param icon Icon to show (question, warning,...)
+     */
+    public static void showMessage(String txt, String caption, int icon) {
+        if (isStringNullOrEmpty(txt)) return;
+        
+        JOptionPane.showMessageDialog(Main.parent, tr(txt), caption, icon);
+    }
+    
+    /**
+     * Check, if a string is either null or empty.
+     * 
+     * @param txt
+     *            . The text to check for.
+     * @return True, if given text is either null or empty.
+     */
+    public static boolean isStringNullOrEmpty(String txt) {
+        return txt == null || txt.length() == 0;
+    }
+    
+    /**
+     * Parses a float number from a string.
+     * @param txt
+     * @return The corresponding float instance or Float.NaN, if txt was empty or contained an invalid float number.
+     */
+    public static Float floatFromString(String txt) {
+        Float f;
+        
+        if (isStringNullOrEmpty(txt)) return Float.NaN;
+        
+        try {
+            f = Float.parseFloat(txt);
+        } catch (NumberFormatException nex) {
+            f = Float.NaN;
+        }
+        return f;
+    }    
 }
Index: applications/editors/josm/plugins/ColumbusCSV/src/org/openstreetmap/josm/plugins/columbusCSV/WayPointHelper.java
===================================================================
--- applications/editors/josm/plugins/ColumbusCSV/src/org/openstreetmap/josm/plugins/columbusCSV/WayPointHelper.java	(revision 30767)
+++ applications/editors/josm/plugins/ColumbusCSV/src/org/openstreetmap/josm/plugins/columbusCSV/WayPointHelper.java	(revision 30768)
@@ -25,4 +25,5 @@
 import java.util.List;
 
+import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.gpx.WayPoint;
@@ -33,113 +34,108 @@
  */
 public class WayPointHelper {
-	/**
-	 * The name of the elevation height of a way point.
-	 */
-	public static final String HEIGHT_ATTRIBUTE = "ele";
+    /**
+     * The name of the elevation height of a way point.
+     */
+    public static final String HEIGHT_ATTRIBUTE = "ele";
 
+    private static final double R = 6378135;
+    
+    private WayPointHelper() {
+       // Private constructor for the utility class. 
+    }
 
-	/**
-	 * Gets the elevation (Z coordinate) of a JOSM way point.
-	 * 
-	 * @param wpt
-	 *            The way point instance.
-	 * @return The x coordinate or 0, if the given way point is null or contains
-	 *         not height attribute.
-	 */
-	public static double getElevation(WayPoint wpt) {
-		if (wpt != null) {
-			if (!wpt.attr.containsKey(HEIGHT_ATTRIBUTE)) {
-				return 0;
-			}
+    /**
+     * Gets the elevation (Z coordinate) of a JOSM way point.
+     * 
+     * @param wpt
+     *            The way point instance.
+     * @return The x coordinate or 0, if the given way point is null or contains
+     *         not height attribute.
+     */
+    public static double getElevation(WayPoint wpt) {
+        if (wpt != null) {
+            if (!wpt.attr.containsKey(HEIGHT_ATTRIBUTE)) {
+                return 0;
+            }
 
-			String height = wpt.getString(WayPointHelper.HEIGHT_ATTRIBUTE);
-			try {
-				double z = Double.parseDouble(height);
+            String height = wpt.getString(WayPointHelper.HEIGHT_ATTRIBUTE);
+            try {
+                return Double.parseDouble(height);
+            } catch (NumberFormatException e) {
+                Main.error(String.format(
+                        "Cannot parse double from '%s': %s", height, e
+                                .getMessage()));
+            }
+        }
+        return 0;
+    }
+    
+    public static double getLonDist(WayPoint w1, WayPoint w2) {
+        LatLon ll = new LatLon(w1.getCoor().lat(), w2.getCoor().lon());
+        return w1.getCoor().greatCircleDistance(ll);
+    }
+    
+    public static double getLatDist(WayPoint w1, WayPoint w2) {
+        LatLon ll = new LatLon(w2.getCoor().lat(), w1.getCoor().lon());
+        return w1.getCoor().greatCircleDistance(ll);
+    }
+    
+    /**
+     * Moves a given lat/lon coordinate by a given amount of meters in
+     * x and y direction.
+     * @param src The original lat/lon coordinate.
+     * @param dlat The distance in latitude direction in meters
+     * @param dlon The distance in longitude direction in meters
+     * @return 
+     */
+    public static LatLon moveLatLon(LatLon src, double dlat, double dlon) {
+        double lat1 = toRadians(src.lat());
+        double lon1 = toRadians(src.lon());
+        
+        double dlonsin2 = sin(dlon/2 / R);
+        double dlatsin2 = sin(dlat/2 / R);
+        double dlatcos = cos(lon1);
+        
+        double lon2rad = 2 * asin(sqrt(dlonsin2 * dlonsin2 / dlatcos/dlatcos)) + lon1;
+        double lat2rad = 2 * asin(dlatsin2) + lat1;
+        
+        double lon2 = toDegrees(lon2rad);
+        double lat2 = toDegrees(lat2rad);
+        
+        return new LatLon(lat2, lon2);
+    }
 
-				return z;
-			} catch (NumberFormatException e) {
-				System.err.println(String.format(
-						"Cannot parse double from '%s': %s", height, e
-								.getMessage()));
-				return 0;
-			}
-		} else {
-			return 0;
-		}
-	}
-	
-	public static double getLonDist(WayPoint w1, WayPoint w2) {
-		LatLon ll = new LatLon(w1.getCoor().lat(), w2.getCoor().lon());
-		return w1.getCoor().greatCircleDistance(ll);
-	}
-	
-	public static double getLatDist(WayPoint w1, WayPoint w2) {
-		LatLon ll = new LatLon(w2.getCoor().lat(), w1.getCoor().lon());
-		return w1.getCoor().greatCircleDistance(ll);
-	}
-	
-	/**
-	 * Moves a given lat/lon coordinate by a given amount of meters in
-	 * x and y direction.
-	 * @param src The original lat/lon coordinate.
-	 * @param dlat The distance in latitude direction in meters
-	 * @param dlon The distance in longitude direction in meters
-	 * @return 
-	 */
-	public static LatLon moveLatLon(LatLon src, double dlat, double dlon) {
-		final double R = 6378135;
-		
-		double lat1 = toRadians(src.lat());
-		double lon1 = toRadians(src.lon());
-		
-		double dlonsin2 = sin(dlon/2 / R);
-		double dlatsin2 = sin(dlat/2 / R);
-		double dlatcos = cos(lon1);
-		
-		double lon2rad = 2 * asin(sqrt(dlonsin2 * dlonsin2 / dlatcos/dlatcos)) + lon1;
-		double lat2rad = 2 * asin(dlatsin2) + lat1;
-		
-		double lon2 = toDegrees(lon2rad);
-		double lat2 = toDegrees(lat2rad);
-		
-		LatLon llmoved = new LatLon(lat2, lon2);
-		
-		//double d2 = llmoved.greatCircleDistance(src);
-		
-		return llmoved;
-	}
+    /**
+     * Reduces a given list of way points to the specified target size.
+     * 
+     * @param origList
+     *            The original list containing the way points.
+     * @param targetSize
+     *            The desired target size of the list. The resulting list may
+     *            contain fewer items, so targetSize should be considered as
+     *            maximum.
+     * @return A list containing the reduced list.
+     */
+    public static List<WayPoint> downsampleWayPoints(List<WayPoint> origList,
+            int targetSize) {
+        if (origList == null)
+            return null;
+        if (targetSize <= 0)
+            throw new IllegalArgumentException(
+                    "targetSize must be greater than zero");
 
-	/**
-	 * Reduces a given list of way points to the specified target size.
-	 * 
-	 * @param origList
-	 *            The original list containing the way points.
-	 * @param targetSize
-	 *            The desired target size of the list. The resulting list may
-	 *            contain fewer items, so targetSize should be considered as
-	 *            maximum.
-	 * @return A list containing the reduced list.
-	 */
-	public static List<WayPoint> downsampleWayPoints(List<WayPoint> origList,
-			int targetSize) {
-		if (origList == null)
-			return null;
-		if (targetSize <= 0)
-			throw new IllegalArgumentException(
-					"targetSize must be greater than zero");
+        int origSize = origList.size();
+        if (origSize <= targetSize) {
+            return origList;
+        }
 
-		int origSize = origList.size();
-		if (origSize <= targetSize) {
-			return origList;
-		}
+        int delta = (int) Math.max(Math.ceil(origSize / targetSize), 2);
 
-		int delta = (int) Math.max(Math.ceil(origSize / targetSize), 2);
+        List<WayPoint> res = new ArrayList<>(targetSize);
+        for (int i = 0; i < origSize; i += delta) {
+            res.add(origList.get(i));
+        }
 
-		List<WayPoint> res = new ArrayList<WayPoint>(targetSize);
-		for (int i = 0; i < origSize; i += delta) {
-			res.add(origList.get(i));
-		}
-
-		return res;
-	}
+        return res;
+    }
 }
