diff --git a/CHANGELOG.md b/CHANGELOG.md
index 9319c775e7eccc44ec2b78ed1cfb2993ce055afe..2a8dee99d3b04d608270abd2b5959220791a0ccb 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,7 +1,18 @@
 ## v0.10.1 [unreleased]
 
+### Release Notes:
+
+- Telegraf now keeps a fixed-length buffer of metrics per-output. This buffer
+defaults to 10,000 metrics, and is adjustable. The buffer is cleared when a
+successful write to that output occurs.
+- The docker plugin has been significantly overhauled to add more metrics
+and allow for docker-machine (incl OSX) support.
+[See the readme](https://github.com/influxdata/telegraf/blob/master/plugins/inputs/docker/README.md)
+for the latest measurements, fields, and tags. There is also now support for
+specifying a docker endpoint to get metrics from.
+
 ### Features
-- [#509](https://github.com/influxdb/telegraf/pull/509): Flatten JSON arrays with indices. Thanks @psilva261!
+- [#509](https://github.com/influxdata/telegraf/pull/509): Flatten JSON arrays with indices. Thanks @psilva261!
 - [#512](https://github.com/influxdata/telegraf/pull/512): Python 3 build script, add lsof dep to package. Thanks @Ormod!
 - [#475](https://github.com/influxdata/telegraf/pull/475): Add response time to httpjson plugin. Thanks @titilambert!
 - [#519](https://github.com/influxdata/telegraf/pull/519): Added a sensors input based on lm-sensors. Thanks @md14454!
@@ -12,14 +23,22 @@
 - [#539](https://github.com/influxdata/telegraf/pull/539): Reload config on SIGHUP. Thanks @titilambert!
 - [#522](https://github.com/influxdata/telegraf/pull/522): Phusion passenger input plugin. Thanks @kureikain!
 - [#541](https://github.com/influxdata/telegraf/pull/541): Kafka output TLS cert support. Thanks @Ormod!
-- [#551](https://github.com/influxdb/telegraf/pull/551): Statsd UDP read packet size now defaults to 1500 bytes, and is configurable.
+- [#551](https://github.com/influxdata/telegraf/pull/551): Statsd UDP read packet size now defaults to 1500 bytes, and is configurable.
 - [#552](https://github.com/influxdata/telegraf/pull/552): Support for collection interval jittering.
+- [#484](https://github.com/influxdata/telegraf/issues/484): Include usage percent with procstat metrics.
+- [#553](https://github.com/influxdata/telegraf/pull/553): Amazon CloudWatch output. thanks @skwong2!
+- [#503](https://github.com/influxdata/telegraf/pull/503): Support docker endpoint configuration.
+- [#563](https://github.com/influxdata/telegraf/pull/563): Docker plugin overhaul.
+- [#285](https://github.com/influxdata/telegraf/issues/285): Fixed-size buffer of points.
 
 ### Bugfixes
-- [#506](https://github.com/influxdb/telegraf/pull/506): Ping input doesn't return response time metric when timeout. Thanks @titilambert!
-- [#508](https://github.com/influxdb/telegraf/pull/508): Fix prometheus cardinality issue with the `net` plugin
+- [#506](https://github.com/influxdata/telegraf/pull/506): Ping input doesn't return response time metric when timeout. Thanks @titilambert!
+- [#508](https://github.com/influxdata/telegraf/pull/508): Fix prometheus cardinality issue with the `net` plugin
 - [#499](https://github.com/influxdata/telegraf/issues/499) & [#502](https://github.com/influxdata/telegraf/issues/502): php fpm unix socket and other fixes, thanks @kureikain!
-- [#543](https://github.com/influxdb/telegraf/issues/543): Statsd Packet size sometimes truncated.
+- [#543](https://github.com/influxdata/telegraf/issues/543): Statsd Packet size sometimes truncated.
+- [#440](https://github.com/influxdata/telegraf/issues/440): Don't query filtered devices for disk stats.
+- [#463](https://github.com/influxdata/telegraf/issues/463): Docker plugin not working on AWS Linux
+- [#568](https://github.com/influxdata/telegraf/issues/568): Multiple output race condition.
 
 ## v0.10.0 [2016-01-12]
 
@@ -62,29 +81,29 @@ configurations overwritten by the upgrade. There is a backup stored at
 ## v0.2.5 [unreleased]
 
 ### Features
-- [#427](https://github.com/influxdb/telegraf/pull/427): zfs plugin: pool stats added. Thanks @allenpetersen!
-- [#428](https://github.com/influxdb/telegraf/pull/428): Amazon Kinesis output. Thanks @jimmystewpot!
-- [#449](https://github.com/influxdb/telegraf/pull/449): influxdb plugin, thanks @mark-rushakoff
+- [#427](https://github.com/influxdata/telegraf/pull/427): zfs plugin: pool stats added. Thanks @allenpetersen!
+- [#428](https://github.com/influxdata/telegraf/pull/428): Amazon Kinesis output. Thanks @jimmystewpot!
+- [#449](https://github.com/influxdata/telegraf/pull/449): influxdb plugin, thanks @mark-rushakoff
 
 ### Bugfixes
-- [#430](https://github.com/influxdb/telegraf/issues/430): Network statistics removed in elasticsearch 2.1. Thanks @jipperinbham!
-- [#452](https://github.com/influxdb/telegraf/issues/452): Elasticsearch open file handles error. Thanks @jipperinbham!
+- [#430](https://github.com/influxdata/telegraf/issues/430): Network statistics removed in elasticsearch 2.1. Thanks @jipperinbham!
+- [#452](https://github.com/influxdata/telegraf/issues/452): Elasticsearch open file handles error. Thanks @jipperinbham!
 
 ## v0.2.4 [2015-12-08]
 
 ### Features
-- [#412](https://github.com/influxdb/telegraf/pull/412): Additional memcached stats. Thanks @mgresser!
-- [#410](https://github.com/influxdb/telegraf/pull/410): Additional redis metrics. Thanks @vlaadbrain!
-- [#414](https://github.com/influxdb/telegraf/issues/414): Jolokia plugin auth parameters
-- [#415](https://github.com/influxdb/telegraf/issues/415): memcached plugin: support unix sockets
-- [#418](https://github.com/influxdb/telegraf/pull/418): memcached plugin additional unit tests.
-- [#408](https://github.com/influxdb/telegraf/pull/408): MailChimp plugin.
-- [#382](https://github.com/influxdb/telegraf/pull/382): Add system wide network protocol stats to `net` plugin.
-- [#401](https://github.com/influxdb/telegraf/pull/401): Support pass/drop/tagpass/tagdrop for outputs. Thanks @oldmantaiter!
+- [#412](https://github.com/influxdata/telegraf/pull/412): Additional memcached stats. Thanks @mgresser!
+- [#410](https://github.com/influxdata/telegraf/pull/410): Additional redis metrics. Thanks @vlaadbrain!
+- [#414](https://github.com/influxdata/telegraf/issues/414): Jolokia plugin auth parameters
+- [#415](https://github.com/influxdata/telegraf/issues/415): memcached plugin: support unix sockets
+- [#418](https://github.com/influxdata/telegraf/pull/418): memcached plugin additional unit tests.
+- [#408](https://github.com/influxdata/telegraf/pull/408): MailChimp plugin.
+- [#382](https://github.com/influxdata/telegraf/pull/382): Add system wide network protocol stats to `net` plugin.
+- [#401](https://github.com/influxdata/telegraf/pull/401): Support pass/drop/tagpass/tagdrop for outputs. Thanks @oldmantaiter!
 
 ### Bugfixes
-- [#405](https://github.com/influxdb/telegraf/issues/405): Prometheus output cardinality issue
-- [#388](https://github.com/influxdb/telegraf/issues/388): Fix collection hangup when cpu times decrement.
+- [#405](https://github.com/influxdata/telegraf/issues/405): Prometheus output cardinality issue
+- [#388](https://github.com/influxdata/telegraf/issues/388): Fix collection hangup when cpu times decrement.
 
 ## v0.2.3 [2015-11-30]
 
@@ -113,15 +132,15 @@ same type can be specified, like this:
 - Aerospike plugin: tag changed from `host` -> `aerospike_host`
 
 ### Features
-- [#379](https://github.com/influxdb/telegraf/pull/379): Riemann output, thanks @allenj!
-- [#375](https://github.com/influxdb/telegraf/pull/375): kafka_consumer service plugin.
-- [#392](https://github.com/influxdb/telegraf/pull/392): Procstat plugin can now accept pgrep -f pattern, thanks @ecarreras!
-- [#383](https://github.com/influxdb/telegraf/pull/383): Specify plugins as a list.
-- [#354](https://github.com/influxdb/telegraf/pull/354): Add ability to specify multiple metrics in one statsd line. Thanks @MerlinDMC!
+- [#379](https://github.com/influxdata/telegraf/pull/379): Riemann output, thanks @allenj!
+- [#375](https://github.com/influxdata/telegraf/pull/375): kafka_consumer service plugin.
+- [#392](https://github.com/influxdata/telegraf/pull/392): Procstat plugin can now accept pgrep -f pattern, thanks @ecarreras!
+- [#383](https://github.com/influxdata/telegraf/pull/383): Specify plugins as a list.
+- [#354](https://github.com/influxdata/telegraf/pull/354): Add ability to specify multiple metrics in one statsd line. Thanks @MerlinDMC!
 
 ### Bugfixes
-- [#371](https://github.com/influxdb/telegraf/issues/371): Kafka consumer plugin not functioning.
-- [#389](https://github.com/influxdb/telegraf/issues/389): NaN value panic
+- [#371](https://github.com/influxdata/telegraf/issues/371): Kafka consumer plugin not functioning.
+- [#389](https://github.com/influxdata/telegraf/issues/389): NaN value panic
 
 ## v0.2.2 [2015-11-18]
 
@@ -130,7 +149,7 @@ same type can be specified, like this:
 lists of servers/URLs. 0.2.2 is being released solely to fix that bug
 
 ### Bugfixes
-- [#377](https://github.com/influxdb/telegraf/pull/377): Fix for duplicate slices in inputs.
+- [#377](https://github.com/influxdata/telegraf/pull/377): Fix for duplicate slices in inputs.
 
 ## v0.2.1 [2015-11-16]
 
@@ -147,22 +166,22 @@ changed to just run docker commands in the Makefile. See `make docker-run` and
 same type.
 
 ### Features
-- [#325](https://github.com/influxdb/telegraf/pull/325): NSQ output. Thanks @jrxFive!
-- [#318](https://github.com/influxdb/telegraf/pull/318): Prometheus output. Thanks @oldmantaiter!
-- [#338](https://github.com/influxdb/telegraf/pull/338): Restart Telegraf on package upgrade. Thanks @linsomniac!
-- [#337](https://github.com/influxdb/telegraf/pull/337): Jolokia plugin, thanks @saiello!
-- [#350](https://github.com/influxdb/telegraf/pull/350): Amon output.
-- [#365](https://github.com/influxdb/telegraf/pull/365): Twemproxy plugin by @codeb2cc
-- [#317](https://github.com/influxdb/telegraf/issues/317): ZFS plugin, thanks @cornerot!
-- [#364](https://github.com/influxdb/telegraf/pull/364): Support InfluxDB UDP output.
-- [#370](https://github.com/influxdb/telegraf/pull/370): Support specifying multiple outputs, as lists.
-- [#372](https://github.com/influxdb/telegraf/pull/372): Remove gosigar and update go-dockerclient for FreeBSD support. Thanks @MerlinDMC!
+- [#325](https://github.com/influxdata/telegraf/pull/325): NSQ output. Thanks @jrxFive!
+- [#318](https://github.com/influxdata/telegraf/pull/318): Prometheus output. Thanks @oldmantaiter!
+- [#338](https://github.com/influxdata/telegraf/pull/338): Restart Telegraf on package upgrade. Thanks @linsomniac!
+- [#337](https://github.com/influxdata/telegraf/pull/337): Jolokia plugin, thanks @saiello!
+- [#350](https://github.com/influxdata/telegraf/pull/350): Amon output.
+- [#365](https://github.com/influxdata/telegraf/pull/365): Twemproxy plugin by @codeb2cc
+- [#317](https://github.com/influxdata/telegraf/issues/317): ZFS plugin, thanks @cornerot!
+- [#364](https://github.com/influxdata/telegraf/pull/364): Support InfluxDB UDP output.
+- [#370](https://github.com/influxdata/telegraf/pull/370): Support specifying multiple outputs, as lists.
+- [#372](https://github.com/influxdata/telegraf/pull/372): Remove gosigar and update go-dockerclient for FreeBSD support. Thanks @MerlinDMC!
 
 ### Bugfixes
-- [#331](https://github.com/influxdb/telegraf/pull/331): Dont overwrite host tag in redis plugin.
-- [#336](https://github.com/influxdb/telegraf/pull/336): Mongodb plugin should take 2 measurements.
-- [#351](https://github.com/influxdb/telegraf/issues/317): Fix continual "CREATE DATABASE" in writes
-- [#360](https://github.com/influxdb/telegraf/pull/360): Apply prefix before ShouldPass check. Thanks @sotfo!
+- [#331](https://github.com/influxdata/telegraf/pull/331): Dont overwrite host tag in redis plugin.
+- [#336](https://github.com/influxdata/telegraf/pull/336): Mongodb plugin should take 2 measurements.
+- [#351](https://github.com/influxdata/telegraf/issues/317): Fix continual "CREATE DATABASE" in writes
+- [#360](https://github.com/influxdata/telegraf/pull/360): Apply prefix before ShouldPass check. Thanks @sotfo!
 
 ## v0.2.0 [2015-10-27]
 
@@ -183,38 +202,38 @@ be controlled via the `round_interval` and `flush_jitter` config options.
 - Telegraf will now retry metric flushes twice
 
 ### Features
-- [#205](https://github.com/influxdb/telegraf/issues/205): Include per-db redis keyspace info
-- [#226](https://github.com/influxdb/telegraf/pull/226): Add timestamps to points in Kafka/AMQP outputs. Thanks @ekini
-- [#90](https://github.com/influxdb/telegraf/issues/90): Add Docker labels to tags in docker plugin
-- [#223](https://github.com/influxdb/telegraf/pull/223): Add port tag to nginx plugin. Thanks @neezgee!
-- [#227](https://github.com/influxdb/telegraf/pull/227): Add command intervals to exec plugin. Thanks @jpalay!
-- [#241](https://github.com/influxdb/telegraf/pull/241): MQTT Output. Thanks @shirou!
+- [#205](https://github.com/influxdata/telegraf/issues/205): Include per-db redis keyspace info
+- [#226](https://github.com/influxdata/telegraf/pull/226): Add timestamps to points in Kafka/AMQP outputs. Thanks @ekini
+- [#90](https://github.com/influxdata/telegraf/issues/90): Add Docker labels to tags in docker plugin
+- [#223](https://github.com/influxdata/telegraf/pull/223): Add port tag to nginx plugin. Thanks @neezgee!
+- [#227](https://github.com/influxdata/telegraf/pull/227): Add command intervals to exec plugin. Thanks @jpalay!
+- [#241](https://github.com/influxdata/telegraf/pull/241): MQTT Output. Thanks @shirou!
 - Memory plugin: cached and buffered measurements re-added
 - Logging: additional logging for each collection interval, track the number
 of metrics collected and from how many inputs.
-- [#240](https://github.com/influxdb/telegraf/pull/240): procstat plugin, thanks @ranjib!
-- [#244](https://github.com/influxdb/telegraf/pull/244): netstat plugin, thanks @shirou!
-- [#262](https://github.com/influxdb/telegraf/pull/262): zookeeper plugin, thanks @jrxFive!
-- [#237](https://github.com/influxdb/telegraf/pull/237): statsd service plugin, thanks @sparrc
-- [#273](https://github.com/influxdb/telegraf/pull/273): puppet agent plugin, thats @jrxFive!
-- [#280](https://github.com/influxdb/telegraf/issues/280): Use InfluxDB client v2.
-- [#281](https://github.com/influxdb/telegraf/issues/281): Eliminate need to deep copy Batch Points.
-- [#286](https://github.com/influxdb/telegraf/issues/286): bcache plugin, thanks @cornerot!
-- [#287](https://github.com/influxdb/telegraf/issues/287): Batch AMQP output, thanks @ekini!
-- [#301](https://github.com/influxdb/telegraf/issues/301): Collect on even intervals
-- [#298](https://github.com/influxdb/telegraf/pull/298): Support retrying output writes
-- [#300](https://github.com/influxdb/telegraf/issues/300): aerospike plugin. Thanks @oldmantaiter!
-- [#322](https://github.com/influxdb/telegraf/issues/322): Librato output. Thanks @jipperinbham!
+- [#240](https://github.com/influxdata/telegraf/pull/240): procstat plugin, thanks @ranjib!
+- [#244](https://github.com/influxdata/telegraf/pull/244): netstat plugin, thanks @shirou!
+- [#262](https://github.com/influxdata/telegraf/pull/262): zookeeper plugin, thanks @jrxFive!
+- [#237](https://github.com/influxdata/telegraf/pull/237): statsd service plugin, thanks @sparrc
+- [#273](https://github.com/influxdata/telegraf/pull/273): puppet agent plugin, thats @jrxFive!
+- [#280](https://github.com/influxdata/telegraf/issues/280): Use InfluxDB client v2.
+- [#281](https://github.com/influxdata/telegraf/issues/281): Eliminate need to deep copy Batch Points.
+- [#286](https://github.com/influxdata/telegraf/issues/286): bcache plugin, thanks @cornerot!
+- [#287](https://github.com/influxdata/telegraf/issues/287): Batch AMQP output, thanks @ekini!
+- [#301](https://github.com/influxdata/telegraf/issues/301): Collect on even intervals
+- [#298](https://github.com/influxdata/telegraf/pull/298): Support retrying output writes
+- [#300](https://github.com/influxdata/telegraf/issues/300): aerospike plugin. Thanks @oldmantaiter!
+- [#322](https://github.com/influxdata/telegraf/issues/322): Librato output. Thanks @jipperinbham!
 
 ### Bugfixes
-- [#228](https://github.com/influxdb/telegraf/pull/228): New version of package will replace old one. Thanks @ekini!
-- [#232](https://github.com/influxdb/telegraf/pull/232): Fix bashism run during deb package installation. Thanks @yankcrime!
-- [#261](https://github.com/influxdb/telegraf/issues/260): RabbitMQ panics if wrong credentials given. Thanks @ekini!
-- [#245](https://github.com/influxdb/telegraf/issues/245): Document Exec plugin example. Thanks @ekini!
-- [#264](https://github.com/influxdb/telegraf/issues/264): logrotate config file fixes. Thanks @linsomniac!
-- [#290](https://github.com/influxdb/telegraf/issues/290): Fix some plugins sending their values as strings.
-- [#289](https://github.com/influxdb/telegraf/issues/289): Fix accumulator panic on nil tags.
-- [#302](https://github.com/influxdb/telegraf/issues/302): Fix `[tags]` getting applied, thanks @gotyaoi!
+- [#228](https://github.com/influxdata/telegraf/pull/228): New version of package will replace old one. Thanks @ekini!
+- [#232](https://github.com/influxdata/telegraf/pull/232): Fix bashism run during deb package installation. Thanks @yankcrime!
+- [#261](https://github.com/influxdata/telegraf/issues/260): RabbitMQ panics if wrong credentials given. Thanks @ekini!
+- [#245](https://github.com/influxdata/telegraf/issues/245): Document Exec plugin example. Thanks @ekini!
+- [#264](https://github.com/influxdata/telegraf/issues/264): logrotate config file fixes. Thanks @linsomniac!
+- [#290](https://github.com/influxdata/telegraf/issues/290): Fix some plugins sending their values as strings.
+- [#289](https://github.com/influxdata/telegraf/issues/289): Fix accumulator panic on nil tags.
+- [#302](https://github.com/influxdata/telegraf/issues/302): Fix `[tags]` getting applied, thanks @gotyaoi!
 
 ## v0.1.9 [2015-09-22]
 
@@ -240,27 +259,27 @@ have been renamed for consistency. Some measurements have also been removed from
 re-added in a "verbose" mode if there is demand for it.
 
 ### Features
-- [#143](https://github.com/influxdb/telegraf/issues/143): InfluxDB clustering support
-- [#181](https://github.com/influxdb/telegraf/issues/181): Makefile GOBIN support. Thanks @Vye!
-- [#203](https://github.com/influxdb/telegraf/pull/200): AMQP output. Thanks @ekini!
-- [#182](https://github.com/influxdb/telegraf/pull/182): OpenTSDB output. Thanks @rplessl!
-- [#187](https://github.com/influxdb/telegraf/pull/187): Retry output sink connections on startup.
-- [#220](https://github.com/influxdb/telegraf/pull/220): Add port tag to apache plugin. Thanks @neezgee!
-- [#217](https://github.com/influxdb/telegraf/pull/217): Add filtering for output sinks
+- [#143](https://github.com/influxdata/telegraf/issues/143): InfluxDB clustering support
+- [#181](https://github.com/influxdata/telegraf/issues/181): Makefile GOBIN support. Thanks @Vye!
+- [#203](https://github.com/influxdata/telegraf/pull/200): AMQP output. Thanks @ekini!
+- [#182](https://github.com/influxdata/telegraf/pull/182): OpenTSDB output. Thanks @rplessl!
+- [#187](https://github.com/influxdata/telegraf/pull/187): Retry output sink connections on startup.
+- [#220](https://github.com/influxdata/telegraf/pull/220): Add port tag to apache plugin. Thanks @neezgee!
+- [#217](https://github.com/influxdata/telegraf/pull/217): Add filtering for output sinks
 and filtering when specifying a config file.
 
 ### Bugfixes
-- [#170](https://github.com/influxdb/telegraf/issues/170): Systemd support
-- [#175](https://github.com/influxdb/telegraf/issues/175): Set write precision before gathering metrics
-- [#178](https://github.com/influxdb/telegraf/issues/178): redis plugin, multiple server thread hang bug
+- [#170](https://github.com/influxdata/telegraf/issues/170): Systemd support
+- [#175](https://github.com/influxdata/telegraf/issues/175): Set write precision before gathering metrics
+- [#178](https://github.com/influxdata/telegraf/issues/178): redis plugin, multiple server thread hang bug
 - Fix net plugin on darwin
-- [#84](https://github.com/influxdb/telegraf/issues/84): Fix docker plugin on CentOS. Thanks @neezgee!
-- [#189](https://github.com/influxdb/telegraf/pull/189): Fix mem_used_perc. Thanks @mced!
-- [#192](https://github.com/influxdb/telegraf/issues/192): Increase compatibility of postgresql plugin. Now supports versions 8.1+
-- [#203](https://github.com/influxdb/telegraf/issues/203): EL5 rpm support. Thanks @ekini!
-- [#206](https://github.com/influxdb/telegraf/issues/206): CPU steal/guest values wrong on linux.
-- [#212](https://github.com/influxdb/telegraf/issues/212): Add hashbang to postinstall script. Thanks @ekini!
-- [#212](https://github.com/influxdb/telegraf/issues/212): Fix makefile warning. Thanks @ekini!
+- [#84](https://github.com/influxdata/telegraf/issues/84): Fix docker plugin on CentOS. Thanks @neezgee!
+- [#189](https://github.com/influxdata/telegraf/pull/189): Fix mem_used_perc. Thanks @mced!
+- [#192](https://github.com/influxdata/telegraf/issues/192): Increase compatibility of postgresql plugin. Now supports versions 8.1+
+- [#203](https://github.com/influxdata/telegraf/issues/203): EL5 rpm support. Thanks @ekini!
+- [#206](https://github.com/influxdata/telegraf/issues/206): CPU steal/guest values wrong on linux.
+- [#212](https://github.com/influxdata/telegraf/issues/212): Add hashbang to postinstall script. Thanks @ekini!
+- [#212](https://github.com/influxdata/telegraf/issues/212): Fix makefile warning. Thanks @ekini!
 
 ## v0.1.8 [2015-09-04]
 
@@ -269,106 +288,106 @@ and filtering when specifying a config file.
 - Now using Go 1.5 to build telegraf
 
 ### Features
-- [#150](https://github.com/influxdb/telegraf/pull/150): Add Host Uptime metric to system plugin
-- [#158](https://github.com/influxdb/telegraf/pull/158): Apache Plugin. Thanks @KPACHbIuLLIAnO4
-- [#159](https://github.com/influxdb/telegraf/pull/159): Use second precision for InfluxDB writes
-- [#165](https://github.com/influxdb/telegraf/pull/165): Add additional metrics to mysql plugin. Thanks @nickscript0
-- [#162](https://github.com/influxdb/telegraf/pull/162): Write UTC by default, provide option
-- [#166](https://github.com/influxdb/telegraf/pull/166): Upload binaries to S3
-- [#169](https://github.com/influxdb/telegraf/pull/169): Ping plugin
+- [#150](https://github.com/influxdata/telegraf/pull/150): Add Host Uptime metric to system plugin
+- [#158](https://github.com/influxdata/telegraf/pull/158): Apache Plugin. Thanks @KPACHbIuLLIAnO4
+- [#159](https://github.com/influxdata/telegraf/pull/159): Use second precision for InfluxDB writes
+- [#165](https://github.com/influxdata/telegraf/pull/165): Add additional metrics to mysql plugin. Thanks @nickscript0
+- [#162](https://github.com/influxdata/telegraf/pull/162): Write UTC by default, provide option
+- [#166](https://github.com/influxdata/telegraf/pull/166): Upload binaries to S3
+- [#169](https://github.com/influxdata/telegraf/pull/169): Ping plugin
 
 ### Bugfixes
 
 ## v0.1.7 [2015-08-28]
 
 ### Features
-- [#38](https://github.com/influxdb/telegraf/pull/38): Kafka output producer.
-- [#133](https://github.com/influxdb/telegraf/pull/133): Add plugin.Gather error logging. Thanks @nickscript0!
-- [#136](https://github.com/influxdb/telegraf/issues/136): Add a -usage flag for printing usage of a single plugin.
-- [#137](https://github.com/influxdb/telegraf/issues/137): Memcached: fix when a value contains a space
-- [#138](https://github.com/influxdb/telegraf/issues/138): MySQL server address tag.
-- [#142](https://github.com/influxdb/telegraf/pull/142): Add Description and SampleConfig funcs to output interface
+- [#38](https://github.com/influxdata/telegraf/pull/38): Kafka output producer.
+- [#133](https://github.com/influxdata/telegraf/pull/133): Add plugin.Gather error logging. Thanks @nickscript0!
+- [#136](https://github.com/influxdata/telegraf/issues/136): Add a -usage flag for printing usage of a single plugin.
+- [#137](https://github.com/influxdata/telegraf/issues/137): Memcached: fix when a value contains a space
+- [#138](https://github.com/influxdata/telegraf/issues/138): MySQL server address tag.
+- [#142](https://github.com/influxdata/telegraf/pull/142): Add Description and SampleConfig funcs to output interface
 - Indent the toml config file for readability
 
 ### Bugfixes
-- [#128](https://github.com/influxdb/telegraf/issues/128): system_load measurement missing.
-- [#129](https://github.com/influxdb/telegraf/issues/129): Latest pkg url fix.
-- [#131](https://github.com/influxdb/telegraf/issues/131): Fix memory reporting on linux & darwin. Thanks @subhachandrachandra!
-- [#140](https://github.com/influxdb/telegraf/issues/140): Memory plugin prec->perc typo fix. Thanks @brunoqc!
+- [#128](https://github.com/influxdata/telegraf/issues/128): system_load measurement missing.
+- [#129](https://github.com/influxdata/telegraf/issues/129): Latest pkg url fix.
+- [#131](https://github.com/influxdata/telegraf/issues/131): Fix memory reporting on linux & darwin. Thanks @subhachandrachandra!
+- [#140](https://github.com/influxdata/telegraf/issues/140): Memory plugin prec->perc typo fix. Thanks @brunoqc!
 
 ## v0.1.6 [2015-08-20]
 
 ### Features
-- [#112](https://github.com/influxdb/telegraf/pull/112): Datadog output. Thanks @jipperinbham!
-- [#116](https://github.com/influxdb/telegraf/pull/116): Use godep to vendor all dependencies
-- [#120](https://github.com/influxdb/telegraf/pull/120): Httpjson plugin. Thanks @jpalay & @alvaromorales!
+- [#112](https://github.com/influxdata/telegraf/pull/112): Datadog output. Thanks @jipperinbham!
+- [#116](https://github.com/influxdata/telegraf/pull/116): Use godep to vendor all dependencies
+- [#120](https://github.com/influxdata/telegraf/pull/120): Httpjson plugin. Thanks @jpalay & @alvaromorales!
 
 ### Bugfixes
-- [#113](https://github.com/influxdb/telegraf/issues/113): Update README with Telegraf/InfluxDB compatibility
-- [#118](https://github.com/influxdb/telegraf/pull/118): Fix for disk usage stats in Windows. Thanks @srfraser!
-- [#122](https://github.com/influxdb/telegraf/issues/122): Fix for DiskUsage segv fault. Thanks @srfraser!
-- [#126](https://github.com/influxdb/telegraf/issues/126): Nginx plugin not catching net.SplitHostPort error
+- [#113](https://github.com/influxdata/telegraf/issues/113): Update README with Telegraf/InfluxDB compatibility
+- [#118](https://github.com/influxdata/telegraf/pull/118): Fix for disk usage stats in Windows. Thanks @srfraser!
+- [#122](https://github.com/influxdata/telegraf/issues/122): Fix for DiskUsage segv fault. Thanks @srfraser!
+- [#126](https://github.com/influxdata/telegraf/issues/126): Nginx plugin not catching net.SplitHostPort error
 
 ## v0.1.5 [2015-08-13]
 
 ### Features
-- [#54](https://github.com/influxdb/telegraf/pull/54): MongoDB plugin. Thanks @jipperinbham!
-- [#55](https://github.com/influxdb/telegraf/pull/55): Elasticsearch plugin. Thanks @brocaar!
-- [#71](https://github.com/influxdb/telegraf/pull/71): HAProxy plugin. Thanks @kureikain!
-- [#72](https://github.com/influxdb/telegraf/pull/72): Adding TokuDB metrics to MySQL. Thanks vadimtk!
-- [#73](https://github.com/influxdb/telegraf/pull/73): RabbitMQ plugin. Thanks @ianunruh!
-- [#77](https://github.com/influxdb/telegraf/issues/77): Automatically create database.
-- [#79](https://github.com/influxdb/telegraf/pull/56): Nginx plugin. Thanks @codeb2cc!
-- [#86](https://github.com/influxdb/telegraf/pull/86): Lustre2 plugin. Thanks srfraser!
-- [#91](https://github.com/influxdb/telegraf/pull/91): Unit testing
-- [#92](https://github.com/influxdb/telegraf/pull/92): Exec plugin. Thanks @alvaromorales!
-- [#98](https://github.com/influxdb/telegraf/pull/98): LeoFS plugin. Thanks @mocchira!
-- [#103](https://github.com/influxdb/telegraf/pull/103): Filter by metric tags. Thanks @srfraser!
-- [#106](https://github.com/influxdb/telegraf/pull/106): Options to filter plugins on startup. Thanks @zepouet!
-- [#107](https://github.com/influxdb/telegraf/pull/107): Multiple outputs beyong influxdb. Thanks @jipperinbham!
-- [#108](https://github.com/influxdb/telegraf/issues/108): Support setting per-CPU and total-CPU gathering.
-- [#111](https://github.com/influxdb/telegraf/pull/111): Report CPU Usage in cpu plugin. Thanks @jpalay!
+- [#54](https://github.com/influxdata/telegraf/pull/54): MongoDB plugin. Thanks @jipperinbham!
+- [#55](https://github.com/influxdata/telegraf/pull/55): Elasticsearch plugin. Thanks @brocaar!
+- [#71](https://github.com/influxdata/telegraf/pull/71): HAProxy plugin. Thanks @kureikain!
+- [#72](https://github.com/influxdata/telegraf/pull/72): Adding TokuDB metrics to MySQL. Thanks vadimtk!
+- [#73](https://github.com/influxdata/telegraf/pull/73): RabbitMQ plugin. Thanks @ianunruh!
+- [#77](https://github.com/influxdata/telegraf/issues/77): Automatically create database.
+- [#79](https://github.com/influxdata/telegraf/pull/56): Nginx plugin. Thanks @codeb2cc!
+- [#86](https://github.com/influxdata/telegraf/pull/86): Lustre2 plugin. Thanks srfraser!
+- [#91](https://github.com/influxdata/telegraf/pull/91): Unit testing
+- [#92](https://github.com/influxdata/telegraf/pull/92): Exec plugin. Thanks @alvaromorales!
+- [#98](https://github.com/influxdata/telegraf/pull/98): LeoFS plugin. Thanks @mocchira!
+- [#103](https://github.com/influxdata/telegraf/pull/103): Filter by metric tags. Thanks @srfraser!
+- [#106](https://github.com/influxdata/telegraf/pull/106): Options to filter plugins on startup. Thanks @zepouet!
+- [#107](https://github.com/influxdata/telegraf/pull/107): Multiple outputs beyong influxdb. Thanks @jipperinbham!
+- [#108](https://github.com/influxdata/telegraf/issues/108): Support setting per-CPU and total-CPU gathering.
+- [#111](https://github.com/influxdata/telegraf/pull/111): Report CPU Usage in cpu plugin. Thanks @jpalay!
 
 ### Bugfixes
-- [#85](https://github.com/influxdb/telegraf/pull/85): Fix GetLocalHost testutil function for mac users
-- [#89](https://github.com/influxdb/telegraf/pull/89): go fmt fixes
-- [#94](https://github.com/influxdb/telegraf/pull/94): Fix for issue #93, explicitly call sarama.v1 -> sarama
-- [#101](https://github.com/influxdb/telegraf/issues/101): switch back from master branch if building locally
-- [#99](https://github.com/influxdb/telegraf/issues/99): update integer output to new InfluxDB line protocol format
+- [#85](https://github.com/influxdata/telegraf/pull/85): Fix GetLocalHost testutil function for mac users
+- [#89](https://github.com/influxdata/telegraf/pull/89): go fmt fixes
+- [#94](https://github.com/influxdata/telegraf/pull/94): Fix for issue #93, explicitly call sarama.v1 -> sarama
+- [#101](https://github.com/influxdata/telegraf/issues/101): switch back from master branch if building locally
+- [#99](https://github.com/influxdata/telegraf/issues/99): update integer output to new InfluxDB line protocol format
 
 ## v0.1.4 [2015-07-09]
 
 ### Features
-- [#56](https://github.com/influxdb/telegraf/pull/56): Update README for Kafka plugin. Thanks @EmilS!
+- [#56](https://github.com/influxdata/telegraf/pull/56): Update README for Kafka plugin. Thanks @EmilS!
 
 ### Bugfixes
-- [#50](https://github.com/influxdb/telegraf/pull/50): Fix init.sh script to use telegraf directory. Thanks @jseriff!
-- [#52](https://github.com/influxdb/telegraf/pull/52): Update CHANGELOG to reference updated directory. Thanks @benfb!
+- [#50](https://github.com/influxdata/telegraf/pull/50): Fix init.sh script to use telegraf directory. Thanks @jseriff!
+- [#52](https://github.com/influxdata/telegraf/pull/52): Update CHANGELOG to reference updated directory. Thanks @benfb!
 
 ## v0.1.3 [2015-07-05]
 
 ### Features
-- [#35](https://github.com/influxdb/telegraf/pull/35): Add Kafka plugin. Thanks @EmilS!
-- [#47](https://github.com/influxdb/telegraf/pull/47): Add RethinkDB plugin. Thanks @jipperinbham!
+- [#35](https://github.com/influxdata/telegraf/pull/35): Add Kafka plugin. Thanks @EmilS!
+- [#47](https://github.com/influxdata/telegraf/pull/47): Add RethinkDB plugin. Thanks @jipperinbham!
 
 ### Bugfixes
-- [#45](https://github.com/influxdb/telegraf/pull/45): Skip disk tags that don't have a value. Thanks @jhofeditz!
-- [#43](https://github.com/influxdb/telegraf/pull/43): Fix bug in MySQL plugin. Thanks @marcosnils!
+- [#45](https://github.com/influxdata/telegraf/pull/45): Skip disk tags that don't have a value. Thanks @jhofeditz!
+- [#43](https://github.com/influxdata/telegraf/pull/43): Fix bug in MySQL plugin. Thanks @marcosnils!
 
 ## v0.1.2 [2015-07-01]
 
 ### Features
-- [#12](https://github.com/influxdb/telegraf/pull/12): Add Linux/ARM to the list of built binaries. Thanks @voxxit!
-- [#14](https://github.com/influxdb/telegraf/pull/14): Clarify the S3 buckets that Telegraf is pushed to.
-- [#16](https://github.com/influxdb/telegraf/pull/16): Convert Redis to use URI, support Redis AUTH. Thanks @jipperinbham!
-- [#21](https://github.com/influxdb/telegraf/pull/21): Add memcached plugin. Thanks @Yukki!
+- [#12](https://github.com/influxdata/telegraf/pull/12): Add Linux/ARM to the list of built binaries. Thanks @voxxit!
+- [#14](https://github.com/influxdata/telegraf/pull/14): Clarify the S3 buckets that Telegraf is pushed to.
+- [#16](https://github.com/influxdata/telegraf/pull/16): Convert Redis to use URI, support Redis AUTH. Thanks @jipperinbham!
+- [#21](https://github.com/influxdata/telegraf/pull/21): Add memcached plugin. Thanks @Yukki!
 
 ### Bugfixes
-- [#13](https://github.com/influxdb/telegraf/pull/13): Fix the packaging script.
-- [#19](https://github.com/influxdb/telegraf/pull/19): Add host name to metric tags. Thanks @sherifzain!
-- [#20](https://github.com/influxdb/telegraf/pull/20): Fix race condition with accumulator mutex. Thanks @nkatsaros!
-- [#23](https://github.com/influxdb/telegraf/pull/23): Change name of folder for packages. Thanks @colinrymer!
-- [#32](https://github.com/influxdb/telegraf/pull/32): Fix spelling of memoory -> memory. Thanks @tylernisonoff!
+- [#13](https://github.com/influxdata/telegraf/pull/13): Fix the packaging script.
+- [#19](https://github.com/influxdata/telegraf/pull/19): Add host name to metric tags. Thanks @sherifzain!
+- [#20](https://github.com/influxdata/telegraf/pull/20): Fix race condition with accumulator mutex. Thanks @nkatsaros!
+- [#23](https://github.com/influxdata/telegraf/pull/23): Change name of folder for packages. Thanks @colinrymer!
+- [#32](https://github.com/influxdata/telegraf/pull/32): Fix spelling of memoory -> memory. Thanks @tylernisonoff!
 
 ## v0.1.1 [2015-06-19]
 
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index a47ad2f17d94350a605a8af92bad008eeafeeca0..f7e2ec86f0b1a83fffbc6b9c2b10de3cb029d754 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -1,8 +1,23 @@
+## Steps for Contributing:
+
+1. [Sign the CLA](https://github.com/influxdata/telegraf/blob/master/CONTRIBUTING.md#sign-the-cla)
+1. Write your input or output plugin (see below for details)
+1. Add your plugin to `plugins/inputs/all/all.go` or `plugins/outputs/all/all.go`
+1. If your plugin requires a new Go package,
+[add it](https://github.com/influxdata/telegraf/blob/master/CONTRIBUTING.md#adding-a-dependency)
+
 ## Sign the CLA
 
 Before we can merge a pull request, you will need to sign the CLA,
 which can be found [on our website](http://influxdb.com/community/cla.html)
 
+## Adding a dependency
+
+Assuming you can already build the project:
+
+1. `go get github.com/sparrc/gdm`
+1. `gdm save`
+
 ## Input Plugins
 
 This section is for developers who want to create new collection inputs.
@@ -19,7 +34,7 @@ and submit new inputs.
 * Input Plugins should call `inputs.Add` in their `init` function to register themselves.
 See below for a quick example.
 * Input Plugins must be added to the
-`github.com/influxdb/telegraf/plugins/inputs/all/all.go` file.
+`github.com/influxdata/telegraf/plugins/inputs/all/all.go` file.
 * The `SampleConfig` function should return valid toml that describes how the
 plugin can be configured. This is include in `telegraf -sample-config`.
 * The `Description` function should say in one line what this plugin does.
@@ -75,7 +90,7 @@ package simple
 
 // simple.go
 
-import "github.com/influxdb/telegraf/plugins/inputs"
+import "github.com/influxdata/telegraf/plugins/inputs"
 
 type Simple struct {
     Ok bool
@@ -147,7 +162,7 @@ similar constructs.
 * Outputs should call `outputs.Add` in their `init` function to register themselves.
 See below for a quick example.
 * To be available within Telegraf itself, plugins must add themselves to the
-`github.com/influxdb/telegraf/plugins/outputs/all/all.go` file.
+`github.com/influxdata/telegraf/plugins/outputs/all/all.go` file.
 * The `SampleConfig` function should return valid toml that describes how the
 output can be configured. This is include in `telegraf -sample-config`.
 * The `Description` function should say in one line what this output does.
@@ -171,7 +186,7 @@ package simpleoutput
 
 // simpleoutput.go
 
-import "github.com/influxdb/telegraf/plugins/outputs"
+import "github.com/influxdata/telegraf/plugins/outputs"
 
 type Simple struct {
     Ok bool
@@ -252,7 +267,7 @@ which would take some time to replicate.
 To overcome this situation we've decided to use docker containers to provide a
 fast and reproducible environment to test those services which require it.
 For other situations
-(i.e: https://github.com/influxdb/telegraf/blob/master/plugins/redis/redis_test.go)
+(i.e: https://github.com/influxdata/telegraf/blob/master/plugins/redis/redis_test.go)
 a simple mock will suffice.
 
 To execute Telegraf tests follow these simple steps:
diff --git a/Godeps b/Godeps
index f719539f5168a12fbce02360ea448f69aac8ed75..9f46fd79bfec0f331cab1b69aafba7ee7ef2ec2d 100644
--- a/Godeps
+++ b/Godeps
@@ -22,6 +22,7 @@ github.com/hailocab/go-hostpool 50839ee41f32bfca8d03a183031aa634b2dc1c64
 github.com/hashicorp/go-msgpack fa3f63826f7c23912c15263591e65d54d080b458
 github.com/hashicorp/raft b95f335efee1992886864389183ebda0c0a5d0f6
 github.com/hashicorp/raft-boltdb d1e82c1ec3f15ee991f7cc7ffd5b67ff6f5bbaee
+github.com/influxdata/influxdb 0e0f85a0c1fd1788ae4f9145531b02c539cfa5b5
 github.com/influxdb/influxdb 0e0f85a0c1fd1788ae4f9145531b02c539cfa5b5
 github.com/jmespath/go-jmespath c01cf91b011868172fdcd9f41838e80c9d716264
 github.com/klauspost/crc32 999f3125931f6557b991b2f8472172bdfa578d38
diff --git a/Makefile b/Makefile
index 2ae4d12574ec8dc6663a8e1ee45084201a419f18..3dedfb70310f3db99cc634c5ac7dbd891c47f76f 100644
--- a/Makefile
+++ b/Makefile
@@ -23,7 +23,6 @@ dev: prepare
 
 # Get dependencies and use gdm to checkout changesets
 prepare:
-	go get ./...
 	go get github.com/sparrc/gdm
 	gdm restore
 
diff --git a/README.md b/README.md
index 80c739d039d98417eb59366516fb5e652a485356..7207db8a92b315230177a4f280e990b885b86abe 100644
--- a/README.md
+++ b/README.md
@@ -77,8 +77,8 @@ if you don't have it already. You also must build with golang version 1.5+.
 
 1. [Install Go](https://golang.org/doc/install)
 2. [Setup your GOPATH](https://golang.org/doc/code.html#GOPATH)
-3. Run `go get github.com/influxdb/telegraf`
-4. Run `cd $GOPATH/src/github.com/influxdb/telegraf`
+3. Run `go get github.com/influxdata/telegraf`
+4. Run `cd $GOPATH/src/github.com/influxdata/telegraf`
 5. Run `make`
 
 ### How to use it:
@@ -139,6 +139,7 @@ Currently implemented sources:
 * apache
 * bcache
 * disque
+* docker
 * elasticsearch
 * exec (generic JSON-emitting executable plugin)
 * haproxy
@@ -189,10 +190,11 @@ want to add support for another service or third-party API.
 * influxdb
 * amon
 * amqp
+* aws kinesis
+* aws cloudwatch
 * datadog
 * graphite
 * kafka
-* amazon kinesis
 * librato
 * mqtt
 * nsq
diff --git a/accumulator.go b/accumulator.go
index 429f3a42cf8f69e0aa86d3043d8b35d8ffcb1efa..83f61ae99f2bc1f0815b23b5b6637294e89eb298 100644
--- a/accumulator.go
+++ b/accumulator.go
@@ -7,9 +7,9 @@ import (
 	"sync"
 	"time"
 
-	"github.com/influxdb/telegraf/internal/config"
+	"github.com/influxdata/telegraf/internal/models"
 
-	"github.com/influxdb/influxdb/client/v2"
+	"github.com/influxdata/influxdb/client/v2"
 )
 
 type Accumulator interface {
@@ -29,7 +29,7 @@ type Accumulator interface {
 }
 
 func NewAccumulator(
-	inputConfig *config.InputConfig,
+	inputConfig *models.InputConfig,
 	points chan *client.Point,
 ) Accumulator {
 	acc := accumulator{}
@@ -47,7 +47,7 @@ type accumulator struct {
 
 	debug bool
 
-	inputConfig *config.InputConfig
+	inputConfig *models.InputConfig
 
 	prefix string
 }
diff --git a/agent.go b/agent.go
index 25b157c544358a732730b3c3a223e7f21c149c34..d0f82145e116f5444e316f71ed0ca24b7b15362e 100644
--- a/agent.go
+++ b/agent.go
@@ -10,11 +10,12 @@ import (
 	"sync"
 	"time"
 
-	"github.com/influxdb/telegraf/internal/config"
-	"github.com/influxdb/telegraf/plugins/inputs"
-	"github.com/influxdb/telegraf/plugins/outputs"
+	"github.com/influxdata/telegraf/internal/config"
+	"github.com/influxdata/telegraf/internal/models"
+	"github.com/influxdata/telegraf/plugins/inputs"
+	"github.com/influxdata/telegraf/plugins/outputs"
 
-	"github.com/influxdb/influxdb/client/v2"
+	"github.com/influxdata/influxdb/client/v2"
 )
 
 // Agent runs telegraf and collects data based on the given config
@@ -101,7 +102,7 @@ func (a *Agent) gatherParallel(pointChan chan *client.Point) error {
 
 		wg.Add(1)
 		counter++
-		go func(input *config.RunningInput) {
+		go func(input *models.RunningInput) {
 			defer wg.Done()
 
 			acc := NewAccumulator(input.Config, pointChan)
@@ -144,7 +145,7 @@ func (a *Agent) gatherParallel(pointChan chan *client.Point) error {
 // reporting interval.
 func (a *Agent) gatherSeparate(
 	shutdown chan struct{},
-	input *config.RunningInput,
+	input *models.RunningInput,
 	pointChan chan *client.Point,
 ) error {
 	ticker := time.NewTicker(input.Config.Interval)
@@ -202,7 +203,6 @@ func (a *Agent) Test() error {
 	for _, input := range a.Config.Inputs {
 		acc := NewAccumulator(input.Config, pointChan)
 		acc.SetDebug(true)
-		// acc.SetPrefix(input.Name + "_")
 
 		fmt.Printf("* Plugin: %s, Collection 1\n", input.Name)
 		if input.Config.Interval != 0 {
@@ -216,7 +216,7 @@ func (a *Agent) Test() error {
 		// Special instructions for some inputs. cpu, for example, needs to be
 		// run twice in order to return cpu usage percentages.
 		switch input.Name {
-		case "cpu", "mongodb":
+		case "cpu", "mongodb", "procstat":
 			time.Sleep(500 * time.Millisecond)
 			fmt.Printf("* Plugin: %s, Collection 2\n", input.Name)
 			if err := input.Input.Gather(acc); err != nil {
@@ -228,93 +228,45 @@ func (a *Agent) Test() error {
 	return nil
 }
 
-// writeOutput writes a list of points to a single output, with retries.
-// Optionally takes a `done` channel to indicate that it is done writing.
-func (a *Agent) writeOutput(
-	points []*client.Point,
-	ro *config.RunningOutput,
-	shutdown chan struct{},
-	wg *sync.WaitGroup,
-) {
-	defer wg.Done()
-	if len(points) == 0 {
-		return
-	}
-	retry := 0
-	retries := a.Config.Agent.FlushRetries
-	start := time.Now()
-
-	for {
-		filtered := ro.FilterPoints(points)
-		err := ro.Output.Write(filtered)
-		if err == nil {
-			// Write successful
-			elapsed := time.Since(start)
-			if !a.Config.Agent.Quiet {
-				log.Printf("Flushed %d metrics to output %s in %s\n",
-					len(filtered), ro.Name, elapsed)
-			}
-			return
-		}
-
-		select {
-		case <-shutdown:
-			return
-		default:
-			if retry >= retries {
-				// No more retries
-				msg := "FATAL: Write to output [%s] failed %d times, dropping" +
-					" %d metrics\n"
-				log.Printf(msg, ro.Name, retries+1, len(points))
-				return
-			} else if err != nil {
-				// Sleep for a retry
-				log.Printf("Error in output [%s]: %s, retrying in %s",
-					ro.Name, err.Error(), a.Config.Agent.FlushInterval.Duration)
-				time.Sleep(a.Config.Agent.FlushInterval.Duration)
-			}
-		}
-
-		retry++
-	}
-}
-
 // flush writes a list of points to all configured outputs
-func (a *Agent) flush(
-	points []*client.Point,
-	shutdown chan struct{},
-	wait bool,
-) {
+func (a *Agent) flush() {
 	var wg sync.WaitGroup
+
+	wg.Add(len(a.Config.Outputs))
 	for _, o := range a.Config.Outputs {
-		wg.Add(1)
-		go a.writeOutput(points, o, shutdown, &wg)
-	}
-	if wait {
-		wg.Wait()
+		go func(output *models.RunningOutput) {
+			defer wg.Done()
+			err := output.Write()
+			if err != nil {
+				log.Printf("Error writing to output [%s]: %s\n",
+					output.Name, err.Error())
+			}
+		}(o)
 	}
+
+	wg.Wait()
 }
 
 // flusher monitors the points input channel and flushes on the minimum interval
 func (a *Agent) flusher(shutdown chan struct{}, pointChan chan *client.Point) error {
 	// Inelegant, but this sleep is to allow the Gather threads to run, so that
 	// the flusher will flush after metrics are collected.
-	time.Sleep(time.Millisecond * 100)
+	time.Sleep(time.Millisecond * 200)
 
 	ticker := time.NewTicker(a.Config.Agent.FlushInterval.Duration)
-	points := make([]*client.Point, 0)
 
 	for {
 		select {
 		case <-shutdown:
 			log.Println("Hang on, flushing any cached points before shutdown")
-			a.flush(points, shutdown, true)
+			a.flush()
 			return nil
 		case <-ticker.C:
-			a.flush(points, shutdown, false)
-			points = make([]*client.Point, 0)
+			a.flush()
 		case pt := <-pointChan:
-			points = append(points, pt)
+			for _, o := range a.Config.Outputs {
+				o.AddPoint(pt)
+			}
 		}
 	}
 }
@@ -389,7 +341,7 @@ func (a *Agent) Run(shutdown chan struct{}) error {
 		// configured. Default intervals are handled below with gatherParallel
 		if input.Config.Interval != 0 {
 			wg.Add(1)
-			go func(input *config.RunningInput) {
+			go func(input *models.RunningInput) {
 				defer wg.Done()
 				if err := a.gatherSeparate(shutdown, input, pointChan); err != nil {
 					log.Printf(err.Error())
diff --git a/agent_test.go b/agent_test.go
index 1cb020c7bef5d4f5ad90399beaeeedd038593d98..3420e665a0f1292235601ca3ba98304af4897006 100644
--- a/agent_test.go
+++ b/agent_test.go
@@ -5,12 +5,12 @@ import (
 	"testing"
 	"time"
 
-	"github.com/influxdb/telegraf/internal/config"
+	"github.com/influxdata/telegraf/internal/config"
 
 	// needing to load the plugins
-	_ "github.com/influxdb/telegraf/plugins/inputs/all"
+	_ "github.com/influxdata/telegraf/plugins/inputs/all"
 	// needing to load the outputs
-	_ "github.com/influxdb/telegraf/plugins/outputs/all"
+	_ "github.com/influxdata/telegraf/plugins/outputs/all"
 )
 
 func TestAgent_LoadPlugin(t *testing.T) {
diff --git a/cmd/telegraf/telegraf.go b/cmd/telegraf/telegraf.go
index 554569012cbeeae1153d52e5ae167e5d9d39cad3..72fb9fdcf087dd2aa88da215fb6bc0bbf4203ab3 100644
--- a/cmd/telegraf/telegraf.go
+++ b/cmd/telegraf/telegraf.go
@@ -9,10 +9,10 @@ import (
 	"strings"
 	"syscall"
 
-	"github.com/influxdb/telegraf"
-	"github.com/influxdb/telegraf/internal/config"
-	_ "github.com/influxdb/telegraf/plugins/inputs/all"
-	_ "github.com/influxdb/telegraf/plugins/outputs/all"
+	"github.com/influxdata/telegraf"
+	"github.com/influxdata/telegraf/internal/config"
+	_ "github.com/influxdata/telegraf/plugins/inputs/all"
+	_ "github.com/influxdata/telegraf/plugins/outputs/all"
 )
 
 var fDebug = flag.Bool("debug", false,
diff --git a/etc/telegraf.conf b/etc/telegraf.conf
index 9df2e93d5064fd0c2d2e0a5416e6ea639633a245..9871ae7bc99894e447d0a62c974aafb3fe2b72ba 100644
--- a/etc/telegraf.conf
+++ b/etc/telegraf.conf
@@ -90,7 +90,7 @@
 [[inputs.disk]]
   # By default, telegraf gather stats for all mountpoints.
   # Setting mountpoints will restrict the stats to the specified mountpoints.
-  # Mountpoints=["/"]
+  # mount_points=["/"]
 
 # Read metrics about disk IO by device
 [[inputs.diskio]]
diff --git a/internal/config/config.go b/internal/config/config.go
index e4d7fbc9df4a616f896d58b640ef1bbbd98cd07d..005290fb6657eed99dbc0a5f04a994e7cc2822b7 100644
--- a/internal/config/config.go
+++ b/internal/config/config.go
@@ -10,14 +10,13 @@ import (
 	"strings"
 	"time"
 
-	"github.com/influxdb/telegraf/internal"
-	"github.com/influxdb/telegraf/plugins/inputs"
-	"github.com/influxdb/telegraf/plugins/outputs"
+	"github.com/influxdata/telegraf/internal"
+	"github.com/influxdata/telegraf/internal/models"
+	"github.com/influxdata/telegraf/plugins/inputs"
+	"github.com/influxdata/telegraf/plugins/outputs"
 
 	"github.com/naoina/toml"
 	"github.com/naoina/toml/ast"
-
-	"github.com/influxdb/influxdb/client/v2"
 )
 
 // Config specifies the URL/user/password for the database that telegraf
@@ -29,8 +28,8 @@ type Config struct {
 	OutputFilters []string
 
 	Agent   *AgentConfig
-	Inputs  []*RunningInput
-	Outputs []*RunningOutput
+	Inputs  []*models.RunningInput
+	Outputs []*models.RunningOutput
 }
 
 func NewConfig() *Config {
@@ -40,13 +39,12 @@ func NewConfig() *Config {
 			Interval:      internal.Duration{Duration: 10 * time.Second},
 			RoundInterval: true,
 			FlushInterval: internal.Duration{Duration: 10 * time.Second},
-			FlushRetries:  2,
 			FlushJitter:   internal.Duration{Duration: 5 * time.Second},
 		},
 
 		Tags:          make(map[string]string),
-		Inputs:        make([]*RunningInput, 0),
-		Outputs:       make([]*RunningOutput, 0),
+		Inputs:        make([]*models.RunningInput, 0),
+		Outputs:       make([]*models.RunningOutput, 0),
 		InputFilters:  make([]string, 0),
 		OutputFilters: make([]string, 0),
 	}
@@ -70,15 +68,17 @@ type AgentConfig struct {
 	// Interval at which to flush data
 	FlushInterval internal.Duration
 
-	// FlushRetries is the number of times to retry each data flush
-	FlushRetries int
-
 	// FlushJitter Jitters the flush interval by a random amount.
 	// This is primarily to avoid large write spikes for users running a large
 	// number of telegraf instances.
 	// ie, a jitter of 5s and interval 10s means flushes will happen every 10-15s
 	FlushJitter internal.Duration
 
+	// MetricBufferLimit is the max number of metrics that each output plugin
+	// will cache. The buffer is cleared when a successful write occurs. When
+	// full, the oldest metrics will be overwritten.
+	MetricBufferLimit int
+
 	// TODO(cam): Remove UTC and Precision parameters, they are no longer
 	// valid for the agent config. Leaving them here for now for backwards-
 	// compatability
@@ -93,129 +93,6 @@ type AgentConfig struct {
 	Hostname string
 }
 
-// TagFilter is the name of a tag, and the values on which to filter
-type TagFilter struct {
-	Name   string
-	Filter []string
-}
-
-type RunningOutput struct {
-	Name   string
-	Output outputs.Output
-	Config *OutputConfig
-}
-
-type RunningInput struct {
-	Name   string
-	Input  inputs.Input
-	Config *InputConfig
-}
-
-// Filter containing drop/pass and tagdrop/tagpass rules
-type Filter struct {
-	Drop []string
-	Pass []string
-
-	TagDrop []TagFilter
-	TagPass []TagFilter
-
-	IsActive bool
-}
-
-// InputConfig containing a name, interval, and filter
-type InputConfig struct {
-	Name              string
-	NameOverride      string
-	MeasurementPrefix string
-	MeasurementSuffix string
-	Tags              map[string]string
-	Filter            Filter
-	Interval          time.Duration
-}
-
-// OutputConfig containing name and filter
-type OutputConfig struct {
-	Name   string
-	Filter Filter
-}
-
-// Filter returns filtered slice of client.Points based on whether filters
-// are active for this RunningOutput.
-func (ro *RunningOutput) FilterPoints(points []*client.Point) []*client.Point {
-	if !ro.Config.Filter.IsActive {
-		return points
-	}
-
-	var filteredPoints []*client.Point
-	for i := range points {
-		if !ro.Config.Filter.ShouldPass(points[i].Name()) || !ro.Config.Filter.ShouldTagsPass(points[i].Tags()) {
-			continue
-		}
-		filteredPoints = append(filteredPoints, points[i])
-	}
-	return filteredPoints
-}
-
-// ShouldPass returns true if the metric should pass, false if should drop
-// based on the drop/pass filter parameters
-func (f Filter) ShouldPass(fieldkey string) bool {
-	if f.Pass != nil {
-		for _, pat := range f.Pass {
-			// TODO remove HasPrefix check, leaving it for now for legacy support.
-			// Cam, 2015-12-07
-			if strings.HasPrefix(fieldkey, pat) || internal.Glob(pat, fieldkey) {
-				return true
-			}
-		}
-		return false
-	}
-
-	if f.Drop != nil {
-		for _, pat := range f.Drop {
-			// TODO remove HasPrefix check, leaving it for now for legacy support.
-			// Cam, 2015-12-07
-			if strings.HasPrefix(fieldkey, pat) || internal.Glob(pat, fieldkey) {
-				return false
-			}
-		}
-
-		return true
-	}
-	return true
-}
-
-// ShouldTagsPass returns true if the metric should pass, false if should drop
-// based on the tagdrop/tagpass filter parameters
-func (f Filter) ShouldTagsPass(tags map[string]string) bool {
-	if f.TagPass != nil {
-		for _, pat := range f.TagPass {
-			if tagval, ok := tags[pat.Name]; ok {
-				for _, filter := range pat.Filter {
-					if internal.Glob(filter, tagval) {
-						return true
-					}
-				}
-			}
-		}
-		return false
-	}
-
-	if f.TagDrop != nil {
-		for _, pat := range f.TagDrop {
-			if tagval, ok := tags[pat.Name]; ok {
-				for _, filter := range pat.Filter {
-					if internal.Glob(filter, tagval) {
-						return false
-					}
-				}
-			}
-		}
-		return true
-	}
-
-	return true
-}
-
 // Inputs returns a list of strings of the configured inputs.
 func (c *Config) InputNames() []string {
 	var name []string
@@ -251,24 +128,14 @@ func (c *Config) ListTags() string {
 var header = `# Telegraf configuration
 
 # Telegraf is entirely plugin driven. All metrics are gathered from the
-# declared inputs.
+# declared inputs, and sent to the declared outputs.
 
-# Even if a plugin has no configuration, it must be declared in here
-# to be active. Declaring a plugin means just specifying the name
-# as a section with no variables. To deactivate a plugin, comment
-# out the name and any variables.
+# Plugins must be declared in here to be active.
+# To deactivate a plugin, comment out the name and any variables.
 
-# Use 'telegraf -config telegraf.toml -test' to see what metrics a config
+# Use 'telegraf -config telegraf.conf -test' to see what metrics a config
 # file would generate.
 
-# One rule that plugins conform to is wherever a connection string
-# can be passed, the values '' and 'localhost' are treated specially.
-# They indicate to the plugin to use their own builtin configuration to
-# connect to the local system.
-
-# NOTE: The configuration has a few required parameters. They are marked
-# with 'required'. Be sure to edit those to make this configuration work.
-
 # Tags can also be specified via a normal map, but only one form at a time:
 [tags]
   # dc = "us-east-1"
@@ -280,6 +147,11 @@ var header = `# Telegraf configuration
   # Rounds collection interval to 'interval'
   # ie, if interval="10s" then always collect on :00, :10, :20, etc.
   round_interval = true
+
+  # Telegraf will cache metric_buffer_limit metrics for each output, and will
+  # flush this buffer on a successful write.
+  metric_buffer_limit = 10000
+
   # Collection jitter is used to jitter the collection by a random amount.
   # Each plugin will sleep for a random time within jitter before collecting.
   # This can be used to avoid many plugins querying things like sysfs at the
@@ -535,11 +407,11 @@ func (c *Config) addOutput(name string, table *ast.Table) error {
 		return err
 	}
 
-	ro := &RunningOutput{
-		Name:   name,
-		Output: output,
-		Config: outputConfig,
+	ro := models.NewRunningOutput(name, output, outputConfig)
+	if c.Agent.MetricBufferLimit > 0 {
+		ro.PointBufferLimit = c.Agent.MetricBufferLimit
 	}
+	ro.Quiet = c.Agent.Quiet
 	c.Outputs = append(c.Outputs, ro)
 	return nil
 }
@@ -568,7 +440,7 @@ func (c *Config) addInput(name string, table *ast.Table) error {
 		return err
 	}
 
-	rp := &RunningInput{
+	rp := &models.RunningInput{
 		Name:   name,
 		Input:  input,
 		Config: pluginConfig,
@@ -578,10 +450,10 @@ func (c *Config) addInput(name string, table *ast.Table) error {
 }
 
 // buildFilter builds a Filter (tagpass/tagdrop/pass/drop) to
-// be inserted into the OutputConfig/InputConfig to be used for prefix
+// be inserted into the models.OutputConfig/models.InputConfig to be used for prefix
 // filtering on tags and measurements
-func buildFilter(tbl *ast.Table) Filter {
-	f := Filter{}
+func buildFilter(tbl *ast.Table) models.Filter {
+	f := models.Filter{}
 
 	if node, ok := tbl.Fields["pass"]; ok {
 		if kv, ok := node.(*ast.KeyValue); ok {
@@ -613,7 +485,7 @@ func buildFilter(tbl *ast.Table) Filter {
 		if subtbl, ok := node.(*ast.Table); ok {
 			for name, val := range subtbl.Fields {
 				if kv, ok := val.(*ast.KeyValue); ok {
-					tagfilter := &TagFilter{Name: name}
+					tagfilter := &models.TagFilter{Name: name}
 					if ary, ok := kv.Value.(*ast.Array); ok {
 						for _, elem := range ary.Value {
 							if str, ok := elem.(*ast.String); ok {
@@ -632,7 +504,7 @@ func buildFilter(tbl *ast.Table) Filter {
 		if subtbl, ok := node.(*ast.Table); ok {
 			for name, val := range subtbl.Fields {
 				if kv, ok := val.(*ast.KeyValue); ok {
-					tagfilter := &TagFilter{Name: name}
+					tagfilter := &models.TagFilter{Name: name}
 					if ary, ok := kv.Value.(*ast.Array); ok {
 						for _, elem := range ary.Value {
 							if str, ok := elem.(*ast.String); ok {
@@ -656,9 +528,9 @@ func buildFilter(tbl *ast.Table) Filter {
 
 // buildInput parses input specific items from the ast.Table,
 // builds the filter and returns a
-// InputConfig to be inserted into RunningInput
-func buildInput(name string, tbl *ast.Table) (*InputConfig, error) {
-	cp := &InputConfig{Name: name}
+// models.InputConfig to be inserted into models.RunningInput
+func buildInput(name string, tbl *ast.Table) (*models.InputConfig, error) {
+	cp := &models.InputConfig{Name: name}
 	if node, ok := tbl.Fields["interval"]; ok {
 		if kv, ok := node.(*ast.KeyValue); ok {
 			if str, ok := kv.Value.(*ast.String); ok {
@@ -715,10 +587,10 @@ func buildInput(name string, tbl *ast.Table) (*InputConfig, error) {
 }
 
 // buildOutput parses output specific items from the ast.Table, builds the filter and returns an
-// OutputConfig to be inserted into RunningInput
+// models.OutputConfig to be inserted into models.RunningInput
 // Note: error exists in the return for future calls that might require error
-func buildOutput(name string, tbl *ast.Table) (*OutputConfig, error) {
-	oc := &OutputConfig{
+func buildOutput(name string, tbl *ast.Table) (*models.OutputConfig, error) {
+	oc := &models.OutputConfig{
 		Name:   name,
 		Filter: buildFilter(tbl),
 	}
diff --git a/internal/config/config_test.go b/internal/config/config_test.go
index c8ed79bdf121294fce01ba023ab531cb39619c95..92f45ad0a12ec13f2f87deee2d8588e63d91d0db 100644
--- a/internal/config/config_test.go
+++ b/internal/config/config_test.go
@@ -4,10 +4,11 @@ import (
 	"testing"
 	"time"
 
-	"github.com/influxdb/telegraf/plugins/inputs"
-	"github.com/influxdb/telegraf/plugins/inputs/exec"
-	"github.com/influxdb/telegraf/plugins/inputs/memcached"
-	"github.com/influxdb/telegraf/plugins/inputs/procstat"
+	"github.com/influxdata/telegraf/internal/models"
+	"github.com/influxdata/telegraf/plugins/inputs"
+	"github.com/influxdata/telegraf/plugins/inputs/exec"
+	"github.com/influxdata/telegraf/plugins/inputs/memcached"
+	"github.com/influxdata/telegraf/plugins/inputs/procstat"
 	"github.com/stretchr/testify/assert"
 )
 
@@ -18,19 +19,19 @@ func TestConfig_LoadSingleInput(t *testing.T) {
 	memcached := inputs.Inputs["memcached"]().(*memcached.Memcached)
 	memcached.Servers = []string{"localhost"}
 
-	mConfig := &InputConfig{
+	mConfig := &models.InputConfig{
 		Name: "memcached",
-		Filter: Filter{
+		Filter: models.Filter{
 			Drop: []string{"other", "stuff"},
 			Pass: []string{"some", "strings"},
-			TagDrop: []TagFilter{
-				TagFilter{
+			TagDrop: []models.TagFilter{
+				models.TagFilter{
 					Name:   "badtag",
 					Filter: []string{"othertag"},
 				},
 			},
-			TagPass: []TagFilter{
-				TagFilter{
+			TagPass: []models.TagFilter{
+				models.TagFilter{
 					Name:   "goodtag",
 					Filter: []string{"mytag"},
 				},
@@ -61,19 +62,19 @@ func TestConfig_LoadDirectory(t *testing.T) {
 	memcached := inputs.Inputs["memcached"]().(*memcached.Memcached)
 	memcached.Servers = []string{"localhost"}
 
-	mConfig := &InputConfig{
+	mConfig := &models.InputConfig{
 		Name: "memcached",
-		Filter: Filter{
+		Filter: models.Filter{
 			Drop: []string{"other", "stuff"},
 			Pass: []string{"some", "strings"},
-			TagDrop: []TagFilter{
-				TagFilter{
+			TagDrop: []models.TagFilter{
+				models.TagFilter{
 					Name:   "badtag",
 					Filter: []string{"othertag"},
 				},
 			},
-			TagPass: []TagFilter{
-				TagFilter{
+			TagPass: []models.TagFilter{
+				models.TagFilter{
 					Name:   "goodtag",
 					Filter: []string{"mytag"},
 				},
@@ -91,7 +92,7 @@ func TestConfig_LoadDirectory(t *testing.T) {
 
 	ex := inputs.Inputs["exec"]().(*exec.Exec)
 	ex.Command = "/usr/bin/myothercollector --foo=bar"
-	eConfig := &InputConfig{
+	eConfig := &models.InputConfig{
 		Name:              "exec",
 		MeasurementSuffix: "_myothercollector",
 	}
@@ -110,7 +111,7 @@ func TestConfig_LoadDirectory(t *testing.T) {
 	pstat := inputs.Inputs["procstat"]().(*procstat.Procstat)
 	pstat.PidFile = "/var/run/grafana-server.pid"
 
-	pConfig := &InputConfig{Name: "procstat"}
+	pConfig := &models.InputConfig{Name: "procstat"}
 	pConfig.Tags = make(map[string]string)
 
 	assert.Equal(t, pstat, c.Inputs[3].Input,
@@ -118,175 +119,3 @@ func TestConfig_LoadDirectory(t *testing.T) {
 	assert.Equal(t, pConfig, c.Inputs[3].Config,
 		"Merged Testdata did not produce correct procstat metadata.")
 }
-
-func TestFilter_Empty(t *testing.T) {
-	f := Filter{}
-
-	measurements := []string{
-		"foo",
-		"bar",
-		"barfoo",
-		"foo_bar",
-		"foo.bar",
-		"foo-bar",
-		"supercalifradjulisticexpialidocious",
-	}
-
-	for _, measurement := range measurements {
-		if !f.ShouldPass(measurement) {
-			t.Errorf("Expected measurement %s to pass", measurement)
-		}
-	}
-}
-
-func TestFilter_Pass(t *testing.T) {
-	f := Filter{
-		Pass: []string{"foo*", "cpu_usage_idle"},
-	}
-
-	passes := []string{
-		"foo",
-		"foo_bar",
-		"foo.bar",
-		"foo-bar",
-		"cpu_usage_idle",
-	}
-
-	drops := []string{
-		"bar",
-		"barfoo",
-		"bar_foo",
-		"cpu_usage_busy",
-	}
-
-	for _, measurement := range passes {
-		if !f.ShouldPass(measurement) {
-			t.Errorf("Expected measurement %s to pass", measurement)
-		}
-	}
-
-	for _, measurement := range drops {
-		if f.ShouldPass(measurement) {
-			t.Errorf("Expected measurement %s to drop", measurement)
-		}
-	}
-}
-
-func TestFilter_Drop(t *testing.T) {
-	f := Filter{
-		Drop: []string{"foo*", "cpu_usage_idle"},
-	}
-
-	drops := []string{
-		"foo",
-		"foo_bar",
-		"foo.bar",
-		"foo-bar",
-		"cpu_usage_idle",
-	}
-
-	passes := []string{
-		"bar",
-		"barfoo",
-		"bar_foo",
-		"cpu_usage_busy",
-	}
-
-	for _, measurement := range passes {
-		if !f.ShouldPass(measurement) {
-			t.Errorf("Expected measurement %s to pass", measurement)
-		}
-	}
-
-	for _, measurement := range drops {
-		if f.ShouldPass(measurement) {
-			t.Errorf("Expected measurement %s to drop", measurement)
-		}
-	}
-}
-
-func TestFilter_TagPass(t *testing.T) {
-	filters := []TagFilter{
-		TagFilter{
-			Name:   "cpu",
-			Filter: []string{"cpu-*"},
-		},
-		TagFilter{
-			Name:   "mem",
-			Filter: []string{"mem_free"},
-		}}
-	f := Filter{
-		TagPass: filters,
-	}
-
-	passes := []map[string]string{
-		{"cpu": "cpu-total"},
-		{"cpu": "cpu-0"},
-		{"cpu": "cpu-1"},
-		{"cpu": "cpu-2"},
-		{"mem": "mem_free"},
-	}
-
-	drops := []map[string]string{
-		{"cpu": "cputotal"},
-		{"cpu": "cpu0"},
-		{"cpu": "cpu1"},
-		{"cpu": "cpu2"},
-		{"mem": "mem_used"},
-	}
-
-	for _, tags := range passes {
-		if !f.ShouldTagsPass(tags) {
-			t.Errorf("Expected tags %v to pass", tags)
-		}
-	}
-
-	for _, tags := range drops {
-		if f.ShouldTagsPass(tags) {
-			t.Errorf("Expected tags %v to drop", tags)
-		}
-	}
-}
-
-func TestFilter_TagDrop(t *testing.T) {
-	filters := []TagFilter{
-		TagFilter{
-			Name:   "cpu",
-			Filter: []string{"cpu-*"},
-		},
-		TagFilter{
-			Name:   "mem",
-			Filter: []string{"mem_free"},
-		}}
-	f := Filter{
-		TagDrop: filters,
-	}
-
-	drops := []map[string]string{
-		{"cpu": "cpu-total"},
-		{"cpu": "cpu-0"},
-		{"cpu": "cpu-1"},
-		{"cpu": "cpu-2"},
-		{"mem": "mem_free"},
-	}
-
-	passes := []map[string]string{
-		{"cpu": "cputotal"},
-		{"cpu": "cpu0"},
-		{"cpu": "cpu1"},
-		{"cpu": "cpu2"},
-		{"mem": "mem_used"},
-	}
-
-	for _, tags := range passes {
-		if !f.ShouldTagsPass(tags) {
-			t.Errorf("Expected tags %v to pass", tags)
-		}
-	}
-
-	for _, tags := range drops {
-		if f.ShouldTagsPass(tags) {
-			t.Errorf("Expected tags %v to drop", tags)
-		}
-	}
-}
diff --git a/internal/models/filter.go b/internal/models/filter.go
new file mode 100644
index 0000000000000000000000000000000000000000..3f171ccaca33c6e1b7cfc2edc78ad7beaf3863db
--- /dev/null
+++ b/internal/models/filter.go
@@ -0,0 +1,92 @@
+package models
+
+import (
+	"strings"
+
+	"github.com/influxdata/influxdb/client/v2"
+	"github.com/influxdata/telegraf/internal"
+)
+
+// TagFilter is the name of a tag, and the values on which to filter
+type TagFilter struct {
+	Name   string
+	Filter []string
+}
+
+// Filter containing drop/pass and tagdrop/tagpass rules
+type Filter struct {
+	Drop []string
+	Pass []string
+
+	TagDrop []TagFilter
+	TagPass []TagFilter
+
+	IsActive bool
+}
+
+func (f Filter) ShouldPointPass(point *client.Point) bool {
+	if f.ShouldPass(point.Name()) && f.ShouldTagsPass(point.Tags()) {
+		return true
+	}
+	return false
+}
+
+// ShouldPass returns true if the metric should pass, false if should drop
+// based on the drop/pass filter parameters
+func (f Filter) ShouldPass(key string) bool {
+	if f.Pass != nil {
+		for _, pat := range f.Pass {
+			// TODO remove HasPrefix check, leaving it for now for legacy support.
+			// Cam, 2015-12-07
+			if strings.HasPrefix(key, pat) || internal.Glob(pat, key) {
+				return true
+			}
+		}
+		return false
+	}
+
+	if f.Drop != nil {
+		for _, pat := range f.Drop {
+			// TODO remove HasPrefix check, leaving it for now for legacy support.
+			// Cam, 2015-12-07
+			if strings.HasPrefix(key, pat) || internal.Glob(pat, key) {
+				return false
+			}
+		}
+
+		return true
+	}
+	return true
+}
+
+// ShouldTagsPass returns true if the metric should pass, false if should drop
+// based on the tagdrop/tagpass filter parameters
+func (f Filter) ShouldTagsPass(tags map[string]string) bool {
+	if f.TagPass != nil {
+		for _, pat := range f.TagPass {
+			if tagval, ok := tags[pat.Name]; ok {
+				for _, filter := range pat.Filter {
+					if internal.Glob(filter, tagval) {
+						return true
+					}
+				}
+			}
+		}
+		return false
+	}
+
+	if f.TagDrop != nil {
+		for _, pat := range f.TagDrop {
+			if tagval, ok := tags[pat.Name]; ok {
+				for _, filter := range pat.Filter {
+					if internal.Glob(filter, tagval) {
+						return false
+					}
+				}
+			}
+		}
+		return true
+	}
+
+	return true
+}
diff --git a/internal/models/filter_test.go b/internal/models/filter_test.go
new file mode 100644
index 0000000000000000000000000000000000000000..9e962e4200519df273f2a0e97877b6a3f528b1f9
--- /dev/null
+++ b/internal/models/filter_test.go
@@ -0,0 +1,177 @@
+package models
+
+import (
+	"testing"
+)
+
+func TestFilter_Empty(t *testing.T) {
+	f := Filter{}
+
+	measurements := []string{
+		"foo",
+		"bar",
+		"barfoo",
+		"foo_bar",
+		"foo.bar",
+		"foo-bar",
+		"supercalifradjulisticexpialidocious",
+	}
+
+	for _, measurement := range measurements {
+		if !f.ShouldPass(measurement) {
+			t.Errorf("Expected measurement %s to pass", measurement)
+		}
+	}
+}
+
+func TestFilter_Pass(t *testing.T) {
+	f := Filter{
+		Pass: []string{"foo*", "cpu_usage_idle"},
+	}
+
+	passes := []string{
+		"foo",
+		"foo_bar",
+		"foo.bar",
+		"foo-bar",
+		"cpu_usage_idle",
+	}
+
+	drops := []string{
+		"bar",
+		"barfoo",
+		"bar_foo",
+		"cpu_usage_busy",
+	}
+
+	for _, measurement := range passes {
+		if !f.ShouldPass(measurement) {
+			t.Errorf("Expected measurement %s to pass", measurement)
+		}
+	}
+
+	for _, measurement := range drops {
+		if f.ShouldPass(measurement) {
+			t.Errorf("Expected measurement %s to drop", measurement)
+		}
+	}
+}
+
+func TestFilter_Drop(t *testing.T) {
+	f := Filter{
+		Drop: []string{"foo*", "cpu_usage_idle"},
+	}
+
+	drops := []string{
+		"foo",
+		"foo_bar",
+		"foo.bar",
+		"foo-bar",
+		"cpu_usage_idle",
+	}
+
+	passes := []string{
+		"bar",
+		"barfoo",
+		"bar_foo",
+		"cpu_usage_busy",
+	}
+
+	for _, measurement := range passes {
+		if !f.ShouldPass(measurement) {
+			t.Errorf("Expected measurement %s to pass", measurement)
+		}
+	}
+
+	for _, measurement := range drops {
+		if f.ShouldPass(measurement) {
+			t.Errorf("Expected measurement %s to drop", measurement)
+		}
+	}
+}
+
+func TestFilter_TagPass(t *testing.T) {
+	filters := []TagFilter{
+		TagFilter{
+			Name:   "cpu",
+			Filter: []string{"cpu-*"},
+		},
+		TagFilter{
+			Name:   "mem",
+			Filter: []string{"mem_free"},
+		}}
+	f := Filter{
+		TagPass: filters,
+	}
+
+	passes := []map[string]string{
+		{"cpu": "cpu-total"},
+		{"cpu": "cpu-0"},
+		{"cpu": "cpu-1"},
+		{"cpu": "cpu-2"},
+		{"mem": "mem_free"},
+	}
+
+	drops := []map[string]string{
+		{"cpu": "cputotal"},
+		{"cpu": "cpu0"},
+		{"cpu": "cpu1"},
+		{"cpu": "cpu2"},
+		{"mem": "mem_used"},
+	}
+
+	for _, tags := range passes {
+		if !f.ShouldTagsPass(tags) {
+			t.Errorf("Expected tags %v to pass", tags)
+		}
+	}
+
+	for _, tags := range drops {
+		if f.ShouldTagsPass(tags) {
+			t.Errorf("Expected tags %v to drop", tags)
+		}
+	}
+}
+
+func TestFilter_TagDrop(t *testing.T) {
+	filters := []TagFilter{
+		TagFilter{
+			Name:   "cpu",
+			Filter: []string{"cpu-*"},
+		},
+		TagFilter{
+			Name:   "mem",
+			Filter: []string{"mem_free"},
+		}}
+	f := Filter{
+		TagDrop: filters,
+	}
+
+	drops := []map[string]string{
+		{"cpu": "cpu-total"},
+		{"cpu": "cpu-0"},
+		{"cpu": "cpu-1"},
+		{"cpu": "cpu-2"},
+		{"mem": "mem_free"},
+	}
+
+	passes := []map[string]string{
+		{"cpu": "cputotal"},
+		{"cpu": "cpu0"},
+		{"cpu": "cpu1"},
+		{"cpu": "cpu2"},
+		{"mem": "mem_used"},
+	}
+
+	for _, tags := range passes {
+		if !f.ShouldTagsPass(tags) {
+			t.Errorf("Expected tags %v to pass", tags)
+		}
+	}
+
+	for _, tags := range drops {
+		if f.ShouldTagsPass(tags) {
+			t.Errorf("Expected tags %v to drop", tags)
+		}
+	}
+}
diff --git a/internal/models/running_input.go b/internal/models/running_input.go
new file mode 100644
index 0000000000000000000000000000000000000000..17c0d2129d17b95d8e8ffb82be65f2771ef96bef
--- /dev/null
+++ b/internal/models/running_input.go
@@ -0,0 +1,24 @@
+package models
+
+import (
+	"time"
+
+	"github.com/influxdata/telegraf/plugins/inputs"
+)
+
+type RunningInput struct {
+	Name   string
+	Input  inputs.Input
+	Config *InputConfig
+}
+
+// InputConfig containing a name, interval, and filter
+type InputConfig struct {
+	Name              string
+	NameOverride      string
+	MeasurementPrefix string
+	MeasurementSuffix string
+	Tags              map[string]string
+	Filter            Filter
+	Interval          time.Duration
+}
diff --git a/internal/models/running_output.go b/internal/models/running_output.go
new file mode 100644
index 0000000000000000000000000000000000000000..196ebdc8aeaf82f27ce3f6c8ad997278dbeeb3ed
--- /dev/null
+++ b/internal/models/running_output.go
@@ -0,0 +1,77 @@
+package models
+
+import (
+	"log"
+	"time"
+
+	"github.com/influxdata/telegraf/plugins/outputs"
+
+	"github.com/influxdata/influxdb/client/v2"
+)
+
+const DEFAULT_POINT_BUFFER_LIMIT = 10000
+
+type RunningOutput struct {
+	Name             string
+	Output           outputs.Output
+	Config           *OutputConfig
+	Quiet            bool
+	PointBufferLimit int
+
+	points           []*client.Point
+	overwriteCounter int
+}
+
+func NewRunningOutput(
+	name string,
+	output outputs.Output,
+	conf *OutputConfig,
+) *RunningOutput {
+	ro := &RunningOutput{
+		Name:             name,
+		points:           make([]*client.Point, 0),
+		Output:           output,
+		Config:           conf,
+		PointBufferLimit: DEFAULT_POINT_BUFFER_LIMIT,
+	}
+	return ro
+}
+
+func (ro *RunningOutput) AddPoint(point *client.Point) {
+	if ro.Config.Filter.IsActive {
+		if !ro.Config.Filter.ShouldPointPass(point) {
+			return
+		}
+	}
+
+	if len(ro.points) < ro.PointBufferLimit {
+		ro.points = append(ro.points, point)
+	} else {
+		if ro.overwriteCounter == len(ro.points) {
+			ro.overwriteCounter = 0
+		}
+		ro.points[ro.overwriteCounter] = point
+		ro.overwriteCounter++
+	}
+}
+
+func (ro *RunningOutput) Write() error {
+	start := time.Now()
+	err := ro.Output.Write(ro.points)
+	elapsed := time.Since(start)
+	if err == nil {
+		if !ro.Quiet {
+			log.Printf("Wrote %d metrics to output %s in %s\n",
+				len(ro.points), ro.Name, elapsed)
+		}
+		ro.points = make([]*client.Point, 0)
+		ro.overwriteCounter = 0
+	}
+	return err
+}
+
+// OutputConfig containing name and filter
+type OutputConfig struct {
+	Name   string
+	Filter Filter
+}
diff --git a/plugins/inputs/aerospike/aerospike.go b/plugins/inputs/aerospike/aerospike.go
index 5f847ebfab42fac7dad4ab5773c890ff314e6362..aa015a4c0dad8e338d2bf292bb2ed89316052ce4 100644
--- a/plugins/inputs/aerospike/aerospike.go
+++ b/plugins/inputs/aerospike/aerospike.go
@@ -4,7 +4,7 @@ import (
 	"bytes"
 	"encoding/binary"
 	"fmt"
-	"github.com/influxdb/telegraf/plugins/inputs"
+	"github.com/influxdata/telegraf/plugins/inputs"
 	"net"
 	"strconv"
 	"strings"
diff --git a/plugins/inputs/aerospike/aerospike_test.go b/plugins/inputs/aerospike/aerospike_test.go
index 3f4d909a2f2c1fbcbbf6f41d27acafe9780a61f8..74b70eb1df4c0810705c1c9c74a67124fb74e3f0 100644
--- a/plugins/inputs/aerospike/aerospike_test.go
+++ b/plugins/inputs/aerospike/aerospike_test.go
@@ -4,7 +4,7 @@ import (
 	"reflect"
 	"testing"
 
-	"github.com/influxdb/telegraf/testutil"
+	"github.com/influxdata/telegraf/testutil"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
 )
diff --git a/plugins/inputs/all/all.go b/plugins/inputs/all/all.go
index fc0cbe0eb2a61771b40c7102caab49c4f7d888d7..fb2d681a6493d10ec00a25c3c366b8a9f8de5cfe 100644
--- a/plugins/inputs/all/all.go
+++ b/plugins/inputs/all/all.go
@@ -1,41 +1,42 @@
 package all
 
 import (
-	_ "github.com/influxdb/telegraf/plugins/inputs/aerospike"
-	_ "github.com/influxdb/telegraf/plugins/inputs/apache"
-	_ "github.com/influxdb/telegraf/plugins/inputs/bcache"
-	_ "github.com/influxdb/telegraf/plugins/inputs/disque"
-	_ "github.com/influxdb/telegraf/plugins/inputs/elasticsearch"
-	_ "github.com/influxdb/telegraf/plugins/inputs/exec"
+	_ "github.com/influxdata/telegraf/plugins/inputs/aerospike"
+	_ "github.com/influxdata/telegraf/plugins/inputs/apache"
+	_ "github.com/influxdata/telegraf/plugins/inputs/bcache"
+	_ "github.com/influxdata/telegraf/plugins/inputs/disque"
+	_ "github.com/influxdata/telegraf/plugins/inputs/docker"
+	_ "github.com/influxdata/telegraf/plugins/inputs/elasticsearch"
+	_ "github.com/influxdata/telegraf/plugins/inputs/exec"
+	_ "github.com/influxdata/telegraf/plugins/inputs/haproxy"
+	_ "github.com/influxdata/telegraf/plugins/inputs/httpjson"
+	_ "github.com/influxdata/telegraf/plugins/inputs/influxdb"
+	_ "github.com/influxdata/telegraf/plugins/inputs/jolokia"
+	_ "github.com/influxdata/telegraf/plugins/inputs/kafka_consumer"
+	_ "github.com/influxdata/telegraf/plugins/inputs/leofs"
+	_ "github.com/influxdata/telegraf/plugins/inputs/lustre2"
+	_ "github.com/influxdata/telegraf/plugins/inputs/mailchimp"
+	_ "github.com/influxdata/telegraf/plugins/inputs/memcached"
+	_ "github.com/influxdata/telegraf/plugins/inputs/mongodb"
+	_ "github.com/influxdata/telegraf/plugins/inputs/mysql"
+	_ "github.com/influxdata/telegraf/plugins/inputs/nginx"
+	_ "github.com/influxdata/telegraf/plugins/inputs/nsq"
+	_ "github.com/influxdata/telegraf/plugins/inputs/passenger"
+	_ "github.com/influxdata/telegraf/plugins/inputs/phpfpm"
+	_ "github.com/influxdata/telegraf/plugins/inputs/ping"
+	_ "github.com/influxdata/telegraf/plugins/inputs/postgresql"
+	_ "github.com/influxdata/telegraf/plugins/inputs/procstat"
+	_ "github.com/influxdata/telegraf/plugins/inputs/prometheus"
+	_ "github.com/influxdata/telegraf/plugins/inputs/puppetagent"
+	_ "github.com/influxdata/telegraf/plugins/inputs/rabbitmq"
+	_ "github.com/influxdata/telegraf/plugins/inputs/redis"
+	_ "github.com/influxdata/telegraf/plugins/inputs/rethinkdb"
+	_ "github.com/influxdata/telegraf/plugins/inputs/sensors"
+	_ "github.com/influxdata/telegraf/plugins/inputs/statsd"
+	_ "github.com/influxdata/telegraf/plugins/inputs/system"
+	_ "github.com/influxdata/telegraf/plugins/inputs/trig"
+	_ "github.com/influxdata/telegraf/plugins/inputs/twemproxy"
+	_ "github.com/influxdata/telegraf/plugins/inputs/zfs"
+	_ "github.com/influxdata/telegraf/plugins/inputs/zookeeper"
 	_ "github.com/influxdb/telegraf/plugins/inputs/ghwebhooks"
-	_ "github.com/influxdb/telegraf/plugins/inputs/haproxy"
-	_ "github.com/influxdb/telegraf/plugins/inputs/httpjson"
-	_ "github.com/influxdb/telegraf/plugins/inputs/influxdb"
-	_ "github.com/influxdb/telegraf/plugins/inputs/jolokia"
-	_ "github.com/influxdb/telegraf/plugins/inputs/kafka_consumer"
-	_ "github.com/influxdb/telegraf/plugins/inputs/leofs"
-	_ "github.com/influxdb/telegraf/plugins/inputs/lustre2"
-	_ "github.com/influxdb/telegraf/plugins/inputs/mailchimp"
-	_ "github.com/influxdb/telegraf/plugins/inputs/memcached"
-	_ "github.com/influxdb/telegraf/plugins/inputs/mongodb"
-	_ "github.com/influxdb/telegraf/plugins/inputs/mysql"
-	_ "github.com/influxdb/telegraf/plugins/inputs/nginx"
-	_ "github.com/influxdb/telegraf/plugins/inputs/nsq"
-	_ "github.com/influxdb/telegraf/plugins/inputs/passenger"
-	_ "github.com/influxdb/telegraf/plugins/inputs/phpfpm"
-	_ "github.com/influxdb/telegraf/plugins/inputs/ping"
-	_ "github.com/influxdb/telegraf/plugins/inputs/postgresql"
-	_ "github.com/influxdb/telegraf/plugins/inputs/procstat"
-	_ "github.com/influxdb/telegraf/plugins/inputs/prometheus"
-	_ "github.com/influxdb/telegraf/plugins/inputs/puppetagent"
-	_ "github.com/influxdb/telegraf/plugins/inputs/rabbitmq"
-	_ "github.com/influxdb/telegraf/plugins/inputs/redis"
-	_ "github.com/influxdb/telegraf/plugins/inputs/rethinkdb"
-	_ "github.com/influxdb/telegraf/plugins/inputs/sensors"
-	_ "github.com/influxdb/telegraf/plugins/inputs/statsd"
-	_ "github.com/influxdb/telegraf/plugins/inputs/system"
-	_ "github.com/influxdb/telegraf/plugins/inputs/trig"
-	_ "github.com/influxdb/telegraf/plugins/inputs/twemproxy"
-	_ "github.com/influxdb/telegraf/plugins/inputs/zfs"
-	_ "github.com/influxdb/telegraf/plugins/inputs/zookeeper"
 )
diff --git a/plugins/inputs/apache/apache.go b/plugins/inputs/apache/apache.go
index f48bac3361e44ea07fb53063a633cbbac913753b..317a635d3c0c71c90b66cd432d4861d914627c86 100644
--- a/plugins/inputs/apache/apache.go
+++ b/plugins/inputs/apache/apache.go
@@ -11,7 +11,7 @@ import (
 	"sync"
 	"time"
 
-	"github.com/influxdb/telegraf/plugins/inputs"
+	"github.com/influxdata/telegraf/plugins/inputs"
 )
 
 type Apache struct {
diff --git a/plugins/inputs/apache/apache_test.go b/plugins/inputs/apache/apache_test.go
index 16c31997488d91a98355d0dea67b28ce38a87c4f..8eed61ca61d858c85d60dd639af461d1d12b862a 100644
--- a/plugins/inputs/apache/apache_test.go
+++ b/plugins/inputs/apache/apache_test.go
@@ -6,7 +6,7 @@ import (
 	"net/http/httptest"
 	"testing"
 
-	"github.com/influxdb/telegraf/testutil"
+	"github.com/influxdata/telegraf/testutil"
 
 	"github.com/stretchr/testify/require"
 )
diff --git a/plugins/inputs/bcache/bcache.go b/plugins/inputs/bcache/bcache.go
index 146849eef047788eb638e77d44b4504a69caff33..b6d6eb130638cfb544700a650dc46131bfcfb810 100644
--- a/plugins/inputs/bcache/bcache.go
+++ b/plugins/inputs/bcache/bcache.go
@@ -8,7 +8,7 @@ import (
 	"strconv"
 	"strings"
 
-	"github.com/influxdb/telegraf/plugins/inputs"
+	"github.com/influxdata/telegraf/plugins/inputs"
 )
 
 type Bcache struct {
diff --git a/plugins/inputs/bcache/bcache_test.go b/plugins/inputs/bcache/bcache_test.go
index 0f34d016ba4742f7c4bfc5f6163e725420f677e9..bd191528fd01420dbe574a55af852ec1b47f732b 100644
--- a/plugins/inputs/bcache/bcache_test.go
+++ b/plugins/inputs/bcache/bcache_test.go
@@ -5,7 +5,7 @@ import (
 	"os"
 	"testing"
 
-	"github.com/influxdb/telegraf/testutil"
+	"github.com/influxdata/telegraf/testutil"
 	"github.com/stretchr/testify/require"
 )
 
diff --git a/plugins/inputs/disque/disque.go b/plugins/inputs/disque/disque.go
index 334fdd554393037714f013d161f9f9c3f54d467c..364e78fbce3524d799037523368ae5b4c9d35ab2 100644
--- a/plugins/inputs/disque/disque.go
+++ b/plugins/inputs/disque/disque.go
@@ -10,7 +10,7 @@ import (
 	"strings"
 	"sync"
 
-	"github.com/influxdb/telegraf/plugins/inputs"
+	"github.com/influxdata/telegraf/plugins/inputs"
 )
 
 type Disque struct {
diff --git a/plugins/inputs/disque/disque_test.go b/plugins/inputs/disque/disque_test.go
index 91c7dc97950d51ae349454abdc7da0cb7cb4b303..f060e956845b3e718dc88aa41a90c6dc01e35c21 100644
--- a/plugins/inputs/disque/disque_test.go
+++ b/plugins/inputs/disque/disque_test.go
@@ -6,7 +6,7 @@ import (
 	"net"
 	"testing"
 
-	"github.com/influxdb/telegraf/testutil"
+	"github.com/influxdata/telegraf/testutil"
 	"github.com/stretchr/testify/require"
 )
 
diff --git a/plugins/inputs/docker/README.md b/plugins/inputs/docker/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..fa662ca804adba332784534aff00fd9c725db3cb
--- /dev/null
+++ b/plugins/inputs/docker/README.md
@@ -0,0 +1,148 @@
+# Docker Input Plugin
+
+The docker plugin uses the docker remote API to gather metrics on running
+docker containers. You can read Docker's documentation for their remote API
+[here](https://docs.docker.com/engine/reference/api/docker_remote_api_v1.20/#get-container-stats-based-on-resource-usage)
+
+The docker plugin uses the excellent
+[fsouza go-dockerclient](https://github.com/fsouza/go-dockerclient) library to
+gather stats. Documentation for the library can be found
+[here](https://godoc.org/github.com/fsouza/go-dockerclient) and documentation
+for the stat structure can be found
+[here](https://godoc.org/github.com/fsouza/go-dockerclient#Stats)
+
+### Configuration:
+
+```
+# Read metrics about docker containers
+[[inputs.docker]]
+  # Docker Endpoint
+  #   To use TCP, set endpoint = "tcp://[ip]:[port]"
+  #   To use environment variables (ie, docker-machine), set endpoint = "ENV"
+  endpoint = "unix:///var/run/docker.sock"
+  # Only collect metrics for these containers, collect all if empty
+  container_names = []
+```
+
+### Measurements & Fields:
+
+Every effort was made to preserve the names based on the JSON response from the
+docker API.
+
+Note that the docker_cpu metric may appear multiple times per collection, based
+on the availability of per-cpu stats on your system.
+
+- docker_mem
+    - total_pgmafault
+    - cache
+    - mapped_file
+    - total_inactive_file
+    - pgpgout
+    - rss
+    - total_mapped_file
+    - writeback
+    - unevictable
+    - pgpgin
+    - total_unevictable
+    - pgmajfault
+    - total_rss
+    - total_rss_huge
+    - total_writeback
+    - total_inactive_anon
+    - rss_huge
+    - hierarchical_memory_limit
+    - total_pgfault
+    - total_active_file
+    - active_anon
+    - total_active_anon
+    - total_pgpgout
+    - total_cache
+    - inactive_anon
+    - active_file
+    - pgfault
+    - inactive_file
+    - total_pgpgin
+    - max_usage
+    - usage
+    - failcnt
+    - limit
+- docker_cpu
+    - throttling_periods
+    - throttling_throttled_periods
+    - throttling_throttled_time
+    - usage_in_kernelmode
+    - usage_in_usermode
+    - usage_system
+    - usage_total
+- docker_net
+    - rx_dropped
+    - rx_bytes
+    - rx_errors
+    - tx_packets
+    - tx_dropped
+    - rx_packets
+    - tx_errors
+    - tx_bytes
+- docker_blkio
+    - io_service_bytes_recursive_async
+    - io_service_bytes_recursive_read
+    - io_service_bytes_recursive_sync
+    - io_service_bytes_recursive_total
+    - io_service_bytes_recursive_write
+    - io_serviced_recursive_async
+    - io_serviced_recursive_read
+    - io_serviced_recursive_sync
+    - io_serviced_recursive_total
+    - io_serviced_recursive_write
+
+### Tags:
+
+- All stats have the following tags:
+    - cont_id (container ID)
+    - cont_image (container image)
+    - cont_name (container name)
+- docker_cpu specific:
+    - cpu
+- docker_net specific:
+    - network
+- docker_blkio specific:
+    - device
+
+### Example Output:
+
+```
+% ./telegraf -config ~/ws/telegraf.conf -input-filter docker -test
+* Plugin: docker, Collection 1
+> docker_mem,cont_id=5705ba8ed8fb47527410653d60a8bb2f3af5e62372297c419022a3cc6d45d848,\
+cont_image=spotify/kafka,cont_name=kafka \
+active_anon=52568064i,active_file=6926336i,cache=12038144i,fail_count=0i,\
+hierarchical_memory_limit=9223372036854771712i,inactive_anon=52707328i,\
+inactive_file=5111808i,limit=1044578304i,mapped_file=10301440i,\
+max_usage=140656640i,pgfault=63762i,pgmajfault=2837i,pgpgin=73355i,\
+pgpgout=45736i,rss=105275392i,rss_huge=4194304i,total_active_anon=52568064i,\
+total_active_file=6926336i,total_cache=12038144i,total_inactive_anon=52707328i,\
+total_inactive_file=5111808i,total_mapped_file=10301440i,total_pgfault=63762i,\
+total_pgmafault=0i,total_pgpgin=73355i,total_pgpgout=45736i,\
+total_rss=105275392i,total_rss_huge=4194304i,total_unevictable=0i,\
+total_writeback=0i,unevictable=0i,usage=117440512i,writeback=0i 1453409536840126713
+> docker_cpu,cont_id=5705ba8ed8fb47527410653d60a8bb2f3af5e62372297c419022a3cc6d45d848,\
+cont_image=spotify/kafka,cont_name=kafka,cpu=cpu-total \
+throttling_periods=0i,throttling_throttled_periods=0i,\
+throttling_throttled_time=0i,usage_in_kernelmode=440000000i,\
+usage_in_usermode=2290000000i,usage_system=84795360000000i,\
+usage_total=6628208865i 1453409536840126713
+> docker_cpu,cont_id=5705ba8ed8fb47527410653d60a8bb2f3af5e62372297c419022a3cc6d45d848,\
+cont_image=spotify/kafka,cont_name=kafka,cpu=cpu0 \
+usage_total=6628208865i 1453409536840126713
+> docker_net,cont_id=5705ba8ed8fb47527410653d60a8bb2f3af5e62372297c419022a3cc6d45d848,\
+cont_image=spotify/kafka,cont_name=kafka,network=eth0 \
+rx_bytes=7468i,rx_dropped=0i,rx_errors=0i,rx_packets=94i,tx_bytes=946i,\
+tx_dropped=0i,tx_errors=0i,tx_packets=13i 1453409536840126713
+> docker_blkio,cont_id=5705ba8ed8fb47527410653d60a8bb2f3af5e62372297c419022a3cc6d45d848,\
+cont_image=spotify/kafka,cont_name=kafka,device=8:0 \
+io_service_bytes_recursive_async=80216064i,io_service_bytes_recursive_read=79925248i,\
+io_service_bytes_recursive_sync=77824i,io_service_bytes_recursive_total=80293888i,\
+io_service_bytes_recursive_write=368640i,io_serviced_recursive_async=6562i,\
+io_serviced_recursive_read=6492i,io_serviced_recursive_sync=37i,\
+io_serviced_recursive_total=6599i,io_serviced_recursive_write=107i 1453409536840126713
+```
diff --git a/plugins/inputs/docker/docker.go b/plugins/inputs/docker/docker.go
new file mode 100644
index 0000000000000000000000000000000000000000..0e96dd1764d1ce073ec2f9bb05d85095cd262de7
--- /dev/null
+++ b/plugins/inputs/docker/docker.go
@@ -0,0 +1,309 @@
+package system
+
+import (
+	"fmt"
+	"strings"
+	"sync"
+	"time"
+
+	"github.com/influxdata/telegraf/plugins/inputs"
+
+	"github.com/fsouza/go-dockerclient"
+)
+
+type Docker struct {
+	Endpoint       string
+	ContainerNames []string
+
+	client *docker.Client
+}
+
+var sampleConfig = `
+  # Docker Endpoint
+  #   To use TCP, set endpoint = "tcp://[ip]:[port]"
+  #   To use environment variables (ie, docker-machine), set endpoint = "ENV"
+  endpoint = "unix:///var/run/docker.sock"
+  # Only collect metrics for these containers, collect all if empty
+  container_names = []
+`
+
+func (d *Docker) Description() string {
+	return "Read metrics about docker containers"
+}
+
+func (d *Docker) SampleConfig() string { return sampleConfig }
+
+func (d *Docker) Gather(acc inputs.Accumulator) error {
+	if d.client == nil {
+		var c *docker.Client
+		var err error
+		if d.Endpoint == "ENV" {
+			c, err = docker.NewClientFromEnv()
+			if err != nil {
+				return err
+			}
+		} else if d.Endpoint == "" {
+			c, err = docker.NewClient("unix:///var/run/docker.sock")
+			if err != nil {
+				return err
+			}
+		} else {
+			c, err = docker.NewClient(d.Endpoint)
+			if err != nil {
+				return err
+			}
+		}
+		d.client = c
+	}
+
+	opts := docker.ListContainersOptions{}
+	containers, err := d.client.ListContainers(opts)
+	if err != nil {
+		return err
+	}
+
+	var wg sync.WaitGroup
+	wg.Add(len(containers))
+	for _, container := range containers {
+		go func(c docker.APIContainers) {
+			defer wg.Done()
+			err := d.gatherContainer(c, acc)
+			if err != nil {
+				fmt.Println(err.Error())
+			}
+		}(container)
+	}
+	wg.Wait()
+
+	return nil
+}
+
+func (d *Docker) gatherContainer(
+	container docker.APIContainers,
+	acc inputs.Accumulator,
+) error {
+	// Parse container name
+	cname := "unknown"
+	if len(container.Names) > 0 {
+		// Not sure what to do with other names, just take the first.
+		cname = strings.TrimPrefix(container.Names[0], "/")
+	}
+
+	tags := map[string]string{
+		"cont_id":    container.ID,
+		"cont_name":  cname,
+		"cont_image": container.Image,
+	}
+	if len(d.ContainerNames) > 0 {
+		if !sliceContains(cname, d.ContainerNames) {
+			return nil
+		}
+	}
+
+	statChan := make(chan *docker.Stats)
+	done := make(chan bool)
+	statOpts := docker.StatsOptions{
+		Stream:  false,
+		ID:      container.ID,
+		Stats:   statChan,
+		Done:    done,
+		Timeout: time.Duration(time.Second * 5),
+	}
+
+	go func() {
+		d.client.Stats(statOpts)
+	}()
+
+	stat := <-statChan
+	close(done)
+
+	// Add labels to tags
+	for k, v := range container.Labels {
+		tags[k] = v
+	}
+
+	gatherContainerStats(stat, acc, tags)
+
+	return nil
+}
+
+func gatherContainerStats(
+	stat *docker.Stats,
+	acc inputs.Accumulator,
+	tags map[string]string,
+) {
+	now := stat.Read
+
+	memfields := map[string]interface{}{
+		"max_usage":                 stat.MemoryStats.MaxUsage,
+		"usage":                     stat.MemoryStats.Usage,
+		"fail_count":                stat.MemoryStats.Failcnt,
+		"limit":                     stat.MemoryStats.Limit,
+		"total_pgmafault":           stat.MemoryStats.Stats.TotalPgmafault,
+		"cache":                     stat.MemoryStats.Stats.Cache,
+		"mapped_file":               stat.MemoryStats.Stats.MappedFile,
+		"total_inactive_file":       stat.MemoryStats.Stats.TotalInactiveFile,
+		"pgpgout":                   stat.MemoryStats.Stats.Pgpgout,
+		"rss":                       stat.MemoryStats.Stats.Rss,
+		"total_mapped_file":         stat.MemoryStats.Stats.TotalMappedFile,
+		"writeback":                 stat.MemoryStats.Stats.Writeback,
+		"unevictable":               stat.MemoryStats.Stats.Unevictable,
+		"pgpgin":                    stat.MemoryStats.Stats.Pgpgin,
+		"total_unevictable":         stat.MemoryStats.Stats.TotalUnevictable,
+		"pgmajfault":                stat.MemoryStats.Stats.Pgmajfault,
+		"total_rss":                 stat.MemoryStats.Stats.TotalRss,
+		"total_rss_huge":            stat.MemoryStats.Stats.TotalRssHuge,
+		"total_writeback":           stat.MemoryStats.Stats.TotalWriteback,
+		"total_inactive_anon":       stat.MemoryStats.Stats.TotalInactiveAnon,
+		"rss_huge":                  stat.MemoryStats.Stats.RssHuge,
+		"hierarchical_memory_limit": stat.MemoryStats.Stats.HierarchicalMemoryLimit,
+		"total_pgfault":             stat.MemoryStats.Stats.TotalPgfault,
+		"total_active_file":         stat.MemoryStats.Stats.TotalActiveFile,
+		"active_anon":               stat.MemoryStats.Stats.ActiveAnon,
+		"total_active_anon":         stat.MemoryStats.Stats.TotalActiveAnon,
+		"total_pgpgout":             stat.MemoryStats.Stats.TotalPgpgout,
+		"total_cache":               stat.MemoryStats.Stats.TotalCache,
+		"inactive_anon":             stat.MemoryStats.Stats.InactiveAnon,
+		"active_file":               stat.MemoryStats.Stats.ActiveFile,
+		"pgfault":                   stat.MemoryStats.Stats.Pgfault,
+		"inactive_file":             stat.MemoryStats.Stats.InactiveFile,
+		"total_pgpgin":              stat.MemoryStats.Stats.TotalPgpgin,
+	}
+	acc.AddFields("docker_mem", memfields, tags, now)
+
+	cpufields := map[string]interface{}{
+		"usage_total":                  stat.CPUStats.CPUUsage.TotalUsage,
+		"usage_in_usermode":            stat.CPUStats.CPUUsage.UsageInUsermode,
+		"usage_in_kernelmode":          stat.CPUStats.CPUUsage.UsageInKernelmode,
+		"usage_system":                 stat.CPUStats.SystemCPUUsage,
+		"throttling_periods":           stat.CPUStats.ThrottlingData.Periods,
+		"throttling_throttled_periods": stat.CPUStats.ThrottlingData.ThrottledPeriods,
+		"throttling_throttled_time":    stat.CPUStats.ThrottlingData.ThrottledTime,
+	}
+	cputags := copyTags(tags)
+	cputags["cpu"] = "cpu-total"
+	acc.AddFields("docker_cpu", cpufields, cputags, now)
+
+	for i, percpu := range stat.CPUStats.CPUUsage.PercpuUsage {
+		percputags := copyTags(tags)
+		percputags["cpu"] = fmt.Sprintf("cpu%d", i)
+		acc.AddFields("docker_cpu", map[string]interface{}{"usage_total": percpu}, percputags, now)
+	}
+
+	for network, netstats := range stat.Networks {
+		netfields := map[string]interface{}{
+			"rx_dropped": netstats.RxDropped,
+			"rx_bytes":   netstats.RxBytes,
+			"rx_errors":  netstats.RxErrors,
+			"tx_packets": netstats.TxPackets,
+			"tx_dropped": netstats.TxDropped,
+			"rx_packets": netstats.RxPackets,
+			"tx_errors":  netstats.TxErrors,
+			"tx_bytes":   netstats.TxBytes,
+		}
+		// Create a new network tag dictionary for the "network" tag
+		nettags := copyTags(tags)
+		nettags["network"] = network
+		acc.AddFields("docker_net", netfields, nettags, now)
+	}
+
+	gatherBlockIOMetrics(stat, acc, tags, now)
+}
+
+func gatherBlockIOMetrics(
+	stat *docker.Stats,
+	acc inputs.Accumulator,
+	tags map[string]string,
+	now time.Time,
+) {
+	blkioStats := stat.BlkioStats
+	// Make a map of devices to their block io stats
+	deviceStatMap := make(map[string]map[string]interface{})
+
+	for _, metric := range blkioStats.IOServiceBytesRecursive {
+		device := fmt.Sprintf("%d:%d", metric.Major, metric.Minor)
+		_, ok := deviceStatMap[device]
+		if !ok {
+			deviceStatMap[device] = make(map[string]interface{})
+		}
+
+		field := fmt.Sprintf("io_service_bytes_recursive_%s", strings.ToLower(metric.Op))
+		deviceStatMap[device][field] = metric.Value
+	}
+
+	for _, metric := range blkioStats.IOServicedRecursive {
+		device := fmt.Sprintf("%d:%d", metric.Major, metric.Minor)
+		_, ok := deviceStatMap[device]
+		if !ok {
+			deviceStatMap[device] = make(map[string]interface{})
+		}
+
+		field := fmt.Sprintf("io_serviced_recursive_%s", strings.ToLower(metric.Op))
+		deviceStatMap[device][field] = metric.Value
+	}
+
+	for _, metric := range blkioStats.IOQueueRecursive {
+		device := fmt.Sprintf("%d:%d", metric.Major, metric.Minor)
+		field := fmt.Sprintf("io_queue_recursive_%s", strings.ToLower(metric.Op))
+		deviceStatMap[device][field] = metric.Value
+	}
+
+	for _, metric := range blkioStats.IOServiceTimeRecursive {
+		device := fmt.Sprintf("%d:%d", metric.Major, metric.Minor)
+		field := fmt.Sprintf("io_service_time_recursive_%s", strings.ToLower(metric.Op))
+		deviceStatMap[device][field] = metric.Value
+	}
+
+	for _, metric := range blkioStats.IOWaitTimeRecursive {
+		device := fmt.Sprintf("%d:%d", metric.Major, metric.Minor)
+		field := fmt.Sprintf("io_wait_time_%s", strings.ToLower(metric.Op))
+		deviceStatMap[device][field] = metric.Value
+	}
+
+	for _, metric := range blkioStats.IOMergedRecursive {
+		device := fmt.Sprintf("%d:%d", metric.Major, metric.Minor)
+		field := fmt.Sprintf("io_merged_recursive_%s", strings.ToLower(metric.Op))
+		deviceStatMap[device][field] = metric.Value
+	}
+
+	for _, metric := range blkioStats.IOTimeRecursive {
+		device := fmt.Sprintf("%d:%d", metric.Major, metric.Minor)
+		field := fmt.Sprintf("io_time_recursive_%s", strings.ToLower(metric.Op))
+		deviceStatMap[device][field] = metric.Value
+	}
+
+	for _, metric := range blkioStats.SectorsRecursive {
+		device := fmt.Sprintf("%d:%d", metric.Major, metric.Minor)
+		field := fmt.Sprintf("sectors_recursive_%s", strings.ToLower(metric.Op))
+		deviceStatMap[device][field] = metric.Value
+	}
+
+	for device, fields := range deviceStatMap {
+		iotags := copyTags(tags)
+		iotags["device"] = device
+		acc.AddFields("docker_blkio", fields, iotags, now)
+	}
+}
+
+func copyTags(in map[string]string) map[string]string {
+	out := make(map[string]string)
+	for k, v := range in {
+		out[k] = v
+	}
+	return out
+}
+
+func sliceContains(in string, sl []string) bool {
+	for _, str := range sl {
+		if str == in {
+			return true
+		}
+	}
+	return false
+}
+
+func init() {
+	inputs.Add("docker", func() inputs.Input {
+		return &Docker{}
+	})
+}
diff --git a/plugins/inputs/docker/docker_test.go b/plugins/inputs/docker/docker_test.go
new file mode 100644
index 0000000000000000000000000000000000000000..9b85d1029b568952111d4f47f0edf6afbe7f3830
--- /dev/null
+++ b/plugins/inputs/docker/docker_test.go
@@ -0,0 +1,190 @@
+package system
+
+import (
+	"testing"
+	"time"
+
+	"github.com/influxdata/telegraf/testutil"
+
+	"github.com/fsouza/go-dockerclient"
+)
+
+func TestDockerGatherContainerStats(t *testing.T) {
+	var acc testutil.Accumulator
+	stats := testStats()
+
+	tags := map[string]string{
+		"cont_id":    "foobarbaz",
+		"cont_name":  "redis",
+		"cont_image": "redis/image",
+	}
+	gatherContainerStats(stats, &acc, tags)
+
+	// test docker_net measurement
+	netfields := map[string]interface{}{
+		"rx_dropped": uint64(1),
+		"rx_bytes":   uint64(2),
+		"rx_errors":  uint64(3),
+		"tx_packets": uint64(4),
+		"tx_dropped": uint64(1),
+		"rx_packets": uint64(2),
+		"tx_errors":  uint64(3),
+		"tx_bytes":   uint64(4),
+	}
+	nettags := copyTags(tags)
+	nettags["network"] = "eth0"
+	acc.AssertContainsTaggedFields(t, "docker_net", netfields, nettags)
+
+	// test docker_blkio measurement
+	blkiotags := copyTags(tags)
+	blkiotags["device"] = "6:0"
+	blkiofields := map[string]interface{}{
+		"io_service_bytes_recursive_read": uint64(100),
+		"io_serviced_recursive_write":     uint64(101),
+	}
+	acc.AssertContainsTaggedFields(t, "docker_blkio", blkiofields, blkiotags)
+
+	// test docker_mem measurement
+	memfields := map[string]interface{}{
+		"max_usage":                 uint64(1001),
+		"usage":                     uint64(1111),
+		"fail_count":                uint64(1),
+		"limit":                     uint64(20),
+		"total_pgmafault":           uint64(0),
+		"cache":                     uint64(0),
+		"mapped_file":               uint64(0),
+		"total_inactive_file":       uint64(0),
+		"pgpgout":                   uint64(0),
+		"rss":                       uint64(0),
+		"total_mapped_file":         uint64(0),
+		"writeback":                 uint64(0),
+		"unevictable":               uint64(0),
+		"pgpgin":                    uint64(0),
+		"total_unevictable":         uint64(0),
+		"pgmajfault":                uint64(0),
+		"total_rss":                 uint64(44),
+		"total_rss_huge":            uint64(444),
+		"total_writeback":           uint64(55),
+		"total_inactive_anon":       uint64(0),
+		"rss_huge":                  uint64(0),
+		"hierarchical_memory_limit": uint64(0),
+		"total_pgfault":             uint64(0),
+		"total_active_file":         uint64(0),
+		"active_anon":               uint64(0),
+		"total_active_anon":         uint64(0),
+		"total_pgpgout":             uint64(0),
+		"total_cache":               uint64(0),
+		"inactive_anon":             uint64(0),
+		"active_file":               uint64(1),
+		"pgfault":                   uint64(2),
+		"inactive_file":             uint64(3),
+		"total_pgpgin":              uint64(4),
+	}
+	acc.AssertContainsTaggedFields(t, "docker_mem", memfields, tags)
+
+	// test docker_cpu measurement
+	cputags := copyTags(tags)
+	cputags["cpu"] = "cpu-total"
+	cpufields := map[string]interface{}{
+		"usage_total":                  uint64(500),
+		"usage_in_usermode":            uint64(100),
+		"usage_in_kernelmode":          uint64(200),
+		"usage_system":                 uint64(100),
+		"throttling_periods":           uint64(1),
+		"throttling_throttled_periods": uint64(0),
+		"throttling_throttled_time":    uint64(0),
+	}
+	acc.AssertContainsTaggedFields(t, "docker_cpu", cpufields, cputags)
+
+	cputags["cpu"] = "cpu0"
+	cpu0fields := map[string]interface{}{
+		"usage_total": uint64(1),
+	}
+	acc.AssertContainsTaggedFields(t, "docker_cpu", cpu0fields, cputags)
+
+	cputags["cpu"] = "cpu1"
+	cpu1fields := map[string]interface{}{
+		"usage_total": uint64(1002),
+	}
+	acc.AssertContainsTaggedFields(t, "docker_cpu", cpu1fields, cputags)
+}
+
+func testStats() *docker.Stats {
+	stats := &docker.Stats{
+		Read:     time.Now(),
+		Networks: make(map[string]docker.NetworkStats),
+	}
+
+	stats.CPUStats.CPUUsage.PercpuUsage = []uint64{1, 1002}
+	stats.CPUStats.CPUUsage.UsageInUsermode = 100
+	stats.CPUStats.CPUUsage.TotalUsage = 500
+	stats.CPUStats.CPUUsage.UsageInKernelmode = 200
+	stats.CPUStats.SystemCPUUsage = 100
+	stats.CPUStats.ThrottlingData.Periods = 1
+
+	stats.MemoryStats.Stats.TotalPgmafault = 0
+	stats.MemoryStats.Stats.Cache = 0
+	stats.MemoryStats.Stats.MappedFile = 0
+	stats.MemoryStats.Stats.TotalInactiveFile = 0
+	stats.MemoryStats.Stats.Pgpgout = 0
+	stats.MemoryStats.Stats.Rss = 0
+	stats.MemoryStats.Stats.TotalMappedFile = 0
+	stats.MemoryStats.Stats.Writeback = 0
+	stats.MemoryStats.Stats.Unevictable = 0
+	stats.MemoryStats.Stats.Pgpgin = 0
+	stats.MemoryStats.Stats.TotalUnevictable = 0
+	stats.MemoryStats.Stats.Pgmajfault = 0
+	stats.MemoryStats.Stats.TotalRss = 44
+	stats.MemoryStats.Stats.TotalRssHuge = 444
+	stats.MemoryStats.Stats.TotalWriteback = 55
+	stats.MemoryStats.Stats.TotalInactiveAnon = 0
+	stats.MemoryStats.Stats.RssHuge = 0
+	stats.MemoryStats.Stats.HierarchicalMemoryLimit = 0
+	stats.MemoryStats.Stats.TotalPgfault = 0
+	stats.MemoryStats.Stats.TotalActiveFile = 0
+	stats.MemoryStats.Stats.ActiveAnon = 0
+	stats.MemoryStats.Stats.TotalActiveAnon = 0
+	stats.MemoryStats.Stats.TotalPgpgout = 0
+	stats.MemoryStats.Stats.TotalCache = 0
+	stats.MemoryStats.Stats.InactiveAnon = 0
+	stats.MemoryStats.Stats.ActiveFile = 1
+	stats.MemoryStats.Stats.Pgfault = 2
+	stats.MemoryStats.Stats.InactiveFile = 3
+	stats.MemoryStats.Stats.TotalPgpgin = 4
+
+	stats.MemoryStats.MaxUsage = 1001
+	stats.MemoryStats.Usage = 1111
+	stats.MemoryStats.Failcnt = 1
+	stats.MemoryStats.Limit = 20
+
+	stats.Networks["eth0"] = docker.NetworkStats{
+		RxDropped: 1,
+		RxBytes:   2,
+		RxErrors:  3,
+		TxPackets: 4,
+		TxDropped: 1,
+		RxPackets: 2,
+		TxErrors:  3,
+		TxBytes:   4,
+	}
+
+	sbr := docker.BlkioStatsEntry{
+		Major: 6,
+		Minor: 0,
+		Op:    "read",
+		Value: 100,
+	}
+	sr := docker.BlkioStatsEntry{
+		Major: 6,
+		Minor: 0,
+		Op:    "write",
+		Value: 101,
+	}
+
+	stats.BlkioStats.IOServiceBytesRecursive = append(
+		stats.BlkioStats.IOServiceBytesRecursive, sbr)
+	stats.BlkioStats.IOServicedRecursive = append(
+		stats.BlkioStats.IOServicedRecursive, sr)
+
+	return stats
+}
diff --git a/plugins/inputs/elasticsearch/elasticsearch.go b/plugins/inputs/elasticsearch/elasticsearch.go
index f8185a0535c676eff2acefaafc68f3b2c231d807..304e0e3d7a09821b9dedaf775e6c19c932018f72 100644
--- a/plugins/inputs/elasticsearch/elasticsearch.go
+++ b/plugins/inputs/elasticsearch/elasticsearch.go
@@ -2,12 +2,15 @@ package elasticsearch
 
 import (
 	"encoding/json"
+	"errors"
 	"fmt"
 	"net/http"
+	"strings"
+	"sync"
 	"time"
 
-	"github.com/influxdb/telegraf/internal"
-	"github.com/influxdb/telegraf/plugins/inputs"
+	"github.com/influxdata/telegraf/internal"
+	"github.com/influxdata/telegraf/plugins/inputs"
 )
 
 const statsPath = "/_nodes/stats"
@@ -93,21 +96,41 @@ func (e *Elasticsearch) Description() string {
 // Gather reads the stats from Elasticsearch and writes it to the
 // Accumulator.
 func (e *Elasticsearch) Gather(acc inputs.Accumulator) error {
+	errChan := make(chan error, len(e.Servers))
+	var wg sync.WaitGroup
+	wg.Add(len(e.Servers))
+
 	for _, serv := range e.Servers {
-		var url string
-		if e.Local {
-			url = serv + statsPathLocal
-		} else {
-			url = serv + statsPath
-		}
-		if err := e.gatherNodeStats(url, acc); err != nil {
-			return err
-		}
-		if e.ClusterHealth {
-			e.gatherClusterStats(fmt.Sprintf("%s/_cluster/health?level=indices", serv), acc)
-		}
+		go func(s string, acc inputs.Accumulator) {
+			defer wg.Done()
+			var url string
+			if e.Local {
+				url = s + statsPathLocal
+			} else {
+				url = s + statsPath
+			}
+			if err := e.gatherNodeStats(url, acc); err != nil {
+				errChan <- err
+				return
+			}
+			if e.ClusterHealth {
+				e.gatherClusterStats(fmt.Sprintf("%s/_cluster/health?level=indices", s), acc)
+			}
+		}(serv, acc)
 	}
-	return nil
+
+	wg.Wait()
+	close(errChan)
+	// Get all errors and return them as one giant error
+	errStrings := []string{}
+	for err := range errChan {
+		errStrings = append(errStrings, err.Error())
+	}
+
+	if len(errStrings) == 0 {
+		return nil
+	}
+	return errors.New(strings.Join(errStrings, "\n"))
 }
 
 func (e *Elasticsearch) gatherNodeStats(url string, acc inputs.Accumulator) error {
diff --git a/plugins/inputs/elasticsearch/elasticsearch_test.go b/plugins/inputs/elasticsearch/elasticsearch_test.go
index 62c3cb8fdabbb3f0f35e9e75f2db11d0c1368bbd..f94d3f9ac03f040169c47fec087a8b58c465310d 100644
--- a/plugins/inputs/elasticsearch/elasticsearch_test.go
+++ b/plugins/inputs/elasticsearch/elasticsearch_test.go
@@ -6,7 +6,7 @@ import (
 	"strings"
 	"testing"
 
-	"github.com/influxdb/telegraf/testutil"
+	"github.com/influxdata/telegraf/testutil"
 
 	"github.com/stretchr/testify/require"
 )
diff --git a/plugins/inputs/exec/exec.go b/plugins/inputs/exec/exec.go
index b3c1001f80f62b402b8733248ccaf179212f9b7d..603ba1464a24704b1c319db3b948f203b4805fdd 100644
--- a/plugins/inputs/exec/exec.go
+++ b/plugins/inputs/exec/exec.go
@@ -8,8 +8,8 @@ import (
 
 	"github.com/gonuts/go-shellquote"
 
-	"github.com/influxdb/telegraf/internal"
-	"github.com/influxdb/telegraf/plugins/inputs"
+	"github.com/influxdata/telegraf/internal"
+	"github.com/influxdata/telegraf/plugins/inputs"
 )
 
 const sampleConfig = `
diff --git a/plugins/inputs/exec/exec_test.go b/plugins/inputs/exec/exec_test.go
index 64fd69fce5f03a1331dd9eaddd3ba8392ec3626e..8bf47c1d0fe027a6f9d5f80d8a0313961a813fd8 100644
--- a/plugins/inputs/exec/exec_test.go
+++ b/plugins/inputs/exec/exec_test.go
@@ -4,7 +4,7 @@ import (
 	"fmt"
 	"testing"
 
-	"github.com/influxdb/telegraf/testutil"
+	"github.com/influxdata/telegraf/testutil"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
 )
diff --git a/plugins/inputs/haproxy/haproxy.go b/plugins/inputs/haproxy/haproxy.go
index 23b92fc266a2ea5652d11d23c7e6c236f8d7468f..c2e334424e1093da0343d7cd666b8afb55d9a2ee 100644
--- a/plugins/inputs/haproxy/haproxy.go
+++ b/plugins/inputs/haproxy/haproxy.go
@@ -3,7 +3,7 @@ package haproxy
 import (
 	"encoding/csv"
 	"fmt"
-	"github.com/influxdb/telegraf/plugins/inputs"
+	"github.com/influxdata/telegraf/plugins/inputs"
 	"io"
 	"net/http"
 	"net/url"
diff --git a/plugins/inputs/haproxy/haproxy_test.go b/plugins/inputs/haproxy/haproxy_test.go
index e514bc7adb0a12a24edfed8c135fb3ffb298b9a6..7b86f2b501f4b13dada1bd0593cbd44026673e1f 100644
--- a/plugins/inputs/haproxy/haproxy_test.go
+++ b/plugins/inputs/haproxy/haproxy_test.go
@@ -5,7 +5,7 @@ import (
 	"strings"
 	"testing"
 
-	"github.com/influxdb/telegraf/testutil"
+	"github.com/influxdata/telegraf/testutil"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
 	"net/http"
diff --git a/plugins/inputs/httpjson/httpjson.go b/plugins/inputs/httpjson/httpjson.go
index 5763fd6fab9b07091a4009d911e3220690e4e3ff..b90a02e5b8a91cd6968933e7ae3ef42d36160505 100644
--- a/plugins/inputs/httpjson/httpjson.go
+++ b/plugins/inputs/httpjson/httpjson.go
@@ -11,8 +11,8 @@ import (
 	"sync"
 	"time"
 
-	"github.com/influxdb/telegraf/internal"
-	"github.com/influxdb/telegraf/plugins/inputs"
+	"github.com/influxdata/telegraf/internal"
+	"github.com/influxdata/telegraf/plugins/inputs"
 )
 
 type HttpJson struct {
diff --git a/plugins/inputs/httpjson/httpjson_test.go b/plugins/inputs/httpjson/httpjson_test.go
index 3f14290ffc9d83e2b303a580d6a49ea0292d0803..0ea5e9e425eadea7a00a5b32165e0cf334dab451 100644
--- a/plugins/inputs/httpjson/httpjson_test.go
+++ b/plugins/inputs/httpjson/httpjson_test.go
@@ -6,7 +6,7 @@ import (
 	"strings"
 	"testing"
 
-	"github.com/influxdb/telegraf/testutil"
+	"github.com/influxdata/telegraf/testutil"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
 )
diff --git a/plugins/inputs/influxdb/influxdb.go b/plugins/inputs/influxdb/influxdb.go
index cf5742e1d70b0fbce8167ea03c4c2e84e04a168e..311f6ba0ccaffacf167c4e1cb6b16b8fe2115300 100644
--- a/plugins/inputs/influxdb/influxdb.go
+++ b/plugins/inputs/influxdb/influxdb.go
@@ -8,7 +8,7 @@ import (
 	"strings"
 	"sync"
 
-	"github.com/influxdb/telegraf/plugins/inputs"
+	"github.com/influxdata/telegraf/plugins/inputs"
 )
 
 type InfluxDB struct {
@@ -130,7 +130,7 @@ func (i *InfluxDB) gatherURL(
 		p.Tags["url"] = url
 
 		acc.AddFields(
-			p.Name,
+			"influxdb_"+p.Name,
 			p.Values,
 			p.Tags,
 		)
diff --git a/plugins/inputs/influxdb/influxdb_test.go b/plugins/inputs/influxdb/influxdb_test.go
index 0e02cc6bdf4c34cf8eaa773c616701356b0a8a12..ef6c1a97a647aa1103817f1c2e53572176cf086d 100644
--- a/plugins/inputs/influxdb/influxdb_test.go
+++ b/plugins/inputs/influxdb/influxdb_test.go
@@ -5,8 +5,8 @@ import (
 	"net/http/httptest"
 	"testing"
 
-	"github.com/influxdb/telegraf/plugins/inputs/influxdb"
-	"github.com/influxdb/telegraf/testutil"
+	"github.com/influxdata/telegraf/plugins/inputs/influxdb"
+	"github.com/influxdata/telegraf/testutil"
 	"github.com/stretchr/testify/require"
 )
 
@@ -84,7 +84,7 @@ func TestBasic(t *testing.T) {
 		"id":  "ex1",
 		"url": fakeServer.URL + "/endpoint",
 	}
-	acc.AssertContainsTaggedFields(t, "foo", fields, tags)
+	acc.AssertContainsTaggedFields(t, "influxdb_foo", fields, tags)
 
 	fields = map[string]interface{}{
 		"x": "x",
@@ -93,5 +93,5 @@ func TestBasic(t *testing.T) {
 		"id":  "ex2",
 		"url": fakeServer.URL + "/endpoint",
 	}
-	acc.AssertContainsTaggedFields(t, "bar", fields, tags)
+	acc.AssertContainsTaggedFields(t, "influxdb_bar", fields, tags)
 }
diff --git a/plugins/inputs/jolokia/jolokia.go b/plugins/inputs/jolokia/jolokia.go
index 36811bd2757f827fc926e88d772b8eddabdec020..7579ecb4a1eaf40a131e315ff24c9aa309d109aa 100644
--- a/plugins/inputs/jolokia/jolokia.go
+++ b/plugins/inputs/jolokia/jolokia.go
@@ -8,7 +8,7 @@ import (
 	"net/http"
 	"net/url"
 
-	"github.com/influxdb/telegraf/plugins/inputs"
+	"github.com/influxdata/telegraf/plugins/inputs"
 )
 
 type Server struct {
diff --git a/plugins/inputs/jolokia/jolokia_test.go b/plugins/inputs/jolokia/jolokia_test.go
index d29b8a8103f4ec43bb7c64f37560b3b7e3ad4bfa..63b47ebff60ed8f9056f17345e6335b7926ade31 100644
--- a/plugins/inputs/jolokia/jolokia_test.go
+++ b/plugins/inputs/jolokia/jolokia_test.go
@@ -7,7 +7,7 @@ import (
 	"strings"
 	"testing"
 
-	"github.com/influxdb/telegraf/testutil"
+	"github.com/influxdata/telegraf/testutil"
 	"github.com/stretchr/testify/assert"
 	_ "github.com/stretchr/testify/require"
 )
diff --git a/plugins/inputs/kafka_consumer/kafka_consumer.go b/plugins/inputs/kafka_consumer/kafka_consumer.go
index f3558e2e510b8aaf77d4b40b494836b95f8fd822..a0f1d3d110e979e50c2bf609e4f76ed056bfcae1 100644
--- a/plugins/inputs/kafka_consumer/kafka_consumer.go
+++ b/plugins/inputs/kafka_consumer/kafka_consumer.go
@@ -5,8 +5,8 @@ import (
 	"strings"
 	"sync"
 
-	"github.com/influxdb/influxdb/models"
-	"github.com/influxdb/telegraf/plugins/inputs"
+	"github.com/influxdata/influxdb/models"
+	"github.com/influxdata/telegraf/plugins/inputs"
 
 	"github.com/Shopify/sarama"
 	"github.com/wvanbergen/kafka/consumergroup"
diff --git a/plugins/inputs/kafka_consumer/kafka_consumer_integration_test.go b/plugins/inputs/kafka_consumer/kafka_consumer_integration_test.go
index 9f554d9ab105159623b25fe28f7d25cd896f65c8..0611467ff51730be7d35140e00cc098bceb0dcf2 100644
--- a/plugins/inputs/kafka_consumer/kafka_consumer_integration_test.go
+++ b/plugins/inputs/kafka_consumer/kafka_consumer_integration_test.go
@@ -6,7 +6,7 @@ import (
 	"time"
 
 	"github.com/Shopify/sarama"
-	"github.com/influxdb/telegraf/testutil"
+	"github.com/influxdata/telegraf/testutil"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
 )
diff --git a/plugins/inputs/kafka_consumer/kafka_consumer_test.go b/plugins/inputs/kafka_consumer/kafka_consumer_test.go
index dcd38f6c4e3e36d9a2b8cf5dcc3c5e5339e8d059..560e130c0190ad0469b6d80196f8a5b785763205 100644
--- a/plugins/inputs/kafka_consumer/kafka_consumer_test.go
+++ b/plugins/inputs/kafka_consumer/kafka_consumer_test.go
@@ -4,8 +4,8 @@ import (
 	"testing"
 	"time"
 
-	"github.com/influxdb/influxdb/models"
-	"github.com/influxdb/telegraf/testutil"
+	"github.com/influxdata/influxdb/models"
+	"github.com/influxdata/telegraf/testutil"
 
 	"github.com/Shopify/sarama"
 	"github.com/stretchr/testify/assert"
diff --git a/plugins/inputs/leofs/leofs.go b/plugins/inputs/leofs/leofs.go
index c65db5f3702f2c19e3c0a526d56532da7410abae..f4dd314b7f81527ec224cb22e4719a65199e53b3 100644
--- a/plugins/inputs/leofs/leofs.go
+++ b/plugins/inputs/leofs/leofs.go
@@ -3,7 +3,7 @@ package leofs
 import (
 	"bufio"
 	"fmt"
-	"github.com/influxdb/telegraf/plugins/inputs"
+	"github.com/influxdata/telegraf/plugins/inputs"
 	"net/url"
 	"os/exec"
 	"strconv"
diff --git a/plugins/inputs/leofs/leofs_test.go b/plugins/inputs/leofs/leofs_test.go
index 48a82a18adb9e085ecc8981d8a47457fb6733073..292cd15d0e7387cd8fedc6a2678db6027ac11736 100644
--- a/plugins/inputs/leofs/leofs_test.go
+++ b/plugins/inputs/leofs/leofs_test.go
@@ -1,7 +1,7 @@
 package leofs
 
 import (
-	"github.com/influxdb/telegraf/testutil"
+	"github.com/influxdata/telegraf/testutil"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
 	"io/ioutil"
diff --git a/plugins/inputs/lustre2/lustre2.go b/plugins/inputs/lustre2/lustre2.go
index 90222af79d9bfbd5d31bb15cf375e0384f9b8d23..d6266de73e21472ed52b7ffbf956bc21c26fd322 100644
--- a/plugins/inputs/lustre2/lustre2.go
+++ b/plugins/inputs/lustre2/lustre2.go
@@ -13,8 +13,8 @@ import (
 	"strconv"
 	"strings"
 
-	"github.com/influxdb/telegraf/internal"
-	"github.com/influxdb/telegraf/plugins/inputs"
+	"github.com/influxdata/telegraf/internal"
+	"github.com/influxdata/telegraf/plugins/inputs"
 )
 
 // Lustre proc files can change between versions, so we want to future-proof
diff --git a/plugins/inputs/lustre2/lustre2_test.go b/plugins/inputs/lustre2/lustre2_test.go
index cea98fa1ed67c8a1b66ff1b42879247185b8d1eb..9e560df2cbd8b04df4d1f8cf1c29e5f991a677e2 100644
--- a/plugins/inputs/lustre2/lustre2_test.go
+++ b/plugins/inputs/lustre2/lustre2_test.go
@@ -5,7 +5,7 @@ import (
 	"os"
 	"testing"
 
-	"github.com/influxdb/telegraf/testutil"
+	"github.com/influxdata/telegraf/testutil"
 	"github.com/stretchr/testify/require"
 )
 
diff --git a/plugins/inputs/mailchimp/mailchimp.go b/plugins/inputs/mailchimp/mailchimp.go
index 4b148a95ca8cada93cfe582989742f4472cd7dcc..284ac61e166a82864bd7bcf559320be995fd4897 100644
--- a/plugins/inputs/mailchimp/mailchimp.go
+++ b/plugins/inputs/mailchimp/mailchimp.go
@@ -4,7 +4,7 @@ import (
 	"fmt"
 	"time"
 
-	"github.com/influxdb/telegraf/plugins/inputs"
+	"github.com/influxdata/telegraf/plugins/inputs"
 )
 
 type MailChimp struct {
diff --git a/plugins/inputs/mailchimp/mailchimp_test.go b/plugins/inputs/mailchimp/mailchimp_test.go
index 5e53945813797f7bdaf900b14dbdd9ecc5fcd883..0c4dab56d5d12046a0240d97cae19c00e3c18596 100644
--- a/plugins/inputs/mailchimp/mailchimp_test.go
+++ b/plugins/inputs/mailchimp/mailchimp_test.go
@@ -7,7 +7,7 @@ import (
 	"net/url"
 	"testing"
 
-	"github.com/influxdb/telegraf/testutil"
+	"github.com/influxdata/telegraf/testutil"
 
 	"github.com/stretchr/testify/require"
 )
diff --git a/plugins/inputs/memcached/memcached.go b/plugins/inputs/memcached/memcached.go
index 1d9ee95478f3efcda0f7fa8596fab764dfa4dcba..078f05aa39f0f20ef120d09b1b712f16d06fe635 100644
--- a/plugins/inputs/memcached/memcached.go
+++ b/plugins/inputs/memcached/memcached.go
@@ -8,7 +8,7 @@ import (
 	"strconv"
 	"time"
 
-	"github.com/influxdb/telegraf/plugins/inputs"
+	"github.com/influxdata/telegraf/plugins/inputs"
 )
 
 // Memcached is a memcached plugin
diff --git a/plugins/inputs/memcached/memcached_test.go b/plugins/inputs/memcached/memcached_test.go
index 6e2f8452af995d81c5cbe40e0334ea3001c4f65e..210adffdba587ef305edcd81708ebfe4b650c873 100644
--- a/plugins/inputs/memcached/memcached_test.go
+++ b/plugins/inputs/memcached/memcached_test.go
@@ -5,7 +5,7 @@ import (
 	"strings"
 	"testing"
 
-	"github.com/influxdb/telegraf/testutil"
+	"github.com/influxdata/telegraf/testutil"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
 )
diff --git a/plugins/inputs/mongodb/mongodb.go b/plugins/inputs/mongodb/mongodb.go
index 4cb3ffee56c6f381e5226a583cfb56473ab7a705..ce73c3a14c6d613a7754a59299033d2069779c0f 100644
--- a/plugins/inputs/mongodb/mongodb.go
+++ b/plugins/inputs/mongodb/mongodb.go
@@ -9,7 +9,7 @@ import (
 	"sync"
 	"time"
 
-	"github.com/influxdb/telegraf/plugins/inputs"
+	"github.com/influxdata/telegraf/plugins/inputs"
 	"gopkg.in/mgo.v2"
 )
 
diff --git a/plugins/inputs/mongodb/mongodb_data.go b/plugins/inputs/mongodb/mongodb_data.go
index 15f8c479b194d88a380e7c2ed5836d02723ed485..c0c68c330092e973cb0cd906a4a0027c1f5acd9e 100644
--- a/plugins/inputs/mongodb/mongodb_data.go
+++ b/plugins/inputs/mongodb/mongodb_data.go
@@ -5,7 +5,7 @@ import (
 	"reflect"
 	"strconv"
 
-	"github.com/influxdb/telegraf/plugins/inputs"
+	"github.com/influxdata/telegraf/plugins/inputs"
 )
 
 type MongodbData struct {
diff --git a/plugins/inputs/mongodb/mongodb_data_test.go b/plugins/inputs/mongodb/mongodb_data_test.go
index 5d24a7a09feeffa36f1227e69c7fcd02e09e98dc..3166ab0183a36e42e2fa3f31bef759750517ea9a 100644
--- a/plugins/inputs/mongodb/mongodb_data_test.go
+++ b/plugins/inputs/mongodb/mongodb_data_test.go
@@ -4,7 +4,7 @@ import (
 	"testing"
 	"time"
 
-	"github.com/influxdb/telegraf/testutil"
+	"github.com/influxdata/telegraf/testutil"
 	"github.com/stretchr/testify/assert"
 )
 
diff --git a/plugins/inputs/mongodb/mongodb_server.go b/plugins/inputs/mongodb/mongodb_server.go
index 795cf97d7063a08be8f6d1c3408f50921f4b5f51..87552f906427c64f68fd3eda66102d820a3fa6c2 100644
--- a/plugins/inputs/mongodb/mongodb_server.go
+++ b/plugins/inputs/mongodb/mongodb_server.go
@@ -4,7 +4,7 @@ import (
 	"net/url"
 	"time"
 
-	"github.com/influxdb/telegraf/plugins/inputs"
+	"github.com/influxdata/telegraf/plugins/inputs"
 	"gopkg.in/mgo.v2"
 	"gopkg.in/mgo.v2/bson"
 )
diff --git a/plugins/inputs/mongodb/mongodb_server_test.go b/plugins/inputs/mongodb/mongodb_server_test.go
index ec536bbef5c6e61df9774de42ed1ea83dac476dc..52869724c7e78400c61a634579e22da8e1373915 100644
--- a/plugins/inputs/mongodb/mongodb_server_test.go
+++ b/plugins/inputs/mongodb/mongodb_server_test.go
@@ -6,7 +6,7 @@ import (
 	"testing"
 	"time"
 
-	"github.com/influxdb/telegraf/testutil"
+	"github.com/influxdata/telegraf/testutil"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
 )
diff --git a/plugins/inputs/mysql/mysql.go b/plugins/inputs/mysql/mysql.go
index f9126b5ea853c1a1cd8b5e6211ad844be9ef8eee..7434a282ace190507f3f49a5234f394f35bc034d 100644
--- a/plugins/inputs/mysql/mysql.go
+++ b/plugins/inputs/mysql/mysql.go
@@ -6,7 +6,7 @@ import (
 	"strings"
 
 	_ "github.com/go-sql-driver/mysql"
-	"github.com/influxdb/telegraf/plugins/inputs"
+	"github.com/influxdata/telegraf/plugins/inputs"
 )
 
 type Mysql struct {
diff --git a/plugins/inputs/mysql/mysql_test.go b/plugins/inputs/mysql/mysql_test.go
index 2362002bcd9a75c9943e2334e150e1f9c0e4c3ee..855e8ba52aa5bea65f23b63a32e56cb0f3c0a651 100644
--- a/plugins/inputs/mysql/mysql_test.go
+++ b/plugins/inputs/mysql/mysql_test.go
@@ -4,7 +4,7 @@ import (
 	"fmt"
 	"testing"
 
-	"github.com/influxdb/telegraf/testutil"
+	"github.com/influxdata/telegraf/testutil"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
 )
diff --git a/plugins/inputs/nginx/nginx.go b/plugins/inputs/nginx/nginx.go
index 18e3244f700e658f601244472ac60f6db1ae6793..6ea665b7e67d4f256e5d150f1fa5f0ac77fbd8cd 100644
--- a/plugins/inputs/nginx/nginx.go
+++ b/plugins/inputs/nginx/nginx.go
@@ -11,7 +11,7 @@ import (
 	"sync"
 	"time"
 
-	"github.com/influxdb/telegraf/plugins/inputs"
+	"github.com/influxdata/telegraf/plugins/inputs"
 )
 
 type Nginx struct {
diff --git a/plugins/inputs/nginx/nginx_test.go b/plugins/inputs/nginx/nginx_test.go
index 9d694bc2611951d8caf61312b2ee8f458d54e528..895e3e583a2917d3477521aa774ec3afa5e90076 100644
--- a/plugins/inputs/nginx/nginx_test.go
+++ b/plugins/inputs/nginx/nginx_test.go
@@ -8,7 +8,7 @@ import (
 	"net/url"
 	"testing"
 
-	"github.com/influxdb/telegraf/testutil"
+	"github.com/influxdata/telegraf/testutil"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
 )
diff --git a/plugins/inputs/nsq/nsq.go b/plugins/inputs/nsq/nsq.go
index 48a709a377b55cd8edab2f74852245bfd9d9efb3..9b680a0dbb94134af625a2f1a9dcbfa6d2b09081 100644
--- a/plugins/inputs/nsq/nsq.go
+++ b/plugins/inputs/nsq/nsq.go
@@ -31,7 +31,7 @@ import (
 	"sync"
 	"time"
 
-	"github.com/influxdb/telegraf/plugins/inputs"
+	"github.com/influxdata/telegraf/plugins/inputs"
 )
 
 // Might add Lookupd endpoints for cluster discovery
diff --git a/plugins/inputs/nsq/nsq_test.go b/plugins/inputs/nsq/nsq_test.go
index fc34a710b017d7aff173414dcef26b924ba9b167..23fd19a428ed6ee2143cd1ddaf062b713a77c411 100644
--- a/plugins/inputs/nsq/nsq_test.go
+++ b/plugins/inputs/nsq/nsq_test.go
@@ -7,7 +7,7 @@ import (
 	"net/url"
 	"testing"
 
-	"github.com/influxdb/telegraf/testutil"
+	"github.com/influxdata/telegraf/testutil"
 
 	"github.com/stretchr/testify/require"
 )
diff --git a/plugins/inputs/passenger/passenger.go b/plugins/inputs/passenger/passenger.go
index 2d98f8c5899886e630a61b03448dff64aa4b33dd..c5b049b7c433f8544bf33b55b94fe9f79501df5e 100644
--- a/plugins/inputs/passenger/passenger.go
+++ b/plugins/inputs/passenger/passenger.go
@@ -8,7 +8,7 @@ import (
 	"strconv"
 	"strings"
 
-	"github.com/influxdb/telegraf/plugins/inputs"
+	"github.com/influxdata/telegraf/plugins/inputs"
 	"golang.org/x/net/html/charset"
 )
 
diff --git a/plugins/inputs/passenger/passenger_test.go b/plugins/inputs/passenger/passenger_test.go
index 3440c5337182cf02878d2645f16ee03376c5e2af..6124a968e31ebc84eb460e29a701bee4ec5b4010 100644
--- a/plugins/inputs/passenger/passenger_test.go
+++ b/plugins/inputs/passenger/passenger_test.go
@@ -6,7 +6,7 @@ import (
 	"os"
 	"testing"
 
-	"github.com/influxdb/telegraf/testutil"
+	"github.com/influxdata/telegraf/testutil"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
 )
diff --git a/plugins/inputs/phpfpm/phpfpm.go b/plugins/inputs/phpfpm/phpfpm.go
index 5600334b24c0528ed63bd0ea511c5e45b5e1ebb8..0166f7beaa50e99078ff1a8915889d83ff1a1db1 100644
--- a/plugins/inputs/phpfpm/phpfpm.go
+++ b/plugins/inputs/phpfpm/phpfpm.go
@@ -12,7 +12,7 @@ import (
 	"strings"
 	"sync"
 
-	"github.com/influxdb/telegraf/plugins/inputs"
+	"github.com/influxdata/telegraf/plugins/inputs"
 )
 
 const (
diff --git a/plugins/inputs/phpfpm/phpfpm_test.go b/plugins/inputs/phpfpm/phpfpm_test.go
index 58db0cf8b86260c0dec1519b3a8169438a00ca3a..c965e5a138411365d71627d36d5294ed5fbdc47b 100644
--- a/plugins/inputs/phpfpm/phpfpm_test.go
+++ b/plugins/inputs/phpfpm/phpfpm_test.go
@@ -10,7 +10,7 @@ import (
 	"net/http/httptest"
 	"testing"
 
-	"github.com/influxdb/telegraf/testutil"
+	"github.com/influxdata/telegraf/testutil"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
 )
diff --git a/plugins/inputs/ping/ping.go b/plugins/inputs/ping/ping.go
index ff7cebb99cd4d9ec3b2c8c8106c08fde7cde7a78..aa1d5bf365c4448ae06167e73014e95c0d5438a6 100644
--- a/plugins/inputs/ping/ping.go
+++ b/plugins/inputs/ping/ping.go
@@ -7,7 +7,7 @@ import (
 	"strings"
 	"sync"
 
-	"github.com/influxdb/telegraf/plugins/inputs"
+	"github.com/influxdata/telegraf/plugins/inputs"
 )
 
 // HostPinger is a function that runs the "ping" function using a list of
diff --git a/plugins/inputs/ping/ping_test.go b/plugins/inputs/ping/ping_test.go
index b98a08be81fe4995a7c59b8edcd84fc8e4251f3c..be603a49cd39474fc4913ecb98ae8f87d8f2de9b 100644
--- a/plugins/inputs/ping/ping_test.go
+++ b/plugins/inputs/ping/ping_test.go
@@ -6,7 +6,7 @@ import (
 	"sort"
 	"testing"
 
-	"github.com/influxdb/telegraf/testutil"
+	"github.com/influxdata/telegraf/testutil"
 	"github.com/stretchr/testify/assert"
 )
 
diff --git a/plugins/inputs/postgresql/postgresql.go b/plugins/inputs/postgresql/postgresql.go
index c356cea7758cf9fb66f9ccf5b639710fc67bdcd5..3398f5ac08a74a7c42b5dc4a0ace10cea1b50735 100644
--- a/plugins/inputs/postgresql/postgresql.go
+++ b/plugins/inputs/postgresql/postgresql.go
@@ -6,7 +6,7 @@ import (
 	"fmt"
 	"strings"
 
-	"github.com/influxdb/telegraf/plugins/inputs"
+	"github.com/influxdata/telegraf/plugins/inputs"
 
 	_ "github.com/lib/pq"
 )
diff --git a/plugins/inputs/postgresql/postgresql_test.go b/plugins/inputs/postgresql/postgresql_test.go
index 0f4ff5579e56ec7fedac250b46e420e3e5679fb4..8baae39a60c6065f02c7c62164627c8614348317 100644
--- a/plugins/inputs/postgresql/postgresql_test.go
+++ b/plugins/inputs/postgresql/postgresql_test.go
@@ -4,7 +4,7 @@ import (
 	"fmt"
 	"testing"
 
-	"github.com/influxdb/telegraf/testutil"
+	"github.com/influxdata/telegraf/testutil"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
 )
diff --git a/plugins/inputs/procstat/procstat.go b/plugins/inputs/procstat/procstat.go
index 5e596d6d8c4c40c6d8753f8ad3b2949c29d0f152..fd8158ec73b1fc5d90f98c0a6d4b7b546b650ae1 100644
--- a/plugins/inputs/procstat/procstat.go
+++ b/plugins/inputs/procstat/procstat.go
@@ -10,7 +10,7 @@ import (
 
 	"github.com/shirou/gopsutil/process"
 
-	"github.com/influxdb/telegraf/plugins/inputs"
+	"github.com/influxdata/telegraf/plugins/inputs"
 )
 
 type Procstat struct {
@@ -18,10 +18,14 @@ type Procstat struct {
 	Exe     string
 	Pattern string
 	Prefix  string
+
+	pidmap map[int32]*process.Process
 }
 
 func NewProcstat() *Procstat {
-	return &Procstat{}
+	return &Procstat{
+		pidmap: make(map[int32]*process.Process),
+	}
 }
 
 var sampleConfig = `
@@ -46,12 +50,12 @@ func (_ *Procstat) Description() string {
 }
 
 func (p *Procstat) Gather(acc inputs.Accumulator) error {
-	procs, err := p.createProcesses()
+	err := p.createProcesses()
 	if err != nil {
 		log.Printf("Error: procstat getting process, exe: [%s] pidfile: [%s] pattern: [%s] %s",
 			p.Exe, p.PidFile, p.Pattern, err.Error())
 	} else {
-		for _, proc := range procs {
+		for _, proc := range p.pidmap {
 			p := NewSpecProcessor(p.Prefix, acc, proc)
 			p.pushMetrics()
 		}
@@ -60,8 +64,7 @@ func (p *Procstat) Gather(acc inputs.Accumulator) error {
 	return nil
 }
 
-func (p *Procstat) createProcesses() ([]*process.Process, error) {
-	var out []*process.Process
+func (p *Procstat) createProcesses() error {
 	var errstring string
 	var outerr error
 
@@ -71,11 +74,14 @@ func (p *Procstat) createProcesses() ([]*process.Process, error) {
 	}
 
 	for _, pid := range pids {
-		p, err := process.NewProcess(int32(pid))
-		if err == nil {
-			out = append(out, p)
-		} else {
-			errstring += err.Error() + " "
+		_, ok := p.pidmap[pid]
+		if !ok {
+			proc, err := process.NewProcess(pid)
+			if err == nil {
+				p.pidmap[pid] = proc
+			} else {
+				errstring += err.Error() + " "
+			}
 		}
 	}
 
@@ -83,7 +89,7 @@ func (p *Procstat) createProcesses() ([]*process.Process, error) {
 		outerr = fmt.Errorf("%s", errstring)
 	}
 
-	return out, outerr
+	return outerr
 }
 
 func (p *Procstat) getAllPids() ([]int32, error) {
@@ -123,9 +129,13 @@ func pidsFromFile(file string) ([]int32, error) {
 func pidsFromExe(exe string) ([]int32, error) {
 	var out []int32
 	var outerr error
-	pgrep, err := exec.Command("pgrep", exe).Output()
+	bin, err := exec.LookPath("pgrep")
+	if err != nil {
+		return out, fmt.Errorf("Couldn't find pgrep binary: %s", err)
+	}
+	pgrep, err := exec.Command(bin, exe).Output()
 	if err != nil {
-		return out, fmt.Errorf("Failed to execute pgrep. Error: '%s'", err)
+		return out, fmt.Errorf("Failed to execute %s. Error: '%s'", bin, err)
 	} else {
 		pids := strings.Fields(string(pgrep))
 		for _, pid := range pids {
@@ -143,9 +153,13 @@ func pidsFromExe(exe string) ([]int32, error) {
 func pidsFromPattern(pattern string) ([]int32, error) {
 	var out []int32
 	var outerr error
-	pgrep, err := exec.Command("pgrep", "-f", pattern).Output()
+	bin, err := exec.LookPath("pgrep")
+	if err != nil {
+		return out, fmt.Errorf("Couldn't find pgrep binary: %s", err)
+	}
+	pgrep, err := exec.Command(bin, "-f", pattern).Output()
 	if err != nil {
-		return out, fmt.Errorf("Failed to execute pgrep. Error: '%s'", err)
+		return out, fmt.Errorf("Failed to execute %s. Error: '%s'", bin, err)
 	} else {
 		pids := strings.Fields(string(pgrep))
 		for _, pid := range pids {
diff --git a/plugins/inputs/procstat/procstat_test.go b/plugins/inputs/procstat/procstat_test.go
index 6ec6834ca7e50dd6503203f76878a303648a960b..bf5790f67498a8b80d0b969cd562ccb189af80c5 100644
--- a/plugins/inputs/procstat/procstat_test.go
+++ b/plugins/inputs/procstat/procstat_test.go
@@ -6,10 +6,11 @@ import (
 	"strconv"
 	"testing"
 
+	"github.com/shirou/gopsutil/process"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
 
-	"github.com/influxdb/telegraf/testutil"
+	"github.com/influxdata/telegraf/testutil"
 )
 
 func TestGather(t *testing.T) {
@@ -23,6 +24,7 @@ func TestGather(t *testing.T) {
 	p := Procstat{
 		PidFile: file.Name(),
 		Prefix:  "foo",
+		pidmap:  make(map[int32]*process.Process),
 	}
 	p.Gather(&acc)
 	assert.True(t, acc.HasFloatField("procstat", "foo_cpu_time_user"))
diff --git a/plugins/inputs/procstat/spec_processor.go b/plugins/inputs/procstat/spec_processor.go
index 9c7e53826f81fceb5c7915eb06bdb1fc3f510bb1..b66572f2ee51ad351cd57bea402903e817aa33ef 100644
--- a/plugins/inputs/procstat/spec_processor.go
+++ b/plugins/inputs/procstat/spec_processor.go
@@ -2,11 +2,11 @@ package procstat
 
 import (
 	"fmt"
-	"log"
+	"time"
 
 	"github.com/shirou/gopsutil/process"
 
-	"github.com/influxdb/telegraf/plugins/inputs"
+	"github.com/influxdata/telegraf/plugins/inputs"
 )
 
 type SpecProcessor struct {
@@ -40,7 +40,7 @@ func NewSpecProcessor(
 	tags := make(map[string]string)
 	tags["pid"] = fmt.Sprintf("%v", p.Pid)
 	if name, err := p.Name(); err == nil {
-		tags["name"] = name
+		tags["process_name"] = name
 	}
 	return &SpecProcessor{
 		Prefix: prefix,
@@ -52,21 +52,11 @@ func NewSpecProcessor(
 }
 
 func (p *SpecProcessor) pushMetrics() {
-	if err := p.pushFDStats(); err != nil {
-		log.Printf("procstat, fd stats not available: %s", err.Error())
-	}
-	if err := p.pushCtxStats(); err != nil {
-		log.Printf("procstat, ctx stats not available: %s", err.Error())
-	}
-	if err := p.pushIOStats(); err != nil {
-		log.Printf("procstat, io stats not available: %s", err.Error())
-	}
-	if err := p.pushCPUStats(); err != nil {
-		log.Printf("procstat, cpu stats not available: %s", err.Error())
-	}
-	if err := p.pushMemoryStats(); err != nil {
-		log.Printf("procstat, mem stats not available: %s", err.Error())
-	}
+	p.pushFDStats()
+	p.pushCtxStats()
+	p.pushIOStats()
+	p.pushCPUStats()
+	p.pushMemoryStats()
 	p.flush()
 }
 
@@ -113,10 +103,18 @@ func (p *SpecProcessor) pushCPUStats() error {
 	p.add("cpu_time_iowait", cpu_time.Iowait)
 	p.add("cpu_time_irq", cpu_time.Irq)
 	p.add("cpu_time_soft_irq", cpu_time.Softirq)
-	p.add("cpu_time_soft_steal", cpu_time.Steal)
-	p.add("cpu_time_soft_stolen", cpu_time.Stolen)
-	p.add("cpu_time_soft_guest", cpu_time.Guest)
-	p.add("cpu_time_soft_guest_nice", cpu_time.GuestNice)
+	p.add("cpu_time_steal", cpu_time.Steal)
+	p.add("cpu_time_stolen", cpu_time.Stolen)
+	p.add("cpu_time_guest", cpu_time.Guest)
+	p.add("cpu_time_guest_nice", cpu_time.GuestNice)
+
+	cpu_perc, err := p.proc.CPUPercent(time.Duration(0))
+	if err != nil {
+		return err
+	} else if cpu_perc == 0 {
+		return nil
+	}
+	p.add("cpu_usage", cpu_perc)
 
 	return nil
 }
diff --git a/plugins/inputs/prometheus/prometheus.go b/plugins/inputs/prometheus/prometheus.go
index 758788b8d84bc18c67241309ea7215042699d7e9..e6374b8d6d9f896e52a248ea2206d14dfb9d622d 100644
--- a/plugins/inputs/prometheus/prometheus.go
+++ b/plugins/inputs/prometheus/prometheus.go
@@ -3,7 +3,7 @@ package prometheus
 import (
 	"errors"
 	"fmt"
-	"github.com/influxdb/telegraf/plugins/inputs"
+	"github.com/influxdata/telegraf/plugins/inputs"
 	"github.com/prometheus/common/expfmt"
 	"github.com/prometheus/common/model"
 	"io"
diff --git a/plugins/inputs/prometheus/prometheus_test.go b/plugins/inputs/prometheus/prometheus_test.go
index 901fe2da23d90f5b283bcb035cb940db3d840e1a..2009cbb116a12284ddc13afa84c8deae28e8dd31 100644
--- a/plugins/inputs/prometheus/prometheus_test.go
+++ b/plugins/inputs/prometheus/prometheus_test.go
@@ -6,7 +6,7 @@ import (
 	"net/http/httptest"
 	"testing"
 
-	"github.com/influxdb/telegraf/testutil"
+	"github.com/influxdata/telegraf/testutil"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
 )
diff --git a/plugins/inputs/puppetagent/puppetagent.go b/plugins/inputs/puppetagent/puppetagent.go
index d0bedae9e8aaf55604049a4c75c81877fb3f6802..eee9186b3d00ab698905993066d1e9cb8043aefe 100644
--- a/plugins/inputs/puppetagent/puppetagent.go
+++ b/plugins/inputs/puppetagent/puppetagent.go
@@ -8,7 +8,7 @@ import (
 	"reflect"
 	"strings"
 
-	"github.com/influxdb/telegraf/plugins/inputs"
+	"github.com/influxdata/telegraf/plugins/inputs"
 )
 
 // PuppetAgent is a PuppetAgent plugin
diff --git a/plugins/inputs/puppetagent/puppetagent_test.go b/plugins/inputs/puppetagent/puppetagent_test.go
index 1d854ab466d467aac93b7ce0d03d619e70a308f0..d1470bc27bc8fa7f1eb8d721c331d1aa84cd5e1d 100644
--- a/plugins/inputs/puppetagent/puppetagent_test.go
+++ b/plugins/inputs/puppetagent/puppetagent_test.go
@@ -1,7 +1,7 @@
 package puppetagent
 
 import (
-	"github.com/influxdb/telegraf/testutil"
+	"github.com/influxdata/telegraf/testutil"
 	"testing"
 )
 
diff --git a/plugins/inputs/rabbitmq/rabbitmq.go b/plugins/inputs/rabbitmq/rabbitmq.go
index fc95af4941b423e31f6c69d07bfb52cd0f314d50..c062b3164d81de55e3c5e6fc72d2e66d81bb5822 100644
--- a/plugins/inputs/rabbitmq/rabbitmq.go
+++ b/plugins/inputs/rabbitmq/rabbitmq.go
@@ -7,7 +7,7 @@ import (
 	"strconv"
 	"time"
 
-	"github.com/influxdb/telegraf/plugins/inputs"
+	"github.com/influxdata/telegraf/plugins/inputs"
 )
 
 const DefaultUsername = "guest"
diff --git a/plugins/inputs/rabbitmq/rabbitmq_test.go b/plugins/inputs/rabbitmq/rabbitmq_test.go
index 12b7aee700f3b3cfd17c6250c401ce4349325d71..4bdc980dbd53bd43ec00d8b0faadbcb6f3c3efc2 100644
--- a/plugins/inputs/rabbitmq/rabbitmq_test.go
+++ b/plugins/inputs/rabbitmq/rabbitmq_test.go
@@ -6,7 +6,7 @@ import (
 	"net/http/httptest"
 	"testing"
 
-	"github.com/influxdb/telegraf/testutil"
+	"github.com/influxdata/telegraf/testutil"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
 )
diff --git a/plugins/inputs/redis/redis.go b/plugins/inputs/redis/redis.go
index c9e98e88672b8b23e65ecea7f81c7e516b71cc7b..735aa20528c638beff1b11c7fac811ca8bb020d3 100644
--- a/plugins/inputs/redis/redis.go
+++ b/plugins/inputs/redis/redis.go
@@ -10,7 +10,7 @@ import (
 	"strings"
 	"sync"
 
-	"github.com/influxdb/telegraf/plugins/inputs"
+	"github.com/influxdata/telegraf/plugins/inputs"
 )
 
 type Redis struct {
diff --git a/plugins/inputs/redis/redis_test.go b/plugins/inputs/redis/redis_test.go
index ec0cf998c46274a18deaae59d065b1686f86b507..612595cdb22a54805ae0273ba00f9591655c5b3c 100644
--- a/plugins/inputs/redis/redis_test.go
+++ b/plugins/inputs/redis/redis_test.go
@@ -6,7 +6,7 @@ import (
 	"strings"
 	"testing"
 
-	"github.com/influxdb/telegraf/testutil"
+	"github.com/influxdata/telegraf/testutil"
 	"github.com/stretchr/testify/require"
 )
 
diff --git a/plugins/inputs/rethinkdb/rethinkdb.go b/plugins/inputs/rethinkdb/rethinkdb.go
index 17873f1ced98c852c76ed464b4489802df2bae69..1f28dab25f70f3c59ca23d298209e554142540f2 100644
--- a/plugins/inputs/rethinkdb/rethinkdb.go
+++ b/plugins/inputs/rethinkdb/rethinkdb.go
@@ -5,7 +5,7 @@ import (
 	"net/url"
 	"sync"
 
-	"github.com/influxdb/telegraf/plugins/inputs"
+	"github.com/influxdata/telegraf/plugins/inputs"
 
 	"gopkg.in/dancannon/gorethink.v1"
 )
diff --git a/plugins/inputs/rethinkdb/rethinkdb_data.go b/plugins/inputs/rethinkdb/rethinkdb_data.go
index 3ea429d82af986a63891fb9a108abb209ab9dd9c..8093fa5baf849a69ca0e761407cfd78baeb7caa3 100644
--- a/plugins/inputs/rethinkdb/rethinkdb_data.go
+++ b/plugins/inputs/rethinkdb/rethinkdb_data.go
@@ -4,7 +4,7 @@ import (
 	"reflect"
 	"time"
 
-	"github.com/influxdb/telegraf/plugins/inputs"
+	"github.com/influxdata/telegraf/plugins/inputs"
 )
 
 type serverStatus struct {
diff --git a/plugins/inputs/rethinkdb/rethinkdb_data_test.go b/plugins/inputs/rethinkdb/rethinkdb_data_test.go
index 3441370a3735b5a61d29d4d50f900315262bba62..6159016c0374e276094575e9008b10067fdc4aa4 100644
--- a/plugins/inputs/rethinkdb/rethinkdb_data_test.go
+++ b/plugins/inputs/rethinkdb/rethinkdb_data_test.go
@@ -3,7 +3,7 @@ package rethinkdb
 import (
 	"testing"
 
-	"github.com/influxdb/telegraf/testutil"
+	"github.com/influxdata/telegraf/testutil"
 	"github.com/stretchr/testify/assert"
 )
 
diff --git a/plugins/inputs/rethinkdb/rethinkdb_server.go b/plugins/inputs/rethinkdb/rethinkdb_server.go
index 4af916a4d162ed1166312df30c4b4561b17279c4..6ca7a3af1f17196a72416f5c567429e5023d8b25 100644
--- a/plugins/inputs/rethinkdb/rethinkdb_server.go
+++ b/plugins/inputs/rethinkdb/rethinkdb_server.go
@@ -9,7 +9,7 @@ import (
 	"strconv"
 	"strings"
 
-	"github.com/influxdb/telegraf/plugins/inputs"
+	"github.com/influxdata/telegraf/plugins/inputs"
 
 	"gopkg.in/dancannon/gorethink.v1"
 )
diff --git a/plugins/inputs/rethinkdb/rethinkdb_server_test.go b/plugins/inputs/rethinkdb/rethinkdb_server_test.go
index 21ab0dbbd83da7b5c5f355000b00f3e617d72071..c4b6442229d54170dc9fb3a17fa6fa3316d62a6d 100644
--- a/plugins/inputs/rethinkdb/rethinkdb_server_test.go
+++ b/plugins/inputs/rethinkdb/rethinkdb_server_test.go
@@ -5,7 +5,7 @@ package rethinkdb
 import (
 	"testing"
 
-	"github.com/influxdb/telegraf/testutil"
+	"github.com/influxdata/telegraf/testutil"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
 )
diff --git a/plugins/inputs/sensors/sensors.go b/plugins/inputs/sensors/sensors.go
index 18e26278d44fcad33997a574a34e4370478ea156..81001abd8dd4f53687a55304896591f756209926 100644
--- a/plugins/inputs/sensors/sensors.go
+++ b/plugins/inputs/sensors/sensors.go
@@ -7,7 +7,7 @@ import (
 
 	"github.com/md14454/gosensors"
 
-	"github.com/influxdb/telegraf/plugins/inputs"
+	"github.com/influxdata/telegraf/plugins/inputs"
 )
 
 type Sensors struct {
diff --git a/plugins/inputs/statsd/README.md b/plugins/inputs/statsd/README.md
index 76255f3b0adc721fbe519073122ffe5be7049361..49b8ff8424291bb1d98410e4e5077191060577d7 100644
--- a/plugins/inputs/statsd/README.md
+++ b/plugins/inputs/statsd/README.md
@@ -157,4 +157,4 @@ mem.cached.localhost:256|g
 ```
 
 There are many more options available,
-[More details can be found here](https://github.com/influxdb/influxdb/tree/master/services/graphite#templates)
+[More details can be found here](https://github.com/influxdata/influxdb/tree/master/services/graphite#templates)
diff --git a/plugins/inputs/statsd/statsd.go b/plugins/inputs/statsd/statsd.go
index d9f597bcf41ef43271fa4ca35525f0377321facd..6b7a427b7f391d10232cce199030b709f9632ddd 100644
--- a/plugins/inputs/statsd/statsd.go
+++ b/plugins/inputs/statsd/statsd.go
@@ -10,9 +10,9 @@ import (
 	"strings"
 	"sync"
 
-	"github.com/influxdb/influxdb/services/graphite"
+	"github.com/influxdata/influxdb/services/graphite"
 
-	"github.com/influxdb/telegraf/plugins/inputs"
+	"github.com/influxdata/telegraf/plugins/inputs"
 )
 
 const UDP_PACKET_SIZE int = 1500
@@ -337,10 +337,15 @@ func (s *Statsd) parseStatsdLine(line string) error {
 			}
 			m.floatvalue = v
 		case "c", "s":
+			var v int64
 			v, err := strconv.ParseInt(pipesplit[0], 10, 64)
 			if err != nil {
-				log.Printf("Error: parsing value to int64: %s\n", line)
-				return errors.New("Error Parsing statsd line")
+				v2, err2 := strconv.ParseFloat(pipesplit[0], 64)
+				if err2 != nil {
+					log.Printf("Error: parsing value to int64: %s\n", line)
+					return errors.New("Error Parsing statsd line")
+				}
+				v = int64(v2)
 			}
 			// If a sample rate is given with a counter, divide value by the rate
 			if m.samplerate != 0 && m.mtype == "c" {
diff --git a/plugins/inputs/statsd/statsd_test.go b/plugins/inputs/statsd/statsd_test.go
index a8aae2e9e3a79544e0b5f6c1f660e2e481a5fabb..6fc1f693362af7cd06bf9c7104bd1f2015399b86 100644
--- a/plugins/inputs/statsd/statsd_test.go
+++ b/plugins/inputs/statsd/statsd_test.go
@@ -5,7 +5,7 @@ import (
 	"fmt"
 	"testing"
 
-	"github.com/influxdb/telegraf/testutil"
+	"github.com/influxdata/telegraf/testutil"
 )
 
 // Invalid lines should return an error
diff --git a/plugins/inputs/system/cpu.go b/plugins/inputs/system/cpu.go
index 298df20bbcd215bf23cd2f74294198c2c40e2590..95c854b2cf2bf580e4ac86fccf55d1236ceed3a3 100644
--- a/plugins/inputs/system/cpu.go
+++ b/plugins/inputs/system/cpu.go
@@ -4,7 +4,7 @@ import (
 	"fmt"
 	"time"
 
-	"github.com/influxdb/telegraf/plugins/inputs"
+	"github.com/influxdata/telegraf/plugins/inputs"
 	"github.com/shirou/gopsutil/cpu"
 )
 
diff --git a/plugins/inputs/system/cpu_test.go b/plugins/inputs/system/cpu_test.go
index c85734adc7e16bf425e4b0db98bf9fd880f9f376..77d90e2a55ab621bf8ceecd3400b509f30c79776 100644
--- a/plugins/inputs/system/cpu_test.go
+++ b/plugins/inputs/system/cpu_test.go
@@ -4,7 +4,7 @@ import (
 	"fmt"
 	"testing"
 
-	"github.com/influxdb/telegraf/testutil"
+	"github.com/influxdata/telegraf/testutil"
 	"github.com/shirou/gopsutil/cpu"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
diff --git a/plugins/inputs/system/disk.go b/plugins/inputs/system/disk.go
index 5d1553dd4626339dd6cd3c3415b55145293c3021..c6b23492b9078c592ebc456df65f4ec431523adf 100644
--- a/plugins/inputs/system/disk.go
+++ b/plugins/inputs/system/disk.go
@@ -3,13 +3,16 @@ package system
 import (
 	"fmt"
 
-	"github.com/influxdb/telegraf/plugins/inputs"
+	"github.com/influxdata/telegraf/plugins/inputs"
 )
 
 type DiskStats struct {
 	ps PS
 
+	// Legacy support
 	Mountpoints []string
+
+	MountPoints []string
 }
 
 func (_ *DiskStats) Description() string {
@@ -19,7 +22,7 @@ func (_ *DiskStats) Description() string {
 var diskSampleConfig = `
   # By default, telegraf gather stats for all mountpoints.
   # Setting mountpoints will restrict the stats to the specified mountpoints.
-  # Mountpoints=["/"]
+  # mount_points = ["/"]
 `
 
 func (_ *DiskStats) SampleConfig() string {
@@ -27,25 +30,17 @@ func (_ *DiskStats) SampleConfig() string {
 }
 
 func (s *DiskStats) Gather(acc inputs.Accumulator) error {
-	disks, err := s.ps.DiskUsage()
-	if err != nil {
-		return fmt.Errorf("error getting disk usage info: %s", err)
+	// Legacy support:
+	if len(s.Mountpoints) != 0 {
+		s.MountPoints = s.Mountpoints
 	}
 
-	var restrictMpoints bool
-	mPoints := make(map[string]bool)
-	if len(s.Mountpoints) != 0 {
-		restrictMpoints = true
-		for _, mp := range s.Mountpoints {
-			mPoints[mp] = true
-		}
+	disks, err := s.ps.DiskUsage(s.MountPoints)
+	if err != nil {
+		return fmt.Errorf("error getting disk usage info: %s", err)
 	}
 
 	for _, du := range disks {
-		_, member := mPoints[du.Path]
-		if restrictMpoints && !member {
-			continue
-		}
 		tags := map[string]string{
 			"path":   du.Path,
 			"fstype": du.Fstype,
diff --git a/plugins/inputs/system/disk_test.go b/plugins/inputs/system/disk_test.go
index 6ea110fef1490c911c479b63f963104e3cff95e3..ec4182cb395c73d6114ad534221893ddd5b72dc9 100644
--- a/plugins/inputs/system/disk_test.go
+++ b/plugins/inputs/system/disk_test.go
@@ -3,7 +3,7 @@ package system
 import (
 	"testing"
 
-	"github.com/influxdb/telegraf/testutil"
+	"github.com/influxdata/telegraf/testutil"
 	"github.com/shirou/gopsutil/disk"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
@@ -15,7 +15,7 @@ func TestDiskStats(t *testing.T) {
 	var acc testutil.Accumulator
 	var err error
 
-	du := []*disk.DiskUsageStat{
+	duAll := []*disk.DiskUsageStat{
 		{
 			Path:        "/",
 			Fstype:      "ext4",
@@ -33,8 +33,20 @@ func TestDiskStats(t *testing.T) {
 			InodesFree:  468,
 		},
 	}
+	duFiltered := []*disk.DiskUsageStat{
+		{
+			Path:        "/",
+			Fstype:      "ext4",
+			Total:       128,
+			Free:        23,
+			InodesTotal: 1234,
+			InodesFree:  234,
+		},
+	}
 
-	mps.On("DiskUsage").Return(du, nil)
+	mps.On("DiskUsage", []string(nil)).Return(duAll, nil)
+	mps.On("DiskUsage", []string{"/", "/dev"}).Return(duFiltered, nil)
+	mps.On("DiskUsage", []string{"/", "/home"}).Return(duAll, nil)
 
 	err = (&DiskStats{ps: &mps}).Gather(&acc)
 	require.NoError(t, err)
@@ -53,32 +65,32 @@ func TestDiskStats(t *testing.T) {
 	}
 
 	fields1 := map[string]interface{}{
-		"total":        uint64(128),  //tags1)
-		"used":         uint64(105),  //tags1)
-		"free":         uint64(23),   //tags1)
-		"inodes_total": uint64(1234), //tags1)
-		"inodes_free":  uint64(234),  //tags1)
-		"inodes_used":  uint64(1000), //tags1)
+		"total":        uint64(128),
+		"used":         uint64(105),
+		"free":         uint64(23),
+		"inodes_total": uint64(1234),
+		"inodes_free":  uint64(234),
+		"inodes_used":  uint64(1000),
 	}
 	fields2 := map[string]interface{}{
-		"total":        uint64(256),  //tags2)
-		"used":         uint64(210),  //tags2)
-		"free":         uint64(46),   //tags2)
-		"inodes_total": uint64(2468), //tags2)
-		"inodes_free":  uint64(468),  //tags2)
-		"inodes_used":  uint64(2000), //tags2)
+		"total":        uint64(256),
+		"used":         uint64(210),
+		"free":         uint64(46),
+		"inodes_total": uint64(2468),
+		"inodes_free":  uint64(468),
+		"inodes_used":  uint64(2000),
 	}
 	acc.AssertContainsTaggedFields(t, "disk", fields1, tags1)
 	acc.AssertContainsTaggedFields(t, "disk", fields2, tags2)
 
 	// We expect 6 more DiskPoints to show up with an explicit match on "/"
-	// and /home not matching the /dev in Mountpoints
-	err = (&DiskStats{ps: &mps, Mountpoints: []string{"/", "/dev"}}).Gather(&acc)
+	// and /home not matching the /dev in MountPoints
+	err = (&DiskStats{ps: &mps, MountPoints: []string{"/", "/dev"}}).Gather(&acc)
 	assert.Equal(t, expectedAllDiskPoints+6, acc.NFields())
 
-	// We should see all the diskpoints as Mountpoints includes both
+	// We should see all the diskpoints as MountPoints includes both
 	// / and /home
-	err = (&DiskStats{ps: &mps, Mountpoints: []string{"/", "/home"}}).Gather(&acc)
+	err = (&DiskStats{ps: &mps, MountPoints: []string{"/", "/home"}}).Gather(&acc)
 	assert.Equal(t, 2*expectedAllDiskPoints+6, acc.NFields())
 }
 
diff --git a/plugins/inputs/system/docker.go b/plugins/inputs/system/docker.go
deleted file mode 100644
index 3a77fad5f69c0bd40c8109cd37c921edfb42e9b4..0000000000000000000000000000000000000000
--- a/plugins/inputs/system/docker.go
+++ /dev/null
@@ -1,89 +0,0 @@
-// +build linux
-
-package system
-
-import (
-	"fmt"
-
-	"github.com/influxdb/telegraf/plugins/inputs"
-)
-
-type DockerStats struct {
-	ps PS
-}
-
-func (_ *DockerStats) Description() string {
-	return "Read metrics about docker containers"
-}
-
-func (_ *DockerStats) SampleConfig() string { return "" }
-
-func (s *DockerStats) Gather(acc inputs.Accumulator) error {
-	containers, err := s.ps.DockerStat()
-	if err != nil {
-		return fmt.Errorf("error getting docker info: %s", err)
-	}
-
-	for _, cont := range containers {
-		tags := map[string]string{
-			"id":      cont.Id,
-			"name":    cont.Name,
-			"command": cont.Command,
-		}
-		for k, v := range cont.Labels {
-			tags[k] = v
-		}
-
-		cts := cont.CPU
-
-		fields := map[string]interface{}{
-			"user":       cts.User,
-			"system":     cts.System,
-			"idle":       cts.Idle,
-			"nice":       cts.Nice,
-			"iowait":     cts.Iowait,
-			"irq":        cts.Irq,
-			"softirq":    cts.Softirq,
-			"steal":      cts.Steal,
-			"guest":      cts.Guest,
-			"guest_nice": cts.GuestNice,
-
-			"cache":                  cont.Mem.Cache,
-			"rss":                    cont.Mem.RSS,
-			"rss_huge":               cont.Mem.RSSHuge,
-			"mapped_file":            cont.Mem.MappedFile,
-			"swap_in":                cont.Mem.Pgpgin,
-			"swap_out":               cont.Mem.Pgpgout,
-			"page_fault":             cont.Mem.Pgfault,
-			"page_major_fault":       cont.Mem.Pgmajfault,
-			"inactive_anon":          cont.Mem.InactiveAnon,
-			"active_anon":            cont.Mem.ActiveAnon,
-			"inactive_file":          cont.Mem.InactiveFile,
-			"active_file":            cont.Mem.ActiveFile,
-			"unevictable":            cont.Mem.Unevictable,
-			"memory_limit":           cont.Mem.HierarchicalMemoryLimit,
-			"total_cache":            cont.Mem.TotalCache,
-			"total_rss":              cont.Mem.TotalRSS,
-			"total_rss_huge":         cont.Mem.TotalRSSHuge,
-			"total_mapped_file":      cont.Mem.TotalMappedFile,
-			"total_swap_in":          cont.Mem.TotalPgpgIn,
-			"total_swap_out":         cont.Mem.TotalPgpgOut,
-			"total_page_fault":       cont.Mem.TotalPgFault,
-			"total_page_major_fault": cont.Mem.TotalPgMajFault,
-			"total_inactive_anon":    cont.Mem.TotalInactiveAnon,
-			"total_active_anon":      cont.Mem.TotalActiveAnon,
-			"total_inactive_file":    cont.Mem.TotalInactiveFile,
-			"total_active_file":      cont.Mem.TotalActiveFile,
-			"total_unevictable":      cont.Mem.TotalUnevictable,
-		}
-		acc.AddFields("docker", fields, tags)
-	}
-
-	return nil
-}
-
-func init() {
-	inputs.Add("docker", func() inputs.Input {
-		return &DockerStats{ps: &systemPS{}}
-	})
-}
diff --git a/plugins/inputs/system/docker_test.go b/plugins/inputs/system/docker_test.go
deleted file mode 100644
index 9ed06dd3ef78068983c9d06f20ed5242cc8c6716..0000000000000000000000000000000000000000
--- a/plugins/inputs/system/docker_test.go
+++ /dev/null
@@ -1,119 +0,0 @@
-// +build linux
-
-package system
-
-import (
-	"testing"
-
-	"github.com/influxdb/telegraf/testutil"
-	"github.com/shirou/gopsutil/cpu"
-	"github.com/shirou/gopsutil/docker"
-
-	"github.com/stretchr/testify/require"
-)
-
-func TestDockerStats_GenerateStats(t *testing.T) {
-	var mps MockPS
-	var acc testutil.Accumulator
-
-	ds := &DockerContainerStat{
-		Name: "blah",
-		CPU: &cpu.CPUTimesStat{
-			CPU:       "all",
-			User:      3.1,
-			System:    8.2,
-			Idle:      80.1,
-			Nice:      1.3,
-			Iowait:    0.2,
-			Irq:       0.1,
-			Softirq:   0.11,
-			Steal:     0.0001,
-			Guest:     8.1,
-			GuestNice: 0.324,
-		},
-		Mem: &docker.CgroupMemStat{
-			ContainerID:             "blah",
-			Cache:                   1,
-			RSS:                     2,
-			RSSHuge:                 3,
-			MappedFile:              4,
-			Pgpgin:                  5,
-			Pgpgout:                 6,
-			Pgfault:                 7,
-			Pgmajfault:              8,
-			InactiveAnon:            9,
-			ActiveAnon:              10,
-			InactiveFile:            11,
-			ActiveFile:              12,
-			Unevictable:             13,
-			HierarchicalMemoryLimit: 14,
-			TotalCache:              15,
-			TotalRSS:                16,
-			TotalRSSHuge:            17,
-			TotalMappedFile:         18,
-			TotalPgpgIn:             19,
-			TotalPgpgOut:            20,
-			TotalPgFault:            21,
-			TotalPgMajFault:         22,
-			TotalInactiveAnon:       23,
-			TotalActiveAnon:         24,
-			TotalInactiveFile:       25,
-			TotalActiveFile:         26,
-			TotalUnevictable:        27,
-		},
-	}
-
-	mps.On("DockerStat").Return([]*DockerContainerStat{ds}, nil)
-
-	err := (&DockerStats{&mps}).Gather(&acc)
-	require.NoError(t, err)
-
-	dockertags := map[string]string{
-		"name":    "blah",
-		"id":      "",
-		"command": "",
-	}
-
-	fields := map[string]interface{}{
-		"user":       3.1,
-		"system":     8.2,
-		"idle":       80.1,
-		"nice":       1.3,
-		"iowait":     0.2,
-		"irq":        0.1,
-		"softirq":    0.11,
-		"steal":      0.0001,
-		"guest":      8.1,
-		"guest_nice": 0.324,
-
-		"cache":                  uint64(1),
-		"rss":                    uint64(2),
-		"rss_huge":               uint64(3),
-		"mapped_file":            uint64(4),
-		"swap_in":                uint64(5),
-		"swap_out":               uint64(6),
-		"page_fault":             uint64(7),
-		"page_major_fault":       uint64(8),
-		"inactive_anon":          uint64(9),
-		"active_anon":            uint64(10),
-		"inactive_file":          uint64(11),
-		"active_file":            uint64(12),
-		"unevictable":            uint64(13),
-		"memory_limit":           uint64(14),
-		"total_cache":            uint64(15),
-		"total_rss":              uint64(16),
-		"total_rss_huge":         uint64(17),
-		"total_mapped_file":      uint64(18),
-		"total_swap_in":          uint64(19),
-		"total_swap_out":         uint64(20),
-		"total_page_fault":       uint64(21),
-		"total_page_major_fault": uint64(22),
-		"total_inactive_anon":    uint64(23),
-		"total_active_anon":      uint64(24),
-		"total_inactive_file":    uint64(25),
-		"total_active_file":      uint64(26),
-		"total_unevictable":      uint64(27),
-	}
-
-	acc.AssertContainsTaggedFields(t, "docker", fields, dockertags)
-}
diff --git a/plugins/inputs/system/memory.go b/plugins/inputs/system/memory.go
index f58a8cd9245dcc74caf2908861d0829754496128..32a2f2b09214d4a22f0742343275ca66f63beb66 100644
--- a/plugins/inputs/system/memory.go
+++ b/plugins/inputs/system/memory.go
@@ -3,7 +3,7 @@ package system
 import (
 	"fmt"
 
-	"github.com/influxdb/telegraf/plugins/inputs"
+	"github.com/influxdata/telegraf/plugins/inputs"
 )
 
 type MemStats struct {
diff --git a/plugins/inputs/system/memory_test.go b/plugins/inputs/system/memory_test.go
index bf461e2e2a7d66dc8da44170a8d40c389b66f743..0a85bc86924a24f2e9a629a24aa1255398a1e68e 100644
--- a/plugins/inputs/system/memory_test.go
+++ b/plugins/inputs/system/memory_test.go
@@ -3,7 +3,7 @@ package system
 import (
 	"testing"
 
-	"github.com/influxdb/telegraf/testutil"
+	"github.com/influxdata/telegraf/testutil"
 	"github.com/shirou/gopsutil/mem"
 	"github.com/stretchr/testify/require"
 )
diff --git a/plugins/inputs/system/mock_PS.go b/plugins/inputs/system/mock_PS.go
index 6e8bfe224c8d2310a153a0c3eafcebfaaa91b125..6e9a5f93ef5ad6be5e5670a36881bbd7032c8ad8 100644
--- a/plugins/inputs/system/mock_PS.go
+++ b/plugins/inputs/system/mock_PS.go
@@ -33,8 +33,8 @@ func (m *MockPS) CPUTimes(perCPU, totalCPU bool) ([]cpu.CPUTimesStat, error) {
 	return r0, r1
 }
 
-func (m *MockPS) DiskUsage() ([]*disk.DiskUsageStat, error) {
-	ret := m.Called()
+func (m *MockPS) DiskUsage(mountPointFilter []string) ([]*disk.DiskUsageStat, error) {
+	ret := m.Called(mountPointFilter)
 
 	r0 := ret.Get(0).([]*disk.DiskUsageStat)
 	r1 := ret.Error(1)
@@ -87,15 +87,6 @@ func (m *MockPS) SwapStat() (*mem.SwapMemoryStat, error) {
 	return r0, r1
 }
 
-func (m *MockPS) DockerStat() ([]*DockerContainerStat, error) {
-	ret := m.Called()
-
-	r0 := ret.Get(0).([]*DockerContainerStat)
-	r1 := ret.Error(1)
-
-	return r0, r1
-}
-
 func (m *MockPS) NetConnections() ([]net.NetConnectionStat, error) {
 	ret := m.Called()
 
diff --git a/plugins/inputs/system/net.go b/plugins/inputs/system/net.go
index 42f0d5854d63d3cc00de162ba59a011d5f4bb6db..7f71f5200c4e5073055c4c1bf1f9c96a50537849 100644
--- a/plugins/inputs/system/net.go
+++ b/plugins/inputs/system/net.go
@@ -5,7 +5,7 @@ import (
 	"net"
 	"strings"
 
-	"github.com/influxdb/telegraf/plugins/inputs"
+	"github.com/influxdata/telegraf/plugins/inputs"
 )
 
 type NetIOStats struct {
diff --git a/plugins/inputs/system/net_test.go b/plugins/inputs/system/net_test.go
index 3ec2cb9904466d3289195c7d91e188c1d2c7f65f..3297acf071331b245f66e03f86d363fdfc74cae8 100644
--- a/plugins/inputs/system/net_test.go
+++ b/plugins/inputs/system/net_test.go
@@ -4,7 +4,7 @@ import (
 	"syscall"
 	"testing"
 
-	"github.com/influxdb/telegraf/testutil"
+	"github.com/influxdata/telegraf/testutil"
 	"github.com/shirou/gopsutil/net"
 	"github.com/stretchr/testify/require"
 )
diff --git a/plugins/inputs/system/netstat.go b/plugins/inputs/system/netstat.go
index 71f2a0da6a1e639a2f979b068e3a565173dbf94e..0fe704ee0a4ad43df412157e39af7fb2e33313ec 100644
--- a/plugins/inputs/system/netstat.go
+++ b/plugins/inputs/system/netstat.go
@@ -4,7 +4,7 @@ import (
 	"fmt"
 	"syscall"
 
-	"github.com/influxdb/telegraf/plugins/inputs"
+	"github.com/influxdata/telegraf/plugins/inputs"
 )
 
 type NetStats struct {
diff --git a/plugins/inputs/system/ps.go b/plugins/inputs/system/ps.go
index 9667477189bf66212caae83c3e8e88a31e493155..98c9b8b31c1ef6111487f32d1fa299c8e99cfa40 100644
--- a/plugins/inputs/system/ps.go
+++ b/plugins/inputs/system/ps.go
@@ -1,39 +1,25 @@
 package system
 
 import (
-	gonet "net"
 	"os"
-	"strings"
 
-	"github.com/influxdb/telegraf/internal"
-	"github.com/influxdb/telegraf/plugins/inputs"
+	"github.com/influxdata/telegraf/internal"
+	"github.com/influxdata/telegraf/plugins/inputs"
 
-	dc "github.com/fsouza/go-dockerclient"
 	"github.com/shirou/gopsutil/cpu"
 	"github.com/shirou/gopsutil/disk"
-	"github.com/shirou/gopsutil/docker"
 	"github.com/shirou/gopsutil/mem"
 	"github.com/shirou/gopsutil/net"
 )
 
-type DockerContainerStat struct {
-	Id      string
-	Name    string
-	Command string
-	Labels  map[string]string
-	CPU     *cpu.CPUTimesStat
-	Mem     *docker.CgroupMemStat
-}
-
 type PS interface {
 	CPUTimes(perCPU, totalCPU bool) ([]cpu.CPUTimesStat, error)
-	DiskUsage() ([]*disk.DiskUsageStat, error)
+	DiskUsage(mountPointFilter []string) ([]*disk.DiskUsageStat, error)
 	NetIO() ([]net.NetIOCountersStat, error)
 	NetProto() ([]net.NetProtoCountersStat, error)
 	DiskIO() (map[string]disk.DiskIOCountersStat, error)
 	VMStat() (*mem.VirtualMemoryStat, error)
 	SwapStat() (*mem.SwapMemoryStat, error)
-	DockerStat() ([]*DockerContainerStat, error)
 	NetConnections() ([]net.NetConnectionStat, error)
 }
 
@@ -44,9 +30,7 @@ func add(acc inputs.Accumulator,
 	}
 }
 
-type systemPS struct {
-	dockerClient *dc.Client
-}
+type systemPS struct{}
 
 func (s *systemPS) CPUTimes(perCPU, totalCPU bool) ([]cpu.CPUTimesStat, error) {
 	var cpuTimes []cpu.CPUTimesStat
@@ -67,15 +51,31 @@ func (s *systemPS) CPUTimes(perCPU, totalCPU bool) ([]cpu.CPUTimesStat, error) {
 	return cpuTimes, nil
 }
 
-func (s *systemPS) DiskUsage() ([]*disk.DiskUsageStat, error) {
+func (s *systemPS) DiskUsage(
+	mountPointFilter []string,
+) ([]*disk.DiskUsageStat, error) {
 	parts, err := disk.DiskPartitions(true)
 	if err != nil {
 		return nil, err
 	}
 
+	// Make a "set" out of the filter slice
+	filterSet := make(map[string]bool)
+	for _, filter := range mountPointFilter {
+		filterSet[filter] = true
+	}
+
 	var usage []*disk.DiskUsageStat
 
 	for _, p := range parts {
+		if len(mountPointFilter) > 0 {
+			// If the mount point is not a member of the filter set,
+			// don't gather info on it.
+			_, ok := filterSet[p.Mountpoint]
+			if !ok {
+				continue
+			}
+		}
 		if _, err := os.Stat(p.Mountpoint); err == nil {
 			du, err := disk.DiskUsage(p.Mountpoint)
 			if err != nil {
@@ -117,52 +117,3 @@ func (s *systemPS) VMStat() (*mem.VirtualMemoryStat, error) {
 func (s *systemPS) SwapStat() (*mem.SwapMemoryStat, error) {
 	return mem.SwapMemory()
 }
-
-func (s *systemPS) DockerStat() ([]*DockerContainerStat, error) {
-	if s.dockerClient == nil {
-		c, err := dc.NewClient("unix:///var/run/docker.sock")
-		if err != nil {
-			return nil, err
-		}
-
-		s.dockerClient = c
-	}
-
-	opts := dc.ListContainersOptions{}
-
-	containers, err := s.dockerClient.ListContainers(opts)
-	if err != nil {
-		if _, ok := err.(*gonet.OpError); ok {
-			return nil, nil
-		}
-
-		return nil, err
-	}
-
-	var stats []*DockerContainerStat
-
-	for _, container := range containers {
-		ctu, err := docker.CgroupCPUDocker(container.ID)
-		if err != nil {
-			return nil, err
-		}
-
-		mem, err := docker.CgroupMemDocker(container.ID)
-		if err != nil {
-			return nil, err
-		}
-
-		name := strings.Join(container.Names, " ")
-
-		stats = append(stats, &DockerContainerStat{
-			Id:      container.ID,
-			Name:    name,
-			Command: container.Command,
-			Labels:  container.Labels,
-			CPU:     ctu,
-			Mem:     mem,
-		})
-	}
-
-	return stats, nil
-}
diff --git a/plugins/inputs/system/system.go b/plugins/inputs/system/system.go
index 813ab84f563f13b2aca2ceecc8d87a23c42c271c..4a0a76d48eb95c9d75dc6a62438641f6b75a7f21 100644
--- a/plugins/inputs/system/system.go
+++ b/plugins/inputs/system/system.go
@@ -8,7 +8,7 @@ import (
 	"github.com/shirou/gopsutil/host"
 	"github.com/shirou/gopsutil/load"
 
-	"github.com/influxdb/telegraf/plugins/inputs"
+	"github.com/influxdata/telegraf/plugins/inputs"
 )
 
 type SystemStats struct{}
diff --git a/plugins/inputs/trig/trig.go b/plugins/inputs/trig/trig.go
index 13c44e247846f61f6e11cd2ee7456dee348d7536..604f9734a2208c93c6dac1cc097648af0cc19021 100644
--- a/plugins/inputs/trig/trig.go
+++ b/plugins/inputs/trig/trig.go
@@ -3,7 +3,7 @@ package trig
 import (
 	"math"
 
-	"github.com/influxdb/telegraf/plugins/inputs"
+	"github.com/influxdata/telegraf/plugins/inputs"
 )
 
 type Trig struct {
diff --git a/plugins/inputs/trig/trig_test.go b/plugins/inputs/trig/trig_test.go
index 82605b0a57cb0e68ace4649f798745a39375e6fa..1471edbeaec2dab4b66b4e3153d2f3c0acddd643 100644
--- a/plugins/inputs/trig/trig_test.go
+++ b/plugins/inputs/trig/trig_test.go
@@ -4,7 +4,7 @@ import (
 	"math"
 	"testing"
 
-	"github.com/influxdb/telegraf/testutil"
+	"github.com/influxdata/telegraf/testutil"
 )
 
 func TestTrig(t *testing.T) {
diff --git a/plugins/inputs/twemproxy/twemproxy.go b/plugins/inputs/twemproxy/twemproxy.go
index 95c9d0ba050670a6cd7a2fd49832ef50f8cb13cc..6dcce80585e8ce00dfba2b7c663aa0172d2b13a1 100644
--- a/plugins/inputs/twemproxy/twemproxy.go
+++ b/plugins/inputs/twemproxy/twemproxy.go
@@ -7,7 +7,7 @@ import (
 	"net"
 	"time"
 
-	"github.com/influxdb/telegraf/plugins/inputs"
+	"github.com/influxdata/telegraf/plugins/inputs"
 )
 
 type Twemproxy struct {
diff --git a/plugins/inputs/twemproxy/twemproxy_test.go b/plugins/inputs/twemproxy/twemproxy_test.go
index 60209d1a18b1cf7bd23e6408e59cae19659b5672..dd79048e0a5f50b1abf5096db73feab328bb61fd 100644
--- a/plugins/inputs/twemproxy/twemproxy_test.go
+++ b/plugins/inputs/twemproxy/twemproxy_test.go
@@ -5,7 +5,7 @@ import (
 	"net"
 	"testing"
 
-	"github.com/influxdb/telegraf/testutil"
+	"github.com/influxdata/telegraf/testutil"
 	"github.com/stretchr/testify/require"
 )
 
diff --git a/plugins/inputs/zfs/zfs.go b/plugins/inputs/zfs/zfs.go
index 109b261f8877638b8d37e62bd3df12f9c68d43ce..13f2d98062bb7cd3917c9ae8cbfb86a273be963f 100644
--- a/plugins/inputs/zfs/zfs.go
+++ b/plugins/inputs/zfs/zfs.go
@@ -6,8 +6,8 @@ import (
 	"strconv"
 	"strings"
 
-	"github.com/influxdb/telegraf/internal"
-	"github.com/influxdb/telegraf/plugins/inputs"
+	"github.com/influxdata/telegraf/internal"
+	"github.com/influxdata/telegraf/plugins/inputs"
 )
 
 type Zfs struct {
diff --git a/plugins/inputs/zfs/zfs_test.go b/plugins/inputs/zfs/zfs_test.go
index 9530084d0dc700ffa54d52f041088af124103648..e40d91c02179a88fac0aae5f4faffe9f6f41522a 100644
--- a/plugins/inputs/zfs/zfs_test.go
+++ b/plugins/inputs/zfs/zfs_test.go
@@ -5,7 +5,7 @@ import (
 	"os"
 	"testing"
 
-	"github.com/influxdb/telegraf/testutil"
+	"github.com/influxdata/telegraf/testutil"
 	"github.com/stretchr/testify/require"
 )
 
diff --git a/plugins/inputs/zookeeper/zookeeper.go b/plugins/inputs/zookeeper/zookeeper.go
index 93a07840dc32ea66d4be10b8eea90143478ffafb..c2940f5e31c3cf76cebca11f223603aef0011724 100644
--- a/plugins/inputs/zookeeper/zookeeper.go
+++ b/plugins/inputs/zookeeper/zookeeper.go
@@ -10,7 +10,7 @@ import (
 	"strings"
 	"time"
 
-	"github.com/influxdb/telegraf/plugins/inputs"
+	"github.com/influxdata/telegraf/plugins/inputs"
 )
 
 // Zookeeper is a zookeeper plugin
diff --git a/plugins/inputs/zookeeper/zookeeper_test.go b/plugins/inputs/zookeeper/zookeeper_test.go
index 354382ecc0afa5fbf6e6568edcff3d77a2b76340..bc02ffb9d62b135fe4b5dc69546e6b1f762a2f09 100644
--- a/plugins/inputs/zookeeper/zookeeper_test.go
+++ b/plugins/inputs/zookeeper/zookeeper_test.go
@@ -3,7 +3,7 @@ package zookeeper
 import (
 	"testing"
 
-	"github.com/influxdb/telegraf/testutil"
+	"github.com/influxdata/telegraf/testutil"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
 )
diff --git a/plugins/outputs/all/all.go b/plugins/outputs/all/all.go
index 7eedb592a29aecaadef62ae12d847909cd8873f5..ac8357c90909070e3d5ba38cb4082f921ff606a1 100644
--- a/plugins/outputs/all/all.go
+++ b/plugins/outputs/all/all.go
@@ -1,17 +1,18 @@
 package all
 
 import (
-	_ "github.com/influxdb/telegraf/plugins/outputs/amon"
-	_ "github.com/influxdb/telegraf/plugins/outputs/amqp"
-	_ "github.com/influxdb/telegraf/plugins/outputs/datadog"
-	_ "github.com/influxdb/telegraf/plugins/outputs/graphite"
-	_ "github.com/influxdb/telegraf/plugins/outputs/influxdb"
-	_ "github.com/influxdb/telegraf/plugins/outputs/kafka"
-	_ "github.com/influxdb/telegraf/plugins/outputs/kinesis"
-	_ "github.com/influxdb/telegraf/plugins/outputs/librato"
-	_ "github.com/influxdb/telegraf/plugins/outputs/mqtt"
-	_ "github.com/influxdb/telegraf/plugins/outputs/nsq"
-	_ "github.com/influxdb/telegraf/plugins/outputs/opentsdb"
-	_ "github.com/influxdb/telegraf/plugins/outputs/prometheus_client"
-	_ "github.com/influxdb/telegraf/plugins/outputs/riemann"
+	_ "github.com/influxdata/telegraf/plugins/outputs/amon"
+	_ "github.com/influxdata/telegraf/plugins/outputs/amqp"
+	_ "github.com/influxdata/telegraf/plugins/outputs/cloudwatch"
+	_ "github.com/influxdata/telegraf/plugins/outputs/datadog"
+	_ "github.com/influxdata/telegraf/plugins/outputs/graphite"
+	_ "github.com/influxdata/telegraf/plugins/outputs/influxdb"
+	_ "github.com/influxdata/telegraf/plugins/outputs/kafka"
+	_ "github.com/influxdata/telegraf/plugins/outputs/kinesis"
+	_ "github.com/influxdata/telegraf/plugins/outputs/librato"
+	_ "github.com/influxdata/telegraf/plugins/outputs/mqtt"
+	_ "github.com/influxdata/telegraf/plugins/outputs/nsq"
+	_ "github.com/influxdata/telegraf/plugins/outputs/opentsdb"
+	_ "github.com/influxdata/telegraf/plugins/outputs/prometheus_client"
+	_ "github.com/influxdata/telegraf/plugins/outputs/riemann"
 )
diff --git a/plugins/outputs/amon/amon.go b/plugins/outputs/amon/amon.go
index d8fceb0350d8122280990d1e1353085bba9636dd..e9f2c9f30042ba470b913ee17d82be10f63da0ed 100644
--- a/plugins/outputs/amon/amon.go
+++ b/plugins/outputs/amon/amon.go
@@ -8,9 +8,9 @@ import (
 	"net/http"
 	"strings"
 
-	"github.com/influxdb/influxdb/client/v2"
-	"github.com/influxdb/telegraf/internal"
-	"github.com/influxdb/telegraf/plugins/outputs"
+	"github.com/influxdata/influxdb/client/v2"
+	"github.com/influxdata/telegraf/internal"
+	"github.com/influxdata/telegraf/plugins/outputs"
 )
 
 type Amon struct {
diff --git a/plugins/outputs/amon/amon_test.go b/plugins/outputs/amon/amon_test.go
index cfe4e9f233a7e420df44d8437801c09590171ce3..b725bab9e52e8267a0381ac82ea86708b6d53eca 100644
--- a/plugins/outputs/amon/amon_test.go
+++ b/plugins/outputs/amon/amon_test.go
@@ -6,9 +6,9 @@ import (
 	"testing"
 	"time"
 
-	"github.com/influxdb/telegraf/testutil"
+	"github.com/influxdata/telegraf/testutil"
 
-	"github.com/influxdb/influxdb/client/v2"
+	"github.com/influxdata/influxdb/client/v2"
 )
 
 func TestBuildPoint(t *testing.T) {
diff --git a/plugins/outputs/amqp/amqp.go b/plugins/outputs/amqp/amqp.go
index e1d6302a1d1cf803565ea68501aafc44252d3c9e..bdbf47b86da4fef03c9cb8b82b086101541411c8 100644
--- a/plugins/outputs/amqp/amqp.go
+++ b/plugins/outputs/amqp/amqp.go
@@ -10,8 +10,8 @@ import (
 	"sync"
 	"time"
 
-	"github.com/influxdb/influxdb/client/v2"
-	"github.com/influxdb/telegraf/plugins/outputs"
+	"github.com/influxdata/influxdb/client/v2"
+	"github.com/influxdata/telegraf/plugins/outputs"
 	"github.com/streadway/amqp"
 )
 
diff --git a/plugins/outputs/amqp/amqp_test.go b/plugins/outputs/amqp/amqp_test.go
index 4c6a9a8d38224e35a624091eddd19a38a73cf32d..a65634cab34fbcf2471deb1ab3bbebdde2176cb3 100644
--- a/plugins/outputs/amqp/amqp_test.go
+++ b/plugins/outputs/amqp/amqp_test.go
@@ -3,7 +3,7 @@ package amqp
 import (
 	"testing"
 
-	"github.com/influxdb/telegraf/testutil"
+	"github.com/influxdata/telegraf/testutil"
 	"github.com/stretchr/testify/require"
 )
 
diff --git a/plugins/outputs/cloudwatch/README.md b/plugins/outputs/cloudwatch/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..853d038c3574d8ab800f92e93ef5d0a206fcd7e6
--- /dev/null
+++ b/plugins/outputs/cloudwatch/README.md
@@ -0,0 +1,33 @@
+## Amazon CloudWatch Output for Telegraf
+
+This plugin will send points to Amazon CloudWatch.
+
+## Amazon Authentication
+
+This plugin uses a credential chain for Authentication with the CloudWatch
+API endpoint. In the following order the plugin will attempt to authenticate.
+1. [IAMS Role](http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html)
+2. [Environment Variables](https://github.com/aws/aws-sdk-go/wiki/configuring-sdk)
+3. [Shared Credentials](https://github.com/aws/aws-sdk-go/wiki/configuring-sdk)
+
+## Config
+
+For this output plugin to function correctly the following variables
+must be configured.
+
+* region
+* namespace
+
+### region
+
+The region is the Amazon region that you wish to connect to.
+Examples include but are not limited to:
+* us-west-1
+* us-west-2
+* us-east-1
+* ap-southeast-1
+* ap-southeast-2
+
+### namespace
+
+The namespace used for AWS CloudWatch metrics.
diff --git a/plugins/outputs/cloudwatch/cloudwatch.go b/plugins/outputs/cloudwatch/cloudwatch.go
new file mode 100644
index 0000000000000000000000000000000000000000..1e20836da04407feecdb745296b1542e8fcaec10
--- /dev/null
+++ b/plugins/outputs/cloudwatch/cloudwatch.go
@@ -0,0 +1,236 @@
+package cloudwatch
+
+import (
+	"log"
+	"math"
+	"sort"
+	"strings"
+	"time"
+
+	"github.com/aws/aws-sdk-go/aws"
+	"github.com/aws/aws-sdk-go/aws/credentials"
+	"github.com/aws/aws-sdk-go/aws/credentials/ec2rolecreds"
+	"github.com/aws/aws-sdk-go/aws/ec2metadata"
+	"github.com/aws/aws-sdk-go/aws/session"
+	"github.com/aws/aws-sdk-go/service/cloudwatch"
+
+	"github.com/influxdata/influxdb/client/v2"
+	"github.com/influxdata/telegraf/plugins/outputs"
+)
+
+type CloudWatch struct {
+	Region    string // AWS Region
+	Namespace string // CloudWatch Metrics Namespace
+	svc       *cloudwatch.CloudWatch
+}
+
+var sampleConfig = `
+  # Amazon REGION
+  region = 'us-east-1'
+
+  # Namespace for the CloudWatch MetricDatums
+  namespace = 'InfluxData/Telegraf'
+`
+
+func (c *CloudWatch) SampleConfig() string {
+	return sampleConfig
+}
+
+func (c *CloudWatch) Description() string {
+	return "Configuration for AWS CloudWatch output."
+}
+
+func (c *CloudWatch) Connect() error {
+	Config := &aws.Config{
+		Region: aws.String(c.Region),
+		Credentials: credentials.NewChainCredentials(
+			[]credentials.Provider{
+				&ec2rolecreds.EC2RoleProvider{Client: ec2metadata.New(session.New())},
+				&credentials.EnvProvider{},
+				&credentials.SharedCredentialsProvider{},
+			}),
+	}
+
+	svc := cloudwatch.New(session.New(Config))
+
+	params := &cloudwatch.ListMetricsInput{
+		Namespace: aws.String(c.Namespace),
+	}
+
+	_, err := svc.ListMetrics(params) // Try a read-only call to test connection.
+
+	if err != nil {
+		log.Printf("cloudwatch: Error in ListMetrics API call : %+v \n", err.Error())
+	}
+
+	c.svc = svc
+
+	return err
+}
+
+func (c *CloudWatch) Close() error {
+	return nil
+}
+
+func (c *CloudWatch) Write(points []*client.Point) error {
+	for _, pt := range points {
+		err := c.WriteSinglePoint(pt)
+		if err != nil {
+			return err
+		}
+	}
+
+	return nil
+}
+
+// Write data for a single point. A point can have many fields and one field
+// is equal to one MetricDatum. There is a limit on how many MetricDatums a
+// request can have so we process one Point at a time.
+func (c *CloudWatch) WriteSinglePoint(point *client.Point) error {
+	datums := BuildMetricDatum(point)
+
+	const maxDatumsPerCall = 20 // PutMetricData only supports up to 20 data points per call
+
+	for _, partition := range PartitionDatums(maxDatumsPerCall, datums) {
+		err := c.WriteToCloudWatch(partition)
+
+		if err != nil {
+			return err
+		}
+	}
+
+	return nil
+}
+
+func (c *CloudWatch) WriteToCloudWatch(datums []*cloudwatch.MetricDatum) error {
+	params := &cloudwatch.PutMetricDataInput{
+		MetricData: datums,
+		Namespace:  aws.String(c.Namespace),
+	}
+
+	_, err := c.svc.PutMetricData(params)
+
+	if err != nil {
+		log.Printf("CloudWatch: Unable to write to CloudWatch : %+v \n", err.Error())
+	}
+
+	return err
+}
+
+// Partition the MetricDatums into smaller slices of a max size so that are under the limit
+// for the AWS API calls.
+func PartitionDatums(size int, datums []*cloudwatch.MetricDatum) [][]*cloudwatch.MetricDatum {
+
+	numberOfPartitions := len(datums) / size
+	if len(datums)%size != 0 {
+		numberOfPartitions += 1
+	}
+
+	partitions := make([][]*cloudwatch.MetricDatum, numberOfPartitions)
+
+	for i := 0; i < numberOfPartitions; i++ {
+		start := size * i
+		end := size * (i + 1)
+		if end > len(datums) {
+			end = len(datums)
+		}
+
+		partitions[i] = datums[start:end]
+	}
+
+	return partitions
+}
+
+// Make a MetricDatum for each field in a Point. Only fields with values that can be
+// converted to float64 are supported. Non-supported fields are skipped.
+func BuildMetricDatum(point *client.Point) []*cloudwatch.MetricDatum {
+	datums := make([]*cloudwatch.MetricDatum, len(point.Fields()))
+	i := 0
+
+	var value float64
+
+	for k, v := range point.Fields() {
+		switch t := v.(type) {
+		case int:
+			value = float64(t)
+		case int32:
+			value = float64(t)
+		case int64:
+			value = float64(t)
+		case float64:
+			value = t
+		case bool:
+			if t {
+				value = 1
+			} else {
+				value = 0
+			}
+		case time.Time:
+			value = float64(t.Unix())
+		default:
+			// Skip unsupported type.
+			datums = datums[:len(datums)-1]
+			continue
+		}
+
+		datums[i] = &cloudwatch.MetricDatum{
+			MetricName: aws.String(strings.Join([]string{point.Name(), k}, "_")),
+			Value:      aws.Float64(value),
+			Dimensions: BuildDimensions(point.Tags()),
+			Timestamp:  aws.Time(point.Time()),
+		}
+
+		i += 1
+	}
+
+	return datums
+}
+
+// Make a list of Dimensions by using a Point's tags. CloudWatch supports up to
+// 10 dimensions per metric so we only keep up to the first 10 alphabetically.
+// This always includes the "host" tag if it exists.
+func BuildDimensions(ptTags map[string]string) []*cloudwatch.Dimension {
+
+	const MaxDimensions = 10
+	dimensions := make([]*cloudwatch.Dimension, int(math.Min(float64(len(ptTags)), MaxDimensions)))
+
+	i := 0
+
+	// This is pretty ugly but we always want to include the "host" tag if it exists.
+	if host, ok := ptTags["host"]; ok {
+		dimensions[i] = &cloudwatch.Dimension{
+			Name:  aws.String("host"),
+			Value: aws.String(host),
+		}
+		i += 1
+	}
+
+	var keys []string
+	for k := range ptTags {
+		if k != "host" {
+			keys = append(keys, k)
+		}
+	}
+	sort.Strings(keys)
+
+	for _, k := range keys {
+		if i >= MaxDimensions {
+			break
+		}
+
+		dimensions[i] = &cloudwatch.Dimension{
+			Name:  aws.String(k),
+			Value: aws.String(ptTags[k]),
+		}
+
+		i += 1
+	}
+
+	return dimensions
+}
+
+func init() {
+	outputs.Add("cloudwatch", func() outputs.Output {
+		return &CloudWatch{}
+	})
+}
diff --git a/plugins/outputs/cloudwatch/cloudwatch_test.go b/plugins/outputs/cloudwatch/cloudwatch_test.go
new file mode 100644
index 0000000000000000000000000000000000000000..2041e14fd42df82da57efd5f17ee6f290f797130
--- /dev/null
+++ b/plugins/outputs/cloudwatch/cloudwatch_test.go
@@ -0,0 +1,88 @@
+package cloudwatch
+
+import (
+	"sort"
+	"testing"
+
+	"github.com/aws/aws-sdk-go/aws"
+	"github.com/aws/aws-sdk-go/service/cloudwatch"
+
+	"github.com/influxdata/influxdb/client/v2"
+	"github.com/influxdata/telegraf/testutil"
+
+	"github.com/stretchr/testify/assert"
+)
+
+// Test that each tag becomes one dimension
+func TestBuildDimensions(t *testing.T) {
+	const MaxDimensions = 10
+
+	assert := assert.New(t)
+
+	testPoint := testutil.TestPoint(1)
+	dimensions := BuildDimensions(testPoint.Tags())
+
+	tagKeys := make([]string, len(testPoint.Tags()))
+	i := 0
+	for k, _ := range testPoint.Tags() {
+		tagKeys[i] = k
+		i += 1
+	}
+
+	sort.Strings(tagKeys)
+
+	if len(testPoint.Tags()) >= MaxDimensions {
+		assert.Equal(MaxDimensions, len(dimensions), "Number of dimensions should be less than MaxDimensions")
+	} else {
+		assert.Equal(len(testPoint.Tags()), len(dimensions), "Number of dimensions should be equal to number of tags")
+	}
+
+	for i, key := range tagKeys {
+		if i >= 10 {
+			break
+		}
+		assert.Equal(key, *dimensions[i].Name, "Key should be equal")
+		assert.Equal(testPoint.Tags()[key], *dimensions[i].Value, "Value should be equal")
+	}
+}
+
+// Test that points with valid values have a MetricDatum created where as non valid do not.
+// Skips "time.Time" type as something is converting the value to string.
+func TestBuildMetricDatums(t *testing.T) {
+	assert := assert.New(t)
+
+	validPoints := []*client.Point{
+		testutil.TestPoint(1),
+		testutil.TestPoint(int32(1)),
+		testutil.TestPoint(int64(1)),
+		testutil.TestPoint(float64(1)),
+		testutil.TestPoint(true),
+	}
+
+	for _, point := range validPoints {
+		datums := BuildMetricDatum(point)
+		assert.Equal(1, len(datums), "Valid type should create a Datum")
+	}
+
+	nonValidPoint := testutil.TestPoint("Foo")
+
+	assert.Equal(0, len(BuildMetricDatum(nonValidPoint)), "Invalid type should not create a Datum")
+}
+
+func TestPartitionDatums(t *testing.T) {
+
+	assert := assert.New(t)
+
+	testDatum := cloudwatch.MetricDatum{
+		MetricName: aws.String("Foo"),
+		Value:      aws.Float64(1),
+	}
+
+	oneDatum := []*cloudwatch.MetricDatum{&testDatum}
+	twoDatum := []*cloudwatch.MetricDatum{&testDatum, &testDatum}
+	threeDatum := []*cloudwatch.MetricDatum{&testDatum, &testDatum, &testDatum}
+
+	assert.Equal([][]*cloudwatch.MetricDatum{oneDatum}, PartitionDatums(2, oneDatum))
+	assert.Equal([][]*cloudwatch.MetricDatum{twoDatum}, PartitionDatums(2, twoDatum))
+	assert.Equal([][]*cloudwatch.MetricDatum{twoDatum, oneDatum}, PartitionDatums(2, threeDatum))
+}
diff --git a/plugins/outputs/datadog/datadog.go b/plugins/outputs/datadog/datadog.go
index 4231b1f285d02c8d18c379e7b9892baa84d4d2dd..7d65397896ededd0c7eae3a5742bb33e70b60bdc 100644
--- a/plugins/outputs/datadog/datadog.go
+++ b/plugins/outputs/datadog/datadog.go
@@ -10,9 +10,9 @@ import (
 	"sort"
 	"strings"
 
-	"github.com/influxdb/influxdb/client/v2"
-	"github.com/influxdb/telegraf/internal"
-	"github.com/influxdb/telegraf/plugins/outputs"
+	"github.com/influxdata/influxdb/client/v2"
+	"github.com/influxdata/telegraf/internal"
+	"github.com/influxdata/telegraf/plugins/outputs"
 )
 
 type Datadog struct {
diff --git a/plugins/outputs/datadog/datadog_test.go b/plugins/outputs/datadog/datadog_test.go
index fe0b7c1fe75a058d378d56d9aa612b4f1d755442..968a8e9c88ceb71e6196ae0277565732722f7f1a 100644
--- a/plugins/outputs/datadog/datadog_test.go
+++ b/plugins/outputs/datadog/datadog_test.go
@@ -9,9 +9,9 @@ import (
 	"testing"
 	"time"
 
-	"github.com/influxdb/telegraf/testutil"
+	"github.com/influxdata/telegraf/testutil"
 
-	"github.com/influxdb/influxdb/client/v2"
+	"github.com/influxdata/influxdb/client/v2"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
 )
diff --git a/plugins/outputs/graphite/graphite.go b/plugins/outputs/graphite/graphite.go
index dd2af8eb16568bbf3295a9209b7613566a48ab9e..f9781041fae3a85f04be5bdf0d46d654dc5704c6 100644
--- a/plugins/outputs/graphite/graphite.go
+++ b/plugins/outputs/graphite/graphite.go
@@ -3,8 +3,8 @@ package graphite
 import (
 	"errors"
 	"fmt"
-	"github.com/influxdb/influxdb/client/v2"
-	"github.com/influxdb/telegraf/plugins/outputs"
+	"github.com/influxdata/influxdb/client/v2"
+	"github.com/influxdata/telegraf/plugins/outputs"
 	"log"
 	"math/rand"
 	"net"
diff --git a/plugins/outputs/graphite/graphite_test.go b/plugins/outputs/graphite/graphite_test.go
index e9000c3c7723c34e48b876a4b8688f7a289a3d24..be4cc2472255667f666531c9975eb20247a50e7f 100644
--- a/plugins/outputs/graphite/graphite_test.go
+++ b/plugins/outputs/graphite/graphite_test.go
@@ -8,7 +8,7 @@ import (
 	"testing"
 	"time"
 
-	"github.com/influxdb/influxdb/client/v2"
+	"github.com/influxdata/influxdb/client/v2"
 
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
diff --git a/plugins/outputs/influxdb/influxdb.go b/plugins/outputs/influxdb/influxdb.go
index f6b79b009c7ea398bb784e3233d9b14243d5586c..f45f020b6c50abbef891ad4fef5911259e374f25 100644
--- a/plugins/outputs/influxdb/influxdb.go
+++ b/plugins/outputs/influxdb/influxdb.go
@@ -9,9 +9,9 @@ import (
 	"strings"
 	"time"
 
-	"github.com/influxdb/influxdb/client/v2"
-	"github.com/influxdb/telegraf/internal"
-	"github.com/influxdb/telegraf/plugins/outputs"
+	"github.com/influxdata/influxdb/client/v2"
+	"github.com/influxdata/telegraf/internal"
+	"github.com/influxdata/telegraf/plugins/outputs"
 )
 
 type InfluxDB struct {
diff --git a/plugins/outputs/influxdb/influxdb_test.go b/plugins/outputs/influxdb/influxdb_test.go
index cf1d7d9b37af696b5b4b5b8f1ce49332a7276c6e..5da0c056f0c9eaa733e7c316c4b7e684f2e8a582 100644
--- a/plugins/outputs/influxdb/influxdb_test.go
+++ b/plugins/outputs/influxdb/influxdb_test.go
@@ -6,7 +6,7 @@ import (
 	"net/http/httptest"
 	"testing"
 
-	"github.com/influxdb/telegraf/testutil"
+	"github.com/influxdata/telegraf/testutil"
 
 	"github.com/stretchr/testify/require"
 )
diff --git a/plugins/outputs/kafka/kafka.go b/plugins/outputs/kafka/kafka.go
index 55ef35fb4b2cbf70aeaaee59176d9b7ab7a64552..b16347c92cf7c000edb9e65eb2c6337162d97a6a 100644
--- a/plugins/outputs/kafka/kafka.go
+++ b/plugins/outputs/kafka/kafka.go
@@ -6,8 +6,8 @@ import (
 	"errors"
 	"fmt"
 	"github.com/Shopify/sarama"
-	"github.com/influxdb/influxdb/client/v2"
-	"github.com/influxdb/telegraf/plugins/outputs"
+	"github.com/influxdata/influxdb/client/v2"
+	"github.com/influxdata/telegraf/plugins/outputs"
 	"io/ioutil"
 )
 
diff --git a/plugins/outputs/kafka/kafka_test.go b/plugins/outputs/kafka/kafka_test.go
index 2c1734857d1599696a4ea4d52deb27893fa4a52b..2af34377862037c20fafbccbc9414682fc874a6e 100644
--- a/plugins/outputs/kafka/kafka_test.go
+++ b/plugins/outputs/kafka/kafka_test.go
@@ -3,7 +3,7 @@ package kafka
 import (
 	"testing"
 
-	"github.com/influxdb/telegraf/testutil"
+	"github.com/influxdata/telegraf/testutil"
 	"github.com/stretchr/testify/require"
 )
 
diff --git a/plugins/outputs/kinesis/kinesis.go b/plugins/outputs/kinesis/kinesis.go
index 11e26fdf9c9f366a7443805155b5493404b2ad3b..f04f1c7c61d84141ec793ad4f7bc856d9ed0e0fd 100644
--- a/plugins/outputs/kinesis/kinesis.go
+++ b/plugins/outputs/kinesis/kinesis.go
@@ -15,8 +15,8 @@ import (
 	"github.com/aws/aws-sdk-go/aws/session"
 	"github.com/aws/aws-sdk-go/service/kinesis"
 
-	"github.com/influxdb/influxdb/client/v2"
-	"github.com/influxdb/telegraf/plugins/outputs"
+	"github.com/influxdata/influxdb/client/v2"
+	"github.com/influxdata/telegraf/plugins/outputs"
 )
 
 type KinesisOutput struct {
diff --git a/plugins/outputs/kinesis/kinesis_test.go b/plugins/outputs/kinesis/kinesis_test.go
index 4c667c86078e49810b98d82f71dc47bbe9279b38..76eb6ebca1cfcb924180c653c3a8f8ac6545f91d 100644
--- a/plugins/outputs/kinesis/kinesis_test.go
+++ b/plugins/outputs/kinesis/kinesis_test.go
@@ -1,7 +1,7 @@
 package kinesis
 
 import (
-	"github.com/influxdb/telegraf/testutil"
+	"github.com/influxdata/telegraf/testutil"
 	"github.com/stretchr/testify/require"
 	"testing"
 )
diff --git a/plugins/outputs/librato/librato.go b/plugins/outputs/librato/librato.go
index 75aecb756a9cac0f2f8389df6a5503d593543ebb..6afcb45422201f8fbb487c378e6928eb78c89a43 100644
--- a/plugins/outputs/librato/librato.go
+++ b/plugins/outputs/librato/librato.go
@@ -7,9 +7,9 @@ import (
 	"log"
 	"net/http"
 
-	"github.com/influxdb/influxdb/client/v2"
-	"github.com/influxdb/telegraf/internal"
-	"github.com/influxdb/telegraf/plugins/outputs"
+	"github.com/influxdata/influxdb/client/v2"
+	"github.com/influxdata/telegraf/internal"
+	"github.com/influxdata/telegraf/plugins/outputs"
 )
 
 type Librato struct {
diff --git a/plugins/outputs/librato/librato_test.go b/plugins/outputs/librato/librato_test.go
index 129352027cacc6f4d0405780ff83474278169cff..25418baa582dc0bc8c99dbeed10646e82d04f896 100644
--- a/plugins/outputs/librato/librato_test.go
+++ b/plugins/outputs/librato/librato_test.go
@@ -9,9 +9,9 @@ import (
 	"testing"
 	"time"
 
-	"github.com/influxdb/telegraf/testutil"
+	"github.com/influxdata/telegraf/testutil"
 
-	"github.com/influxdb/influxdb/client/v2"
+	"github.com/influxdata/influxdb/client/v2"
 	"github.com/stretchr/testify/require"
 )
 
diff --git a/plugins/outputs/mqtt/mqtt.go b/plugins/outputs/mqtt/mqtt.go
index a70b2e5750eac3435270ad4ceb8d0108f4229199..7c47cf741684b163b9a33438a10f8711e81dd208 100644
--- a/plugins/outputs/mqtt/mqtt.go
+++ b/plugins/outputs/mqtt/mqtt.go
@@ -10,9 +10,9 @@ import (
 	"sync"
 
 	paho "git.eclipse.org/gitroot/paho/org.eclipse.paho.mqtt.golang.git"
-	"github.com/influxdb/influxdb/client/v2"
-	"github.com/influxdb/telegraf/internal"
-	"github.com/influxdb/telegraf/plugins/outputs"
+	"github.com/influxdata/influxdb/client/v2"
+	"github.com/influxdata/telegraf/internal"
+	"github.com/influxdata/telegraf/plugins/outputs"
 )
 
 const MaxClientIdLen = 8
diff --git a/plugins/outputs/mqtt/mqtt_test.go b/plugins/outputs/mqtt/mqtt_test.go
index 0922b83edca712a840369b958989c21b39d71101..f25f4497f721981f21b8f09cb6c3a19a3aa5781c 100644
--- a/plugins/outputs/mqtt/mqtt_test.go
+++ b/plugins/outputs/mqtt/mqtt_test.go
@@ -3,7 +3,7 @@ package mqtt
 import (
 	"testing"
 
-	"github.com/influxdb/telegraf/testutil"
+	"github.com/influxdata/telegraf/testutil"
 	"github.com/stretchr/testify/require"
 )
 
diff --git a/plugins/outputs/nsq/nsq.go b/plugins/outputs/nsq/nsq.go
index db58670a2c1951019fa2d43fdcc1e2cd94312888..79818ec5c846e6d514eb648bced4a926a75cb7c3 100644
--- a/plugins/outputs/nsq/nsq.go
+++ b/plugins/outputs/nsq/nsq.go
@@ -2,8 +2,8 @@ package nsq
 
 import (
 	"fmt"
-	"github.com/influxdb/influxdb/client/v2"
-	"github.com/influxdb/telegraf/plugins/outputs"
+	"github.com/influxdata/influxdb/client/v2"
+	"github.com/influxdata/telegraf/plugins/outputs"
 	"github.com/nsqio/go-nsq"
 )
 
diff --git a/plugins/outputs/nsq/nsq_test.go b/plugins/outputs/nsq/nsq_test.go
index 4448383f42cc338c4b6154c5dae466b82a99f726..b2d703a70ef23619436b80c961b1f67e08b605e8 100644
--- a/plugins/outputs/nsq/nsq_test.go
+++ b/plugins/outputs/nsq/nsq_test.go
@@ -3,7 +3,7 @@ package nsq
 import (
 	"testing"
 
-	"github.com/influxdb/telegraf/testutil"
+	"github.com/influxdata/telegraf/testutil"
 	"github.com/stretchr/testify/require"
 )
 
diff --git a/plugins/outputs/opentsdb/opentsdb.go b/plugins/outputs/opentsdb/opentsdb.go
index 236385d71b786d3ddd00d5b74130f28c8d128883..6e9f3e26a7fff1512a52b509e1a7915acc5df7f1 100644
--- a/plugins/outputs/opentsdb/opentsdb.go
+++ b/plugins/outputs/opentsdb/opentsdb.go
@@ -8,8 +8,8 @@ import (
 	"strings"
 	"time"
 
-	"github.com/influxdb/influxdb/client/v2"
-	"github.com/influxdb/telegraf/plugins/outputs"
+	"github.com/influxdata/influxdb/client/v2"
+	"github.com/influxdata/telegraf/plugins/outputs"
 )
 
 type OpenTSDB struct {
diff --git a/plugins/outputs/opentsdb/opentsdb_test.go b/plugins/outputs/opentsdb/opentsdb_test.go
index f75bd7205dedc5c9576772a84770884a779dfb49..92df3fb5218695341740fdc33bc5a7ac1f5e5a5d 100644
--- a/plugins/outputs/opentsdb/opentsdb_test.go
+++ b/plugins/outputs/opentsdb/opentsdb_test.go
@@ -4,7 +4,7 @@ import (
 	"reflect"
 	"testing"
 
-	"github.com/influxdb/telegraf/testutil"
+	"github.com/influxdata/telegraf/testutil"
 	"github.com/stretchr/testify/require"
 )
 
diff --git a/plugins/outputs/prometheus_client/prometheus_client.go b/plugins/outputs/prometheus_client/prometheus_client.go
index 1fbf9056a66bbc0f122a73d6d6d7475978f09610..4e429722a72c92e9999406274963664875eca36d 100644
--- a/plugins/outputs/prometheus_client/prometheus_client.go
+++ b/plugins/outputs/prometheus_client/prometheus_client.go
@@ -5,8 +5,8 @@ import (
 	"log"
 	"net/http"
 
-	"github.com/influxdb/influxdb/client/v2"
-	"github.com/influxdb/telegraf/plugins/outputs"
+	"github.com/influxdata/influxdb/client/v2"
+	"github.com/influxdata/telegraf/plugins/outputs"
 	"github.com/prometheus/client_golang/prometheus"
 )
 
diff --git a/plugins/outputs/prometheus_client/prometheus_client_test.go b/plugins/outputs/prometheus_client/prometheus_client_test.go
index dc353486cf20462d2984ff779d629234133954ef..73163ee1d6b76abff36033e561b85c31852a1dfe 100644
--- a/plugins/outputs/prometheus_client/prometheus_client_test.go
+++ b/plugins/outputs/prometheus_client/prometheus_client_test.go
@@ -5,9 +5,9 @@ import (
 
 	"github.com/stretchr/testify/require"
 
-	"github.com/influxdb/influxdb/client/v2"
-	"github.com/influxdb/telegraf/plugins/inputs/prometheus"
-	"github.com/influxdb/telegraf/testutil"
+	"github.com/influxdata/influxdb/client/v2"
+	"github.com/influxdata/telegraf/plugins/inputs/prometheus"
+	"github.com/influxdata/telegraf/testutil"
 )
 
 var pTesting *PrometheusClient
diff --git a/plugins/outputs/registry.go b/plugins/outputs/registry.go
index d7ea30492fb00c84660f5379fd36767cbe0a7e39..d4c6ba1e5919f9502a48f7089568c475d97efab0 100644
--- a/plugins/outputs/registry.go
+++ b/plugins/outputs/registry.go
@@ -1,7 +1,7 @@
 package outputs
 
 import (
-	"github.com/influxdb/influxdb/client/v2"
+	"github.com/influxdata/influxdb/client/v2"
 )
 
 type Output interface {
diff --git a/plugins/outputs/riemann/riemann.go b/plugins/outputs/riemann/riemann.go
index afbde005109509ca214bdb936218f7837cb92326..c1b22ec4694ec0a2d2d10aa4f884145f8456481f 100644
--- a/plugins/outputs/riemann/riemann.go
+++ b/plugins/outputs/riemann/riemann.go
@@ -6,8 +6,8 @@ import (
 	"os"
 
 	"github.com/amir/raidman"
-	"github.com/influxdb/influxdb/client/v2"
-	"github.com/influxdb/telegraf/plugins/outputs"
+	"github.com/influxdata/influxdb/client/v2"
+	"github.com/influxdata/telegraf/plugins/outputs"
 )
 
 type Riemann struct {
diff --git a/plugins/outputs/riemann/riemann_test.go b/plugins/outputs/riemann/riemann_test.go
index 31e9478b1d8073419a2428556d11fb16c6e611bf..8b3f27ac015ade89db6f3d7cbc7e61dee8220f27 100644
--- a/plugins/outputs/riemann/riemann_test.go
+++ b/plugins/outputs/riemann/riemann_test.go
@@ -3,7 +3,7 @@ package riemann
 import (
 	"testing"
 
-	"github.com/influxdb/telegraf/testutil"
+	"github.com/influxdata/telegraf/testutil"
 	"github.com/stretchr/testify/require"
 )
 
diff --git a/scripts/Vagrantfile b/scripts/Vagrantfile
index 3c0199bdb309e681bfc313c52986bcd6fbf12628..a04450d6d3fdd8c1c4653e53a6c65f05297c00b0 100644
--- a/scripts/Vagrantfile
+++ b/scripts/Vagrantfile
@@ -7,7 +7,7 @@ VAGRANTFILE_API_VERSION = "2"
 Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
 
   config.vm.box = "ubuntu/trusty64"
-  config.vm.synced_folder "..", "/home/vagrant/go/src/github.com/influxdb/telegraf",
+  config.vm.synced_folder "..", "/home/vagrant/go/src/github.com/influxdata/telegraf",
     type: "rsync",
     rsync__args: ["--verbose", "--archive", "--delete", "-z", "--safe-links"],
     rsync__exclude: ["./telegraf", ".vagrant/"]
@@ -26,7 +26,7 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
     gvm use go1.4.2 --default
     echo "export PATH=$PATH:$GOPATH/bin"   >> "$HOME/.bashrc"
     echo 'export GOPATH=/home/vagrant/go'  >> "$HOME/.bashrc"
-    cd "$HOME/go/src/github.com/influxdb/telegraf" &&\
+    cd "$HOME/go/src/github.com/influxdata/telegraf" &&\
       rm -rf Godeps/_workspace/pkg &&\
       GOPATH="$HOME/go" make
   SHELL
diff --git a/scripts/circle-test.sh b/scripts/circle-test.sh
index 96319bf72f2c5cfbd73866e6c35126b9f43d1527..bbad51506c9dfff60949b0060066d7d8a1306418 100755
--- a/scripts/circle-test.sh
+++ b/scripts/circle-test.sh
@@ -34,7 +34,7 @@ export GOPATH=$BUILD_DIR
 # Turning off GOGC speeds up build times
 export GOGC=off
 export PATH=$GOPATH/bin:$PATH
-exit_if_fail mkdir -p $GOPATH/src/github.com/influxdb
+exit_if_fail mkdir -p $GOPATH/src/github.com/influxdata
 
 # Dump some test config to the log.
 echo "Test configuration"
@@ -44,8 +44,8 @@ echo "\$GOPATH: $GOPATH"
 echo "\$CIRCLE_BRANCH: $CIRCLE_BRANCH"
 
 # Move the checked-out source to a better location
-exit_if_fail mv $HOME/telegraf $GOPATH/src/github.com/influxdb
-exit_if_fail cd $GOPATH/src/github.com/influxdb/telegraf
+exit_if_fail mv $HOME/telegraf $GOPATH/src/github.com/influxdata
+exit_if_fail cd $GOPATH/src/github.com/influxdata/telegraf
 
 # Verify that go fmt has been run
 check_go_fmt
diff --git a/scripts/telegraf.service b/scripts/telegraf.service
index d92f3072cdb3c12feacbe276361293ce0826ecc6..6f44504024ec59dd7520e5eb899c0e7866177117 100644
--- a/scripts/telegraf.service
+++ b/scripts/telegraf.service
@@ -1,6 +1,6 @@
 [Unit]
 Description=The plugin-driven server agent for reporting metrics into InfluxDB
-Documentation=https://github.com/influxdb/telegraf
+Documentation=https://github.com/influxdata/telegraf
 After=network.target
 
 [Service]
diff --git a/testutil/testutil.go b/testutil/testutil.go
index 581220299901829087be69ab691280b8178017e5..436b5736143ae648ff1bf74706429bdb125e9179 100644
--- a/testutil/testutil.go
+++ b/testutil/testutil.go
@@ -6,7 +6,7 @@ import (
 	"os"
 	"time"
 
-	"github.com/influxdb/influxdb/client/v2"
+	"github.com/influxdata/influxdb/client/v2"
 )
 
 var localhost = "localhost"