Index: /applications/editors/josm/plugins/livegps/src/livegps/LiveGPSPreferences.java
===================================================================
--- /applications/editors/josm/plugins/livegps/src/livegps/LiveGPSPreferences.java	(revision 36110)
+++ /applications/editors/josm/plugins/livegps/src/livegps/LiveGPSPreferences.java	(revision 36111)
@@ -8,4 +8,5 @@
 
 import javax.swing.Box;
+import javax.swing.JCheckBox;
 import javax.swing.JLabel;
 import javax.swing.JPanel;
@@ -24,4 +25,5 @@
     private final JTextField gpsdPort = new JTextField(30);
     private final JTextField serialDevice = new JTextField(30);
+    private final JCheckBox disableGPSD = new JCheckBox(tr("Disable GPSD"));
 
     public LiveGPSPreferences() {
@@ -48,4 +50,7 @@
         panel.add(serialDevice, GBC.eol().fill(GridBagConstraints.HORIZONTAL).insets(5, 0, 0, 5));
 
+        disableGPSD.setSelected(Config.getPref().getBoolean(LiveGpsAcquirer.C_DISABLED));
+        panel.add(disableGPSD, GBC.eol().fill(GridBagConstraints.HORIZONTAL).insets(5, 0, 0, 5));
+
         panel.add(Box.createVerticalGlue(), GBC.eol().fill(GridBagConstraints.VERTICAL));
         createPreferenceTabWithScrollPane(gui, panel);
@@ -57,4 +62,5 @@
         Config.getPref().put(LiveGpsAcquirer.C_PORT, gpsdPort.getText());
         Config.getPref().put(LiveGpsAcquirerNMEA.C_SERIAL, serialDevice.getText());
+        Config.getPref().putBoolean(LiveGpsAcquirer.C_DISABLED, disableGPSD.isSelected());
         return false;
     }
Index: /applications/editors/josm/plugins/livegps/src/livegps/LiveGpsAcquirer.java
===================================================================
--- /applications/editors/josm/plugins/livegps/src/livegps/LiveGpsAcquirer.java	(revision 36110)
+++ /applications/editors/josm/plugins/livegps/src/livegps/LiveGpsAcquirer.java	(revision 36111)
@@ -33,4 +33,6 @@
     /* option to use specify gpsd port number */
     public static final String C_PORT = "livegps.gpsd.port";
+    /* option to use specify gpsd disabling */
+    public static final String C_DISABLED = "livegps.gpsd.disabled";
     private String gpsdHost;
     private int gpsdPort;
@@ -132,5 +134,5 @@
         while (!shutdownFlag) {
 
-            while (!connected) {
+            while (!connected && !shutdownFlag) {
                 try {
                     connect();
@@ -144,4 +146,6 @@
                 }
             }
+            if (shutdownFlag)
+              break;
 
             assert connected;
@@ -190,4 +194,5 @@
 
     public void shutdown() {
+        Logging.info("LiveGps: Shutdown gpsd");
         shutdownFlag = true;
     }
Index: /applications/editors/josm/plugins/livegps/src/livegps/LiveGpsAcquirerNMEA.java
===================================================================
--- /applications/editors/josm/plugins/livegps/src/livegps/LiveGpsAcquirerNMEA.java	(revision 36110)
+++ /applications/editors/josm/plugins/livegps/src/livegps/LiveGpsAcquirerNMEA.java	(revision 36111)
@@ -115,5 +115,5 @@
         shutdownFlag = false;
         while (!shutdownFlag) {
-            while (!connected) {
+            while (!connected && !shutdownFlag) {
                 try {
                     connect();
@@ -123,5 +123,5 @@
                         Thread.sleep(1000);
                     } catch (InterruptedException ignore) {
-                        Logging.trace(ignore);
+                        Logging.info(ignore);
                     }
                 }
@@ -137,5 +137,5 @@
                 sb.append((char) loopstartChar);
                 Instant lasttime = null;
-                while (true) {
+                while (!shutdownFlag) {
                     // handle long useless data
                     if (sb.length() >= 1020) {
@@ -144,4 +144,5 @@
                     int c = serReader.read();
                     if (c == '$') {
+                        Logging.trace("Parsing NMEA: " + sb.toString().replaceAll("[\r\n]",""));
                         parser.parseNMEASentence(sb.toString());
                         sb.delete(0, sb.length());
@@ -151,11 +152,4 @@
                     } else {
                         sb.append((char) c);
-                    }
-                    if (!serReader.ready()) {
-                        try {
-                            Thread.sleep(50);
-                        } catch (InterruptedException ignore) {
-                            Logging.trace(ignore);
-                        }
                     }
                     if (!serReader.ready()) {
@@ -175,4 +169,5 @@
                                 if (w.getString("speed") != null)
                                     speed = Float.valueOf(w.getString("speed"));
+                                Logging.trace("New LiveGPS entry: " + w);
                                 LiveGpsData gpsData = new LiveGpsData(w.lat(), w.lon(), course, speed, 0.0f, 0.0f);
                                 gpsData.setWaypoint(w);
@@ -183,4 +178,11 @@
                         if (last != null) {
                             lasttime = last.getInstant();
+                        }
+                        if (!serReader.ready()) {
+                            try {
+                                Thread.sleep(50);
+                            } catch (InterruptedException ignore) {
+                                Logging.info(ignore);
+                            }
                         }
                     }
@@ -195,5 +197,5 @@
                     Thread.sleep(1000);
                 } catch (InterruptedException ignore) {
-                    Logging.trace(ignore);
+                    Logging.info(ignore);
                 }
             } catch (IllegalDataException ex) {
@@ -209,4 +211,5 @@
 
     public void shutdown() {
+        Logging.info("LiveGps: Shutdown NMEA");
         shutdownFlag = true;
     }
Index: /applications/editors/josm/plugins/livegps/src/livegps/LiveGpsDialog.java
===================================================================
--- /applications/editors/josm/plugins/livegps/src/livegps/LiveGpsDialog.java	(revision 36110)
+++ /applications/editors/josm/plugins/livegps/src/livegps/LiveGpsDialog.java	(revision 36111)
@@ -27,5 +27,9 @@
 public class LiveGpsDialog extends ToggleDialog implements PropertyChangeListener {
     private static final long serialVersionUID = 6183400754671501117L;
+    private boolean statusGPSD;
+    private boolean statusNMEA;
+    private JLabel statusText;
     private JLabel statusLabel;
+    private JLabel nmeaStatusText;
     private JLabel nmeaStatusLabel;
     private JLabel wayLabel;
@@ -45,10 +49,8 @@
         panel = new JPanel();
         panel.setLayout(new GridLayout(7, 2));
-        panel.add(new JLabel(tr("Status gpsd")));
+        panel.add(statusText = new JLabel(tr("Status gpsd")));
         panel.add(statusLabel = new JLabel());
-        if (!Config.getPref().get(LiveGpsAcquirerNMEA.C_SERIAL).isEmpty()) {
-          panel.add(new JLabel(tr("Status NMEA")));
-          panel.add(nmeaStatusLabel = new JLabel());
-        }
+        panel.add(nmeaStatusText = new JLabel(tr("Status NMEA")));
+        panel.add(nmeaStatusLabel = new JLabel());
         panel.add(new JLabel(tr("Way Info")));
         panel.add(wayLabel = new JLabel());
@@ -61,5 +63,25 @@
         panel.add(new JLabel(tr("Course")));
         panel.add(courseLabel = new JLabel());
+        setStatusVisibility(true);
         createLayout(panel, true, null);
+    }
+
+    /**
+     * Set the visibility of the status fields
+     * @param init initialize the values (don't check previous state)
+     */
+    private void setStatusVisibility(boolean init) {
+        boolean statusGPSDNew = !Config.getPref().getBoolean(LiveGpsAcquirer.C_DISABLED);
+        if (init || statusGPSD != statusGPSDNew) {
+            statusText.setVisible(statusGPSDNew);
+            statusLabel.setVisible(statusGPSDNew);
+            statusGPSD = statusGPSDNew;
+        }
+        boolean statusNMEANew = !Config.getPref().get(LiveGpsAcquirerNMEA.C_SERIAL).isEmpty();
+        if (init || statusNMEA != statusNMEANew) {
+            nmeaStatusText.setVisible(statusNMEANew);
+            nmeaStatusLabel.setVisible(statusNMEANew);
+            statusNMEA = statusNMEANew;
+        }
     }
 
@@ -102,4 +124,6 @@
             status = (LiveGpsStatus) evt.getNewValue();
 
+            setStatusVisibility(false);
+
             SwingUtilities.invokeLater(new Runnable() {
             @Override
@@ -117,4 +141,6 @@
             nmeaStatus = (LiveGpsStatus) evt.getNewValue();
 
+            setStatusVisibility(false);
+
             SwingUtilities.invokeLater(new Runnable() {
             @Override
Index: /applications/editors/josm/plugins/livegps/src/livegps/LiveGpsLayer.java
===================================================================
--- /applications/editors/josm/plugins/livegps/src/livegps/LiveGpsLayer.java	(revision 36110)
+++ /applications/editors/josm/plugins/livegps/src/livegps/LiveGpsLayer.java	(revision 36111)
@@ -42,4 +42,5 @@
     WayPoint lastPoint;
     private final AppendableGpxTrackSegment trackSegment;
+    private final GpxData gpxData;
     boolean autocenter;
     private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
@@ -54,4 +55,5 @@
         IGpxTrack trackBeingWritten = new SingleSegmentGpxTrack(trackSegment, attr);
         data.tracks.add(trackBeingWritten);
+        gpxData = data;
 
         initIntervals();
@@ -78,4 +80,5 @@
         }
         trackSegment.addWaypoint(lastPoint);
+        gpxData.invalidate();
 
         if (autocenter)
Index: /applications/editors/josm/plugins/livegps/src/livegps/LiveGpsPlugin.java
===================================================================
--- /applications/editors/josm/plugins/livegps/src/livegps/LiveGpsPlugin.java	(revision 36110)
+++ /applications/editors/josm/plugins/livegps/src/livegps/LiveGpsPlugin.java	(revision 36111)
@@ -169,10 +169,4 @@
 
         if (enable && !enabled) {
-            assert (acquirer == null);
-            assert (acquirerThread == null);
-
-            acquirer = new LiveGpsAcquirer();
-            acquirerThread = new Thread(acquirer);
-
             if (lgpslayer == null) {
                 lgpslayer = new LiveGpsLayer(data);
@@ -182,11 +176,20 @@
             }
 
-            acquirer.addPropertyChangeListener(lgpslayer);
-            acquirer.addPropertyChangeListener(lgpsdialog);
-            for (PropertyChangeListener listener : listenerQueue) {
-                acquirer.addPropertyChangeListener(listener);
-            }
-
-            acquirerThread.start();
+            assert (acquirer == null);
+            assert (acquirerThread == null);
+
+            if (!Config.getPref().getBoolean(LiveGpsAcquirer.C_DISABLED)) {
+
+                acquirer = new LiveGpsAcquirer();
+                acquirerThread = new Thread(acquirer);
+
+                acquirer.addPropertyChangeListener(lgpslayer);
+                acquirer.addPropertyChangeListener(lgpsdialog);
+                for (PropertyChangeListener listener : listenerQueue) {
+                    acquirer.addPropertyChangeListener(listener);
+                }
+
+                acquirerThread.start();
+            }
 
             assert (acquirerNMEA == null);
@@ -212,7 +215,9 @@
             assert (acquirerThread != null);
 
-            acquirer.shutdown();
-            acquirer = null;
-            acquirerThread = null;
+            if (acquirerThread != null) {
+                acquirer.shutdown();
+                acquirer = null;
+                acquirerThread = null;
+            }
 
             if (acquirerNMEAThread != null) {
