diff --git a/CHANGELOG.md b/CHANGELOG.md
index f907cd43ee38310aa52751c20750ccd298f61f80..566b5e91ecaf627c80f2c94599498302fed5b5d5 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,6 +7,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
 ## [Unreleased]
 ### Changed
 - Cursor location / tooltip defaults to last point in the time series.
+- Date labels moved to and centered in areas between midnight tick marks
 
 
 ## [0.7.0] - 2018-04-23
diff --git a/assets/src/scripts/components/hydrograph/axes.js b/assets/src/scripts/components/hydrograph/axes.js
index e6e7d9c096e44b7676866a071fef79aea3a7faab..93a61c27798053f31d4c724dbc736b98e1d9685d 100644
--- a/assets/src/scripts/components/hydrograph/axes.js
+++ b/assets/src/scripts/components/hydrograph/axes.js
@@ -10,6 +10,7 @@ const { layoutSelector } = require('./layout');
 const { xScaleSelector, yScaleSelector } = require('./scales');
 const { currentVariableSelector, yLabelSelector } = require('./timeseries');
 
+const dateFormatter = timeFormat('%b %d');
 
 /**
  * Create an x and y axis for hydrograph
@@ -20,13 +21,28 @@ const { currentVariableSelector, yLabelSelector } = require('./timeseries');
  * @return {Object}             {xAxis, yAxis} - D3 Axis
  */
 export const createAxes = function({xScale, yScale}, yTickSize, parmCd) {
-    // Create x-axis
+    const formatter = function(d) {
+        if(d.getHours() === 12) {
+            return dateFormatter(d);
+        } else {
+            return null;
+        }
+    };
+
+    // Create x-axis with ticks at midnight but no visible date/time labels
     const xAxis = axisBottom()
         .scale(xScale)
         .ticks(timeDay)
-        .tickFormat(timeFormat('%b %d'))
+        .tickFormat('')
         .tickSizeOuter(0);
-
+    // Create a second x-axis. This x-axis will overlay the first x-axis and have labels every 12 hours but no ticks.
+    // Labels not on the 12 hour points are removed with formatting.
+    const xAxisWithDateTimeLabels = axisBottom()
+        .scale(xScale)
+        .ticks(timeDay.hour)
+        .tickPadding(5)
+        .tickSize(0)
+        .tickFormat(formatter);
     // Create y-axis
     const tickDetails = getYTickDetails(yScale.domain(), parmCd);
     const yAxis = axisLeft()
@@ -37,7 +53,7 @@ export const createAxes = function({xScale, yScale}, yTickSize, parmCd) {
         .tickPadding(3)
         .tickSizeOuter(0);
 
-    return {xAxis, yAxis};
+    return {xAxis, xAxisWithDateTimeLabels, yAxis};
 };
 
 
@@ -65,7 +81,7 @@ export const axesSelector = createSelector(
 /**
  * Add x and y axes to the given svg node.
  */
-export const appendAxes = function(elem, {xAxis, yAxis, layout, yTitle}) {
+export const appendAxes = function(elem, {xAxis, xAxisWithDateTimeLabels, yAxis, layout, yTitle}) {
     const xLoc = {
         x: 0,
         y: layout.height - (layout.margin.top + layout.margin.bottom)
@@ -77,7 +93,7 @@ export const appendAxes = function(elem, {xAxis, yAxis, layout, yTitle}) {
     };
 
     // Remove existing axes before adding the new ones.
-    elem.selectAll('.x-axis, .y-axis').remove();
+    elem.selectAll('.x-axis, .x-axis-date-time-label, .y-axis').remove();
 
     // Add x-axis
     elem.append('g')
@@ -85,6 +101,12 @@ export const appendAxes = function(elem, {xAxis, yAxis, layout, yTitle}) {
         .attr('transform', `translate(${xLoc.x}, ${xLoc.y})`)
         .call(xAxis);
 
+    // Add the second x-axis, the one with the centered date/time labels, on top of the first x-axis
+    elem.append('g')
+        .attr('class', 'x-axis-date-time-label')
+        .attr('transform', `translate(${xLoc.x}, ${xLoc.y})`)
+        .call(xAxisWithDateTimeLabels);
+
     // Add y-axis and a text label
     elem.append('g')
         .attr('class', 'y-axis')
diff --git a/assets/src/scripts/components/hydrograph/axes.spec.js b/assets/src/scripts/components/hydrograph/axes.spec.js
index 072a1d0aabc87f1ba75d05fa35a2192de48611a6..29f9a980d85cc9fb5bd728ecefe7f35f07eaa3c0 100644
--- a/assets/src/scripts/components/hydrograph/axes.spec.js
+++ b/assets/src/scripts/components/hydrograph/axes.spec.js
@@ -1,4 +1,4 @@
-const { scaleLinear } = require('d3-scale');
+const { scaleLinear, scaleTime } = require('d3-scale');
 const { select } = require('d3-selection');
 
 const { createAxes, appendAxes } = require('./axes');
@@ -6,7 +6,7 @@ const { createAxes, appendAxes } = require('./axes');
 
 describe('Chart axes', () => {
     // xScale is oriented on the left
-    const xScale = scaleLinear().range([0, 10]).domain([0, 10]);
+    const xScale = scaleTime().range([0, 10]).domain([new Date('2011-10-10'), new Date('2012-10-10')]);
     const yScale = scaleLinear().range([0, 10]).domain([0, 10]);
     const layout = {
         width: 400,
@@ -18,13 +18,14 @@ describe('Chart axes', () => {
             left: 65
         }
     };
-    const {xAxis, yAxis} = createAxes({xScale, yScale}, 100);
+    const {xAxis, xAxisWithDateTimeLabels, yAxis} = createAxes({xScale, yScale}, 100);
     let svg;
 
     beforeEach(() => {
         svg = select(document.body).append('svg');
         appendAxes(svg, {
             xAxis,
+            xAxisWithDateTimeLabels,
             yAxis,
             layout,
             yTitle: 'Label title'
@@ -37,6 +38,7 @@ describe('Chart axes', () => {
 
     it('axes created', () => {
         expect(xAxis).toEqual(jasmine.any(Function));
+        expect(xAxisWithDateTimeLabels).toEqual(jasmine.any(Function));
         expect(yAxis).toEqual(jasmine.any(Function));
         expect(yAxis.tickSizeInner()).toBe(100);
         expect(xAxis.scale()).toBe(xScale);
diff --git a/assets/src/styles/_common.scss b/assets/src/styles/_common.scss
new file mode 100644
index 0000000000000000000000000000000000000000..4b8b8fd0b745fb7618cfa0722b230e879781f7d3
--- /dev/null
+++ b/assets/src/styles/_common.scss
@@ -0,0 +1,13 @@
+$font-path: './fonts';
+$image-path: './img';
+
+// Layout
+// NOTE: If you change this, also change DESKTOP_BREAKPOINT_PX in layout.js!
+$desktop-screen: 800px !default;
+
+// Override default of 4rem
+$h1-font-size: 3.25rem !default;
+
+@import 'uswds';
+
+$usgs-blue: #00264c;
diff --git a/assets/src/styles/components/_hydrograph.scss b/assets/src/styles/components/hydrograph/_app.scss
similarity index 98%
rename from assets/src/styles/components/_hydrograph.scss
rename to assets/src/styles/components/hydrograph/_app.scss
index 4e7a2571e14183bcf700919c81deb02516c76c51..6cb9d1e3f16992ca0f3a927c669bfe86ab13e70f 100644
--- a/assets/src/styles/components/_hydrograph.scss
+++ b/assets/src/styles/components/hydrograph/_app.scss
@@ -1,8 +1,8 @@
-$approved-timeseries: #2db92d;
-$estimated-timeseries: black;
-$default-timeseries: blue;
-$selected: $color-aqua-lightest;
-$highlight: $color-gray-lightest;
+/**
+ * Hydrograph component SCSS to be used in front-end application.
+ */
+
+@import './graph';
 
 #select-timeseries  {
     label {
diff --git a/assets/src/styles/components/hydrograph/_graph.scss b/assets/src/styles/components/hydrograph/_graph.scss
new file mode 100644
index 0000000000000000000000000000000000000000..22b34ee3739c800ba10a1ba87fd5f4f5afca0a51
--- /dev/null
+++ b/assets/src/styles/components/hydrograph/_graph.scss
@@ -0,0 +1,154 @@
+/**
+ * Hydrograph component SCSS to be used directly by graph-server, and imported
+ * by the client-side app.
+ */
+
+$approved-timeseries: #2db92d;
+$estimated-timeseries: black;
+$default-timeseries: blue;
+$selected: $color-aqua-lightest;
+$highlight: $color-gray-lightest;
+
+svg.hydrograph-svg {
+    .overlay {
+        fill: none;
+        pointer-events: all;
+    }
+    circle.focus {
+        fill: #436BAF;
+        opacity: .6;
+    }
+    .focus {
+        line {
+            opacity: .5;
+            stroke: #436BAF;
+            stroke-width: 1px;
+            stroke-dasharray: 5, 5
+        }
+    }
+    .line-segment {
+        fill: none;
+        stroke-width: 3px;
+        stroke: $default-timeseries;
+        &.approved {
+            stroke: $approved-timeseries;
+        }
+        &.estimated {
+            stroke: $estimated-timeseries;
+            stroke-dasharray: 1, 3;
+        }
+    }
+    .ts-compare {
+        stroke-width: 1px;
+    }
+    .axis {
+        path {
+            fill: none;
+        }
+    }
+    .tick {
+        text {
+            font-size: 1.05em;
+            @include media($small-screen) {
+                font-size: 1.2em;
+            }
+            @include media($medium-screen) {
+                font-size: 1.4em;
+            }
+        }
+    }
+    .y-axis {
+        text {
+            fill: black;
+            &.y-axis-label {
+                text-anchor: middle;
+                display: none;
+                font-size: 1.5em;
+                font-style: italic;
+                @include media($site-max-width) {
+                    display: block;
+                }
+            }
+        }
+        .tick {
+            line {
+                fill: none;
+                stroke: lightgrey;
+                stroke-opacity: 0.7;
+            }
+        }
+    }
+    .x-axis {
+        .tick {
+            line {
+                fill: none;
+                stroke: black;
+                stroke-opacity: 0.7;
+            }
+        }
+    }
+    #median-points {
+        .median-data-series {
+            cursor: pointer;
+        }
+    }
+    .median-data-series {
+        &.median-modulo-0 {
+            fill: #f96713;
+        }
+        &.median-modulo-1 {
+            fill: #0c7d40;
+        }
+        &.median-modulo-2 {
+            fill: #0557fc;
+        }
+        &.median-modulo-3 {
+            fill: #f4f727;
+        }
+        &.median-modulo-4 {
+            fill: #01fab6;
+        }
+        &.median-modulo-5 {
+            fill: #9a9b77;
+        }
+    }
+    .mask {
+        opacity: 0.2;
+    }
+    .ice-affected-mask {
+        fill: #33daff;
+    }
+    .flood-mask {
+        fill: #0c7d40;
+    }
+    .zeroflow-mask {
+        fill: #f4f727;
+    }
+    .dry-mask {
+        fill: #9a9b77;
+    }
+    .seasonal-mask {
+        fill: #17fc04;
+    }
+    .partial-record-mask {
+        fill: #ec14fe;
+    }
+    .rating-development-mask {
+        fill: #fe141b;
+    }
+    .equipment-malfunction-mask {
+        fill: #0557fc;
+    }
+    .maintenance-mask {
+        fill: #01fab6;
+    }
+    .unavailable-mask {
+        fill: #abb2b9;
+    }
+    .test-mask {
+        fill: #4729a5;
+    }
+    .pump-mask {
+        fill: #3498db;
+    }
+}
diff --git a/assets/src/styles/graph.scss b/assets/src/styles/graph.scss
new file mode 100644
index 0000000000000000000000000000000000000000..49d9c463c19908c30bee4c24d380a32c3e9ed46f
--- /dev/null
+++ b/assets/src/styles/graph.scss
@@ -0,0 +1,2 @@
+@import './common';
+@import './components/hydrograph/graph';
diff --git a/assets/src/styles/main.scss b/assets/src/styles/main.scss
index f078ea28858d13e20e3d47522e38d506017b22a8..7c837d81ffe271267b840a2d080ad7891565a225 100644
--- a/assets/src/styles/main.scss
+++ b/assets/src/styles/main.scss
@@ -1,20 +1,9 @@
 @import 'leaflet';
 
-$font-path: './fonts';
-$image-path: './img';
-$fa-font-path: './fonts' !default;
-
-// Layout
-// NOTE: If you change this, also change DESKTOP_BREAKPOINT_PX in layout.js!
-$desktop-screen: 800px !default;
-
-// Override default of 4rem
-$h1-font-size: 3.25rem !default;
+@import './common';
 
+$fa-font-path: './fonts' !default;
 @import '../../../node_modules/font-awesome/scss/font-awesome';
-@import 'uswds';
-
-$usgs-blue: #00264c;
 
 @import './partials/footer';
 @import './partials/header';
@@ -25,7 +14,7 @@ $usgs-blue: #00264c;
 
 .wdfn-component {
     &[data-component='hydrograph'] {
-        @import './components/hydrograph';
+        @import './components/hydrograph/app';
     }
     &[data-component='map'] {
         @import './components/map';
diff --git a/package-lock.json b/package-lock.json
index cf76317b322096a09d9094a0b82be4a1e3ae937c..6c27b7c8fe3cf4c868b2d39b6395d09d3b0694a9 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,6 +1,6 @@
 {
   "name": "waterdataui-assets",
-  "version": "0.7.0dev",
+  "version": "0.8.0dev",
   "lockfileVersion": 1,
   "requires": true,
   "dependencies": {
@@ -451,8 +451,7 @@
     "async-limiter": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz",
-      "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==",
-      "dev": true
+      "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg=="
     },
     "asynckit": {
       "version": "0.4.0",
@@ -2258,6 +2257,7 @@
       "requires": {
         "anymatch": "1.3.2",
         "async-each": "1.0.1",
+        "fsevents": "1.2.2",
         "glob-parent": "2.0.0",
         "inherits": "2.0.3",
         "is-binary-path": "1.0.1",
@@ -3146,7 +3146,6 @@
       "version": "2.6.9",
       "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
       "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-      "dev": true,
       "requires": {
         "ms": "2.0.0"
       }
@@ -3706,6 +3705,19 @@
         "event-emitter": "0.3.5"
       }
     },
+    "es6-promise": {
+      "version": "4.2.4",
+      "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz",
+      "integrity": "sha512-/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ=="
+    },
+    "es6-promisify": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz",
+      "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=",
+      "requires": {
+        "es6-promise": "4.2.4"
+      }
+    },
     "es6-set": {
       "version": "0.1.5",
       "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz",
@@ -4270,6 +4282,42 @@
         "is-extglob": "1.0.0"
       }
     },
+    "extract-zip": {
+      "version": "1.6.6",
+      "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.6.tgz",
+      "integrity": "sha1-EpDt6NINCHK0Kf0/NRyhKOxe+Fw=",
+      "requires": {
+        "concat-stream": "1.6.0",
+        "debug": "2.6.9",
+        "mkdirp": "0.5.0",
+        "yauzl": "2.4.1"
+      },
+      "dependencies": {
+        "concat-stream": {
+          "version": "1.6.0",
+          "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz",
+          "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=",
+          "requires": {
+            "inherits": "2.0.3",
+            "readable-stream": "2.3.5",
+            "typedarray": "0.0.6"
+          }
+        },
+        "minimist": {
+          "version": "0.0.8",
+          "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
+          "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
+        },
+        "mkdirp": {
+          "version": "0.5.0",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz",
+          "integrity": "sha1-HXMHam35hs2TROFecfzAWkyavxI=",
+          "requires": {
+            "minimist": "0.0.8"
+          }
+        }
+      }
+    },
     "extsprintf": {
       "version": "1.3.0",
       "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
@@ -4345,6 +4393,14 @@
         "websocket-driver": "0.7.0"
       }
     },
+    "fd-slicer": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz",
+      "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=",
+      "requires": {
+        "pend": "1.2.0"
+      }
+    },
     "figures": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
@@ -4910,6 +4966,535 @@
       "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
       "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
     },
+    "fsevents": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.2.tgz",
+      "integrity": "sha512-iownA+hC4uHFp+7gwP/y5SzaiUo7m2vpa0dhpzw8YuKtiZsz7cIXsFbXpLEeBM6WuCQyw1MH4RRe6XI8GFUctQ==",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "nan": "2.9.2",
+        "node-pre-gyp": "0.9.1"
+      },
+      "dependencies": {
+        "abbrev": {
+          "version": "1.1.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "ansi-regex": {
+          "version": "2.1.1",
+          "bundled": true,
+          "dev": true
+        },
+        "aproba": {
+          "version": "1.2.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "are-we-there-yet": {
+          "version": "1.1.4",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "delegates": "1.0.0",
+            "readable-stream": "2.3.6"
+          }
+        },
+        "balanced-match": {
+          "version": "1.0.0",
+          "bundled": true,
+          "dev": true
+        },
+        "brace-expansion": {
+          "version": "1.1.11",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "balanced-match": "1.0.0",
+            "concat-map": "0.0.1"
+          }
+        },
+        "chownr": {
+          "version": "1.0.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "code-point-at": {
+          "version": "1.1.0",
+          "bundled": true,
+          "dev": true
+        },
+        "concat-map": {
+          "version": "0.0.1",
+          "bundled": true,
+          "dev": true
+        },
+        "console-control-strings": {
+          "version": "1.1.0",
+          "bundled": true,
+          "dev": true
+        },
+        "core-util-is": {
+          "version": "1.0.2",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "debug": {
+          "version": "2.6.9",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "deep-extend": {
+          "version": "0.4.2",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "delegates": {
+          "version": "1.0.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "detect-libc": {
+          "version": "1.0.3",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "fs-minipass": {
+          "version": "1.2.5",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "minipass": "2.2.4"
+          }
+        },
+        "fs.realpath": {
+          "version": "1.0.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "gauge": {
+          "version": "2.7.4",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "aproba": "1.2.0",
+            "console-control-strings": "1.1.0",
+            "has-unicode": "2.0.1",
+            "object-assign": "4.1.1",
+            "signal-exit": "3.0.2",
+            "string-width": "1.0.2",
+            "strip-ansi": "3.0.1",
+            "wide-align": "1.1.2"
+          }
+        },
+        "glob": {
+          "version": "7.1.2",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "fs.realpath": "1.0.0",
+            "inflight": "1.0.6",
+            "inherits": "2.0.3",
+            "minimatch": "3.0.4",
+            "once": "1.4.0",
+            "path-is-absolute": "1.0.1"
+          }
+        },
+        "has-unicode": {
+          "version": "2.0.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "iconv-lite": {
+          "version": "0.4.21",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "safer-buffer": "2.1.2"
+          }
+        },
+        "ignore-walk": {
+          "version": "3.0.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "minimatch": "3.0.4"
+          }
+        },
+        "inflight": {
+          "version": "1.0.6",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "once": "1.4.0",
+            "wrappy": "1.0.2"
+          }
+        },
+        "inherits": {
+          "version": "2.0.3",
+          "bundled": true,
+          "dev": true
+        },
+        "ini": {
+          "version": "1.3.5",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "is-fullwidth-code-point": {
+          "version": "1.0.0",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "number-is-nan": "1.0.1"
+          }
+        },
+        "isarray": {
+          "version": "1.0.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "minimatch": {
+          "version": "3.0.4",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "brace-expansion": "1.1.11"
+          }
+        },
+        "minimist": {
+          "version": "0.0.8",
+          "bundled": true,
+          "dev": true
+        },
+        "minipass": {
+          "version": "2.2.4",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "safe-buffer": "5.1.1",
+            "yallist": "3.0.2"
+          }
+        },
+        "minizlib": {
+          "version": "1.1.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "minipass": "2.2.4"
+          }
+        },
+        "mkdirp": {
+          "version": "0.5.1",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "minimist": "0.0.8"
+          }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "needle": {
+          "version": "2.2.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "debug": "2.6.9",
+            "iconv-lite": "0.4.21",
+            "sax": "1.2.4"
+          }
+        },
+        "node-pre-gyp": {
+          "version": "0.9.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "detect-libc": "1.0.3",
+            "mkdirp": "0.5.1",
+            "needle": "2.2.0",
+            "nopt": "4.0.1",
+            "npm-packlist": "1.1.10",
+            "npmlog": "4.1.2",
+            "rc": "1.2.6",
+            "rimraf": "2.6.2",
+            "semver": "5.5.0",
+            "tar": "4.4.1"
+          }
+        },
+        "nopt": {
+          "version": "4.0.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "abbrev": "1.1.1",
+            "osenv": "0.1.5"
+          }
+        },
+        "npm-bundled": {
+          "version": "1.0.3",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "npm-packlist": {
+          "version": "1.1.10",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "ignore-walk": "3.0.1",
+            "npm-bundled": "1.0.3"
+          }
+        },
+        "npmlog": {
+          "version": "4.1.2",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "are-we-there-yet": "1.1.4",
+            "console-control-strings": "1.1.0",
+            "gauge": "2.7.4",
+            "set-blocking": "2.0.0"
+          }
+        },
+        "number-is-nan": {
+          "version": "1.0.1",
+          "bundled": true,
+          "dev": true
+        },
+        "object-assign": {
+          "version": "4.1.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "once": {
+          "version": "1.4.0",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "wrappy": "1.0.2"
+          }
+        },
+        "os-homedir": {
+          "version": "1.0.2",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "os-tmpdir": {
+          "version": "1.0.2",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "osenv": {
+          "version": "0.1.5",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "os-homedir": "1.0.2",
+            "os-tmpdir": "1.0.2"
+          }
+        },
+        "path-is-absolute": {
+          "version": "1.0.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "process-nextick-args": {
+          "version": "2.0.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "rc": {
+          "version": "1.2.6",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "deep-extend": "0.4.2",
+            "ini": "1.3.5",
+            "minimist": "1.2.0",
+            "strip-json-comments": "2.0.1"
+          },
+          "dependencies": {
+            "minimist": {
+              "version": "1.2.0",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            }
+          }
+        },
+        "readable-stream": {
+          "version": "2.3.6",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "core-util-is": "1.0.2",
+            "inherits": "2.0.3",
+            "isarray": "1.0.0",
+            "process-nextick-args": "2.0.0",
+            "safe-buffer": "5.1.1",
+            "string_decoder": "1.1.1",
+            "util-deprecate": "1.0.2"
+          }
+        },
+        "rimraf": {
+          "version": "2.6.2",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "glob": "7.1.2"
+          }
+        },
+        "safe-buffer": {
+          "version": "5.1.1",
+          "bundled": true,
+          "dev": true
+        },
+        "safer-buffer": {
+          "version": "2.1.2",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "sax": {
+          "version": "1.2.4",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "semver": {
+          "version": "5.5.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "set-blocking": {
+          "version": "2.0.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "signal-exit": {
+          "version": "3.0.2",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "string-width": {
+          "version": "1.0.2",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "code-point-at": "1.1.0",
+            "is-fullwidth-code-point": "1.0.0",
+            "strip-ansi": "3.0.1"
+          }
+        },
+        "string_decoder": {
+          "version": "1.1.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "safe-buffer": "5.1.1"
+          }
+        },
+        "strip-ansi": {
+          "version": "3.0.1",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "ansi-regex": "2.1.1"
+          }
+        },
+        "strip-json-comments": {
+          "version": "2.0.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "tar": {
+          "version": "4.4.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "chownr": "1.0.1",
+            "fs-minipass": "1.2.5",
+            "minipass": "2.2.4",
+            "minizlib": "1.1.0",
+            "mkdirp": "0.5.1",
+            "safe-buffer": "5.1.1",
+            "yallist": "3.0.2"
+          }
+        },
+        "util-deprecate": {
+          "version": "1.0.2",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "wide-align": {
+          "version": "1.1.2",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "string-width": "1.0.2"
+          }
+        },
+        "wrappy": {
+          "version": "1.0.2",
+          "bundled": true,
+          "dev": true
+        },
+        "yallist": {
+          "version": "3.0.2",
+          "bundled": true,
+          "dev": true
+        }
+      }
+    },
     "fstream": {
       "version": "1.0.11",
       "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz",
@@ -8441,8 +9026,7 @@
     "mime": {
       "version": "1.6.0",
       "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
-      "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
-      "dev": true
+      "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
     },
     "mime-db": {
       "version": "1.33.0",
@@ -8624,8 +9208,7 @@
     "ms": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
-      "dev": true
+      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
     },
     "multi-stage-sourcemap": {
       "version": "0.2.1",
@@ -9172,6 +9755,7 @@
             "anymatch": "2.0.0",
             "async-each": "1.0.1",
             "braces": "2.3.1",
+            "fsevents": "1.2.2",
             "glob-parent": "3.1.0",
             "inherits": "2.0.3",
             "is-binary-path": "1.0.1",
@@ -10293,6 +10877,11 @@
         "sha.js": "2.4.10"
       }
     },
+    "pend": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
+      "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA="
+    },
     "performance-now": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
@@ -10502,6 +11091,7 @@
             "anymatch": "2.0.0",
             "async-each": "1.0.1",
             "braces": "2.3.1",
+            "fsevents": "1.2.2",
             "glob-parent": "3.1.0",
             "inherits": "2.0.3",
             "is-binary-path": "1.0.1",
@@ -10982,8 +11572,7 @@
     "progress": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz",
-      "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=",
-      "dev": true
+      "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8="
     },
     "proxy-agent": {
       "version": "2.0.0",
@@ -11011,6 +11600,11 @@
         }
       }
     },
+    "proxy-from-env": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz",
+      "integrity": "sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4="
+    },
     "proxy-middleware": {
       "version": "0.15.0",
       "resolved": "https://registry.npmjs.org/proxy-middleware/-/proxy-middleware-0.15.0.tgz",
@@ -11104,6 +11698,50 @@
       "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
       "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4="
     },
+    "puppeteer": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-1.3.0.tgz",
+      "integrity": "sha512-wx10aPQPpGJVxdB6yoDSLm9p4rCwARUSLMVV0bx++owuqkvviXKyiFM3EWsywaFmjOKNPXacIjplF7xhHiFP3w==",
+      "requires": {
+        "debug": "2.6.9",
+        "extract-zip": "1.6.6",
+        "https-proxy-agent": "2.2.1",
+        "mime": "1.6.0",
+        "progress": "2.0.0",
+        "proxy-from-env": "1.0.0",
+        "rimraf": "2.6.2",
+        "ws": "3.3.3"
+      },
+      "dependencies": {
+        "agent-base": {
+          "version": "4.2.0",
+          "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.0.tgz",
+          "integrity": "sha512-c+R/U5X+2zz2+UCrCFv6odQzJdoqI+YecuhnAJLa1zYaMc13zPfwMwZrr91Pd1DYNo/yPRbiM4WVf9whgwFsIg==",
+          "requires": {
+            "es6-promisify": "5.0.0"
+          }
+        },
+        "https-proxy-agent": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz",
+          "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==",
+          "requires": {
+            "agent-base": "4.2.0",
+            "debug": "3.1.0"
+          },
+          "dependencies": {
+            "debug": {
+              "version": "3.1.0",
+              "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+              "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+              "requires": {
+                "ms": "2.0.0"
+              }
+            }
+          }
+        }
+      }
+    },
     "q": {
       "version": "1.4.1",
       "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz",
@@ -11635,7 +12273,6 @@
       "version": "2.6.2",
       "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
       "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
-      "dev": true,
       "requires": {
         "glob": "7.1.2"
       }
@@ -13197,8 +13834,7 @@
     "ultron": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz",
-      "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==",
-      "dev": true
+      "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og=="
     },
     "umd": {
       "version": "3.0.2",
@@ -13959,7 +14595,6 @@
       "version": "3.3.3",
       "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz",
       "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==",
-      "dev": true,
       "requires": {
         "async-limiter": "1.0.0",
         "safe-buffer": "5.1.1",
@@ -14033,6 +14668,14 @@
         "camelcase": "4.1.0"
       }
     },
+    "yauzl": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz",
+      "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=",
+      "requires": {
+        "fd-slicer": "1.0.1"
+      }
+    },
     "yeast": {
       "version": "0.1.2",
       "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz",
diff --git a/package.json b/package.json
index 864121c3e8394f419c660cb827e7e4de2d8b750e..ee7eb426d711fc7769d8abb4181d99db775a8d79 100644
--- a/package.json
+++ b/package.json
@@ -10,7 +10,9 @@
     "test:watch": "karma start --debug --no-single-run --auto-watch --browsers Chrome",
     "clean": "rm -rf assets/dist && mkdir assets/dist",
     "build": "npm run clean && run-p build:* && npm run hash-assets",
-    "build:css": "node-sass --include-path node_modules/leaflet/dist --include-path node_modules/uswds/src/stylesheets assets/src/styles/main.scss assets/dist/main.css && uglifycss --output assets/dist/main.css assets/dist/main.css && postcss assets/dist/main.css --no-map --use autoprefixer -o assets/dist/main.css",
+    "build:css": "run-p build:css:*",
+    "build:css:main": "node-sass --include-path node_modules/leaflet/dist --include-path node_modules/uswds/src/stylesheets assets/src/styles/main.scss assets/dist/main.css && uglifycss --output assets/dist/main.css assets/dist/main.css && postcss assets/dist/main.css --no-map --use autoprefixer -o assets/dist/main.css",
+    "build:css:graph": "node-sass --include-path node_modules/uswds/src/stylesheets assets/src/styles/graph.scss assets/dist/graph.css && uglifycss --output assets/dist/graph.css assets/dist/graph.css && postcss assets/dist/graph.css --no-map --use autoprefixer -o assets/dist/graph.css",
     "build:fonts": "mkdir -p assets/dist/fonts && cp node_modules/uswds/src/fonts/* assets/dist/fonts && cp node_modules/font-awesome/fonts/* assets/dist/fonts",
     "build:images": "mkdir -p assets/dist/img && mkdir -p assets/dist/images && cp -r node_modules/uswds/src/img/* assets/dist/img && cp -r node_modules/leaflet/dist/images/* assets/dist/images && cp -r assets/src/img/* assets/dist/img",
     "build:js": "browserify -p tinyify assets/src/scripts/index.js > assets/dist/bundle.js && uglifyjs -c drop_console=true --output assets/dist/bundle.js assets/dist/bundle.js",