diff --git a/assets/src/scripts/mock-gw-field-visits.js b/assets/src/scripts/mock-gw-field-visits.js
new file mode 100644
index 0000000000000000000000000000000000000000..cb8ef7d701de790326a9e10d0d5faf6ca5e30e01
--- /dev/null
+++ b/assets/src/scripts/mock-gw-field-visits.js
@@ -0,0 +1,652 @@
+export const MOCK_GW_FIELD_VISITS = `{
+    "type": "Feature",
+    "geometry": {"type": "point", "coordinates": [-87.3848333000000, 41.61747220000000]},
+    "properties": {
+        "agency": "U.S. Geological Survey",
+        "monitoringLocationNumber": "413703087230501",
+        "monitoringLocationName": "USGS WELL P4 AT PINE STATION NP NEAR GARY, IN",
+        "monitoringLocationType": "Well",
+        "district": "Indiana",
+        "state": "Indiana",
+        "county": "Lake County",
+        "country": "US",
+        "monitoringLocationAltitudeLandSurface": "586.81",
+        "altitudeMethod": "Level or other surveyed method.",
+        "altitudeAccuracy": ".05",
+        "altitudeDatum": "North American Vertical Datum of 1988",
+        "nationalAquifer": "Sand and gravel aquifers (glaciated regions)",
+        "nationalAquiferCode": "N100GLCIAL",
+        "localAquifer": "Quaternary System",
+        "localAquiferType": "Unconfined single aquifer",
+        "wellDepth": "11.32",
+        "holeDepth": "11.32",
+        "holeDepthSource": "S",
+        "agencyCode": "USGS",
+        "active": "t",
+        "districtCode": "18",
+        "stateFIPS": "18",
+        "countyFIPS": "089",
+        "countryFIPS": "US",
+        "hydrologicUnit": "04040001",
+        "monitoringLocationUrl": "https://waterdata.usgs.gov/monitoring-location/413703087230501",
+        "dataStreams": [{
+            "observationType": "Discrete",
+            "observationDomain": "Groundwater levels",
+            "phenomenonTimeStart": "2019-08-21 22:10:00",
+            "phenomenonTimeEnd": "2021-12-16 17:04:00",
+            "observedPropertyName": "Groundwater level above NGVD 1929, feet",
+            "observedPropertyReference": "https://waterdata.usgs.gov/nwisweb/rdf?parmCd=62610",
+            "USGSParameterCode": "62610",
+            "samplingFeatureName": "USGS WELL P4 AT PINE STATION NP NEAR GARY, IN",
+            "statistic": "Daily random instantaneous values",
+            "statisticReference": "http://waterdata.usgs.gov/nwisweb/rdf?statCd=00011",
+            "unitOfMeasureName": "ft",
+            "unitOfMeasureReference": null,
+            "observations": [{
+                "phenomenonTime": "2021-04-23T16:34",
+                "phenomenonTimeAccuracy": "minute",
+                "result": "587.53",
+                "resultAccuracy": "0.03",
+                "resultMethod": "GW level, calib electric tape",
+                "approvals": ["Provisional"],
+                "qualifiers": ["Static"]
+            }, {
+                "phenomenonTime": "2019-11-01T17:15",
+                "phenomenonTimeAccuracy": "minute",
+                "result": "589.30",
+                "resultAccuracy": "0.01",
+                "resultMethod": "GW level, calib electric tape",
+                "approvals": ["Approved"],
+                "qualifiers": ["Static"]
+            }, {
+                "phenomenonTime": "2020-01-29T21:20",
+                "phenomenonTimeAccuracy": "minute",
+                "result": "589.32",
+                "resultAccuracy": "0.01",
+                "resultMethod": "GW level, calib electric tape",
+                "approvals": ["Approved"],
+                "qualifiers": ["Static"]
+            }, {
+                "phenomenonTime": "2021-08-26T18:08",
+                "phenomenonTimeAccuracy": "minute",
+                "result": "587.19",
+                "resultAccuracy": "0.02",
+                "resultMethod": "GW level, calib electric tape",
+                "approvals": ["Provisional"],
+                "qualifiers": ["Static"]
+            }, {
+                "phenomenonTime": "2021-10-21T16:26",
+                "phenomenonTimeAccuracy": "minute",
+                "result": "586.45",
+                "resultAccuracy": "0.02",
+                "resultMethod": "GW level, calib electric tape",
+                "approvals": ["Provisional"],
+                "qualifiers": ["Static"]
+            }, {
+                "phenomenonTime": "2020-08-04T14:49",
+                "phenomenonTimeAccuracy": "minute",
+                "result": "588.75",
+                "resultAccuracy": "0.01",
+                "resultMethod": "GW level, calib electric tape",
+                "approvals": ["Approved"],
+                "qualifiers": ["Static"]
+            }, {
+                "phenomenonTime": "2021-09-28T15:35",
+                "phenomenonTimeAccuracy": "minute",
+                "result": "585.81",
+                "resultAccuracy": "0.02",
+                "resultMethod": "GW level, calib electric tape",
+                "approvals": ["Provisional"],
+                "qualifiers": ["Static"]
+            }, {
+                "phenomenonTime": "2020-10-23T18:26",
+                "phenomenonTimeAccuracy": "minute",
+                "result": "586.88",
+                "resultAccuracy": "0.01",
+                "resultMethod": "GW level, calib electric tape",
+                "approvals": ["Approved"],
+                "qualifiers": ["Static"]
+            }, {
+                "phenomenonTime": "2020-05-26T21:15",
+                "phenomenonTimeAccuracy": "minute",
+                "result": "589.53",
+                "resultAccuracy": "0.01",
+                "resultMethod": "GW level, calib electric tape",
+                "approvals": ["Approved"],
+                "qualifiers": ["Static"]
+            }, {
+                "phenomenonTime": "2021-07-29T20:31",
+                "phenomenonTimeAccuracy": "minute",
+                "result": "587.88",
+                "resultAccuracy": "0.02",
+                "resultMethod": "GW level, calib electric tape",
+                "approvals": ["Provisional"],
+                "qualifiers": ["Static"]
+            }, {
+                "phenomenonTime": "2021-01-21T16:35",
+                "phenomenonTimeAccuracy": "minute",
+                "result": "587.28",
+                "resultAccuracy": "0.03",
+                "resultMethod": "GW level, calib electric tape",
+                "approvals": ["Provisional"],
+                "qualifiers": ["Static"]
+            }, {
+                "phenomenonTime": "2019-08-21T22:10",
+                "phenomenonTimeAccuracy": "minute",
+                "result": "587.13",
+                "resultAccuracy": "0.01",
+                "resultMethod": "GW level, calib electric tape",
+                "approvals": ["Approved"],
+                "qualifiers": ["Static"]
+            }, {
+                "phenomenonTime": "2021-12-16T17:04",
+                "phenomenonTimeAccuracy": "minute",
+                "result": "587.34",
+                "resultAccuracy": "0.03",
+                "resultMethod": "GW level, calib electric tape",
+                "approvals": ["Provisional"],
+                "qualifiers": ["Static"]
+            }, {
+                "phenomenonTime": "2020-11-20T18:13",
+                "phenomenonTimeAccuracy": "minute",
+                "result": "586.71",
+                "resultAccuracy": "0.01",
+                "resultMethod": "GW level, calib electric tape",
+                "approvals": ["Approved"],
+                "qualifiers": ["Static"]
+            }, {
+                "phenomenonTime": "2021-11-16T18:28",
+                "phenomenonTimeAccuracy": "minute",
+                "result": "587.29",
+                "resultAccuracy": "0.03",
+                "resultMethod": "GW level, calib electric tape",
+                "approvals": ["Provisional"],
+                "qualifiers": ["Static"]
+            }, {
+                "phenomenonTime": "2021-05-26T19:20",
+                "phenomenonTimeAccuracy": "minute",
+                "result": "587.32",
+                "resultAccuracy": "0.03",
+                "resultMethod": "GW level, calib electric tape",
+                "approvals": ["Provisional"],
+                "qualifiers": ["Static"]
+            }, {
+                "phenomenonTime": "2019-09-18T16:00",
+                "phenomenonTimeAccuracy": "minute",
+                "result": "587.45",
+                "resultAccuracy": null,
+                "resultMethod": "GW level, electric tape",
+                "approvals": ["Approved"],
+                "qualifiers": []
+            }, {
+                "phenomenonTime": "2021-06-29T15:14",
+                "phenomenonTimeAccuracy": "minute",
+                "result": "588.07",
+                "resultAccuracy": "0.03",
+                "resultMethod": "GW level, calib electric tape",
+                "approvals": ["Provisional"],
+                "qualifiers": ["Static"]
+            }, {
+                "phenomenonTime": "2020-09-22T14:56",
+                "phenomenonTimeAccuracy": "minute",
+                "result": "587.30",
+                "resultAccuracy": null,
+                "resultMethod": "GW level, electric tape",
+                "approvals": ["Approved"],
+                "qualifiers": []
+            }, {
+                "phenomenonTime": "2020-03-31T17:25",
+                "phenomenonTimeAccuracy": "minute",
+                "result": "589.22",
+                "resultAccuracy": "0.01",
+                "resultMethod": "GW level, calib electric tape",
+                "approvals": ["Approved"],
+                "qualifiers": ["Static"]
+            }, {
+                "phenomenonTime": "2021-03-25T15:20",
+                "phenomenonTimeAccuracy": "minute",
+                "result": "587.66",
+                "resultAccuracy": "0.01",
+                "resultMethod": "GW level, calib electric tape",
+                "approvals": ["Provisional"],
+                "qualifiers": ["Static"]
+            }, {
+                "phenomenonTime": "2020-12-22T17:06",
+                "phenomenonTimeAccuracy": "minute",
+                "result": "587.01",
+                "resultAccuracy": "0.01",
+                "resultMethod": "GW level, calib electric tape",
+                "approvals": ["Approved"],
+                "qualifiers": ["Static"]
+            }, {
+                "phenomenonTime": "2021-02-19T20:08",
+                "phenomenonTimeAccuracy": "minute",
+                "result": null,
+                "resultAccuracy": "0.10",
+                "resultMethod": "GW level, calib electric tape",
+                "approvals": ["Provisional"],
+                "qualifiers": ["NoMeasurement", "Frozen"]
+            }, {
+                "phenomenonTime": "2019-12-30T19:40",
+                "phenomenonTimeAccuracy": "minute",
+                "result": "589.13",
+                "resultAccuracy": "0.01",
+                "resultMethod": "GW level, calib electric tape",
+                "approvals": ["Approved"],
+                "qualifiers": ["Static"]
+            }]
+        }, {
+            "observationType": "Discrete",
+            "observationDomain": "Groundwater levels",
+            "phenomenonTimeStart": "2019-08-21 22:10:00",
+            "phenomenonTimeEnd": "2021-12-16 17:04:00",
+            "observedPropertyName": "Groundwater level above NAVD 1988, feet",
+            "observedPropertyReference": "https://waterdata.usgs.gov/nwisweb/rdf?parmCd=62611",
+            "USGSParameterCode": "62611",
+            "samplingFeatureName": "USGS WELL P4 AT PINE STATION NP NEAR GARY, IN",
+            "statistic": "Daily random instantaneous values",
+            "statisticReference": "http://waterdata.usgs.gov/nwisweb/rdf?statCd=00011",
+            "unitOfMeasureName": "ft",
+            "unitOfMeasureReference": null,
+            "observations": [{
+                "phenomenonTime": "2021-12-16T17:04",
+                "phenomenonTimeAccuracy": "minute",
+                "result": "587.00",
+                "resultAccuracy": "0.03",
+                "resultMethod": "GW level, calib electric tape",
+                "approvals": ["Provisional"],
+                "qualifiers": ["Static"]
+            }, {
+                "phenomenonTime": "2021-11-16T18:28",
+                "phenomenonTimeAccuracy": "minute",
+                "result": "586.95",
+                "resultAccuracy": "0.03",
+                "resultMethod": "GW level, calib electric tape",
+                "approvals": ["Provisional"],
+                "qualifiers": ["Static"]
+            }, {
+                "phenomenonTime": "2021-07-29T20:31",
+                "phenomenonTimeAccuracy": "minute",
+                "result": "587.54",
+                "resultAccuracy": "0.02",
+                "resultMethod": "GW level, calib electric tape",
+                "approvals": ["Provisional"],
+                "qualifiers": ["Static"]
+            }, {
+                "phenomenonTime": "2021-06-29T15:14",
+                "phenomenonTimeAccuracy": "minute",
+                "result": "587.73",
+                "resultAccuracy": "0.03",
+                "resultMethod": "GW level, calib electric tape",
+                "approvals": ["Provisional"],
+                "qualifiers": ["Static"]
+            }, {
+                "phenomenonTime": "2021-08-26T18:08",
+                "phenomenonTimeAccuracy": "minute",
+                "result": "586.85",
+                "resultAccuracy": "0.02",
+                "resultMethod": "GW level, calib electric tape",
+                "approvals": ["Provisional"],
+                "qualifiers": ["Static"]
+            }, {
+                "phenomenonTime": "2020-12-22T17:06",
+                "phenomenonTimeAccuracy": "minute",
+                "result": "586.67",
+                "resultAccuracy": "0.01",
+                "resultMethod": "GW level, calib electric tape",
+                "approvals": ["Approved"],
+                "qualifiers": ["Static"]
+            }, {
+                "phenomenonTime": "2021-02-19T20:08",
+                "phenomenonTimeAccuracy": "minute",
+                "result": null,
+                "resultAccuracy": "0.10",
+                "resultMethod": "GW level, calib electric tape",
+                "approvals": ["Provisional"],
+                "qualifiers": ["NoMeasurement", "Frozen"]
+            }, {
+                "phenomenonTime": "2019-12-30T19:40",
+                "phenomenonTimeAccuracy": "minute",
+                "result": "588.79",
+                "resultAccuracy": "0.01",
+                "resultMethod": "GW level, calib electric tape",
+                "approvals": ["Approved"],
+                "qualifiers": ["Static"]
+            }, {
+                "phenomenonTime": "2020-09-22T14:56",
+                "phenomenonTimeAccuracy": "minute",
+                "result": "586.96",
+                "resultAccuracy": null,
+                "resultMethod": "GW level, electric tape",
+                "approvals": ["Approved"],
+                "qualifiers": []
+            }, {
+                "phenomenonTime": "2020-05-26T21:15",
+                "phenomenonTimeAccuracy": "minute",
+                "result": "589.19",
+                "resultAccuracy": "0.01",
+                "resultMethod": "GW level, calib electric tape",
+                "approvals": ["Approved"],
+                "qualifiers": ["Static"]
+            }, {
+                "phenomenonTime": "2019-09-18T16:00",
+                "phenomenonTimeAccuracy": "minute",
+                "result": "587.11",
+                "resultAccuracy": null,
+                "resultMethod": "GW level, electric tape",
+                "approvals": ["Approved"],
+                "qualifiers": []
+            }, {
+                "phenomenonTime": "2020-01-29T21:20",
+                "phenomenonTimeAccuracy": "minute",
+                "result": "588.98",
+                "resultAccuracy": "0.01",
+                "resultMethod": "GW level, calib electric tape",
+                "approvals": ["Approved"],
+                "qualifiers": ["Static"]
+            }, {
+                "phenomenonTime": "2019-08-21T22:10",
+                "phenomenonTimeAccuracy": "minute",
+                "result": "586.79",
+                "resultAccuracy": "0.01",
+                "resultMethod": "GW level, calib electric tape",
+                "approvals": ["Approved"],
+                "qualifiers": ["Static"]
+            }, {
+                "phenomenonTime": "2021-04-23T16:34",
+                "phenomenonTimeAccuracy": "minute",
+                "result": "587.19",
+                "resultAccuracy": "0.03",
+                "resultMethod": "GW level, calib electric tape",
+                "approvals": ["Provisional"],
+                "qualifiers": ["Static"]
+            }, {
+                "phenomenonTime": "2020-11-20T18:13",
+                "phenomenonTimeAccuracy": "minute",
+                "result": "586.37",
+                "resultAccuracy": "0.01",
+                "resultMethod": "GW level, calib electric tape",
+                "approvals": ["Approved"],
+                "qualifiers": ["Static"]
+            }, {
+                "phenomenonTime": "2021-03-25T15:20",
+                "phenomenonTimeAccuracy": "minute",
+                "result": "587.32",
+                "resultAccuracy": "0.01",
+                "resultMethod": "GW level, calib electric tape",
+                "approvals": ["Provisional"],
+                "qualifiers": ["Static"]
+            }, {
+                "phenomenonTime": "2021-05-26T19:20",
+                "phenomenonTimeAccuracy": "minute",
+                "result": "586.98",
+                "resultAccuracy": "0.03",
+                "resultMethod": "GW level, calib electric tape",
+                "approvals": ["Provisional"],
+                "qualifiers": ["Static"]
+            }, {
+                "phenomenonTime": "2021-01-21T16:35",
+                "phenomenonTimeAccuracy": "minute",
+                "result": "586.94",
+                "resultAccuracy": "0.03",
+                "resultMethod": "GW level, calib electric tape",
+                "approvals": ["Provisional"],
+                "qualifiers": ["Static"]
+            }, {
+                "phenomenonTime": "2021-10-21T16:26",
+                "phenomenonTimeAccuracy": "minute",
+                "result": "586.11",
+                "resultAccuracy": "0.02",
+                "resultMethod": "GW level, calib electric tape",
+                "approvals": ["Provisional"],
+                "qualifiers": ["Static"]
+            }, {
+                "phenomenonTime": "2020-03-31T17:25",
+                "phenomenonTimeAccuracy": "minute",
+                "result": "588.88",
+                "resultAccuracy": "0.01",
+                "resultMethod": "GW level, calib electric tape",
+                "approvals": ["Approved"],
+                "qualifiers": ["Static"]
+            }, {
+                "phenomenonTime": "2020-10-23T18:26",
+                "phenomenonTimeAccuracy": "minute",
+                "result": "586.54",
+                "resultAccuracy": "0.01",
+                "resultMethod": "GW level, calib electric tape",
+                "approvals": ["Approved"],
+                "qualifiers": ["Static"]
+            }, {
+                "phenomenonTime": "2019-11-01T17:15",
+                "phenomenonTimeAccuracy": "minute",
+                "result": "588.96",
+                "resultAccuracy": "0.01",
+                "resultMethod": "GW level, calib electric tape",
+                "approvals": ["Approved"],
+                "qualifiers": ["Static"]
+            }, {
+                "phenomenonTime": "2021-09-28T15:35",
+                "phenomenonTimeAccuracy": "minute",
+                "result": "585.47",
+                "resultAccuracy": "0.02",
+                "resultMethod": "GW level, calib electric tape",
+                "approvals": ["Provisional"],
+                "qualifiers": ["Static"]
+            }, {
+                "phenomenonTime": "2020-08-04T14:49",
+                "phenomenonTimeAccuracy": "minute",
+                "result": "588.41",
+                "resultAccuracy": "0.01",
+                "resultMethod": "GW level, calib electric tape",
+                "approvals": ["Approved"],
+                "qualifiers": ["Static"]
+            }]
+        }, {
+            "observationType": "Discrete",
+            "observationDomain": "Groundwater levels",
+            "phenomenonTimeStart": "2019-08-21 22:10:00",
+            "phenomenonTimeEnd": "2021-12-16 17:04:00",
+            "observedPropertyName": "Depth to water level, feet below land surface",
+            "observedPropertyReference": "https://waterdata.usgs.gov/nwisweb/rdf?parmCd=72019",
+            "USGSParameterCode": "72019",
+            "samplingFeatureName": "USGS WELL P4 AT PINE STATION NP NEAR GARY, IN",
+            "statistic": "Daily random instantaneous values",
+            "statisticReference": "http://waterdata.usgs.gov/nwisweb/rdf?statCd=00011",
+            "unitOfMeasureName": "ft",
+            "unitOfMeasureReference": null,
+            "observations": [{
+                "phenomenonTime": "2021-05-26T19:20",
+                "phenomenonTimeAccuracy": "minute",
+                "result": "-0.17",
+                "resultAccuracy": "0.03",
+                "resultMethod": "GW level, calib electric tape",
+                "approvals": ["Provisional"],
+                "qualifiers": ["Static"]
+            }, {
+                "phenomenonTime": "2021-04-23T16:34",
+                "phenomenonTimeAccuracy": "minute",
+                "result": "-0.38",
+                "resultAccuracy": "0.03",
+                "resultMethod": "GW level, calib electric tape",
+                "approvals": ["Provisional"],
+                "qualifiers": ["Static"]
+            }, {
+                "phenomenonTime": "2020-09-22T14:56",
+                "phenomenonTimeAccuracy": "minute",
+                "result": "-0.15",
+                "resultAccuracy": null,
+                "resultMethod": "GW level, electric tape",
+                "approvals": ["Approved"],
+                "qualifiers": []
+            }, {
+                "phenomenonTime": "2020-11-20T18:13",
+                "phenomenonTimeAccuracy": "minute",
+                "result": "0.44",
+                "resultAccuracy": "0.01",
+                "resultMethod": "GW level, calib electric tape",
+                "approvals": ["Approved"],
+                "qualifiers": ["Static"]
+            }, {
+                "phenomenonTime": "2021-12-16T17:04",
+                "phenomenonTimeAccuracy": "minute",
+                "result": "-0.19",
+                "resultAccuracy": "0.03",
+                "resultMethod": "GW level, calib electric tape",
+                "approvals": ["Provisional"],
+                "qualifiers": ["Static"]
+            }, {
+                "phenomenonTime": "2020-01-29T21:20",
+                "phenomenonTimeAccuracy": "minute",
+                "result": "-2.17",
+                "resultAccuracy": "0.01",
+                "resultMethod": "GW level, calib electric tape",
+                "approvals": ["Approved"],
+                "qualifiers": ["Static"]
+            }, {
+                "phenomenonTime": "2021-09-28T15:35",
+                "phenomenonTimeAccuracy": "minute",
+                "result": "1.34",
+                "resultAccuracy": "0.02",
+                "resultMethod": "GW level, calib electric tape",
+                "approvals": ["Provisional"],
+                "qualifiers": ["Static"]
+            }, {
+                "phenomenonTime": "2021-08-26T18:08",
+                "phenomenonTimeAccuracy": "minute",
+                "result": "-0.04",
+                "resultAccuracy": "0.02",
+                "resultMethod": "GW level, calib electric tape",
+                "approvals": ["Provisional"],
+                "qualifiers": ["Static"]
+            }, {
+                "phenomenonTime": "2021-06-29T15:14",
+                "phenomenonTimeAccuracy": "minute",
+                "result": "-0.92",
+                "resultAccuracy": "0.03",
+                "resultMethod": "GW level, calib electric tape",
+                "approvals": ["Provisional"],
+                "qualifiers": ["Static"]
+            }, {
+                "phenomenonTime": "2020-03-31T17:25",
+                "phenomenonTimeAccuracy": "minute",
+                "result": "-2.07",
+                "resultAccuracy": "0.01",
+                "resultMethod": "GW level, calib electric tape",
+                "approvals": ["Approved"],
+                "qualifiers": ["Static"]
+            }, {
+                "phenomenonTime": "2021-01-21T16:35",
+                "phenomenonTimeAccuracy": "minute",
+                "result": "-0.13",
+                "resultAccuracy": "0.03",
+                "resultMethod": "GW level, calib electric tape",
+                "approvals": ["Provisional"],
+                "qualifiers": ["Static"]
+            }, {
+                "phenomenonTime": "2019-09-18T16:00",
+                "phenomenonTimeAccuracy": "minute",
+                "result": "-0.30",
+                "resultAccuracy": null,
+                "resultMethod": "GW level, electric tape",
+                "approvals": ["Approved"],
+                "qualifiers": []
+            }, {
+                "phenomenonTime": "2021-11-16T18:28",
+                "phenomenonTimeAccuracy": "minute",
+                "result": "-0.14",
+                "resultAccuracy": "0.03",
+                "resultMethod": "GW level, calib electric tape",
+                "approvals": ["Provisional"],
+                "qualifiers": ["Static"]
+            }, {
+                "phenomenonTime": "2019-08-21T22:10",
+                "phenomenonTimeAccuracy": "minute",
+                "result": "0.02",
+                "resultAccuracy": "0.01",
+                "resultMethod": "GW level, calib electric tape",
+                "approvals": ["Approved"],
+                "qualifiers": ["Static"]
+            }, {
+                "phenomenonTime": "2021-03-25T15:20",
+                "phenomenonTimeAccuracy": "minute",
+                "result": "-0.51",
+                "resultAccuracy": "0.01",
+                "resultMethod": "GW level, calib electric tape",
+                "approvals": ["Provisional"],
+                "qualifiers": ["Static"]
+            }, {
+                "phenomenonTime": "2019-12-30T19:40",
+                "phenomenonTimeAccuracy": "minute",
+                "result": "-1.98",
+                "resultAccuracy": "0.01",
+                "resultMethod": "GW level, calib electric tape",
+                "approvals": ["Approved"],
+                "qualifiers": ["Static"]
+            }, {
+                "phenomenonTime": "2021-07-29T20:31",
+                "phenomenonTimeAccuracy": "minute",
+                "result": "-0.73",
+                "resultAccuracy": "0.02",
+                "resultMethod": "GW level, calib electric tape",
+                "approvals": ["Provisional"],
+                "qualifiers": ["Static"]
+            }, {
+                "phenomenonTime": "2020-08-04T14:49",
+                "phenomenonTimeAccuracy": "minute",
+                "result": "-1.60",
+                "resultAccuracy": "0.01",
+                "resultMethod": "GW level, calib electric tape",
+                "approvals": ["Approved"],
+                "qualifiers": ["Static"]
+            }, {
+                "phenomenonTime": "2020-12-22T17:06",
+                "phenomenonTimeAccuracy": "minute",
+                "result": "0.14",
+                "resultAccuracy": "0.01",
+                "resultMethod": "GW level, calib electric tape",
+                "approvals": ["Approved"],
+                "qualifiers": ["Static"]
+            }, {
+                "phenomenonTime": "2020-05-26T21:15",
+                "phenomenonTimeAccuracy": "minute",
+                "result": "-2.38",
+                "resultAccuracy": "0.01",
+                "resultMethod": "GW level, calib electric tape",
+                "approvals": ["Approved"],
+                "qualifiers": ["Static"]
+            }, {
+                "phenomenonTime": "2021-02-19T20:08",
+                "phenomenonTimeAccuracy": "minute",
+                "result": null,
+                "resultAccuracy": "0.10",
+                "resultMethod": "GW level, calib electric tape",
+                "approvals": ["Provisional"],
+                "qualifiers": ["NoMeasurement", "Frozen"]
+            }, {
+                "phenomenonTime": "2019-11-01T17:15",
+                "phenomenonTimeAccuracy": "minute",
+                "result": "-2.15",
+                "resultAccuracy": "0.01",
+                "resultMethod": "GW level, calib electric tape",
+                "approvals": ["Approved"],
+                "qualifiers": ["Static"]
+            }, {
+                "phenomenonTime": "2020-10-23T18:26",
+                "phenomenonTimeAccuracy": "minute",
+                "result": "0.27",
+                "resultAccuracy": "0.01",
+                "resultMethod": "GW level, calib electric tape",
+                "approvals": ["Approved"],
+                "qualifiers": ["Static"]
+            }, {
+                "phenomenonTime": "2021-10-21T16:26",
+                "phenomenonTimeAccuracy": "minute",
+                "result": "0.70",
+                "resultAccuracy": "0.02",
+                "resultMethod": "GW level, calib electric tape",
+                "approvals": ["Provisional"],
+                "qualifiers": ["Static"]
+            }]
+        }]
+    }
+}`;
diff --git a/assets/src/scripts/mock-service-data.js b/assets/src/scripts/mock-service-data.js
index 45b77b586d4b36ac47adc09d880463b06c99ddf0..2e7d8fc4c05d0f40863a4199764284fb6fd4f1c5 100644
--- a/assets/src/scripts/mock-service-data.js
+++ b/assets/src/scripts/mock-service-data.js
@@ -3154,195 +3154,6 @@ export const MOCK_OBSERVATION_ITEM = `{
     ]
 }`;
 
-export const MOCK_GWLEVEL_DATA =
-`{
-  "name": "ns1:timeSeriesResponseType",
-  "declaredType": "org.cuahsi.waterml.TimeSeriesResponseType",
-  "scope": "javax.xml.bind.JAXBElement$GlobalScope",
-  "value": {
-    "queryInfo": {
-      "queryURL": "http://waterservices.usgs.gov/nwis/gwlevels/format=json&sites=354133082042203&parameterCd=72019&startDT=2020-01-01&endDT=2020-11-17",
-      "criteria": {
-        "locationParam": "[ALL:354133082042203]",
-        "variableParam": "[72019]",
-        "timeParam": {
-          "beginDateTime": "2020-01-01T00:00:00.000",
-          "endDateTime": "2020-11-17T23:59:59.000"
-        },
-        "parameter": []
-      },
-      "note": [
-        {
-          "value": "[ALL:354133082042203]",
-          "title": "filter:sites"
-        },
-        {
-          "value": "[mode=RANGE, modifiedSince=null] interval={INTERVAL[2020-01-01T00:00:00.000-05:00/2020-11-17T23:59:59.000Z]}",
-          "title": "filter:timeRange"
-        },
-        {
-          "value": "methodIds=[ALL]",
-          "title": "filter:methodId"
-        },
-        {
-          "value": "2021-01-07T14:03:54.275Z",
-          "title": "requestDT"
-        },
-        {
-          "value": "2d53d020-50f1-11eb-be92-2cea7f58f5ca",
-          "title": "requestId"
-        },
-        {
-          "value": "Provisional data are subject to revision. Go to http://waterdata.usgs.gov/nwis/help/?provisional for more information.",
-          "title": "disclaimer"
-        },
-        {
-          "value": "vaas01",
-          "title": "server"
-        }
-      ]
-    },
-    "timeSeries": [
-      {
-        "sourceInfo": {
-          "siteName": "MC-109 NEAR PLEASANT GARDENS, NC (BEDROCK)",
-          "siteCode": [
-            {
-              "value": "354133082042203",
-              "network": "NWIS",
-              "agencyCode": "USGS"
-            }
-          ],
-          "timeZoneInfo": {
-            "defaultTimeZone": {
-              "zoneOffset": "-05:00",
-              "zoneAbbreviation": "EST"
-            },
-            "daylightSavingsTimeZone": {
-              "zoneOffset": "-04:00",
-              "zoneAbbreviation": "EDT"
-            },
-            "siteUsesDaylightSavingsTime": true
-          },
-          "geoLocation": {
-            "geogLocation": {
-              "srs": "EPSG:4326",
-              "latitude": 35.6926111,
-              "longitude": -82.0729444
-            },
-            "localSiteXY": []
-          },
-          "note": [],
-          "siteType": [],
-          "siteProperty": [
-            {
-              "value": "GW",
-              "name": "siteTypeCd"
-            },
-            {
-              "value": "03050101",
-              "name": "hucCd"
-            },
-            {
-              "value": "37",
-              "name": "stateCd"
-            },
-            {
-              "value": "37111",
-              "name": "countyCd"
-            }
-          ]
-        },
-        "variable": {
-          "variableCode": [
-            {
-              "value": "72019",
-              "network": "NWIS",
-              "vocabulary": "NWIS:UnitValues",
-              "variableID": 52331280,
-              "default": true
-            }
-          ],
-          "variableName": "Depth to water level, ft below land surface",
-          "variableDescription": "Depth to water level, feet below land surface",
-          "valueType": "Derived Value",
-          "unit": {
-            "unitCode": "ft"
-          },
-          "options": {
-            "option": [
-              {
-                "name": "Statistic",
-                "optionCode": "00000"
-              }
-            ]
-          },
-          "note": [],
-          "noDataValue": -999999.0,
-          "variableProperty": [],
-          "oid": "52331280"
-        },
-        "values": [
-          {
-            "value": [
-              {
-                "value": "26.07",
-                "qualifiers": ["A", "1"],
-                "dateTime": "2020-01-23T09:06:00.000"
-              },
-              {
-                "value": "27.00",
-                "qualifiers": ["A", "1"],
-                "dateTime": "2020-03-19T15:11:00.000"
-              },
-              {
-                "value": "27.000",
-                "qualifiers": ["A", "1"],
-                "dateTime": "2020-05-13T11:47:00.000"
-              },
-              {
-                "value": "29.19",
-                "qualifiers": ["A", "1"],
-                "dateTime": "2020-07-23T11:45:00.000"
-              },
-              {
-                "value": "25.55",
-                "qualifiers": ["A", "1"],
-                "dateTime": "2020-08-24T16:04:00.000"
-              },
-              {
-                "value": "25.03",
-                "qualifiers": ["A", "1"],
-                "dateTime": "2020-10-01T18:10:00.000"
-              },
-              {
-                "value": "24.54",
-                "qualifiers": ["A", "1"],
-                "dateTime": "2020-11-17T12:57:00.000"
-              }
-            ],
-            "qualifier": [],
-            "qualityControlLevel": [],
-            "method": [
-              {
-                "methodID": 1
-              }
-            ],
-            "source": [],
-            "offset": [],
-            "sample": [],
-            "censorCode": []
-          }
-        ],
-        "name": "USGS:354133082042203:72019:00000"
-      }
-    ]
-  },
-  "nil": false,
-  "globalScope": true,
-  "typeSubstituted": false
-}`;
-
 export const MOCK_TEMP_C_IV_DATA =
 `{
 	"name": "ns1:timeSeriesResponseType",
diff --git a/assets/src/scripts/monitoring-location/components/hydrograph/data-table.js b/assets/src/scripts/monitoring-location/components/hydrograph/data-table.js
index f7762c1361d6c7afe29946498a9e98e5437b8a60..e70df0be68eef099b9336e44b1b320450d51f5b1 100644
--- a/assets/src/scripts/monitoring-location/components/hydrograph/data-table.js
+++ b/assets/src/scripts/monitoring-location/components/hydrograph/data-table.js
@@ -15,12 +15,12 @@ const TABLE_CAPTION = {
 
 const COLUMN_HEADINGS = {
     iv: ['Parameter', 'Time', 'Result', 'Approval', 'Masks'],
-    gw: ['Parameter', 'Time', 'Result', 'Approval']
+    gw: ['Parameter', 'Time', 'Result', 'Accuracy', 'Approval', 'Qualifiers']
 };
 
 const VALUE_NAMES = {
     iv: ['parameterName', 'dateTime', 'result', 'approvals', 'masks'],
-    gw: ['parameterName', 'dateTime', 'result', 'approvals']
+    gw: ['parameterName', 'dateTime', 'result', 'resultAccuracy', 'approvals', 'qualifiers']
 };
 
 const CONTAINER_ID = {
diff --git a/assets/src/scripts/monitoring-location/components/hydrograph/download-data.js b/assets/src/scripts/monitoring-location/components/hydrograph/download-data.js
index e273fd268229892a0393ffc8b4f25e7b06c04e79..b11488c056bb26ac6c93786d9441b980a6d320e8 100644
--- a/assets/src/scripts/monitoring-location/components/hydrograph/download-data.js
+++ b/assets/src/scripts/monitoring-location/components/hydrograph/download-data.js
@@ -14,9 +14,9 @@ import {getGroundwaterServiceURL} from 'ui/web-services/groundwater-levels';
 import {drawErrorAlert} from 'd3render/alerts';
 
 import {isCalculatedTemperature} from 'ml/parameter-code-utils';
-import {getTimeRange, getPrimaryParameter} from 'ml/selectors/hydrograph-data-selector';
+import {getTimeRange} from 'ml/selectors/hydrograph-data-selector';
 
-import {hasVisibleIVData, hasVisibleMedianStatisticsData, hasVisibleGroundwaterLevels} from './selectors/time-series-data';
+import {hasVisibleIVData, hasVisibleMedianStatisticsData, hasVisibleGroundwaterLevels, getPrimaryParameter} from './selectors/time-series-data';
 
 const INFO_TEXT = `
 <div>
@@ -68,16 +68,13 @@ const getMedianDataURL = function(store, siteno) {
         format: 'rdb'
     });
 };
-const getGroundwaterLevelURL = function(store, siteno) {
+const getGroundwaterLevelURL = function(store, siteno, agencyCd) {
     const currentState = store.getState();
     const timeRange = getTimeRange('current')(currentState);
 
     return getGroundwaterServiceURL({
         siteno,
-        parameterCode: getPrimaryParameter(currentState).parameterCode,
-        startTime: toISO(timeRange.start),
-        endTime: toISO(timeRange.end),
-        format: 'rdb'
+        agencyCd
     });
 };
 const getSiteMetaDataURL = function(siteno) {
@@ -142,7 +139,7 @@ const drawRadioButtons = function(container, {
  * @param {Redux store} store
  * @param {String} siteno
  */
-export const drawDownloadForm = function(container, store, siteno) {
+export const drawDownloadForm = function(container, store, siteno, agencyCd) {
     const downloadContainer = container.append('div');
     const formContainer = downloadContainer.append('div')
         .attr('class', 'usa-form')
@@ -183,7 +180,7 @@ export const drawDownloadForm = function(container, store, siteno) {
                         downloadUrl = getMedianDataURL(store, siteno);
                         break;
                     case 'groundwater-levels':
-                        downloadUrl = getGroundwaterLevelURL(store, siteno);
+                        downloadUrl = getGroundwaterLevelURL(store, siteno, agencyCd);
                         break;
                     case 'site':
                         downloadUrl = getSiteMetaDataURL(siteno);
diff --git a/assets/src/scripts/monitoring-location/components/hydrograph/index.js b/assets/src/scripts/monitoring-location/components/hydrograph/index.js
index a35a6362d74f00dd8504084986f075038e9a0c7a..763e75beec466e6bfc382de51a6dfefda29fad9b 100644
--- a/assets/src/scripts/monitoring-location/components/hydrograph/index.js
+++ b/assets/src/scripts/monitoring-location/components/hydrograph/index.js
@@ -11,7 +11,7 @@ import {renderTimeSeriesUrlParams} from 'ml/url-params';
 
 import {getInputsForRetrieval} from 'ml/selectors/hydrograph-state-selector';
 
-
+import {retrieveGroundwaterLevelData} from 'ml/store/groundwater-level-field-visits';
 import {retrieveHydrographData} from 'ml/store/hydrograph-data';
 import {retrieveHydrographParameters} from 'ml/store/hydrograph-parameters';
 import {setSelectedParameterCode, setCompareDataVisibility, setSelectedTimeSpan,
@@ -87,13 +87,18 @@ export const attachToNode = function(store,
     // Fetch all data needed to render the hydrograph
     const fetchHydrographDataPromise = store.dispatch(retrieveHydrographData(siteno, agencyCd,
         getInputsForRetrieval(store.getState())));
+    let fetchDataPromises = [fetchHydrographDataPromise];
 
-    // if showing the controls, fetch the parameter meta data
-    if (!thisShowOnlyGraph) {
-        store.dispatch(retrieveHydrographParameters(siteno));
+    // if showing only graph make a call to retrieve all of the groundwater level data. Otherwise
+    // this is done when retrieving all hydrograph parameter meta data.
+    if (thisShowOnlyGraph) {
+        if (config.gwPeriodOfRecord) {
+            fetchDataPromises.push(store.dispatch(retrieveGroundwaterLevelData(siteno, agencyCd)));
+        }
+    } else {
+        fetchDataPromises.push(store.dispatch(retrieveHydrographParameters(siteno, agencyCd)));
     }
 
-    let fetchDataPromises = [fetchHydrographDataPromise];
     // Fetch flood levels
     if (config.ivPeriodOfRecord && config.GAGE_HEIGHT_PARAMETER_CODE in config.ivPeriodOfRecord) {
         const fetchFloodLevelsPromise =  store.dispatch(floodDataActions.retrieveFloodLevels(siteno));
diff --git a/assets/src/scripts/monitoring-location/components/hydrograph/select-actions.js b/assets/src/scripts/monitoring-location/components/hydrograph/select-actions.js
index c52aade5fc2fb3510d624be629feae782f5c533d..2e9a72764fbe81f9118cb102aa95bd57b023c971 100644
--- a/assets/src/scripts/monitoring-location/components/hydrograph/select-actions.js
+++ b/assets/src/scripts/monitoring-location/components/hydrograph/select-actions.js
@@ -78,5 +78,5 @@ export const drawSelectActions = function(container, store, siteno, agencyCode)
     container.append('div')
         .attr('id', 'download-graph-data-container')
         .attr('hidden', true)
-        .call(drawDownloadForm, store, siteno);
+        .call(drawDownloadForm, store, siteno, agencyCode);
 };
diff --git a/assets/src/scripts/monitoring-location/components/hydrograph/selectors/axes.js b/assets/src/scripts/monitoring-location/components/hydrograph/selectors/axes.js
index a4a59e06ff7f20fbf8d6fd579e0884552907b165..d9fefc641820cff172a7ee4a7779c60c1359f926 100644
--- a/assets/src/scripts/monitoring-location/components/hydrograph/selectors/axes.js
+++ b/assets/src/scripts/monitoring-location/components/hydrograph/selectors/axes.js
@@ -6,11 +6,12 @@ import config from 'ui/config';
 
 import {generateTimeTicks} from 'd3render/tick-marks';
 
-import {getPrimaryParameter} from 'ml/selectors/hydrograph-data-selector';
 
 import {getYTickDetails} from './domain';
 import {getLayout} from './layout';
 import {getXScale, getBrushXScale, getYScale} from './scales';
+import {getPrimaryParameter} from './time-series-data';
+
 
 
 const createXAxis = function(xScale) {
diff --git a/assets/src/scripts/monitoring-location/components/hydrograph/selectors/discrete-data.js b/assets/src/scripts/monitoring-location/components/hydrograph/selectors/discrete-data.js
index e7e3f20ef732559e139bdc80f444bd04bbbc0527..fc91d09acd62409453404b599e6a1bb64f1458d3 100644
--- a/assets/src/scripts/monitoring-location/components/hydrograph/selectors/discrete-data.js
+++ b/assets/src/scripts/monitoring-location/components/hydrograph/selectors/discrete-data.js
@@ -5,15 +5,35 @@ import {createSelector} from 'reselect';
 
 import config from 'ui/config';
 
-import {getGroundwaterLevels, getPrimaryParameter} from 'ml/selectors/hydrograph-data-selector';
+import {getSelectedGroundwaterLevels} from 'ml/selectors/groundwater-level-field-visits-selector';
 
 const GW_LEVEL_RADIUS = 7;
 const GW_LEVEL_CLASS = 'gw-level-point';
 
+const CENSORED_QUALIFIERS = [
+    'Dry',
+    'Flowing',
+    'Frozen',
+    'Obstructed',
+    'Measurement unable to be obtained'
+];
+
+const TIME_FORMAT = {
+    'minute': 'y-MM-dd HH:mmZZ',
+    'hour': 'y-MM-dd HHZZ',
+    'day': 'y-MM-dd',
+    'month': 'y-MM',
+    'year': 'y'
+};
+
+const hasCensoredQualifiers = function(qualifiers) {
+    return qualifiers.findIndex(qualifier => CENSORED_QUALIFIERS.includes(qualifier)) !== -1;
+};
+
 const APPROVAL_QUALIFIERS = {
-    'A': {label: 'Approved', class: 'approved'},
-    'P': {label: 'Provisional', class: 'provisional'},
-    'R': {label: 'Revised', class: 'revised'}
+    'Approved': {label: 'Approved', class: 'approved'},
+    'Provisional': {label: 'Provisional', class: 'provisional'},
+    'Revised': {label: 'Revised', class: 'revised'}
 };
 
 const getDetailsForApprovalCode = function(qualifiers) {
@@ -21,7 +41,7 @@ const getDetailsForApprovalCode = function(qualifiers) {
     if (approvalQualifier) {
         return APPROVAL_QUALIFIERS[approvalQualifier];
     } else {
-        return APPROVAL_QUALIFIERS['P'];
+        return APPROVAL_QUALIFIERS['Provisional'];
     }
 };
 
@@ -37,22 +57,24 @@ const getDetailsForApprovalCode = function(qualifiers) {
  *      @prop {Number} radius - used to draw the circle marker
  */
 export const getGroundwaterLevelPoints = createSelector(
-    getGroundwaterLevels,
+    getSelectedGroundwaterLevels,
     gwLevels => {
         if (!gwLevels) {
             return [];
         }
-        return gwLevels.values.map(data => {
-            const approvalDetails = getDetailsForApprovalCode(data.qualifiers);
-            return {
-                displayValue: data.value,
-                value: data.value ? parseFloat(data.value) : null,
-                dateTime: data.dateTime,
-                classes: [GW_LEVEL_CLASS, approvalDetails.class],
-                label: approvalDetails.label,
-                radius: GW_LEVEL_RADIUS
-            };
-        });
+        return gwLevels.values
+            .filter(value => !hasCensoredQualifiers(value.qualifiers) || value.result)
+            .map(value => {
+                const approvalDetails = getDetailsForApprovalCode(value.approvals);
+                return {
+                    value: parseFloat(value.result),
+                    displayValue: value.result,
+                    dateTime: value.epochTime,
+                    classes: [GW_LEVEL_CLASS, approvalDetails.class],
+                    label: approvalDetails.label,
+                    radius: GW_LEVEL_RADIUS
+                };
+            });
     }
 );
 
@@ -64,16 +86,12 @@ export const getGroundwaterLevelPoints = createSelector(
 export const getGroundwaterLevelDataRange = createSelector(
     getGroundwaterLevelPoints,
     points => {
-        if (!points) {
+        if (!points || !points.length) {
             return null;
         }
 
-        const values = points.filter(data => data.value !== null).map(data => data.value);
-        if (values.length) {
-            return [Math.min(...values), Math.max(...values)];
-        } else {
-            return null;
-        }
+        const values = points.map(data => data.value);
+        return [Math.min(...values), Math.max(...values)];
     }
 );
 
@@ -104,25 +122,28 @@ export const getUniqueGWKinds = createSelector(
  * @return {Function} - Function returns an array of visible ground water values with properties:
  *      @prop {String} parameterName
  *      @prop {String} result
+ *      @prop {String} resultAccuracy
+ *      @prop {Number} epochTime - useful for sorting the data by time
  *      @prop {String} dateTime in site's time zone.
  *      @prop {String} approvals
+ *      @prop {String} qualifiers
  */
 export const getGroundwaterLevelsTableData = createSelector(
-    getPrimaryParameter,
-    getGroundwaterLevelPoints,
-    (parameter, gwLevels) => {
-        if (!parameter || !gwLevels) {
+    getSelectedGroundwaterLevels,
+    gwLevels => {
+        if (!gwLevels) {
             return [];
         }
-        return gwLevels.map((point) => {
+        return gwLevels.values.map(value => {
             return {
-                parameterName: parameter.name,
-                result: point.displayValue,
-                dateTime: DateTime.fromMillis(point.dateTime, {zone: config.locationTimeZone}).toISO({
-                    suppressMilliseconds: true,
-                    suppressSeconds: true
-                }),
-                approvals: point.label
+                parameterName: gwLevels.parameter.name,
+                result: hasCensoredQualifiers(value.qualifiers) || !value.result ? 'None' : value.result,
+                resultAccuracy: value.resultAccuracy ? value.resultAccuracy : 'None',
+                epochTime: value.epochTime,
+                dateTime: DateTime.fromMillis(value.epochTime, {zone: config.locationTimeZone})
+                    .toFormat(TIME_FORMAT[value.phenomenonTimeAccuracy]),
+                approvals: value.approvals.join(', '),
+                qualifiers: value.qualifiers.join(', ')
             };
         });
     }
diff --git a/assets/src/scripts/monitoring-location/components/hydrograph/selectors/domain.js b/assets/src/scripts/monitoring-location/components/hydrograph/selectors/domain.js
index 286a10d65f6f10a2adc7bf20cea576e0755e3fef..b8401885a55637715465e7540930d1dff3d62c68 100644
--- a/assets/src/scripts/monitoring-location/components/hydrograph/selectors/domain.js
+++ b/assets/src/scripts/monitoring-location/components/hydrograph/selectors/domain.js
@@ -6,13 +6,12 @@ import config from 'ui/config';
 import {mediaQuery} from 'ui/utils';
 
 import {
-    getPrimaryMedianStatisticsValueRange,
-    getPrimaryParameter
+    getPrimaryMedianStatisticsValueRange
 } from 'ml/selectors/hydrograph-data-selector';
 
 import {getGroundwaterLevelDataRange} from './discrete-data';
 import {getIVDataRange} from './iv-data';
-import {isVisible} from './time-series-data';
+import {isVisible, getPrimaryParameter} from './time-series-data';
 
 const Y_TICK_COUNT = 5;
 
diff --git a/assets/src/scripts/monitoring-location/components/hydrograph/selectors/iv-data.js b/assets/src/scripts/monitoring-location/components/hydrograph/selectors/iv-data.js
index 94927b0a934ff570cfe199f936ce9e94ffbed13f..c8f89fd7c077bca11861a41220a5c59e314b3e67 100644
--- a/assets/src/scripts/monitoring-location/components/hydrograph/selectors/iv-data.js
+++ b/assets/src/scripts/monitoring-location/components/hydrograph/selectors/iv-data.js
@@ -7,7 +7,7 @@ import {createSelector} from 'reselect';
 
 import config from 'ui/config';
 
-import {getIVData, getPrimaryParameter} from 'ml/selectors/hydrograph-data-selector';
+import {getIVData, getIVPrimaryParameter} from 'ml/selectors/hydrograph-data-selector';
 import {getSelectedIVMethodID} from 'ml/selectors/hydrograph-state-selector';
 
 const MASKED_QUALIFIERS = {
@@ -181,7 +181,7 @@ export const getIVDataRange = memoize(dataKind => createSelector(
  */
 export const getIVTableData = memoize(dataKind => createSelector(
     getIVDataPoints(dataKind),
-    getPrimaryParameter,
+    getIVPrimaryParameter,
     (ivData, parameter) => {
         if (!ivData) {
             return [];
diff --git a/assets/src/scripts/monitoring-location/components/hydrograph/selectors/legend-data.js b/assets/src/scripts/monitoring-location/components/hydrograph/selectors/legend-data.js
index abf96b600e0fb263e5e8ba143e3fee4553fd9cb9..d67a8f019683e54d0c8cbed859d937000a259a1c 100644
--- a/assets/src/scripts/monitoring-location/components/hydrograph/selectors/legend-data.js
+++ b/assets/src/scripts/monitoring-location/components/hydrograph/selectors/legend-data.js
@@ -5,14 +5,14 @@ import config from 'ui/config';
 import {defineLineMarker, defineRectangleMarker, defineCircleMarker, defineTextOnlyMarker} from 'd3render/markers';
 
 import {showFloodLevels} from 'ml/selectors/flood-data-selector';
-import {getPrimaryMedianStatisticsData, getPrimaryParameter} from 'ml/selectors/hydrograph-data-selector';
+import {getPrimaryMedianStatisticsData} from 'ml/selectors/hydrograph-data-selector';
 import {isCompareIVDataVisible, isMedianDataVisible} from 'ml/selectors/hydrograph-state-selector';
 
 import {getUniqueGWKinds} from './discrete-data';
 import {getFloodLevelData} from './flood-level-data';
 import {getIVUniqueDataKinds, HASH_ID} from './iv-data';
 import {getThresholdsInRange} from './thresholds-data';
-
+import {getPrimaryParameter} from './time-series-data';
 
 
 const TS_LABEL = {
diff --git a/assets/src/scripts/monitoring-location/components/hydrograph/selectors/scales.js b/assets/src/scripts/monitoring-location/components/hydrograph/selectors/scales.js
index a67cbab7079fb4a99d351afe5aaa3e9bfe7676f3..78f18247e7e122668e62b33157a3e04e59959b89 100644
--- a/assets/src/scripts/monitoring-location/components/hydrograph/selectors/scales.js
+++ b/assets/src/scripts/monitoring-location/components/hydrograph/selectors/scales.js
@@ -3,13 +3,13 @@ import memoize from 'fast-memoize';
 import {createSelector} from 'reselect';
 
 import {
-    getPrimaryParameter,
     getTimeRange
 } from 'ml/selectors/hydrograph-data-selector';
 import {getGraphBrushOffset} from 'ml/selectors/hydrograph-state-selector';
 
 import {SYMLOG_PARMS, getPrimaryValueRange} from './domain';
 import {getLayout} from './layout';
+import {getPrimaryParameter} from './time-series-data';
 
 
 const REVERSE_AXIS_PARMS = [
diff --git a/assets/src/scripts/monitoring-location/components/hydrograph/selectors/time-series-data.js b/assets/src/scripts/monitoring-location/components/hydrograph/selectors/time-series-data.js
index cc90da84d196eb8fe46f4696d0aa66215c411693..455dcf444ee500f3b175d3cdae2819aecafe3517 100644
--- a/assets/src/scripts/monitoring-location/components/hydrograph/selectors/time-series-data.js
+++ b/assets/src/scripts/monitoring-location/components/hydrograph/selectors/time-series-data.js
@@ -4,7 +4,8 @@ import {createSelector} from 'reselect';
 
 import config from 'ui/config';
 
-import {getIVData, getGroundwaterLevels, getMedianStatisticsData, getPrimaryMethods, getPrimaryParameter,
+import {getSelectedGroundwaterLevels} from 'ml/selectors/groundwater-level-field-visits-selector';
+import {getIVData, getMedianStatisticsData, getPrimaryMethods, getIVPrimaryParameter,
     getTimeRange
 } from 'ml/selectors/hydrograph-data-selector';
 import {getSelectedIVMethodID, isCompareIVDataVisible, isMedianDataVisible} from 'ml/selectors/hydrograph-state-selector';
@@ -12,6 +13,19 @@ import {getSelectedIVMethodID, isCompareIVDataVisible, isMedianDataVisible} from
 const formatTime = function(timeInMillis) {
     return DateTime.fromMillis(timeInMillis, {zone: config.locationTimeZone}).toFormat('L/d/yyyy tt ZZZ');
 };
+
+/*
+ * Returns a Redux selector function which returns a parameter object that describes the
+ * parameter that is currently displayed in the hydrograph or null if no data.
+ */
+export const getPrimaryParameter = createSelector(
+    getIVPrimaryParameter,
+    getSelectedGroundwaterLevels,
+    (ivParameter, gwLevels) => {
+        return ivParameter ? ivParameter : gwLevels ? gwLevels.parameter : null;
+    }
+);
+
 /**
  * Returns a Redux selector function which returns whether the dataKind time series is visible
  * @param  {String} dataKind - 'primary', 'compare', 'median'
@@ -57,7 +71,7 @@ export const hasVisibleMedianStatisticsData = createSelector(
 );
 
 export const hasVisibleGroundwaterLevels = createSelector(
-    getGroundwaterLevels,
+    getSelectedGroundwaterLevels,
     gwLevels => gwLevels && gwLevels.values ? gwLevels.values.length > 0 : false
 );
 
diff --git a/assets/src/scripts/monitoring-location/components/hydrograph/time-series-graph.js b/assets/src/scripts/monitoring-location/components/hydrograph/time-series-graph.js
index 8bcb0586c90968af2197a79ac80b9708fd13626f..34f92f9bd9c1664977919a06206b23d2f4b6bb9c 100644
--- a/assets/src/scripts/monitoring-location/components/hydrograph/time-series-graph.js
+++ b/assets/src/scripts/monitoring-location/components/hydrograph/time-series-graph.js
@@ -11,7 +11,7 @@ import {renderMaskDefs} from 'd3render/data-masks';
 import {appendInfoTooltip} from 'd3render/info-tooltip';
 
 import {showFloodLevels} from 'ml/selectors/flood-data-selector';
-import {getPrimaryParameter, getPrimaryMedianStatisticsData} from 'ml/selectors/hydrograph-data-selector';
+import {getPrimaryMedianStatisticsData} from 'ml/selectors/hydrograph-data-selector';
 
 import {getAxes}  from './selectors/axes';
 import {getGroundwaterLevelPoints} from './selectors/discrete-data';
@@ -19,7 +19,7 @@ import {getFloodLevelData} from './selectors/flood-level-data';
 import {getIVDataSegments, HASH_ID} from './selectors/iv-data';
 import {getMainLayout} from './selectors/layout';
 import {getMainXScale, getMainYScale} from './selectors/scales';
-import {getTitle, getDescription, isVisible} from './selectors/time-series-data';
+import {getTitle, getDescription, isVisible, getPrimaryParameter} from './selectors/time-series-data';
 
 import {drawGroundwaterLevels} from './discrete-data';
 import {drawFloodLevelLines} from './flood-level-lines';
diff --git a/assets/src/scripts/monitoring-location/components/hydrograph/tooltip.js b/assets/src/scripts/monitoring-location/components/hydrograph/tooltip.js
index 18bc05080586570fd848933392cbad7d42f291d2..ca29db4af5934f99c6ee75c3d259bc9101842fcb 100644
--- a/assets/src/scripts/monitoring-location/components/hydrograph/tooltip.js
+++ b/assets/src/scripts/monitoring-location/components/hydrograph/tooltip.js
@@ -6,7 +6,6 @@ import {link} from 'ui/lib/d3-redux';
 
 import {drawFocusOverlay, drawFocusCircles, drawFocusLine} from 'd3render/graph-tooltip';
 
-import {getPrimaryParameter} from 'ml/selectors/hydrograph-data-selector';
 import {setGraphCursorOffset} from 'ml/store/hydrograph-state';
 
 import {getCursorTime, getIVDataCursorPoint, getIVDataTooltipPoint, getGroundwaterLevelCursorPoint,
@@ -14,6 +13,8 @@ import {getCursorTime, getIVDataCursorPoint, getIVDataTooltipPoint, getGroundwat
 } from './selectors/cursor';
 import {getMainLayout} from './selectors/layout';
 import {getMainXScale, getMainYScale} from './selectors/scales';
+import {getPrimaryParameter} from './selectors/time-series-data';
+
 
 import {drawCursorSlider} from './cursor-slider';
 
diff --git a/assets/src/scripts/monitoring-location/selectors/flood-data-selector.js b/assets/src/scripts/monitoring-location/selectors/flood-data-selector.js
index 368d3b54f407c1433e9951b869d7c8d3d407daef..d2134caa530fd22877f80daedead52c227cd338a 100644
--- a/assets/src/scripts/monitoring-location/selectors/flood-data-selector.js
+++ b/assets/src/scripts/monitoring-location/selectors/flood-data-selector.js
@@ -2,7 +2,7 @@ import {createSelector} from 'reselect';
 
 import config from 'ui/config';
 
-import {getPrimaryParameter} from './hydrograph-data-selector';
+import {getIVPrimaryParameter} from './hydrograph-data-selector';
 
 export const getFloodStages = state => state.floodData.stages || [];
 
@@ -33,7 +33,7 @@ export const hasFloodLevels = createSelector(
  */
 export const showFloodLevels = createSelector(
     hasFloodLevels,
-    getPrimaryParameter,
+    getIVPrimaryParameter,
     (hasFloodLevels, parameter) => hasFloodLevels && parameter && parameter.parameterCode === config.GAGE_HEIGHT_PARAMETER_CODE
 );
 
diff --git a/assets/src/scripts/monitoring-location/selectors/groundwater-level-field-visits-selector.js b/assets/src/scripts/monitoring-location/selectors/groundwater-level-field-visits-selector.js
new file mode 100644
index 0000000000000000000000000000000000000000..53d5aafb8bf1fd6becec742d136f8d72b5ae32f7
--- /dev/null
+++ b/assets/src/scripts/monitoring-location/selectors/groundwater-level-field-visits-selector.js
@@ -0,0 +1,33 @@
+import {createSelector} from 'reselect';
+
+import {getTimeRange} from './hydrograph-data-selector';
+import {getSelectedParameterCode} from './hydrograph-state-selector';
+
+export const getAllGroundwaterLevels = state => state.groundwaterLevelData.all;
+
+export const getSelectedGroundwaterLevels = createSelector(
+    getSelectedParameterCode,
+    getTimeRange('current'),
+    getAllGroundwaterLevels,
+    (parameterCode, timeRange, groundwaterLevelsData) => {
+        const parameterCodeDatastream =
+            groundwaterLevelsData.find(datastream => datastream.USGSParameterCode === parameterCode);
+        if (parameterCodeDatastream) {
+            const inTimeRangeObservations =
+                parameterCodeDatastream.observations.filter(observation => {
+                    return observation.epochTime > timeRange.start && observation.epochTime < timeRange.end;
+                });
+            return {
+                parameter: {
+                    parameterCode: parameterCodeDatastream.USGSParameterCode,
+                    name: parameterCodeDatastream.observedPropertyName,
+                    description: parameterCodeDatastream.observedPropertyName,
+                    unit: parameterCodeDatastream.unitOfMeasureName
+                },
+                values: inTimeRangeObservations
+            };
+        } else {
+            return null;
+        }
+    }
+);
diff --git a/assets/src/scripts/monitoring-location/selectors/hydrograph-data-selector.js b/assets/src/scripts/monitoring-location/selectors/hydrograph-data-selector.js
index dc8eab8aa818c840e3725a319ce52fab98201b95..4ded7fc1ac3fdd4bad9787ca8f150d40ecc95552 100644
--- a/assets/src/scripts/monitoring-location/selectors/hydrograph-data-selector.js
+++ b/assets/src/scripts/monitoring-location/selectors/hydrograph-data-selector.js
@@ -33,25 +33,18 @@ export const getIVData = memoize((dataKind) => state => state.hydrographData[`${
  */
 export const getMedianStatisticsData = state => state.hydrographData.medianStatisticsData || null;
 
-/*
- * Returns a selector function which returns the groundwater levels data
- * @return {Function}
- */
-export const getGroundwaterLevels = state => state.hydrographData.groundwaterLevels ||  null;
+
 /*
  * Returns a selector function which returns the parameter that the hydrographData is representing
  * and is an Object containing the parameter code, name, description, and unit
  * @return {Function}
  */
-export const getPrimaryParameter = createSelector(
+export const getIVPrimaryParameter = createSelector(
     getIVData('primary'),
-    getGroundwaterLevels,
-    (ivData, gwLevels) => {
+    (ivData) => {
         let parameter = null;
         if (ivData) {
             parameter = ivData.parameter;
-        } else if (gwLevels) {
-            parameter = gwLevels.parameter;
         }
         return parameter;
     }
diff --git a/assets/src/scripts/monitoring-location/store/groundwater-level-field-visits.js b/assets/src/scripts/monitoring-location/store/groundwater-level-field-visits.js
new file mode 100644
index 0000000000000000000000000000000000000000..1e1b08b87a9d100f61b7bce75ce04412257a2195
--- /dev/null
+++ b/assets/src/scripts/monitoring-location/store/groundwater-level-field-visits.js
@@ -0,0 +1,88 @@
+import {DateTime} from 'luxon';
+
+import config from 'ui/config';
+
+import {fetchGroundwaterLevels} from 'ui/web-services/groundwater-levels';
+
+const INITIAL_DATA = {
+    all: []
+};
+/*
+ * Synchronous Redux action - update the groundwater level data
+ * @param {Array of Objects} - Each object represents the datastreams property from
+ *      the groundwater level field visit service.
+ * @return {Function} - Redux action
+ */
+const updateGroundwaterLevelData = function(datastreams) {
+    return {
+        type: 'UPDATE_GROUNDWATER_LEVEL_DATA',
+        datastreams
+    };
+};
+
+/*
+ * Asynchronous Redux action - fetches the latest data for groundwater level site visits and
+ * updates the data
+ * @param {String} siteno
+ * @param {String} agencyCd
+ * @returns {Function} - which returns a Promise
+ */
+export const retrieveGroundwaterLevelData = function(siteno, agencyCd) {
+    return function(dispatch) {
+        return fetchGroundwaterLevels({siteno, agencyCd}).then(resp => {
+            /* Add Epoch time to each datastream. This way we deal with time is in one place
+             * Time strings with hour or minute accuracy are interpreted as UTC.
+             * Time strings with day, month, or year are interpreted as the start of the day in the site's local time zone.
+             */
+            let augmentedDatastreams = [];
+            if (resp.properties && resp.properties.dataStreams) {
+                augmentedDatastreams = resp.properties.dataStreams.map(datastream => {
+                    const augmentedObservations = datastream.observations.map(observation => {
+                        let timeZoneToUse;
+                        switch (observation.phenomenonTimeAccuracy) {
+                            case 'minute':
+                            case 'hour':
+                                timeZoneToUse = 'utc';
+                                break;
+                            case 'day':
+                            case 'month':
+                            case 'year':
+                                timeZoneToUse = config.locationTimeZone;
+                                break;
+                            default:
+                                timeZoneToUse = 'utc';
+                        }
+                        const epochTime = DateTime.fromISO(observation.phenomenonTime, {zone: timeZoneToUse})
+                            .startOf(observation.phenomenonTimeAccuracy)
+                            .toMillis();
+                        return {
+                            ...observation,
+                            epochTime: epochTime
+                        };
+                    });
+                    //Sorts in ascending time order
+                    return {
+                        ...datastream,
+                        observations: augmentedObservations.sort((a, b) => a.epochTime - b.epochTime)
+                    };
+                });
+            }
+            dispatch(updateGroundwaterLevelData(augmentedDatastreams));
+            return augmentedDatastreams;
+        });
+    };
+};
+
+/*
+ * Slice reducer
+ */
+export const groundwaterLevelDataReducer = function(data=INITIAL_DATA, action) {
+    switch(action.type) {
+        case 'UPDATE_GROUNDWATER_LEVEL_DATA':
+            return {
+                ...data,
+                all: action.datastreams
+            };
+        default: return data;
+    }
+};
\ No newline at end of file
diff --git a/assets/src/scripts/monitoring-location/store/hydrograph-data.js b/assets/src/scripts/monitoring-location/store/hydrograph-data.js
index dc6426be897450d94dbf98107f22a8529c496239..23d492480d13e8bac72e22c6bbedf3dc553bd10c 100644
--- a/assets/src/scripts/monitoring-location/store/hydrograph-data.js
+++ b/assets/src/scripts/monitoring-location/store/hydrograph-data.js
@@ -4,7 +4,6 @@ import {DateTime, Duration} from 'luxon';
 import config from 'ui/config';
 import {convertCelsiusToFahrenheit} from 'ui/utils';
 
-import {fetchGroundwaterLevels} from 'ui/web-services/groundwater-levels';
 import {fetchTimeSeries} from 'ui/web-services/instantaneous-values';
 import {fetchSiteStatistics} from 'ui/web-services/statistics-data';
 import {fetchDataFromSensorThings} from 'ui/web-services/sensor-things';
@@ -70,20 +69,6 @@ const addMedianStatisticsData = function(statsData) {
     };
 };
 
-/*
- * Synchronous Redux action which sets the groundwater levels data
- * @param {Object} gwLevels
- *      @prop {Object} parameter
- *      @prop {Array} values
- * @return {Object} Redux action
- */
-const addGroundwaterLevels = function(gwLevels) {
-    return {
-        type: 'ADD_GROUNDWATER_LEVELS',
-        gwLevels
-    };
-};
-
 /*
  * Synchronous Redux action which sets the operational limit data. This will be the maximum and minimum value that a
  * gage can report with accuracy for a particular observed property
@@ -246,50 +231,6 @@ export const retrieveMedianStatistics = function(siteno, parameterCode) {
     };
 };
 
-/*
- * Asynchronous Redux action to fetch the groundwater levels data for siteno, parameterCode, period or startTime/endTime
- * for the dataKind
- * @param {String} siteno
- * @param {String} parameterCode
- * @param {String} period - ISO 8601 duration
- * @param {String} startTime - ISO 8601 time string
- * @param {String} endTie - ISO 8601 time string
- * @return {Function} that returns a Promise
- */
-const retrieveGroundwaterLevels = function(siteno, {parameterCode, period, startTime, endTime}) {
-    return function(dispatch) {
-        return fetchGroundwaterLevels({siteno, parameterCode, period, startTime, endTime})
-            .then(data => {
-                if (data.value && data.value.timeSeries && data.value.timeSeries.length) {
-                    let values;
-                    const timeSeries = data.value.timeSeries[0];
-                    if (!timeSeries.values.length || !timeSeries.values[0].value.length) {
-                        values = [];
-                    } else {
-                        values = timeSeries.values[0].value.map((v) => {
-                            const dateTime = DateTime.fromISO(v.dateTime, {zone: 'utc'}).toMillis();
-                            return {
-                                value: v.value,
-                                qualifiers: v.qualifiers,
-                                dateTime: dateTime
-                            };
-                        });
-                    }
-                    const parameter = {
-                        parameterCode: timeSeries.variable.variableCode[0].value,
-                        name: timeSeries.variable.variableName,
-                        description: timeSeries.variable.variableDescription,
-                        unit: timeSeries.variable.unit.unitCode
-                    };
-                    dispatch(addGroundwaterLevels({
-                        parameter,
-                        values
-                    }));
-                }
-            });
-    };
-};
-
 /**
  * Removes the unneeded data from Sensor Things and returns only the essential information for thresholds
  * @param {Object} properties - Complex object containing threshold data along with unneeded data returned from Sensor Things
@@ -368,7 +309,6 @@ export const retrieveHydrographData = function(siteno, agencyCode, {parameterCod
    return function(dispatch) {
         const parameterToFetch = getParameterToFetch(parameterCode);
         const hasIVData = config.ivPeriodOfRecord && parameterToFetch in config.ivPeriodOfRecord;
-        const hasGWData = config.gwPeriodOfRecord && parameterToFetch in config.gwPeriodOfRecord;
         dispatch(clearHydrographData());
 
         let timeRange;
@@ -392,10 +332,7 @@ export const retrieveHydrographData = function(siteno, agencyCode, {parameterCod
             fetchPromises.push(dispatch(retrieveIVData(
                 siteno, 'primary', {parameterCode, period, startTime, endTime})));
         }
-        if (hasGWData) {
-            fetchPromises.push(dispatch(
-                retrieveGroundwaterLevels(siteno, {parameterCode, period, startTime, endTime})));
-        }
+
         if (hasIVData && loadCompare && ALLOW_COMPARE_FOR_DURATIONS.includes(period)) {
             fetchPromises.push(dispatch(
                 retrievePriorYearIVData(siteno, {
@@ -434,12 +371,6 @@ export const hydrographDataReducer = function(hydrographData = {}, action) {
                 medianStatisticsData: action.statsData
             };
         }
-        case 'ADD_GROUNDWATER_LEVELS': {
-            return {
-                ...hydrographData,
-                groundwaterLevels: action.gwLevels
-            };
-        }
         case 'ADD_THRESHOLDS': {
             return {
                 // add this to general state instead of hydrographData
diff --git a/assets/src/scripts/monitoring-location/store/hydrograph-parameters.js b/assets/src/scripts/monitoring-location/store/hydrograph-parameters.js
index 64d88eaf4d9e6347288dce547b6987c3eb9999f9..8674f458b48f570c017af54d03d7705090deada7 100644
--- a/assets/src/scripts/monitoring-location/store/hydrograph-parameters.js
+++ b/assets/src/scripts/monitoring-location/store/hydrograph-parameters.js
@@ -3,14 +3,14 @@ import merge from 'lodash/merge';
 
 import config from 'ui/config';
 
-import {fetchGroundwaterLevels} from 'ui/web-services/groundwater-levels';
 import {fetchTimeSeries} from 'ui/web-services/instantaneous-values';
 
 import {getConvertedTemperatureParameter, hasMeasuredFahrenheitParameter} from 'ml/parameter-code-utils';
 import {Actions as floodStateActions} from './flood-data';
+import {retrieveGroundwaterLevelData} from './groundwater-level-field-visits';
 
 /*
- * Synchronous Redux action - updatethe hydrograph variables
+ * Synchronous Redux action - update the hydrograph variables
  * @param {Object} variables - keys are parameter codes.
  * @return {Object} - Redux action
  */
@@ -25,7 +25,7 @@ const updateHydrographParameters = function(parameters) {
  * Asynchronous Redux action - fetches the latest value for all parameter codes and
  * updates the store hydrograph parameter codes.
  */
-export const retrieveHydrographParameters = function(siteno) {
+export const retrieveHydrographParameters = function(siteno, agencyCd) {
     return function(dispatch) {
         let fetchPromises = [];
         if (config.ivPeriodOfRecord) {
@@ -66,28 +66,21 @@ export const retrieveHydrographParameters = function(siteno) {
             fetchPromises.push(fetchIVParameters);
         }
         if (config.gwPeriodOfRecord) {
-            const fetchGWLevelParameters = fetchGroundwaterLevels({siteno: siteno})
-                .then(series => {
-                    if (series.value && series.value.timeSeries) {
-                        return series.value.timeSeries.reduce((varsByPCode, ts) => {
-                            const parameterCode = ts.variable.variableCode[0].value;
-                            varsByPCode[parameterCode] = {
-                                parameterCode: parameterCode,
-                                name: ts.variable.variableName,
-                                description: ts.variable.variableDescription,
-                                unit: ts.variable.unit.unitCode,
-                                hasGWLevelsData: true
-                            };
-                            return varsByPCode;
-                        }, {});
-                    } else {
-                        return null;
-                    }
-                })
-                .catch(reason => {
-                    console.error(reason);
-                    throw reason;
+            const fetchGWLevelParameters = dispatch(retrieveGroundwaterLevelData(siteno, agencyCd))
+                .then(datastreams => {
+                    let gwVars = {};
+                    datastreams.forEach(datastream => {
+                        gwVars[datastream.USGSParameterCode] = {
+                            parameterCode: datastream.USGSParameterCode,
+                            name: datastream.observedPropertyName,
+                            description: datastream.observedPropertyName,
+                            unit: datastream.unitOfMeasureName,
+                            hasGWLevelsData: true
+                        };
+                    });
+                    return gwVars;
                 });
+
             fetchPromises.push(fetchGWLevelParameters);
         }
         if (fetchPromises.length) {
diff --git a/assets/src/scripts/monitoring-location/store/index.js b/assets/src/scripts/monitoring-location/store/index.js
index 773a32fe5b23616647f30c3bfe746281aa7e04cc..42db029d056010993894a4c1d7edcb509147946f 100644
--- a/assets/src/scripts/monitoring-location/store/index.js
+++ b/assets/src/scripts/monitoring-location/store/index.js
@@ -6,6 +6,7 @@ import {dailyValueTimeSeriesStateReducer as dailyValueTimeSeriesState} from './d
 import {
     floodDataReducer as floodData,
     floodStateReducer as floodState} from './flood-data';
+import {groundwaterLevelDataReducer as groundwaterLevelData} from './groundwater-level-field-visits';
 import {hydrographDataReducer as hydrographData} from './hydrograph-data';
 import {hydrographParametersReducer as hydrographParameters,
     initializeParameters} from './hydrograph-parameters';
@@ -20,6 +21,7 @@ const appReducer = combineReducers({
     hydrographData,
     hydrographParameters,
     hydrographState,
+    groundwaterLevelData,
     dailyValueTimeSeriesData,
     floodData,
     nldiData,
@@ -37,6 +39,9 @@ export const configureStore = function(initialState) {
         hydrographData: {},
         hydrographParameters: initializeParameters(),
         hydrographState: HYDROGRAPH_INITIAL_STATE,
+        groundwaterLevelData: {
+            all: []
+        },
         dailyValueTimeSeriesData: {},
         floodData: {
             stages: [],
diff --git a/assets/src/scripts/web-services/groundwater-levels.js b/assets/src/scripts/web-services/groundwater-levels.js
index 4430eec137476cabcb5cc6bb0a7f52527182bfdc..de63f3c6bc60e7a7a874e673fe4aa8570c3d97e2 100644
--- a/assets/src/scripts/web-services/groundwater-levels.js
+++ b/assets/src/scripts/web-services/groundwater-levels.js
@@ -1,49 +1,31 @@
 import config from 'ui/config';
 
 /**
- *  Formats a URL for the purpose of downloading groundwater levels data in RDB format
+ *  Formats a URL for the purpose of downloading groundwater levels data in json format
  * @param {String} siteno - A code that uniquely identifies a monitoring location
- * @param {String} parameterCode - USGS five digit parameter code
- * @param {String} period - ISO 8601 duration in days
- * @param {String} startTime - ISO 8601 time
- * @param {String} endTime- ISO 8601 time
- * @param {String} format - The format of the data returned from the water services API, such as 'json' or 'rdb'
+ * @param {String} agencyCd - A code for the agency
+ * @param {String} format - The format of the data returned from the API, such as 'json' or 'rdb'
  * @return {String} The URL used to contact waterservices.usgs.gov
  */
-export const getGroundwaterServiceURL = function({
-                                                      siteno,
-                                                      parameterCode = null,
-                                                      period = null,
-                                                      startTime = null,
-                                                      endTime = null,
-                                                      format
-                                                  }) {
-    const parameterCodeQuery = parameterCode ? `&parameterCd=${parameterCode}` : '';
-    let timeQuery;
-    if (period) {
-        timeQuery = `&period=${period}`;
-    } else {
-        timeQuery = startTime && endTime ? `&startDT=${startTime}&endDT=${endTime}` : '';
-    }
-    return `${config.GROUNDWATER_LEVELS_ENDPOINT}?sites=${siteno}${parameterCodeQuery}${timeQuery}&format=${format}`;
+export const getGroundwaterServiceURL = function(
+    {
+        siteno,
+        agencyCd,
+        format
+    }) {
+    return `${config.GROUNDWATER_LEVELS_ENDPOINT}?featureId=${agencyCd}-${siteno}&type=discrete&domain=groundwater_levels&f=${format}`;
 };
 
 /**
  * Fetch the groundwater levels for site, parameterCode, and period
- * @param {String} sites
- * @param {String} parameterCode
- * @param {String} period - ISO-8601 Duration in days.
- * @param {String} startTime - ISO-8601 time format
- * @param {String} endTime - ISO-8601 time format
+ * @param {String} siteno
+ * @param {String} agencyCd
  * @return {Promise} resolves to Object that is retrieved with ground water levels
  */
-export const fetchGroundwaterLevels = async function({siteno, parameterCode=null, period=null, startTime=null, endTime=null}) {
+export const fetchGroundwaterLevels = async function({siteno, agencyCd}) {
     const url = getGroundwaterServiceURL({
         siteno: siteno,
-        parameterCode: parameterCode,
-        period: period,
-        startTime: startTime,
-        endTime: endTime,
+        agencyCd: agencyCd,
         format: 'json'
     });
     const request = new Request(url, {
diff --git a/assets/src/scripts/web-services/groundwater-levels.test.js b/assets/src/scripts/web-services/groundwater-levels.test.js
index 0c21f5d87228b4d9af1dbe8e81ac25e4c011d20c..ef85901850556ee13a13a8ebdb81fc7a53e83907 100644
--- a/assets/src/scripts/web-services/groundwater-levels.test.js
+++ b/assets/src/scripts/web-services/groundwater-levels.test.js
@@ -1,7 +1,7 @@
 import {enableFetchMocks, disableFetchMocks} from 'jest-fetch-mock';
 import mockConsole from 'jest-mock-console';
 
-import {MOCK_GWLEVEL_DATA} from 'ui/mock-service-data';
+import {MOCK_GW_FIELD_VISITS} from 'ui/mock-gw-field-visits';
 
 import {getGroundwaterServiceURL, fetchGroundwaterLevels} from './groundwater-levels';
 
@@ -19,74 +19,21 @@ describe('web-services/groundwater-levels', () => {
     });
 
     describe('getGroundwaterServiceURL', () => {
-        it('Expects site no and format parameters but no others', () => {
+        it('Expects site no, agencyCd and format parameters', () => {
             const result = getGroundwaterServiceURL({
                 siteno: '11112222',
-                format: 'rdb'
+                agencyCd: 'USGS',
+                format: 'json'
             });
-            expect(result).toContain('sites=11112222');
-            expect(result).toContain('format=rdb');
-            expect(result).not.toContain('parameterCd');
-            expect(result).not.toContain('period');
-            expect(result).not.toContain('startDT');
-            expect(result).not.toContain('endDT');
-        });
-
-        it('Expects defined parameter code and period will appear in the URL', () => {
-            const result = getGroundwaterServiceURL({
-                siteno: '11112222',
-                parameterCode: '72019',
-                period: 'P30D',
-                format: 'rdb'
-            });
-            expect(result).toContain('sites=11112222');
-            expect(result).toContain('format=rdb');
-            expect(result).toContain('parameterCd=72019');
-            expect(result).toContain('period=P30D');
-            expect(result).not.toContain('startDT');
-            expect(result).not.toContain('endDT');
-        });
-
-        it('Expects period will appear in the URL even if startTime and endTime are specified', () => {
-            const result = getGroundwaterServiceURL({
-                siteno: '11112222',
-                parameterCode: '72019',
-                period: 'P45D',
-                startTime: '2020-01-03',
-                endTime: '20202-01-15',
-                format: 'rdb'
-            });
-            expect(result).toContain('sites=11112222');
-            expect(result).toContain('format=rdb');
-            expect(result).toContain('parameterCd=72019');
-            expect(result).toContain('period=P45D');
-            expect(result).not.toContain('startDT');
-            expect(result).not.toContain('endDT');
-        });
-
-        it('Expects startTime and endTime in the URL if period is not specified', () => {
-            const result = getGroundwaterServiceURL({
-                siteno: '11112222',
-                parameterCode: '72019',
-                startTime: '2020-01-03',
-                endTime: '2020-01-15',
-                format: 'rdb'
-            });
-            expect(result).toContain('sites=11112222');
-            expect(result).toContain('format=rdb');
-            expect(result).toContain('parameterCd=72019');
-            expect(result).not.toContain('period');
-            expect(result).toContain('startDT=2020-01-03');
-            expect(result).toContain('endDT=2020-01-15');
+            expect(result).toContain('featureId=USGS-11112222');
+            expect(result).toContain('f=json');
         });
     });
 
     describe('fetchGroundwaterLevels', () => {
         const fetchParameters = {
-            siteno: '354133082042203',
-            parameterCode: '72019',
-            startTime: '2020-01-01',
-            endTime: '2020-11-17'
+            siteno: '413703087230501',
+            agencyCd: 'USGS'
         };
 
         beforeEach(() => {
@@ -98,44 +45,15 @@ describe('web-services/groundwater-levels', () => {
 
             expect(fetch.mock.calls).toHaveLength(1);
             const url = fetch.mock.calls[0][0].url;
-            expect(url).toContain(`sites=${fetchParameters.siteno}`);
-            expect(url).toContain(`parameterCd=${fetchParameters.parameterCode}`);
-            expect(url).not.toContain('period');
-            expect(url).toContain(`startDT=${fetchParameters.startTime}`);
-            expect(url).toContain(`endDT=${fetchParameters.endTime}`);
-            expect(url).toContain('format=json');
-        });
-
-        it('expects period to be in query parameters if no startDT and endDT', () => {
-            fetchGroundwaterLevels({
-                siteno: '354133082042203',
-                parameterCode: '72019',
-                period: 'P7D'
-            });
-            const url = fetch.mock.calls[0][0].url;
-
-            expect(url).toContain('period=P7D');
-            expect(url).not.toContain('startDT');
-            expect(url).not.toContain('endDT');
-        });
-
-        it('expect no time parameters if all are null', () => {
-            fetchGroundwaterLevels({
-                site: '354133082042203',
-                parameterCode: '72019'
-            });
-
-            const url = fetch.mock.calls[0][0].url;
-            expect(url).not.toContain('period');
-            expect(url).not.toContain('startDT');
-            expect(url).not.toContain('endDT');
+            expect(url).toContain(`featureId=${fetchParameters.agencyCd}-${fetchParameters.siteno}`);
+            expect(url).toContain('f=json');
         });
 
         it('Successful fetch returns a JSON object with ground water levels', async() => {
-            fetch.once(MOCK_GWLEVEL_DATA, {status: 200});
+            fetch.once(MOCK_GW_FIELD_VISITS, {status: 200});
             const resp = await fetchGroundwaterLevels(fetchParameters);
 
-            expect(resp).toEqual(JSON.parse(MOCK_GWLEVEL_DATA));
+            expect(resp).toEqual(JSON.parse(MOCK_GW_FIELD_VISITS));
         });
 
         it('Bad fetch returns an empty object', async() => {
diff --git a/wdfn-server/config.py b/wdfn-server/config.py
index c6f71e237e06ce2f8d59d990dd8606eba538fce8..906913e18941aa3bf1b53f8b997cfb4cdb230cd9 100644
--- a/wdfn-server/config.py
+++ b/wdfn-server/config.py
@@ -23,7 +23,7 @@ PUBLIC_SITE_DATA_ENDPOINT = 'https://waterservices.usgs.gov/nwis/site'
 IV_DATA_ENDPOINT = 'https://waterservices.usgs.gov/nwis/iv'
 HISTORICAL_IV_DATA_ENDPOINT = 'https://nwis.waterservices.usgs.gov/nwis/iv'
 STATISTICS_ENDPOINT = 'https://waterservices.usgs.gov/nwis/stat'
-GROUNDWATER_LEVELS_ENDPOINT = 'https://waterservices.usgs.gov/nwis/gwlevels/'
+GROUNDWATER_LEVELS_ENDPOINT = 'https://labs.waterdata.usgs.gov/api/observations/data'
 MONITORING_LOCATIONS_OBSERVATIONS_ENDPOINT = 'https://labs.waterdata.usgs.gov/api/observations/collections/'
 SENSOR_THINGS_ENDPOINT = 'https://labs.waterdata.usgs.gov/sta/v1.1/'
 SIMS_ENDPOINT = ''