Index: /applications/editors/josm/plugins/livegps/build.xml
===================================================================
--- /applications/editors/josm/plugins/livegps/build.xml	(revision 36106)
+++ /applications/editors/josm/plugins/livegps/build.xml	(revision 36107)
@@ -2,6 +2,6 @@
 <project name="livegps" default="dist" basedir=".">
     <property name="commit.message" value="Changed the constructor signature of the plugin main class"/>
-    <property name="plugin.main.version" value="18494"/>
-	
+    <property name="plugin.main.version" value="18788"/>
+
     <!-- Configure these properties (replace "..." accordingly).
          See https://josm.openstreetmap.de/wiki/DevelopersGuide/DevelopingPlugins
@@ -10,8 +10,8 @@
     <property name="plugin.class" value="livegps.LiveGpsPlugin"/>
     <property name="plugin.description" value="Support live GPS input (moving dot) through a connection to gpsd server."/>
-    <property name="plugin.icon" value="images/dialogs/livegps.png"/>
+    <property name="plugin.icon" value="images/dialogs/livegps.svg"/>
     <property name="plugin.link" value="https://wiki.openstreetmap.org/index.php/JOSM/Plugins/LiveGPS"/>
     <property name="plugin.stage" value="50"/>
-    
+
     <!-- ** include targets that all plugins have in common ** -->
     <import file="../build-common.xml"/>
Index: /applications/editors/josm/plugins/livegps/images/autocentermenu.svg
===================================================================
--- /applications/editors/josm/plugins/livegps/images/autocentermenu.svg	(revision 36107)
+++ /applications/editors/josm/plugins/livegps/images/autocentermenu.svg	(revision 36107)
@@ -0,0 +1,283 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   width="16"
+   height="16"
+   viewBox="0 0 4.2333332 4.2333333"
+   version="1.1"
+   id="svg5"
+   inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
+   sodipodi:docname="autocentermenu.svg"
+   xml:space="preserve"
+   inkscape:export-filename="autocentermenu_neu4.png"
+   inkscape:export-xdpi="96"
+   inkscape:export-ydpi="96"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
+     id="namedview7"
+     pagecolor="#ffffff"
+     bordercolor="#000000"
+     borderopacity="0.25"
+     inkscape:showpageshadow="2"
+     inkscape:pageopacity="0.0"
+     inkscape:pagecheckerboard="0"
+     inkscape:deskcolor="#d1d1d1"
+     inkscape:document-units="mm"
+     showgrid="false"
+     inkscape:zoom="13.455443"
+     inkscape:cx="-0.92899208"
+     inkscape:cy="1.1891099"
+     inkscape:window-width="1920"
+     inkscape:window-height="1127"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="layer1"
+     showguides="false"><inkscape:grid
+       type="xygrid"
+       id="grid537" /></sodipodi:namedview><defs
+     id="defs2"><clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath428"><g
+         id="g432"
+         style="stroke-width:0.999999"><rect
+           style="fill:#ffffff;fill-opacity:0.444275;stroke:none;stroke-width:0.400003"
+           id="rect430"
+           width="4.2333331"
+           height="4.2333341"
+           x="1.11262e-07"
+           y="-1.2715657e-07"
+           ry="0"
+           rx="0" /></g></clipPath><clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath434"><g
+         id="g438"
+         style="stroke-width:0.999999"><rect
+           style="fill:#ffffff;fill-opacity:0.444275;stroke:none;stroke-width:0.400003"
+           id="rect436"
+           width="4.2333331"
+           height="4.2333341"
+           x="1.11262e-07"
+           y="-1.2715657e-07"
+           ry="0"
+           rx="0" /></g></clipPath><clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath440"><g
+         id="g444"
+         style="stroke-width:0.999999"><rect
+           style="fill:#ffffff;fill-opacity:0.444275;stroke:none;stroke-width:0.400003"
+           id="rect442"
+           width="4.2333331"
+           height="4.2333341"
+           x="1.11262e-07"
+           y="-1.2715657e-07"
+           ry="0"
+           rx="0" /></g></clipPath><clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath446"><g
+         id="g450"
+         style="stroke-width:0.999999"><rect
+           style="fill:#ffffff;fill-opacity:0.444275;stroke:none;stroke-width:0.400003"
+           id="rect448"
+           width="4.2333331"
+           height="4.2333341"
+           x="1.11262e-07"
+           y="-1.2715657e-07"
+           ry="0"
+           rx="0" /></g></clipPath><clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath452"><g
+         id="g456"
+         style="stroke-width:0.999999"><rect
+           style="fill:#ffffff;fill-opacity:0.444275;stroke:none;stroke-width:0.400003"
+           id="rect454"
+           width="4.2333331"
+           height="4.2333341"
+           x="1.11262e-07"
+           y="-1.2715657e-07"
+           ry="0"
+           rx="0" /></g></clipPath><clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath333"><g
+         id="g339"
+         transform="matrix(144.97481,0,0,144.97481,318.15847,-337.40237)"><g
+           id="g337"
+           style="stroke-width:0.00689774"><rect
+             style="fill:#ffffff;fill-opacity:0.444275;stroke:none;stroke-width:0.00275912"
+             id="rect335"
+             width="4.2333331"
+             height="4.2333341"
+             x="1.11262e-07"
+             y="-1.2715657e-07"
+             ry="0"
+             rx="0" /></g></g></clipPath></defs><g
+     inkscape:label="Ebene 1"
+     inkscape:groupmode="layer"
+     id="layer1"><path
+       style="fill:#000000;stroke-width:1.76118"
+       d="M 3.8522794,2.2585672 H 0.6129081 Z"
+       id="path352"
+       clip-path="url(#clipPath452)" /><path
+       style="fill:#000000;stroke-width:1.76118"
+       d="M 0.48068886,1.4123641 H 3.6275068"
+       id="path408"
+       clip-path="url(#clipPath446)" /><path
+       style="fill:#000000;stroke:#000000;stroke-width:0.4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 0.57686043,2.1166667 H 3.6564729"
+       id="path966"
+       clip-path="url(#clipPath440)" /><path
+       style="fill:#000000;stroke:#000000;stroke-width:0.4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 2.1166667,3.6564747 V 0.57685867"
+       id="path966-3"
+       clip-path="url(#clipPath434)" /><circle
+       style="fill:#ff0000;stroke:#ff0000;stroke-width:0.121893;stroke-dasharray:none;stroke-opacity:1"
+       id="path2303"
+       cx="2.1166666"
+       cy="2.1166666"
+       r="0.2245716"
+       clip-path="url(#clipPath428)" /><path
+       sodipodi:type="star"
+       style="fill:#000000;stroke-width:0.188749"
+       id="path533-7"
+       inkscape:flatsided="false"
+       sodipodi:sides="3"
+       sodipodi:cx="-0.95244533"
+       sodipodi:cy="-0.67435908"
+       sodipodi:r1="0.59877396"
+       sodipodi:r2="0.29938695"
+       sodipodi:arg1="1.8411217"
+       sodipodi:arg2="2.8883193"
+       inkscape:rounded="0"
+       inkscape:randomized="0"
+       d="m -1.1123449,-0.09733017 -0.1299362,-0.50201026 -0.1299361,-0.50201027 0.49972168,0.13847719 0.49972169,0.13847708 -0.36978558,0.36353312 z"
+       inkscape:transform-center-x="-0.060173181"
+       inkscape:transform-center-y="0.38142814"
+       transform="matrix(-0.94399942,-0.92907249,0.92907249,-0.94399942,1.8438665,1.9187697)" /><path
+       sodipodi:type="star"
+       style="fill:#000000;stroke-width:0.188803"
+       id="path533-3"
+       inkscape:flatsided="false"
+       sodipodi:sides="3"
+       sodipodi:cx="-0.95244533"
+       sodipodi:cy="-0.67435908"
+       sodipodi:r1="0.59877396"
+       sodipodi:r2="0.29938695"
+       sodipodi:arg1="1.8411217"
+       sodipodi:arg2="2.8883193"
+       inkscape:rounded="0"
+       inkscape:randomized="0"
+       d="m -1.1123449,-0.09733017 -0.1299362,-0.50201026 -0.1299361,-0.50201027 0.49972168,0.13847719 0.49972169,0.13847708 -0.36978558,0.36353312 z"
+       inkscape:transform-center-x="0.38132093"
+       inkscape:transform-center-y="0.06015624"
+       transform="matrix(0.9288115,-0.94373423,0.94373423,0.9288115,2.3139135,1.8439431)" /><g
+       id="g2494"
+       style="fill:#808080;fill-opacity:1"
+       transform="matrix(0.00689775,0,0,0.00689775,-2.1945776,2.3273172)"
+       clip-path="url(#clipPath333)">
+	<g
+   id="g2492"
+   style="fill:#808080;fill-opacity:1">
+		<path
+   id="path2488"
+   style="fill:#b3b3b3;fill-opacity:1;stroke:#808080;stroke-width:13.0193;stroke-dasharray:none;stroke-opacity:1"
+   d="m 311.98299,-14.018127 c -12.75297,0 -25.10465,10.2212155 -26.91164,22.6359591 l -2.2636,15.5936619 -1.69769,19.806464 -13.33007,5.093091 -14.96488,-12.701289 -12.76417,-9.368771 c -4.24847,-3.118794 -9.35836,-4.84158 -15.02777,-4.84158 h -2.57798 c -6.81837,0 -12.4118,3.105913 -17.22848,7.922585 l -62.06025,62.060257 c -4.24847,4.248477 -6.78933,9.925549 -7.35668,16.725449 -0.28452,1.13639 -0.31439,2.292 -0.31439,3.14387 0,5.38571 1.27578,10.52925 4.52719,14.9649 l 9.36877,12.76415 13.33006,15.02777 c -1.98239,3.68112 -3.67071,7.95107 -5.65898,13.33007 l -19.86935,1.69769 -15.59366,2.2636 c -12.13526,1.76502 -22.635964,14.16454 -22.635964,26.91164 v 87.52571 c 0,12.7471 10.420974,24.88336 22.635964,26.66013 l 15.59366,2.2636 19.86935,1.6977 c 2.26691,5.94719 4.24479,10.46278 5.65898,13.58157 l -13.33006,15.02776 -9.36877,12.76417 c -3.1188,4.24848 -4.52719,9.01999 -4.52719,14.39898 0,0.85272 0.0299,2.00748 0.31439,3.14388 0.56819,6.79992 2.81194,12.75249 7.35668,17.29137 l 62.06025,62.06025 c 4.6782,4.67734 10.41011,7.60819 17.22848,7.60819 h 2.57798 c 5.66941,0 10.77846,-1.66578 15.02777,-4.77869 l 12.76417,-9.36878 14.96488,-13.33007 c 5.1012,2.54389 9.64895,4.55918 13.33007,5.97338 l 1.69769,19.55496 2.2636,15.84517 c 1.73397,12.14282 14.1595,22.38445 26.91164,22.38445 h 87.58859 c 12.74711,0 24.86245,-10.24163 26.59726,-22.38445 l 2.26359,-15.84517 1.6977,-19.55496 c 4.53299,-1.69787 9.04858,-3.7073 13.58158,-5.97338 l 15.02775,13.33007 12.76418,9.36878 c 4.43647,3.25139 9.61575,4.52718 15.27927,4.52718 h 2.82949 c 6.82341,0 12.47111,-3.10821 16.72546,-7.35668 l 62.06025,-62.06025 c 4.81668,-4.81668 7.3874,-10.49145 7.67109,-17.29137 0.28451,-0.85188 0.2515,-1.41172 0.2515,-2.26359 0,-5.94719 -1.87778,-10.89064 -5.09309,-15.27927 l -9.36877,-12.76417 -12.7013,-15.02776 5.34461,-13.58157 19.55496,-1.6977 15.84516,-2.2636 c 12.41979,-1.77677 22.69884,-13.91303 22.69884,-26.66013 v -87.52571 c 0,-12.7471 -10.27821,-25.13487 -22.69884,-26.91164 l -15.84516,-2.2636 -19.55496,-1.69769 -5.34461,-13.33007 12.7013,-15.02777 9.36877,-12.76415 c 3.48724,-4.75038 5.09309,-9.89211 5.09309,-15.84518 0,-0.846 0.033,-1.41087 -0.2515,-2.26359 -0.28369,-6.7999 -3.12635,-12.185739 -7.67109,-16.725449 L 506.33786,30.121994 c -4.54475,-4.538868 -9.90205,-7.922585 -16.72546,-7.922585 h -2.51511 c -5.94803,0 -11.15718,1.58934 -15.59365,4.84158 L 458.73946,36.40976 443.71171,49.111049 430.13013,44.017958 428.43243,24.211494 426.16884,8.6178321 C 424.36185,-3.7969115 412.31785,-14.018127 399.57158,-14.018127 Z m 43.6371,169.140907 c 24.08505,0 44.77429,8.49387 62.06025,25.77984 17.28011,17.2801 25.77985,37.6667 25.77985,61.74587 0,24.36452 -8.49974,45.05796 -25.77985,62.06025 -17.28596,16.99559 -37.9752,25.46545 -62.06025,25.46545 -24.36369,0 -45.06467,-8.46986 -62.06025,-25.46545 -17.00145,-17.00229 -25.46546,-37.69657 -25.46546,-62.06025 0,-24.07917 8.53619,-44.67811 25.46546,-61.74587 17.06775,-17.21295 37.69656,-25.77984 62.06025,-25.77984 z" />
+		
+	</g>
+</g><g
+       id="g2496"
+       style="fill:#808080;fill-opacity:1"
+       transform="matrix(0.00689775,0,0,0.00689775,-2.1945776,2.3273172)">
+</g><g
+       id="g2498"
+       style="fill:#808080;fill-opacity:1"
+       transform="matrix(0.00689775,0,0,0.00689775,-2.1945776,2.3273172)">
+</g><g
+       id="g2500"
+       style="fill:#808080;fill-opacity:1"
+       transform="matrix(0.00689775,0,0,0.00689775,-2.1945776,2.3273172)">
+</g><g
+       id="g2502"
+       style="fill:#808080;fill-opacity:1"
+       transform="matrix(0.00689775,0,0,0.00689775,-2.1945776,2.3273172)">
+</g><g
+       id="g2504"
+       style="fill:#808080;fill-opacity:1"
+       transform="matrix(0.00689775,0,0,0.00689775,-2.1945776,2.3273172)">
+</g><g
+       id="g2506"
+       style="fill:#808080;fill-opacity:1"
+       transform="matrix(0.00689775,0,0,0.00689775,-2.1945776,2.3273172)">
+</g><g
+       id="g2508"
+       style="fill:#808080;fill-opacity:1"
+       transform="matrix(0.00689775,0,0,0.00689775,-2.1945776,2.3273172)">
+</g><g
+       id="g2510"
+       style="fill:#808080;fill-opacity:1"
+       transform="matrix(0.00689775,0,0,0.00689775,-2.1945776,2.3273172)">
+</g><g
+       id="g2512"
+       style="fill:#808080;fill-opacity:1"
+       transform="matrix(0.00689775,0,0,0.00689775,-2.1945776,2.3273172)">
+</g><g
+       id="g2514"
+       style="fill:#808080;fill-opacity:1"
+       transform="matrix(0.00689775,0,0,0.00689775,-2.1945776,2.3273172)">
+</g><g
+       id="g2516"
+       style="fill:#808080;fill-opacity:1"
+       transform="matrix(0.00689775,0,0,0.00689775,-2.1945776,2.3273172)">
+</g><g
+       id="g2518"
+       style="fill:#808080;fill-opacity:1"
+       transform="matrix(0.00689775,0,0,0.00689775,-2.1945776,2.3273172)">
+</g><g
+       id="g2520"
+       style="fill:#808080;fill-opacity:1"
+       transform="matrix(0.00689775,0,0,0.00689775,-2.1945776,2.3273172)">
+</g><g
+       id="g2522"
+       style="fill:#808080;fill-opacity:1"
+       transform="matrix(0.00689775,0,0,0.00689775,-2.1945776,2.3273172)">
+</g><g
+       id="g2524"
+       style="fill:#808080;fill-opacity:1"
+       transform="matrix(0.00689775,0,0,0.00689775,-2.1945776,2.3273172)">
+</g><path
+       sodipodi:type="star"
+       style="fill:#000000;stroke-width:0.188803"
+       id="path533"
+       inkscape:flatsided="false"
+       sodipodi:sides="3"
+       sodipodi:cx="-0.95244533"
+       sodipodi:cy="-0.67435908"
+       sodipodi:r1="0.59877396"
+       sodipodi:r2="0.29938695"
+       sodipodi:arg1="1.8411217"
+       sodipodi:arg2="2.8883193"
+       inkscape:rounded="0"
+       inkscape:randomized="0"
+       d="m -1.1123449,-0.09733017 -0.1299362,-0.50201026 -0.1299361,-0.50201027 0.49972168,0.13847719 0.49972169,0.13847708 -0.36978558,0.36353312 z"
+       inkscape:transform-center-x="0.060156252"
+       inkscape:transform-center-y="-0.38132093"
+       transform="matrix(0.94373423,0.9288115,-0.9288115,0.94373423,2.3893903,2.3139135)" /><path
+       sodipodi:type="star"
+       style="fill:#000000;stroke-width:0.188803"
+       id="path533-6"
+       inkscape:flatsided="false"
+       sodipodi:sides="3"
+       sodipodi:cx="-0.95244533"
+       sodipodi:cy="-0.67435908"
+       sodipodi:r1="0.59877396"
+       sodipodi:r2="0.29938695"
+       sodipodi:arg1="1.8411217"
+       sodipodi:arg2="2.8883193"
+       inkscape:rounded="0"
+       inkscape:randomized="0"
+       d="m -1.1123449,-0.09733017 -0.1299362,-0.50201026 -0.1299361,-0.50201027 0.49972168,0.13847719 0.49972169,0.13847708 -0.36978558,0.36353312 z"
+       inkscape:transform-center-x="-0.38132102"
+       inkscape:transform-center-y="0.060156241"
+       transform="matrix(-0.9288115,-0.94373423,-0.94373423,0.9288115,1.9194199,1.8439431)" /></g></svg>
Index: /applications/editors/josm/plugins/livegps/images/capturemenu.svg
===================================================================
--- /applications/editors/josm/plugins/livegps/images/capturemenu.svg	(revision 36107)
+++ /applications/editors/josm/plugins/livegps/images/capturemenu.svg	(revision 36107)
@@ -0,0 +1,102 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   width="16"
+   height="16"
+   viewBox="0 0 4.2333332 4.2333333"
+   version="1.1"
+   id="svg2946"
+   inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
+   sodipodi:docname="capturemenu.svg"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:svg="http://www.w3.org/2000/svg">
+  <sodipodi:namedview
+     id="namedview2948"
+     pagecolor="#ffffff"
+     bordercolor="#000000"
+     borderopacity="0.25"
+     inkscape:showpageshadow="2"
+     inkscape:pageopacity="0.0"
+     inkscape:pagecheckerboard="0"
+     inkscape:deskcolor="#d1d1d1"
+     inkscape:document-units="mm"
+     showgrid="false"
+     inkscape:zoom="13.455443"
+     inkscape:cx="4.7192798"
+     inkscape:cy="10.404711"
+     inkscape:window-width="1920"
+     inkscape:window-height="1127"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="g4601" />
+  <defs
+     id="defs2943" />
+  <g
+     inkscape:label="Ebene 1"
+     inkscape:groupmode="layer"
+     id="layer1">
+    <g
+       id="g2883"
+       transform="translate(-4.7488538,5.0071895)">
+      <g
+         id="g4601"
+         transform="matrix(0.68395353,0,0,0.68395353,1.6085532,-2.4725667)"
+         style="stroke-width:1.46209">
+        <path
+           style="fill:#000000;stroke-width:2.575"
+           d="M 10.780899,1.0857562 H 7.5415275 Z"
+           id="path352" />
+        <path
+           style="fill:#000000;stroke-width:2.575"
+           d="M 7.4093083,0.2395531 H 10.556126"
+           id="path408" />
+        <path
+           style="fill:#000000;stroke:#000000;stroke-width:0.584835;stroke-dasharray:none;stroke-opacity:1"
+           d="M 7.7012868,0.9438557 H 10.780899"
+           id="path966" />
+        <path
+           style="fill:#000000;stroke:#000000;stroke-width:0.584835;stroke-dasharray:none;stroke-opacity:1"
+           d="M 9.2410929,2.4836637 V -0.59595231"
+           id="path966-3" />
+        <circle
+           style="fill:#ff0000;stroke:#ff0000;stroke-width:0.178218;stroke-dasharray:none;stroke-opacity:1"
+           id="path2303"
+           cx="9.2410936"
+           cy="0.94385558"
+           r="0.2245716" />
+        <rect
+           style="fill:#000000;fill-opacity:1;stroke-width:0.365522"
+           id="rect4671"
+           width="0.73104382"
+           height="0.73104382"
+           x="7.7221098"
+           y="-0.88006485" />
+        <rect
+           style="fill:#000000;fill-opacity:1;stroke-width:0.365522"
+           id="rect4671-6"
+           width="0.73104382"
+           height="0.73104382"
+           x="5.6349664"
+           y="-2.9086401" />
+        <rect
+           style="fill:#000000;fill-opacity:1;stroke-width:0.365522"
+           id="rect4671-7"
+           width="0.73104382"
+           height="0.73104382"
+           x="4.5913949"
+           y="-3.7058406" />
+        <rect
+           style="fill:#000000;fill-opacity:1;stroke-width:0.365522"
+           id="rect4671-5"
+           width="0.73104382"
+           height="0.73104382"
+           x="6.6785383"
+           y="-1.8943524" />
+      </g>
+    </g>
+  </g>
+</svg>
Index: /applications/editors/josm/plugins/livegps/images/centermenu.svg
===================================================================
--- /applications/editors/josm/plugins/livegps/images/centermenu.svg	(revision 36107)
+++ /applications/editors/josm/plugins/livegps/images/centermenu.svg	(revision 36107)
@@ -0,0 +1,349 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   width="16"
+   height="16"
+   viewBox="0 0 4.2333332 4.2333333"
+   version="1.1"
+   id="svg2196"
+   inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
+   sodipodi:docname="centermenu.svg"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:svg="http://www.w3.org/2000/svg">
+  <sodipodi:namedview
+     id="namedview2198"
+     pagecolor="#ffffff"
+     bordercolor="#000000"
+     borderopacity="0.25"
+     inkscape:showpageshadow="2"
+     inkscape:pageopacity="0.0"
+     inkscape:pagecheckerboard="0"
+     inkscape:deskcolor="#d1d1d1"
+     inkscape:document-units="mm"
+     showgrid="false"
+     inkscape:zoom="13.455443"
+     inkscape:cx="-26.197577"
+     inkscape:cy="4.1618845"
+     inkscape:window-width="1920"
+     inkscape:window-height="1127"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="layer1" />
+  <defs
+     id="defs2193">
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath452">
+      <g
+         id="g456"
+         style="stroke-width:0.999999">
+        <rect
+           style="fill:#ffffff;fill-opacity:0.444275;stroke:none;stroke-width:0.400003"
+           id="rect454"
+           width="4.2333331"
+           height="4.2333341"
+           x="1.11262e-07"
+           y="-1.2715657e-07"
+           ry="0"
+           rx="0" />
+      </g>
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath446">
+      <g
+         id="g450"
+         style="stroke-width:0.999999">
+        <rect
+           style="fill:#ffffff;fill-opacity:0.444275;stroke:none;stroke-width:0.400003"
+           id="rect448"
+           width="4.2333331"
+           height="4.2333341"
+           x="1.11262e-07"
+           y="-1.2715657e-07"
+           ry="0"
+           rx="0" />
+      </g>
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath440">
+      <g
+         id="g444"
+         style="stroke-width:0.999999">
+        <rect
+           style="fill:#ffffff;fill-opacity:0.444275;stroke:none;stroke-width:0.400003"
+           id="rect442"
+           width="4.2333331"
+           height="4.2333341"
+           x="1.11262e-07"
+           y="-1.2715657e-07"
+           ry="0"
+           rx="0" />
+      </g>
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath434">
+      <g
+         id="g438"
+         style="stroke-width:0.999999">
+        <rect
+           style="fill:#ffffff;fill-opacity:0.444275;stroke:none;stroke-width:0.400003"
+           id="rect436"
+           width="4.2333331"
+           height="4.2333341"
+           x="1.11262e-07"
+           y="-1.2715657e-07"
+           ry="0"
+           rx="0" />
+      </g>
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath428">
+      <g
+         id="g432"
+         style="stroke-width:0.999999">
+        <rect
+           style="fill:#ffffff;fill-opacity:0.444275;stroke:none;stroke-width:0.400003"
+           id="rect430"
+           width="4.2333331"
+           height="4.2333341"
+           x="1.11262e-07"
+           y="-1.2715657e-07"
+           ry="0"
+           rx="0" />
+      </g>
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath422">
+      <g
+         id="g426"
+         style="stroke-width:0.00689774"
+         transform="matrix(144.97481,0,0,144.97481,318.15847,-337.40237)">
+        <rect
+           style="fill:#ffffff;fill-opacity:0.444275;stroke:none;stroke-width:0.00275912"
+           id="rect424"
+           width="4.2333331"
+           height="4.2333341"
+           x="1.11262e-07"
+           y="-1.2715657e-07"
+           ry="0"
+           rx="0" />
+      </g>
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath452-3">
+      <g
+         id="g456-6"
+         style="stroke-width:0.999999">
+        <rect
+           style="fill:#ffffff;fill-opacity:0.444275;stroke:none;stroke-width:0.400003"
+           id="rect454-7"
+           width="4.2333331"
+           height="4.2333341"
+           x="1.11262e-07"
+           y="-1.2715657e-07"
+           ry="0"
+           rx="0" />
+      </g>
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath446-5">
+      <g
+         id="g450-3"
+         style="stroke-width:0.999999">
+        <rect
+           style="fill:#ffffff;fill-opacity:0.444275;stroke:none;stroke-width:0.400003"
+           id="rect448-5"
+           width="4.2333331"
+           height="4.2333341"
+           x="1.11262e-07"
+           y="-1.2715657e-07"
+           ry="0"
+           rx="0" />
+      </g>
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath440-6">
+      <g
+         id="g444-2"
+         style="stroke-width:0.999999">
+        <rect
+           style="fill:#ffffff;fill-opacity:0.444275;stroke:none;stroke-width:0.400003"
+           id="rect442-9"
+           width="4.2333331"
+           height="4.2333341"
+           x="1.11262e-07"
+           y="-1.2715657e-07"
+           ry="0"
+           rx="0" />
+      </g>
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath434-1">
+      <g
+         id="g438-2"
+         style="stroke-width:0.999999">
+        <rect
+           style="fill:#ffffff;fill-opacity:0.444275;stroke:none;stroke-width:0.400003"
+           id="rect436-7"
+           width="4.2333331"
+           height="4.2333341"
+           x="1.11262e-07"
+           y="-1.2715657e-07"
+           ry="0"
+           rx="0" />
+      </g>
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath428-0">
+      <g
+         id="g432-9"
+         style="stroke-width:0.999999">
+        <rect
+           style="fill:#ffffff;fill-opacity:0.444275;stroke:none;stroke-width:0.400003"
+           id="rect430-3"
+           width="4.2333331"
+           height="4.2333341"
+           x="1.11262e-07"
+           y="-1.2715657e-07"
+           ry="0"
+           rx="0" />
+      </g>
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath422-6">
+      <g
+         id="g426-0"
+         style="stroke-width:0.00689774"
+         transform="matrix(144.97481,0,0,144.97481,318.15847,-337.40237)">
+        <rect
+           style="fill:#ffffff;fill-opacity:0.444275;stroke:none;stroke-width:0.00275912"
+           id="rect424-6"
+           width="4.2333331"
+           height="4.2333341"
+           x="1.11262e-07"
+           y="-1.2715657e-07"
+           ry="0"
+           rx="0" />
+      </g>
+    </clipPath>
+  </defs>
+  <g
+     inkscape:label="Ebene 1"
+     inkscape:groupmode="layer"
+     id="layer1">
+    <path
+       style="fill:#000000;stroke-width:1.76118"
+       d="M 3.8522794,2.2585672 H 0.6129081 Z"
+       id="path352"
+       clip-path="url(#clipPath452-3)" />
+    <path
+       style="fill:#000000;stroke-width:1.76118"
+       d="M 0.48068886,1.4123641 H 3.6275068"
+       id="path408"
+       clip-path="url(#clipPath446-5)" />
+    <path
+       style="fill:#000000;stroke:#000000;stroke-width:0.4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 0.57686043,2.1166667 H 3.6564729"
+       id="path966"
+       clip-path="url(#clipPath440-6)" />
+    <path
+       style="fill:#000000;stroke:#000000;stroke-width:0.4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 2.1166667,3.6564747 V 0.57685867"
+       id="path966-3"
+       clip-path="url(#clipPath434-1)" />
+    <circle
+       style="fill:#ff0000;stroke:#ff0000;stroke-width:0.121893;stroke-dasharray:none;stroke-opacity:1"
+       id="path2303"
+       cx="2.1166666"
+       cy="2.1166666"
+       r="0.2245716"
+       clip-path="url(#clipPath428-0)" />
+    <path
+       sodipodi:type="star"
+       style="fill:#000000;stroke-width:0.188749"
+       id="path533-7-2"
+       inkscape:flatsided="false"
+       sodipodi:sides="3"
+       sodipodi:cx="-0.95244533"
+       sodipodi:cy="-0.67435908"
+       sodipodi:r1="0.59877396"
+       sodipodi:r2="0.29938695"
+       sodipodi:arg1="1.8411217"
+       sodipodi:arg2="2.8883193"
+       inkscape:rounded="0"
+       inkscape:randomized="0"
+       d="m -1.1123449,-0.09733017 -0.1299362,-0.50201026 -0.1299361,-0.50201027 0.49972168,0.13847719 0.49972169,0.13847708 -0.36978558,0.36353312 z"
+       inkscape:transform-center-x="-0.060173181"
+       inkscape:transform-center-y="0.38142814"
+       transform="matrix(-0.94399942,-0.92907249,0.92907249,-0.94399942,1.8438665,1.9187697)" />
+    <path
+       sodipodi:type="star"
+       style="fill:#000000;stroke-width:0.188803"
+       id="path533-3-6"
+       inkscape:flatsided="false"
+       sodipodi:sides="3"
+       sodipodi:cx="-0.95244533"
+       sodipodi:cy="-0.67435908"
+       sodipodi:r1="0.59877396"
+       sodipodi:r2="0.29938695"
+       sodipodi:arg1="1.8411217"
+       sodipodi:arg2="2.8883193"
+       inkscape:rounded="0"
+       inkscape:randomized="0"
+       d="m -1.1123449,-0.09733017 -0.1299362,-0.50201026 -0.1299361,-0.50201027 0.49972168,0.13847719 0.49972169,0.13847708 -0.36978558,0.36353312 z"
+       inkscape:transform-center-x="0.38132093"
+       inkscape:transform-center-y="0.06015624"
+       transform="matrix(0.9288115,-0.94373423,0.94373423,0.9288115,2.3139135,1.843943)" />
+    <path
+       sodipodi:type="star"
+       style="fill:#000000;stroke-width:0.188803"
+       id="path533-1"
+       inkscape:flatsided="false"
+       sodipodi:sides="3"
+       sodipodi:cx="-0.95244533"
+       sodipodi:cy="-0.67435908"
+       sodipodi:r1="0.59877396"
+       sodipodi:r2="0.29938695"
+       sodipodi:arg1="1.8411217"
+       sodipodi:arg2="2.8883193"
+       inkscape:rounded="0"
+       inkscape:randomized="0"
+       d="m -1.1123449,-0.09733017 -0.1299362,-0.50201026 -0.1299361,-0.50201027 0.49972168,0.13847719 0.49972169,0.13847708 -0.36978558,0.36353312 z"
+       inkscape:transform-center-x="0.060156252"
+       inkscape:transform-center-y="-0.38132093"
+       transform="matrix(0.94373423,0.9288115,-0.9288115,0.94373423,2.3893903,2.3139135)" />
+    <path
+       sodipodi:type="star"
+       style="fill:#000000;stroke-width:0.188803"
+       id="path533-6-8"
+       inkscape:flatsided="false"
+       sodipodi:sides="3"
+       sodipodi:cx="-0.95244533"
+       sodipodi:cy="-0.67435908"
+       sodipodi:r1="0.59877396"
+       sodipodi:r2="0.29938695"
+       sodipodi:arg1="1.8411217"
+       sodipodi:arg2="2.8883193"
+       inkscape:rounded="0"
+       inkscape:randomized="0"
+       d="m -1.1123449,-0.09733017 -0.1299362,-0.50201026 -0.1299361,-0.50201027 0.49972168,0.13847719 0.49972169,0.13847708 -0.36978558,0.36353312 z"
+       inkscape:transform-center-x="-0.38132102"
+       inkscape:transform-center-y="0.060156241"
+       transform="matrix(-0.9288115,-0.94373423,-0.94373423,0.9288115,1.9194199,1.843943)" />
+  </g>
+</svg>
Index: /applications/editors/josm/plugins/livegps/images/dialogs/livegps.svg
===================================================================
--- /applications/editors/josm/plugins/livegps/images/dialogs/livegps.svg	(revision 36107)
+++ /applications/editors/josm/plugins/livegps/images/dialogs/livegps.svg	(revision 36107)
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   width="16"
+   height="16"
+   viewBox="0 0 4.2333332 4.2333333"
+   version="1.1"
+   id="svg5"
+   inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
+   sodipodi:docname="livegps.svg"
+   inkscape:export-filename="livegps_neu.png"
+   inkscape:export-xdpi="96"
+   inkscape:export-ydpi="96"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:svg="http://www.w3.org/2000/svg">
+  <sodipodi:namedview
+     id="namedview7"
+     pagecolor="#ffffff"
+     bordercolor="#000000"
+     borderopacity="0.25"
+     inkscape:showpageshadow="2"
+     inkscape:pageopacity="0.0"
+     inkscape:pagecheckerboard="0"
+     inkscape:deskcolor="#d1d1d1"
+     inkscape:document-units="mm"
+     showgrid="false"
+     inkscape:zoom="26.910886"
+     inkscape:cx="2.7312367"
+     inkscape:cy="13.414646"
+     inkscape:window-width="1920"
+     inkscape:window-height="1127"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="layer1" />
+  <defs
+     id="defs2" />
+  <g
+     inkscape:label="Ebene 1"
+     inkscape:groupmode="layer"
+     id="layer1">
+    <path
+       style="fill:#000000;stroke:#000000;stroke-width:0.39737;stroke-dasharray:none;stroke-opacity:1"
+       d="M 0.02724637,2.1166668 H 4.2060871"
+       id="path966" />
+    <path
+       style="fill:#000000;stroke:#000000;stroke-width:0.397371;stroke-dasharray:none;stroke-opacity:1"
+       d="M 2.1166668,4.2060847 V 0.02724887"
+       id="path966-3" />
+    <circle
+       style="fill:none;stroke:#ff0101;stroke-width:0.248357;stroke-dasharray:none;stroke-opacity:1"
+       id="path1419"
+       cx="2.1166666"
+       cy="2.1166666"
+       r="1.9660295" />
+    <circle
+       style="fill:none;stroke:#ff0101;stroke-width:0.248357;stroke-dasharray:none;stroke-opacity:1"
+       id="path1419-3"
+       cx="2.1166666"
+       cy="2.1166666"
+       r="1.2660376" />
+    <circle
+       style="fill:#ff0000;stroke-width:0.500233"
+       id="path351"
+       cx="2.1166666"
+       cy="2.1166666"
+       r="0.44999999" />
+  </g>
+</svg>
Index: /applications/editors/josm/plugins/livegps/src/livegps/LiveGPSPreferences.java
===================================================================
--- /applications/editors/josm/plugins/livegps/src/livegps/LiveGPSPreferences.java	(revision 36107)
+++ /applications/editors/josm/plugins/livegps/src/livegps/LiveGPSPreferences.java	(revision 36107)
@@ -0,0 +1,61 @@
+// License: Public Domain. For details, see LICENSE file.
+package livegps;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
+
+import javax.swing.Box;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JTextField;
+
+import org.openstreetmap.josm.gui.preferences.DefaultTabPreferenceSetting;
+import org.openstreetmap.josm.gui.preferences.PreferenceTabbedPane;
+import org.openstreetmap.josm.spi.preferences.Config;
+import org.openstreetmap.josm.tools.GBC;
+
+/**
+ * Preferences of LiveGPS
+ */
+public class LiveGPSPreferences extends DefaultTabPreferenceSetting {
+    private final JTextField gpsdHost = new JTextField(30);
+    private final JTextField gpsdPort = new JTextField(30);
+    private final JTextField serialDevice = new JTextField(30);
+
+    public LiveGPSPreferences() {
+        super("dialogs/livegps", tr("LiveGPS settings"), tr("Here you can change some preferences of LiveGPS plugin"));
+    }
+
+    @Override
+    public void addGui(PreferenceTabbedPane gui) {
+        JPanel panel = new JPanel(new GridBagLayout());
+
+        gpsdHost.setText(Config.getPref().get(LiveGpsAcquirer.C_HOST, LiveGpsAcquirer.DEFAULT_HOST));
+        gpsdHost.setToolTipText(tr("Host address of gpsd, default is {0}", LiveGpsAcquirer.DEFAULT_HOST));
+        panel.add(new JLabel(tr("Host address of gpsd")), GBC.std());
+        panel.add(gpsdHost, GBC.eol().fill(GridBagConstraints.HORIZONTAL).insets(5, 0, 0, 5));
+
+        gpsdPort.setText(String.valueOf(Config.getPref().getInt(LiveGpsAcquirer.C_PORT, LiveGpsAcquirer.DEFAULT_PORT)));
+        gpsdPort.setToolTipText(tr("Port number of gpsd, default is {0}", LiveGpsAcquirer.DEFAULT_PORT));
+        panel.add(new JLabel(tr("Port number gpsd")), GBC.std());
+        panel.add(gpsdPort, GBC.eol().fill(GridBagConstraints.HORIZONTAL).insets(5, 0, 0, 5));
+
+        serialDevice.setText(Config.getPref().get(LiveGpsAcquirerNMEA.C_SERIAL));
+        serialDevice.setToolTipText(tr("Serial device for direct NMEA input, does not exist by default"));
+        panel.add(new JLabel(tr("Serial device")), GBC.std());
+        panel.add(serialDevice, GBC.eol().fill(GridBagConstraints.HORIZONTAL).insets(5, 0, 0, 5));
+
+        panel.add(Box.createVerticalGlue(), GBC.eol().fill(GridBagConstraints.VERTICAL));
+        createPreferenceTabWithScrollPane(gui, panel);
+    }
+
+    @Override
+    public boolean ok() {
+        Config.getPref().put(LiveGpsAcquirer.C_HOST, gpsdHost.getText());
+        Config.getPref().put(LiveGpsAcquirer.C_PORT, gpsdPort.getText());
+        Config.getPref().put(LiveGpsAcquirerNMEA.C_SERIAL, serialDevice.getText());
+        return false;
+    }
+}
Index: /applications/editors/josm/plugins/livegps/src/livegps/LiveGpsAcquirer.java
===================================================================
--- /applications/editors/josm/plugins/livegps/src/livegps/LiveGpsAcquirer.java	(revision 36106)
+++ /applications/editors/josm/plugins/livegps/src/livegps/LiveGpsAcquirer.java	(revision 36107)
@@ -25,8 +25,12 @@
 
 public class LiveGpsAcquirer implements Runnable {
-    private static final String DEFAULT_HOST = "localhost";
-    private static final int DEFAULT_PORT = 2947;
-    private static final String C_HOST = "livegps.gpsd.host";
-    private static final String C_PORT = "livegps.gpsd.port";
+    /* default gpsd host address */
+    public static final String DEFAULT_HOST = "localhost";
+    /* default gpsd port number */
+    public static final int DEFAULT_PORT = 2947;
+    /* option to use specify gpsd host address */
+    public static final String C_HOST = "livegps.gpsd.host";
+    /* option to use specify gpsd port number */
+    public static final String C_PORT = "livegps.gpsd.port";
     private String gpsdHost;
     private int gpsdPort;
@@ -37,4 +41,6 @@
     private boolean shutdownFlag = false;
     private boolean JSONProtocol = true;
+    private long skipTime = 0L;
+    private int skipNum = 0;
 
     private final List<PropertyChangeListener> propertyChangeListener = new ArrayList<>();
@@ -139,5 +145,5 @@
             }
 
-            assert (connected);
+            assert connected;
 
             try {
@@ -191,5 +197,13 @@
         String line, type, release;
 
-        Logging.info("LiveGps: trying to connect to gpsd at " + gpsdHost + ":" + gpsdPort);
+        long t = System.currentTimeMillis();
+        if (skipTime == 0 || t > skipTime) {
+            skipTime = 0;
+            Logging.info("LiveGps: trying to connect to gpsd at " + gpsdHost + ":"
+                + gpsdPort + (skipNum != 0 ? " (skipped " + skipNum + " notices)" : ""));
+            skipNum = 0;
+        } else {
+          ++skipNum;
+        }
         fireGpsStatusChangeEvent(LiveGpsStatus.GpsStatus.CONNECTING, tr("Connecting"));
 
@@ -200,11 +214,18 @@
                 break;
             } catch (IOException e) {
-                Logging.warn("LiveGps: Could not open connection to gpsd: " + e);
+                if (skipTime == 0) {
+                    Logging.warn("LiveGps: Could not open connection to gpsd ("+addrs[i]+"): " + e);
+                }
                 gpsdSocket = null;
             }
         }
 
-        if (gpsdSocket == null || gpsdSocket.isConnected() == false)
+        if (gpsdSocket == null || gpsdSocket.isConnected() == false) {
+            if (skipTime == 0)
+                skipTime = System.currentTimeMillis()+60000;
             throw new IOException();
+        }
+        skipTime = 0;
+        skipNum = 0;
 
         /*
@@ -311,5 +332,5 @@
 
         words = line.split(",");
-        if ((words.length == 0) || (!words[0].equals("GPSD")))
+        if ((words.length == 0) || !words[0].equals("GPSD"))
             return null;
 
Index: /applications/editors/josm/plugins/livegps/src/livegps/LiveGpsAcquirerNMEA.java
===================================================================
--- /applications/editors/josm/plugins/livegps/src/livegps/LiveGpsAcquirerNMEA.java	(revision 36107)
+++ /applications/editors/josm/plugins/livegps/src/livegps/LiveGpsAcquirerNMEA.java	(revision 36107)
@@ -0,0 +1,234 @@
+// License: Public Domain. For details, see LICENSE file.
+package livegps;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.io.FileInputStream;
+import java.io.InputStreamReader;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.time.Instant;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import org.openstreetmap.josm.data.gpx.WayPoint;
+import org.openstreetmap.josm.io.IllegalDataException;
+import org.openstreetmap.josm.io.nmea.NmeaParser;
+import org.openstreetmap.josm.spi.preferences.Config;
+import org.openstreetmap.josm.tools.Logging;
+
+/**
+ * Acquires NMEA data from a (virtual) serial port
+ */
+public class LiveGpsAcquirerNMEA implements Runnable {
+    /* option to use serial port direct access */
+    public static final String C_SERIAL = "livegps.serial.port";
+    private String serName;
+
+    private InputStreamReader serReader;
+    private NmeaParser parser;
+    private boolean connected = false;
+    private boolean shutdownFlag = false;
+
+    private final List<PropertyChangeListener> propertyChangeListener = new ArrayList<>();
+    private PropertyChangeEvent lastStatusEvent;
+    private PropertyChangeEvent lastDataEvent;
+
+    /**
+     * Constructor, initializes the configurable settings.
+     */
+    public LiveGpsAcquirerNMEA() {
+        serName = Config.getPref().get(C_SERIAL);
+    }
+
+    /**
+     * Adds a property change listener to the acquirer.
+     * @param listener the new listener
+     */
+    public void addPropertyChangeListener(PropertyChangeListener listener) {
+        if (!propertyChangeListener.contains(listener)) {
+            propertyChangeListener.add(listener);
+        }
+    }
+
+    /**
+     * Remove a property change listener from the acquirer.
+     * @param listener the new listener
+     */
+    public void removePropertyChangeListener(PropertyChangeListener listener) {
+        if (propertyChangeListener.contains(listener)) {
+            propertyChangeListener.remove(listener);
+        }
+    }
+
+    /**
+     * Fire a gps status change event. Fires events with key "gpsstatus" and a {@link LiveGpsStatus}
+     * object as value.
+     * The status event may be sent any time.
+     * @param status the status.
+     * @param statusMessage the status message.
+     */
+    public void fireGpsStatusChangeEvent(LiveGpsStatus.GpsStatus status, String statusMessage) {
+        PropertyChangeEvent event = new PropertyChangeEvent(this, "nmeastatus",
+                null, new LiveGpsStatus(status, statusMessage));
+
+        if (!event.equals(lastStatusEvent)) {
+            firePropertyChangeEvent(event);
+            lastStatusEvent = event;
+        }
+    }
+
+    /**
+     * Fire a gps data change event to all listeners. Fires events with key "gpsdata" and a
+     * {@link LiveGpsData} object as values.
+     * This event is only sent, when the suppressor permits it. This
+     * event will cause the UI to re-draw itself, which has some performance penalty,
+     * @param oldData the old gps data.
+     * @param newData the new gps data.
+     */
+    public void fireGpsDataChangeEvent(LiveGpsData oldData, LiveGpsData newData) {
+        PropertyChangeEvent event = new PropertyChangeEvent(this, "gpsdata", oldData, newData);
+
+        if (!event.equals(lastDataEvent)) {
+            firePropertyChangeEvent(event);
+            lastDataEvent = event;
+        }
+    }
+
+    /**
+     * Fires the given event to all listeners.
+     * @param event the event to fire.
+     */
+    protected void firePropertyChangeEvent(PropertyChangeEvent event) {
+        for (PropertyChangeListener listener : propertyChangeListener) {
+            listener.propertyChange(event);
+        }
+    }
+
+    @Override
+    public void run() {
+        LiveGpsData oldGpsData = null;
+
+        shutdownFlag = false;
+        while (!shutdownFlag) {
+            while (!connected) {
+                try {
+                    connect();
+                } catch (IOException iox) {
+                    fireGpsStatusChangeEvent(LiveGpsStatus.GpsStatus.CONNECTION_FAILED, tr("NMEA Connection Failed"));
+                    try {
+                        Thread.sleep(1000);
+                    } catch (InterruptedException ignore) {
+                        Logging.trace(ignore);
+                    }
+                }
+            }
+
+            assert connected;
+
+            try {
+                StringBuilder sb = new StringBuilder(1024);
+                int loopstartChar = serReader.read();
+                if (loopstartChar == -1)
+                    throw new IOException();
+                sb.append((char) loopstartChar);
+                Instant lasttime = null;
+                while (true) {
+                    // handle long useless data
+                    if (sb.length() >= 1020) {
+                        sb.delete(0, sb.length()-1);
+                    }
+                    int c = serReader.read();
+                    if (c == '$') {
+                        parser.parseNMEASentence(sb.toString());
+                        sb.delete(0, sb.length());
+                        sb.append('$');
+                    } else if (c == -1) {
+                        throw new IOException();
+                    } else {
+                        sb.append((char) c);
+                    }
+                    if (!serReader.ready()) {
+                        try {
+                            Thread.sleep(50);
+                        } catch (InterruptedException ignore) {
+                            Logging.trace(ignore);
+                        }
+                    }
+                    if (!serReader.ready()) {
+                        WayPoint last = null;
+                        Collection<WayPoint> wpts = parser.getAndDropWaypoints();
+                        for (WayPoint w : wpts) {
+                            if(w.getInstant() == null)
+                                continue;
+                            if (w.getInstant().equals(lasttime)) {
+                                Logging.info("Skip double waypoint at " + lasttime);
+                            } else {
+                                last = w;
+                                float course = 0.0f;
+                                float speed = 0.0f;
+                                if (w.getString("course") != null)
+                                    course = Float.valueOf(w.getString("course"));
+                                if (w.getString("speed") != null)
+                                    speed = Float.valueOf(w.getString("speed"));
+                                LiveGpsData gpsData = new LiveGpsData(w.lat(), w.lon(), course, speed, 0.0f, 0.0f);
+                                gpsData.setWaypoint(w);
+                                fireGpsDataChangeEvent(oldGpsData, gpsData);
+                                oldGpsData = gpsData;
+                            }
+                        }
+                        if (last != null) {
+                            lasttime = last.getInstant();
+                        }
+                    }
+                }
+            } catch (IOException iox) {
+                Logging.log(Logging.LEVEL_WARN, "LiveGps: lost connection to NMEA", iox);
+                fireGpsStatusChangeEvent(
+                        LiveGpsStatus.GpsStatus.CONNECTION_FAILED,
+                        tr("NMEA Connection Failed"));
+                disconnect();
+                try {
+                    Thread.sleep(1000);
+                } catch (InterruptedException ignore) {
+                    Logging.trace(ignore);
+                }
+            } catch (IllegalDataException ex) {
+                Logging.log(Logging.LEVEL_WARN, "LiveGps: Illegal NMEA", ex);
+            }
+        }
+
+        Logging.info("LiveGps: Disconnected from NMEA");
+        fireGpsStatusChangeEvent(LiveGpsStatus.GpsStatus.DISCONNECTED,
+                tr("NMEA Not connected"));
+        disconnect();
+    }
+
+    public void shutdown() {
+        shutdownFlag = true;
+    }
+
+    private void connect() throws IOException {
+        fireGpsStatusChangeEvent(LiveGpsStatus.GpsStatus.CONNECTING, tr("Connecting"));
+        serReader = new InputStreamReader(new FileInputStream(serName), StandardCharsets.UTF_8);
+        parser = new NmeaParser();
+        fireGpsStatusChangeEvent(LiveGpsStatus.GpsStatus.CONNECTED, tr("Connected"));
+        connected = true;
+    }
+
+    private void disconnect() {
+        if (serReader != null) {
+            try {
+                serReader.close();
+            } catch (IOException iox) {
+                Logging.warn("LiveGps: Unable to close NMEA; reconnection may not be possible");
+            }
+            serReader = null;
+        }
+        parser = null;
+        connected = false;
+    }
+}
Index: /applications/editors/josm/plugins/livegps/src/livegps/LiveGpsData.java
===================================================================
--- /applications/editors/josm/plugins/livegps/src/livegps/LiveGpsData.java	(revision 36106)
+++ /applications/editors/josm/plugins/livegps/src/livegps/LiveGpsData.java	(revision 36107)
@@ -7,4 +7,5 @@
 
 import org.openstreetmap.josm.data.coor.LatLon;
+import org.openstreetmap.josm.data.gpx.WayPoint;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Way;
@@ -13,6 +14,6 @@
 
 /**
+ * Representation of a single LiveGPS data epoch
  * @author cdaller
- *
  */
 public class LiveGpsData {
@@ -24,4 +25,5 @@
     private String wayString;
     private Way way;
+    private WayPoint wp;
 
     public LiveGpsData(double latitude, double longitude, float course, float speed) {
@@ -42,5 +44,22 @@
 
     /**
-     * @return the course
+     * Return the waypoint associated with this data set (can be {@code null})
+     * @return waypoint with additional information or {@code null}
+     */
+    public WayPoint getWaypoint() {
+        return this.wp;
+    }
+
+    /**
+     * Set the waypoint to transfer additional data form NMEA input
+     * @param wp waypoint to set
+     */
+    public void setWaypoint(WayPoint wp) {
+        this.wp = wp;
+    }
+
+    /**
+     * Return the course value
+     * @return course value in degree
      */
     public float getCourse() {
@@ -49,5 +68,6 @@
 
     /**
-     * @param course the course to set
+     * Set the course value in degree
+     * @param course course to set
      */
     public void setCourse(float course) {
@@ -56,5 +76,6 @@
 
     /**
-     * @return the haveFix
+     * Return the fix status (whether there is a position solution or not)
+     * @return fix status
      */
     public boolean isFix() {
@@ -63,4 +84,5 @@
 
     /**
+     * Set the fix status (whether there is a position solution or not)
      * @param haveFix the haveFix to set
      */
@@ -70,5 +92,6 @@
 
     /**
-     * @return the latitude
+     * Return the latitude part of the position
+     * @return latitude of position
      */
     public double getLatitude() {
@@ -77,5 +100,6 @@
 
     /**
-     * @return the longitude
+     * Return the longitude part of the position
+     * @return longitude of position
      */
     public double getLongitude() {
@@ -84,5 +108,6 @@
 
     /**
-     * @return the speed in metres per second!
+     * Return the speed (m/s)
+     * @return speed in metres per second!
      */
     public float getSpeed() {
@@ -91,4 +116,5 @@
 
     /**
+     * Set the speed (m/s)
      * @param speed the speed to set
      */
@@ -98,5 +124,6 @@
 
     /**
-     * @return the latlon
+     * Return the position with latitude and logitude combined
+     * @return both position components
      */
     public LatLon getLatLon() {
@@ -104,4 +131,8 @@
     }
 
+    /**
+     * Set the position with latitude and logitude combined
+     * @param latLon position to set
+     */
     public void setLatLon(LatLon latLon) {
         this.latLon = latLon;
@@ -202,7 +233,5 @@
         if (this == obj)
             return true;
-        if (obj == null)
-            return false;
-        if (getClass() != obj.getClass())
+        if (!(obj instanceof LiveGpsData))
             return false;
         final LiveGpsData other = (LiveGpsData) obj;
Index: /applications/editors/josm/plugins/livegps/src/livegps/LiveGpsDialog.java
===================================================================
--- /applications/editors/josm/plugins/livegps/src/livegps/LiveGpsDialog.java	(revision 36106)
+++ /applications/editors/josm/plugins/livegps/src/livegps/LiveGpsDialog.java	(revision 36107)
@@ -14,15 +14,19 @@
 import javax.swing.SwingUtilities;
 
+import org.openstreetmap.josm.data.coor.conversion.CoordinateFormatManager;
+import org.openstreetmap.josm.data.coor.conversion.ICoordinateFormat;
 import org.openstreetmap.josm.gui.MapFrame;
 import org.openstreetmap.josm.gui.dialogs.ToggleDialog;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.Shortcut;
 
 /**
+ * The LiveGPS dialog window showing the current data and status
  * @author cdaller
- *
  */
 public class LiveGpsDialog extends ToggleDialog implements PropertyChangeListener {
     private static final long serialVersionUID = 6183400754671501117L;
     private JLabel statusLabel;
+    private JLabel nmeaStatusLabel;
     private JLabel wayLabel;
     private JLabel latLabel;
@@ -31,5 +35,6 @@
     private JLabel speedLabel;
     private JPanel panel;
-    private LiveGpsStatus status;
+    private LiveGpsStatus status = new LiveGpsStatus(LiveGpsStatus.GpsStatus.CONNECTING, tr("Connecting"));
+    private LiveGpsStatus nmeaStatus = new LiveGpsStatus(LiveGpsStatus.GpsStatus.CONNECTING, tr("Connecting"));
     private LiveGpsData data;
 
@@ -39,7 +44,11 @@
         KeyEvent.VK_G, Shortcut.ALT_CTRL_SHIFT), 100);
         panel = new JPanel();
-        panel.setLayout(new GridLayout(6, 2));
-        panel.add(new JLabel(tr("Status")));
+        panel.setLayout(new GridLayout(7, 2));
+        panel.add(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(new JLabel(tr("Way Info")));
         panel.add(wayLabel = new JLabel());
@@ -68,9 +77,10 @@
                 if (data.isFix()) {
                     panel.setBackground(Color.WHITE);
-                    latLabel.setText(data.getLatitude() + "deg");
-                    longLabel.setText(data.getLongitude() + "deg");
+                    ICoordinateFormat mCord = CoordinateFormatManager.getDefaultFormat();
+                    latLabel.setText(mCord.latToString(data.getLatLon()));
+                    longLabel.setText(mCord.lonToString(data.getLatLon()));
                     double mySpeed = data.getSpeed() * 3.6f;
-                    speedLabel.setText((Math.round(mySpeed*100)/100) + "km/h");
-                    courseLabel.setText(data.getCourse() + "deg");
+                    speedLabel.setText(tr("{0} km/h", Math.round(mySpeed*100)/100));
+                    courseLabel.setText(tr("{0} deg", data.getCourse()));
 
                     String wayString = data.getWayInfo();
@@ -89,4 +99,5 @@
             } });
         } else if ("gpsstatus".equals(evt.getPropertyName())) {
+            LiveGpsStatus oldStatus = status;
             status = (LiveGpsStatus) evt.getNewValue();
 
@@ -94,6 +105,8 @@
             @Override
             public void run() {
-                statusLabel.setText(status.getStatusMessage());
-                if (status.getStatus() != LiveGpsStatus.GpsStatus.CONNECTED) {
+                /* prevent flickering - skip the connecting message when NMEA input is working */
+                if (!(oldStatus.getStatus() == LiveGpsStatus.GpsStatus.CONNECTION_FAILED && status.getStatus() == LiveGpsStatus.GpsStatus.CONNECTING && nmeaStatus.getStatus() == LiveGpsStatus.GpsStatus.CONNECTED))
+                    statusLabel.setText(status.getStatusMessage());
+                if (status.getStatus() != LiveGpsStatus.GpsStatus.CONNECTED && nmeaStatus.getStatus() != LiveGpsStatus.GpsStatus.CONNECTED) {
                     panel.setBackground(Color.RED);
                 } else {
@@ -101,4 +114,12 @@
                 }
             } });
+        } else if ("nmeastatus".equals(evt.getPropertyName())) {
+            nmeaStatus = (LiveGpsStatus) evt.getNewValue();
+
+            SwingUtilities.invokeLater(new Runnable() {
+            @Override
+            public void run() {
+                nmeaStatusLabel.setText(nmeaStatus.getStatusMessage());
+            } });
         }
     }
Index: /applications/editors/josm/plugins/livegps/src/livegps/LiveGpsLayer.java
===================================================================
--- /applications/editors/josm/plugins/livegps/src/livegps/LiveGpsLayer.java	(revision 36106)
+++ /applications/editors/josm/plugins/livegps/src/livegps/LiveGpsLayer.java	(revision 36107)
@@ -63,5 +63,5 @@
     }
 
-    void setCurrentPosition(double lat, double lon) {
+    void setCurrentPosition(double lat, double lon, WayPoint wp) {
         LatLon thisPos = new LatLon(lat, lon);
         if (lastPos != null && thisPos.equalsEpsilon(lastPos, ILatLon.MAX_SERVER_PRECISION))
@@ -71,6 +71,10 @@
 
         lastPos = thisPos;
-        lastPoint = new WayPoint(thisPos);
-        lastPoint.attr.put("time", dateFormat.format(new Date()));
+        if (wp != null) {
+          lastPoint = wp;
+        } else {
+          lastPoint = new WayPoint(thisPos);
+          lastPoint.attr.put("time", dateFormat.format(new Date()));
+        }
         trackSegment.addWaypoint(lastPoint);
 
@@ -110,5 +114,5 @@
             lastData = (LiveGpsData) evt.getNewValue();
             if (lastData.isFix()) {
-                setCurrentPosition(lastData.getLatitude(), lastData.getLongitude());
+                setCurrentPosition(lastData.getLatitude(), lastData.getLongitude(), lastData.getWaypoint());
                 if (allowRedraw())
                     this.setFilterStateChanged();
Index: /applications/editors/josm/plugins/livegps/src/livegps/LiveGpsPlugin.java
===================================================================
--- /applications/editors/josm/plugins/livegps/src/livegps/LiveGpsPlugin.java	(revision 36106)
+++ /applications/editors/josm/plugins/livegps/src/livegps/LiveGpsPlugin.java	(revision 36107)
@@ -23,6 +23,8 @@
 import org.openstreetmap.josm.gui.layer.LayerManager.LayerOrderChangeEvent;
 import org.openstreetmap.josm.gui.layer.LayerManager.LayerRemoveEvent;
+import org.openstreetmap.josm.gui.preferences.PreferenceSetting;
 import org.openstreetmap.josm.plugins.Plugin;
 import org.openstreetmap.josm.plugins.PluginInformation;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.Shortcut;
 
@@ -31,4 +33,6 @@
     private LiveGpsAcquirer acquirer = null;
     private Thread acquirerThread = null;
+    private LiveGpsAcquirerNMEA acquirerNMEA = null;
+    private Thread acquirerNMEAThread = null;
     private JMenu lgpsmenu = null;
     private JCheckBoxMenuItem lgpscapture;
@@ -186,6 +190,21 @@
             acquirerThread.start();
 
+            assert (acquirerNMEA == null);
+            assert (acquirerNMEAThread == null);
+
+            if (!Config.getPref().get(LiveGpsAcquirerNMEA.C_SERIAL).isEmpty()) {
+                acquirerNMEA = new LiveGpsAcquirerNMEA();
+                acquirerNMEAThread = new Thread(acquirerNMEA);
+                acquirerNMEA.addPropertyChangeListener(lgpslayer);
+                acquirerNMEA.addPropertyChangeListener(lgpsdialog);
+
+                for (PropertyChangeListener listener : listenerQueue) {
+                    acquirerNMEA.addPropertyChangeListener(listener);
+                }
+
+                acquirerNMEAThread.start();
+            }
+
             enabled = true;
-
         } else if (!enable && enabled) {
             assert (lgpslayer != null);
@@ -197,4 +216,10 @@
             acquirerThread = null;
 
+            if (acquirerNMEAThread != null) {
+                acquirerNMEA.shutdown();
+                acquirerNMEA = null;
+                acquirerNMEAThread = null;
+            }
+
             enabled = false;
         }
@@ -211,4 +236,6 @@
         if (acquirer != null)
             acquirer.addPropertyChangeListener(listener);
+        if (acquirerNMEA != null)
+            acquirerNMEA.addPropertyChangeListener(listener);
     }
 
@@ -223,4 +250,6 @@
         if (acquirer != null)
             acquirer.removePropertyChangeListener(listener);
+        if (acquirerNMEA != null)
+            acquirerNMEA.removePropertyChangeListener(listener);
     }
 
@@ -232,8 +261,14 @@
 
     /**
-     * @return the lgpsmenu
+     * Return the LiveGPS menu
+     * @return the {@code JMenu} entry
      */
     public JMenu getLgpsMenu() {
         return this.lgpsmenu;
     }
+
+    @Override
+    public PreferenceSetting getPreferenceSetting() {
+        return new LiveGPSPreferences();
+    }
 }
Index: /applications/editors/josm/plugins/livegps/src/livegps/LiveGpsStatus.java
===================================================================
--- /applications/editors/josm/plugins/livegps/src/livegps/LiveGpsStatus.java	(revision 36106)
+++ /applications/editors/josm/plugins/livegps/src/livegps/LiveGpsStatus.java	(revision 36107)
@@ -3,6 +3,6 @@
 
 /**
+ * Representation of the LiveGPS connection status
  * @author cdaller
- *
  */
 public class LiveGpsStatus {
@@ -14,4 +14,9 @@
     private GpsStatus status;
 
+    /**
+     * Create a status representation
+     * @param status current status code
+     * @param statusMessage current status description message
+     */
     public LiveGpsStatus(GpsStatus status, String statusMessage) {
         super();
@@ -21,5 +26,6 @@
 
     /**
-     * @return the status
+     * Retrieve the current status
+     * @return current status
      */
     public GpsStatus getStatus() {
@@ -28,4 +34,5 @@
 
     /**
+     * Set the current status
      * @param status the status to set
      */
@@ -35,5 +42,6 @@
 
     /**
-     * @return the statusMessage
+     * Access the status message
+     * @return status message
      */
     public String getStatusMessage() {
@@ -42,5 +50,6 @@
 
     /**
-     * @param statusMessage the statusMessage to set
+     * Set the current status message
+     * @param statusMessage the status message to set
      */
     public void setStatusMessage(String statusMessage) {
