diff --git a/sohstationviewer/view/plotting/gps_dialog.py b/sohstationviewer/view/plotting/gps_dialog.py
index 908754bc254c1aca6ba4e82c99b65abb9c0df60c..ac39adf0ca32732e23a33d5dda5a695d0803fa4c 100644
--- a/sohstationviewer/view/plotting/gps_dialog.py
+++ b/sohstationviewer/view/plotting/gps_dialog.py
@@ -2,20 +2,63 @@ import sys
 from pathlib import Path
 from typing import List
 
-from model.gps_point import GPSPoint
-from model.mseed.mseed import MSeed
-from view.plotting.plotting_widget.plotting_widget import PlottingWidget
+from sohstationviewer.model.gps_point import GPSPoint
+from sohstationviewer.model.mseed.mseed import MSeed
 
 from PySide2 import QtWidgets, QtCore
+from matplotlib.backends.backend_qt5agg import (
+    FigureCanvasQTAgg as Canvas)
+from matplotlib.figure import Figure
+from matplotlib.axes import Axes
 
 
-class GPSWidget(PlottingWidget):
-    def __init__(self, parent, tracking_box):
-        super().__init__(parent, tracking_box)
+class GPSWidget(QtWidgets.QWidget):
+    def __init__(self, parent, tracking_box, gps_points):
+        super().__init__(parent)
+        self.tracking_box = tracking_box
+        self.gps_points = gps_points
+
+        self.fig = Figure(figsize=(6, 6), dpi=100)
+        self.ax: Axes = self.fig.add_axes((0, 0, 1, 1))
+        self.ax.set_facecolor("dimgray")
+
+        self.canvas = Canvas(self.fig)
 
     @QtCore.Slot()
     def plot_gps(self):
-        pass
+        good_gps_points = [point
+                           for point in self.gps_points
+                           if not point.is_bad_point()]
+        all_latitudes = [point.latitude for point in good_gps_points]
+        all_longitudes = [point.longitude for point in good_gps_points]
+        max_latitude = max(all_latitudes)
+        min_latitude = min(all_latitudes)
+        max_longitude = max(all_longitudes)
+        min_longitude = min(all_longitudes)
+
+        latitude_range = max_latitude - min_latitude
+        longitude_range = max_longitude - min_longitude
+        if latitude_range > longitude_range:
+            longitude_average = (min_longitude + max_longitude) / 2
+            min_longitude = longitude_average - latitude_range / 2
+            max_longitude = longitude_average + latitude_range / 2
+        else:
+            latitude_average = (min_latitude + max_latitude) / 2
+            min_latitude = latitude_average - longitude_range / 2
+            max_latitude = latitude_average + longitude_range / 2
+
+        self.ax.set_yticks([])
+        self.ax.set_xticks([])
+        self.ax.spines['right'].set_visible(False)
+        self.ax.spines['left'].set_visible(False)
+        self.ax.spines['top'].set_visible(False)
+        self.ax.spines['bottom'].set_visible(False)
+        self.ax.plot(all_longitudes, all_latitudes, 'ws', markersize=3, markeredgecolor='black')
+        if latitude_range > longitude_range:
+            self.ax.set_xlim(min_longitude, max_longitude)
+        else:
+            self.ax.set_ylim(min_latitude, max_latitude)
+        self.ax.set_box_aspect(1)
 
 
 class GPSDialog(QtWidgets.QWidget):
@@ -26,17 +69,28 @@ class GPSDialog(QtWidgets.QWidget):
         self.data_path = None
         self.info_text_browser = QtWidgets.QTextBrowser(self)
 
-        self.setGeometry(300, 300, 400, 500)
+        # The height of the dialog is chosen so that the GPS plot is flush with
+        # the edges of the dialog.
+        dialog_height = 518
+        self.setGeometry(300, 300, 400, dialog_height)
         self.setWindowTitle("GPS Plot")
 
         main_layout = QtWidgets.QVBoxLayout()
         self.setLayout(main_layout)
-        main_layout.setContentsMargins(5, 5, 5, 5)
+        main_layout.setContentsMargins(0, 0, 0, 0)
         main_layout.setSpacing(0)
 
         self.plotting_widget = GPSWidget(
-            self, self.info_text_browser)
-        main_layout.addWidget(self.plotting_widget, 2)
+            self, self.info_text_browser, gps_points
+        )
+        main_layout.addWidget(self.plotting_widget.canvas)
+
+        # Add a 1-pixel high widget to the main layout so that there is a
+        # visible border between the GPS plot and the button. QTextBrowser
+        # is used because it is known to have a visible border.
+        invisible_widget = QtWidgets.QTextBrowser()
+        invisible_widget.setFixedHeight(1)
+        main_layout.addWidget(invisible_widget)
 
         button_layout = QtWidgets.QHBoxLayout()
         button_layout.setContentsMargins(100, 0, 100, 0)
@@ -72,10 +126,7 @@ class GPSDialog(QtWidgets.QWidget):
         with open(outside_folder / f'{folder_name}.gps.dat', 'w+') as outfile:
             outfile.write(f'# GPS data points for {folder_name}\n')
             for point in self.gps_points:
-                is_bad_point = (point.height == 0 and point.longitude == 0 and
-                                point.longitude == 0 and
-                                point.num_satellite_used == 0)
-                if is_bad_point:
+                if point.is_bad_point():
                     continue
                 line = (
                     f'{point.last_timemark}\t{point.fix_type}\t'
@@ -89,9 +140,12 @@ if __name__ == '__main__':
     import os
     os.chdir('/Users/kle/PycharmProjects/sohstationviewer')
     app = QtWidgets.QApplication(sys.argv)
-    data = MSeed(QtWidgets.QTextBrowser(), '/Users/kle/Documents/SOHView data/Q330/Q330_5281.sdr')
+    # data_path = '/Users/kle/PycharmProjects/sohstationviewer/tests/test_data/Q330-sample'
+    data_path = '/Users/kle/Documents/SOHView data/Q330/Q330_5281.sdr'
+    data = MSeed(QtWidgets.QTextBrowser(), data_path)
     wnd = GPSDialog(None, data.gps_points)
-    wnd.data_path = Path('/Users/kle/Documents/SOHView data/Q330/Q330_5281.sdr')
-    wnd.export_button.click()
-    # wnd.show()
-    # sys.exit(app.exec_())
+    wnd.data_path = Path(data_path)
+    wnd.show()
+    wnd.read_button.click()
+
+    sys.exit(app.exec_())