diff --git a/visualizer.py b/visualizer.py
index b71a8d28d9fa358a3a472be448413143629234eb..9e3c41efee724950492026fefa124783ec6f1734 100755
--- a/visualizer.py
+++ b/visualizer.py
@@ -115,20 +115,18 @@ def get_records():
 @app.route('/record/years')
 def get_record_years():
     """Return a JSON list of years for the selected station."""
-    name = get_query('name')
-    for station in get_records():
-        if station['name'] == name:
-            years = [i['year'] for i in station['records']]
-            return jsonify(years)
-    abort(404)
+    station = get_station_record(get_query('name'))
+    years = [i['year'] for i in station['records']]
+    return jsonify(years)
 
 
 @app.route('/plot/boxplot')
 def plot_boxplot():
-    name = get_query('name')
+    station_id = get_query('name')
     year1 = get_query('year1', to=year_type)
     year2 = get_query('year2', to=year_type)
     meas = get_query('measurement', to=meas_type)
+    station = get_station_record(station_id)
 
     plot_data = []
 
@@ -142,7 +140,7 @@ def plot_boxplot():
         return row[meas.field]
 
     for year in years:
-        data = read_data(name, year)
+        data = read_data(station, year)
         selected_data = data[:, meas.field]
         plot_data.append(selected_data)
 
@@ -165,6 +163,7 @@ def plot_boxplot():
          f'Min {meas.title}: {minimum[meas.field]}, Date: ({minimum[0]}).'),
         fontsize='small',
     )
+    name = station['name']
     plt.suptitle(f'{meas.title} measurements, {name} Station, '
                  f'{start_year} - {end_year}.')
     return savefig_response(fig)
@@ -172,10 +171,11 @@ def plot_boxplot():
 
 @app.route('/plot')
 def plot():
-    name = get_query('name')
+    station_id = get_query('name')
     year = get_query('year', to=year_type)
     meas = get_query('measurement', to=meas_type)
-    data = read_data(name, year)
+    station = get_station_record(station_id)
+    data = read_data(station, year)
     fig, axes = plt.subplots()
     fig.set_figheight(6)
     fig.set_figwidth(12)
@@ -195,6 +195,7 @@ def plot():
          f'Min {meas.title}: {minimum[meas.field]}, Date: ({minimum[0]}).'),
         fontsize='small',
     )
+    name = station['name']
     plt.suptitle(f'{meas.title} measurements, {name} Station, '
                  f'{data[0][0].year}')
     return savefig_response(fig)
@@ -204,16 +205,19 @@ def plot():
 def plot_overlay():
     num_datasets = 2
     datasets = tuple(SimpleNamespace() for _ in range(num_datasets))
+    stations = get_records()
     for n, dset in enumerate(datasets, start=1):
-        dset.name = get_query(f'name{n}')
+        dset.station_id = get_query(f'name{n}')
         dset.year = get_query(f'year{n}', to=year_type)
+        dset.station = get_station_record(dset.station_id, stations=stations)
+        dset.name = dset.station['name']
     meas = get_query('measurement', to=meas_type)
 
     def ignore_feb_29(rows):
         return [row for row in rows if (row[0].month, row[0].day) != (2, 29)]
 
     for dset in datasets:
-        raw_data = read_data(dset.name, dset.year)
+        raw_data = read_data(dset.station, dset.year)
         dset.data = np.array(ignore_feb_29(raw_data))
 
     fig, axes = plt.subplots()
@@ -292,25 +296,34 @@ def year_type(s):
     raise ValueError(f'bad year arg: {s!r}')
 
 
-def get_link(name, year):
+def get_link(station, year):
     """Get the link to a dataset.
 
-    Calls `abort(404)` if there is no link/record for the given station
-    and year.
+    Calls `abort(404)` if there is no link/record for the given year.
     """
-    for station in get_records():
-        if station['name'] == name:
-            for record in station['records']:
-                if record['year'] == year:
-                    return record['url']
+    for record in station['records']:
+        if record['year'] == year:
+            return record['url']
     abort(404)
 
 
 @app.route('/record/link')
 def get_record_link():
-    name = get_query('name')
+    station = get_station_record(get_query('name'))
     year = get_query('year', to=year_type)
-    return jsonify(get_link(name, year))
+    return jsonify(get_link(station, year))
+
+
+def get_station_record(station_id, stations=None):
+    """Get the station record corresponding to the station ID.
+
+    Calls `abort(404)` if there is none."""
+    if stations is None:
+        stations = get_records()
+    for station in stations:
+        if station['name'] == station_id:
+            return station
+    abort(404)
 
 
 def get_resources(link):
@@ -331,13 +344,13 @@ def get_resources(link):
             yield url
 
 
-def read_data(name, year):
+def read_data(station, year):
     daily_data = []
-    resource_list = get_resources(get_link(name, year))
+    resource_list = get_resources(get_link(station, year))
     for url in resource_list:
         with urlopen(url) as data:
             lines = map(bytes.decode, data)
-            spec = (SOUTH_POLE_DATA if name == 'South Pole Station'
+            spec = (SOUTH_POLE_DATA if station['name'] == 'South Pole Station'
                     else ONE_HOUR_DATA)
             for row in asccol.parse_data(lines, spec):
                 date = datetime.datetime(row.year, row.month, row.day,