Index: /trunk/src/org/openstreetmap/josm/gui/layer/GpxLayer.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/layer/GpxLayer.java	(revision 553)
+++ /trunk/src/org/openstreetmap/josm/gui/layer/GpxLayer.java	(revision 554)
@@ -515,13 +515,7 @@
 						point.eastNorth.distance(prevPoint.eastNorth) > audioGapRadiansSquared))
 					{
-						String markerName;
-						int wholeSeconds = (int)(offset + 0.5);
-						if (wholeSeconds < 60)
-							markerName = Integer.toString(wholeSeconds);
-						else if (wholeSeconds < 3600)
-							markerName = String.format("%d:%02d", wholeSeconds / 60, wholeSeconds % 60);
-						else
-							markerName = String.format("%d:%02d:%02d", wholeSeconds / 3600, (wholeSeconds % 3600)/60, wholeSeconds % 60);
-						AudioMarker am = AudioMarker.create(point.latlon, markerName, uri, ml, time, offset);
+						
+						AudioMarker am = AudioMarker.create(point.latlon, 
+								AudioMarker.inventName(offset), uri, ml, time, offset);
 						ml.data.add(am);
 						prevPoint = point;
Index: /trunk/src/org/openstreetmap/josm/gui/layer/markerlayer/AudioMarker.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/layer/markerlayer/AudioMarker.java	(revision 553)
+++ /trunk/src/org/openstreetmap/josm/gui/layer/markerlayer/AudioMarker.java	(revision 554)
@@ -75,5 +75,5 @@
 		try {
 			// first enable tracing the audio along the track
-			if (Main.pref.getBoolean("marker.traceaudio") && parentLayer != null) {
+			if (Main.pref.getBoolean("marker.traceaudio", true) && parentLayer != null) {
 				parentLayer.traceAudio();
 			}
@@ -89,3 +89,17 @@
 		syncOffset = adjustment; // added to offset may turn out negative, but that's ok
 	}
+
+	public double syncOffset() {
+		return syncOffset;
+	}
+	
+	public static String inventName (double offset) {
+		int wholeSeconds = (int)(offset + 0.5);
+		if (wholeSeconds < 60)
+			return Integer.toString(wholeSeconds);
+		else if (wholeSeconds < 3600)
+			return String.format("%d:%02d", wholeSeconds / 60, wholeSeconds % 60);
+		else
+			return String.format("%d:%02d:%02d", wholeSeconds / 3600, (wholeSeconds % 3600)/60, wholeSeconds % 60);
+	}
 }
Index: /trunk/src/org/openstreetmap/josm/gui/layer/markerlayer/MarkerLayer.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/layer/markerlayer/MarkerLayer.java	(revision 553)
+++ /trunk/src/org/openstreetmap/josm/gui/layer/markerlayer/MarkerLayer.java	(revision 554)
@@ -69,8 +69,8 @@
 	private Rectangle audioTracer = null;
 	private Icon audioTracerIcon = null;
-	private EastNorth audioTracerPosition = null;
+	private EastNorth playheadPosition = null;
 	private static Timer timer = null;
 	private static double audioAnimationInterval = 0.0; // seconds
-	private static double previousTime = -1.0;
+	private static double playheadTime = -1.0;
 
 	public MarkerLayer(GpxData indata, String name, File associatedFile, GpxLayer fromLayer) {
@@ -163,5 +163,5 @@
 
 		if (audioTracer != null) {
-			Point screen = Main.map.mapView.getPoint(audioTracerPosition);
+			Point screen = Main.map.mapView.getPoint(playheadPosition);
 			audioTracer.setLocation(screen.x, screen.y);
 			audioTracerIcon.paintIcon(Main.map.mapView, g, screen.x, screen.y);
@@ -193,5 +193,5 @@
 			recentlyPlayedMarker.offset -
 			recentlyPlayedMarker.syncOffset;
-		if (Math.abs(audioTime- previousTime) < audioAnimationInterval)
+		if (Math.abs(audioTime- playheadTime) < audioAnimationInterval)
 			return;
 		if (fromLayer == null)
@@ -220,5 +220,5 @@
 		if (w1 == null)
 			return;
-		audioTracerPosition = w2 == null ? 
+		playheadPosition = w2 == null ? 
 			w1.eastNorth : 
 			w1.eastNorth.interpolate(w2.eastNorth, 
@@ -229,5 +229,5 @@
 			audioTracer = new Rectangle(0, 0, audioTracerIcon.getIconWidth(), audioTracerIcon.getIconHeight());			
 		}
-		previousTime = audioTime;
+		playheadTime = audioTime;
 		Main.map.mapView.repaint();
 	}
@@ -322,23 +322,38 @@
 		});
 
-		return new Component[] {
-			new JMenuItem(new LayerListDialog.ShowHideLayerAction(this)),
-            new JMenuItem(new LayerListDialog.ShowHideMarkerText(this)),
-			new JMenuItem(new LayerListDialog.DeleteLayerAction(this)),
-			new JSeparator(),
-			color,
-			new JSeparator(),
-			syncaudio,
-			applyaudio,
-			new JMenuItem(new RenameLayerAction(associatedFile, this)),
-			new JSeparator(),
-			new JMenuItem(new LayerListPopup.InfoAction(this))
-		};
+		JMenuItem moveaudio = new JMenuItem(tr("Make Audio Marker At Play Head"), ImageProvider.get("addmarkers"));
+		moveaudio.addActionListener(new ActionListener(){
+			public void actionPerformed(ActionEvent e) {
+				makeAudioMarkerAtPlayHead();
+			}
+		});
+
+		Collection<Component> components = new ArrayList<Component>();
+		components.add(new JMenuItem(new LayerListDialog.ShowHideLayerAction(this)));
+		components.add(new JMenuItem(new LayerListDialog.ShowHideMarkerText(this)));
+		components.add(new JMenuItem(new LayerListDialog.DeleteLayerAction(this)));
+		components.add(new JSeparator());
+		components.add(color);
+		components.add(new JSeparator());
+		components.add(syncaudio);
+		components.add(applyaudio);
+		if (Main.pref.getBoolean("marker.traceaudio", true)) {
+			components.add (moveaudio);
+		}		
+		components.add(new JMenuItem(new RenameLayerAction(associatedFile, this)));
+		components.add(new JSeparator());
+		components.add(new JMenuItem(new LayerListPopup.InfoAction(this)));
+		return components.toArray(new Component[0]);
 	}
 
 	private void adjustOffsetsOnAudioMarkers() {
+		if (! AudioPlayer.paused()) {
+			JOptionPane.showMessageDialog(Main.parent,tr("You need to pause audio at the moment when you hear your synchronization cue."));
+			return;
+		}
 		Marker startMarker = AudioMarker.recentlyPlayedMarker();
+		boolean explicitMarker = true;
 		if (startMarker != null && ! data.contains(startMarker)) {
-			// message?
+			explicitMarker = false;
 			startMarker = null;
 		}
@@ -354,4 +369,5 @@
 		if (startMarker == null) {
 			// still no marker to work from - message?
+			JOptionPane.showMessageDialog(Main.parent,tr("No audio marker found in the layer to synchronize with."));
 			return;
 		}
@@ -365,9 +381,63 @@
 			if (seenStart) {
 				AudioMarker ma = (AudioMarker) m; // it must be an AudioMarker
-				if (! ma.url().equals(url))
-					break;
-				ma.adjustOffset(adjustment);
-			}
-		}
+				if (ma.url().equals(url))
+					ma.adjustOffset(adjustment);
+			}
+		}
+		
+		JOptionPane.showMessageDialog(Main.parent, explicitMarker ? 
+			tr("Audio synchronized with most recently played marker and subsequent ones (that have the same sound track).") :
+			tr("Audio synchronized with audio markers in the layer (that have the same sound track as the first one)."));
+	}
+	
+	private void makeAudioMarkerAtPlayHead() {
+		if (! AudioPlayer.paused()) {
+			JOptionPane.showMessageDialog(Main.parent,tr("You need to pause audio at the point on the track where you want the marker."));
+			return;
+		}
+		// find first audio marker to get absolute start time
+		double offset = 0.0;
+		AudioMarker am = null; 
+		for (Marker m : data) {
+			if (m.getClass() == AudioMarker.class) {
+				am = (AudioMarker)m;
+				offset = playheadTime - am.time;
+				break;
+			}
+		}
+		if (am == null) {
+			JOptionPane.showMessageDialog(Main.parent,tr("No existing audio markers in this layer to offset from."));
+			return;
+		}
+
+		// make our new marker
+		AudioMarker newAudioMarker = AudioMarker.create(Main.proj.eastNorth2latlon(playheadPosition), 
+			AudioMarker.inventName(offset), AudioPlayer.url().toString(), this, playheadTime, offset);
+		
+		// insert it at the right place in a copy the collection
+		Collection<Marker> newData = new ArrayList<Marker>();
+		am = null; 
+		for (Marker m : data) {
+			if (m.getClass() == AudioMarker.class) {
+				am = (AudioMarker) m;
+				if (newAudioMarker != null && offset < am.offset) {
+					newAudioMarker.adjustOffset(am.syncOffset()); // i.e. same as predecessor
+					newData.add(newAudioMarker);
+					newAudioMarker = null;
+				}
+			}
+			newData.add(m);
+		}
+		if (newAudioMarker != null) {
+			if (am != null)
+				newAudioMarker.adjustOffset(am.syncOffset()); // i.e. same as predecessor				
+			newData.add(newAudioMarker); // insert at end
+			newAudioMarker = null;
+		}
+		
+		// replace the collection
+		data.clear();
+		data.addAll(newData);
+		Main.map.mapView.repaint();
 	}
 	
Index: /trunk/src/org/openstreetmap/josm/gui/preferences/AudioPreference.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/preferences/AudioPreference.java	(revision 553)
+++ /trunk/src/org/openstreetmap/josm/gui/preferences/AudioPreference.java	(revision 554)
@@ -7,4 +7,5 @@
 import java.awt.event.ActionListener;
 
+import javax.swing.Box;
 import javax.swing.JCheckBox;
 import javax.swing.JLabel;
@@ -61,5 +62,5 @@
 			}
 		});
-		markerAudioTraceVisible.setSelected(Main.pref.getBoolean("marker.traceaudio"));
+		markerAudioTraceVisible.setSelected(Main.pref.getBoolean("marker.traceaudio", true));
 		markerAudioTraceVisible.setToolTipText(tr("Display a moving icon representing the point on the synchronized track where the audio currently playing was recorded."));
 		gui.audio.add(markerAudioTraceVisible, GBC.eol().insets(0,0,0,0));
@@ -85,5 +86,5 @@
 			}
 		});
-		markersNamedTrackpoints.setSelected(Main.pref.getBoolean("markers.namedtrackpoints"));
+		markersNamedTrackpoints.setSelected(Main.pref.getBoolean("marker.namedtrackpoints"));
 		markersNamedTrackpoints.setToolTipText(tr("Automatically create audio markers from trackpoints (rather than explicit waypoints) with names or descriptions."));
 		gui.audio.add(markersNamedTrackpoints, GBC.eol().insets(0,0,0,0));
@@ -108,4 +109,6 @@
 		gui.audio.add(new JLabel(tr("Lead-in time (seconds)")), GBC.std());
 		gui.audio.add(audioLeadIn, GBC.eol().fill(GBC.HORIZONTAL).insets(5,0,0,5));
+
+		gui.audio.add(Box.createVerticalGlue(), GBC.eol().fill(GBC.VERTICAL));
 	}
 
@@ -114,5 +117,5 @@
 		Main.pref.put("marker.traceaudio", markerAudioTraceVisible.isSelected());
 		Main.pref.put("marker.buttonlabels", markerButtonLabels.isSelected());
-		Main.pref.put("markers.namedtrackpoints", markersNamedTrackpoints.isSelected());
+		Main.pref.put("marker.namedtrackpoints", markersNamedTrackpoints.isSelected());
 		Main.pref.put("marker.audiosampleminsecs", audioSampleMinSecs.getText());		
 		Main.pref.put("marker.audiosampleminmetres", audioSampleMinMetres.getText());		
Index: /trunk/src/org/openstreetmap/josm/io/GpxReader.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/io/GpxReader.java	(revision 553)
+++ /trunk/src/org/openstreetmap/josm/io/GpxReader.java	(revision 554)
@@ -227,16 +227,17 @@
 				break;
 			case wpt:
-				if (qName.equals("ele") || qName.equals("time") || qName.equals("desc")
+				if (qName.equals("ele") || qName.equals("desc")
 						|| qName.equals("magvar") || qName.equals("geoidheight")
-						|| qName.equals("name") || qName.equals("time")
-						|| qName.equals("sym") || qName.equals("cmt") || qName.equals("type")) {
+						|| qName.equals("name")	|| qName.equals("sym") 
+						|| qName.equals("cmt") || qName.equals("type")) {
 					currentWayPoint.attr.put(qName, accumulator.toString());
+				} else if (qName.equals("time")) {
+					currentWayPoint.attr.put(qName, accumulator.toString());
+					currentWayPoint.setTime();					
 				} else if (qName.equals("rtept")) {
 					currentState = states.pop();
-					currentWayPoint.setTime();
 					currentRoute.routePoints.add(currentWayPoint);
 				} else if (qName.equals("trkpt")) {
 					currentState = states.pop();
-					currentWayPoint.setTime();
 					currentTrackSeg.add(currentWayPoint);
 					if (Main.pref.getBoolean("marker.namedtrackpoints") && 
@@ -248,5 +249,4 @@
 				} else if (qName.equals("wpt")) {
 					currentState = states.pop();
-					currentWayPoint.setTime();
 					currentData.waypoints.add(currentWayPoint);
 				}
