diff --git a/CHANGELOG.md b/CHANGELOG.md
index 22d48b2f3d272437ab32ff0562c1d0d01f7015c7..7ed1d24517ef87437ef136573cfa03483b10b283 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -25,6 +25,7 @@
 ### New Outputs
 
 - [http](./plugins/outputs/http/README.md) - Contributed by @Dark0096
+- [application_insights](./plugins/outputs/application_insights/README.md): Contribute by @karolz-ms
 
 ### Features
 
@@ -41,6 +42,7 @@
 - [#4096](https://github.com/influxdata/telegraf/pull/4096): Add topk processor plugin.
 - [#4114](https://github.com/influxdata/telegraf/pull/4114): Add cursor metrics to mongodb input.
 - [#3455](https://github.com/influxdata/telegraf/pull/3455): Add tag/integer pair for result to net_response.
+- [#4010](https://github.com/influxdata/telegraf/pull/3455): Add application_insights output plugin.
 
 ### Bugfixes
 
diff --git a/README.md b/README.md
index 03754232c5603a8d2baea201845c9d2a744d87f5..e453a4b53e1c7f122e33860175cd00aea66e0584 100644
--- a/README.md
+++ b/README.md
@@ -282,6 +282,7 @@ formats may be used with input plugins supporting the `data_format` option:
 * [influxdb](./plugins/outputs/influxdb)
 * [amon](./plugins/outputs/amon)
 * [amqp](./plugins/outputs/amqp) (rabbitmq)
+* [application_insights](./plugins/outputs/application_insights)
 * [aws kinesis](./plugins/outputs/kinesis)
 * [aws cloudwatch](./plugins/outputs/cloudwatch)
 * [cratedb](./plugins/outputs/cratedb)
diff --git a/docs/LICENSE_OF_DEPENDENCIES.md b/docs/LICENSE_OF_DEPENDENCIES.md
index 07b7287e94bdceeab374d09494ede3179a1ba634..0e476302716d6a088d48b4d3220e2bb13341f16c 100644
--- a/docs/LICENSE_OF_DEPENDENCIES.md
+++ b/docs/LICENSE_OF_DEPENDENCIES.md
@@ -3,6 +3,7 @@
 When distributed in a binary form, Telegraf may contain portions of the
 following works:
 
+- code.cloudfoundry.org/clock [APACHE](https://github.com/cloudfoundry/clock/blob/master/LICENSE)
 - collectd.org [MIT](https://github.com/collectd/go-collectd/blob/master/LICENSE)
 - github.com/aerospike/aerospike-client-go [APACHE](https://github.com/aerospike/aerospike-client-go/blob/master/LICENSE)
 - github.com/amir/raidman [PUBLIC DOMAIN](https://github.com/amir/raidman/blob/master/UNLICENSE)
@@ -51,6 +52,7 @@ following works:
 - github.com/kballard/go-shellquote [MIT](https://github.com/kballard/go-shellquote/blob/master/LICENSE)
 - github.com/lib/pq [MIT](https://github.com/lib/pq/blob/master/LICENSE.md)
 - github.com/matttproud/golang_protobuf_extensions [APACHE](https://github.com/matttproud/golang_protobuf_extensions/blob/master/LICENSE)
+- github.com/Microsoft/ApplicationInsights-Go [APACHE](https://github.com/Microsoft/ApplicationInsights-Go/blob/master/LICENSE)
 - github.com/Microsoft/go-winio [MIT](https://github.com/Microsoft/go-winio/blob/master/LICENSE)
 - github.com/miekg/dns [BSD](https://github.com/miekg/dns/blob/master/LICENSE)
 - github.com/naoina/go-stringutil [MIT](https://github.com/naoina/go-stringutil/blob/master/LICENSE)
diff --git a/plugins/outputs/application_insights/README.md b/plugins/outputs/application_insights/README.md
index c5b925c2ab29a80eb22bf244f0a99d13c39e35cb..08850a3e65ee6a8dde0c9437ee6519336d0fed51 100644
--- a/plugins/outputs/application_insights/README.md
+++ b/plugins/outputs/application_insights/README.md
@@ -1,32 +1,43 @@
 # Application Insights Output Plugin
 
-This plugin writes telegraf metrics to Azure Application Insights
+This plugin writes telegraf metrics to [Azure Application Insights](https://azure.microsoft.com/en-us/services/application-insights/).
 
-## Configuration
-```
+### Configuration:
+```toml
 [[outputs.application_insights]]
   ## Instrumentation key of the Application Insights resource.
-  instrumentationKey = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx"
+  instrumentation_key = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx"
 
-  ## Timeout on close. If not provided, will default to 5s. 0s means no timeout (not recommended).
+  ## Timeout for closing (default: 5s).
   # timeout = "5s"
 
-  ## Determines whether diagnostic logging (for Application Insights endpoint traffic) is enabled. Default is false.
-  # enable_diagnosic_logging = "true"
+  ## Enable additional diagnostic logging.
+  # enable_diagnosic_logging = false
 
-  ## ContextTagSources dictionary instructs the Application Insights plugin to set Application Insights context tags using metric properties.
-  ## In this dictionary keys are Application Insights context tags to set, and values are names of metric properties to use as source of data.
-  ## For example:
+  ## Context Tag Sources add Application Insights context tags to a tag value.
+  ##
+  ## For list of allowed context tag keys see:
+  ## https://github.com/Microsoft/ApplicationInsights-Go/blob/master/appinsights/contracts/contexttagkeys.go
   # [outputs.application_insights.context_tag_sources]
-  # "ai.cloud.role" = "kubernetes_container_name"
-  # "ai.cloud.roleInstance" = "kubernetes_pod_name"
-  ## will set the ai.cloud.role context tag to the value of kubernetes_container_name property (if present), 
-  ## and the ai.cloud.roleInstance context tag to the value of kubernetes_pod_name property.
-  ## For list of all context tag keys see https://github.com/Microsoft/ApplicationInsights-Go/blob/master/appinsights/contracts/contexttagkeys.go
+  #   "ai.cloud.role" = "kubernetes_container_name"
+  #   "ai.cloud.roleInstance" = "kubernetes_pod_name"
 ```
 
-## Implementation notes
-- Every field in a metric will result in a separate metric telemetry. For example, the metric `foo,host=a first=42,second=43 1525293034000000000`
-will result in two metric telemetry records sent to Application Insights: first named `foo_first` and value of 42, and the secod named `foo_second` and a value of 43 (both having property `host` set to "a". \
-\
-The exception is a single-field metric with a value named `value`, in that case the single metric telemetry created will use just the whole metric name without the "value" suffix. For example, `bar,host=a value=23 1525293034000000000` will result in a telemetry named `bar` and value 23.
\ No newline at end of file
+
+### Metric Encoding:
+
+For each field an Application Insights Telemetry record is created named based
+on the measurement name and field.
+
+
+**Example:** Create the telemetry records `foo_first` and `foo_second`:
+```
+foo,host=a first=42,second=43 1525293034000000000
+```
+
+In the special case of a single field named `value`, a single telemetry record is created named using only the measurement name
+
+**Example:** Create a telemetry record `foo`:
+```
+bar,host=a value=42 1525293034000000000
+```
diff --git a/plugins/outputs/application_insights/application_insights.go b/plugins/outputs/application_insights/application_insights.go
index 895b8530be351b00f4cd77aad0b0c4ab16950ccf..26f3f8dc0f7f9e09157390fdabfbc9864be006dd 100644
--- a/plugins/outputs/application_insights/application_insights.go
+++ b/plugins/outputs/application_insights/application_insights.go
@@ -41,24 +41,22 @@ const (
 
 var (
 	sampleConfig = `
-## Instrumentation key of the Application Insights resource.
+  ## Instrumentation key of the Application Insights resource.
   instrumentation_key = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx"
 
-## Timeout on close. If not provided, will default to 5s. 0s means no timeout (not recommended).
-# timeout = "5s"
-
-## Determines whether diagnostic logging (for Application Insights endpoint traffic) is enabled. Default is false.
-# enable_diagnosic_logging = "true"
-
-## ContextTagSources dictionary instructs the Application Insights plugin to set Application Insights context tags using metric properties.
-## In this dictionary keys are Application Insights context tags to set, and values are names of metric properties to use as source of data.
-## For example:
-# [outputs.application_insights.context_tag_sources]
-# "ai.cloud.role" = "kubernetes_container_name"
-# "ai.cloud.roleInstance" = "kubernetes_pod_name"
-## will set the ai.cloud.role context tag to the value of kubernetes_container_name property (if present), 
-## and the ai.cloud.roleInstance context tag to the value of kubernetes_pod_name property.
-## For list of all context tag keys see https://github.com/Microsoft/ApplicationInsights-Go/blob/master/appinsights/contracts/contexttagkeys.go
+  ## Timeout for closing (default: 5s).
+  # timeout = "5s"
+
+  ## Enable additional diagnostic logging.
+  # enable_diagnosic_logging = false
+
+  ## Context Tag Sources add Application Insights context tags to a tag value.
+  ##
+  ## For list of allowed context tag keys see:
+  ## https://github.com/Microsoft/ApplicationInsights-Go/blob/master/appinsights/contracts/contexttagkeys.go
+  # [outputs.application_insights.context_tag_sources]
+  #   "ai.cloud.role" = "kubernetes_container_name"
+  #   "ai.cloud.roleInstance" = "kubernetes_pod_name"
 `
 	is32Bit        bool
 	is32BitChecked bool
@@ -69,7 +67,7 @@ func (a *ApplicationInsights) SampleConfig() string {
 }
 
 func (a *ApplicationInsights) Description() string {
-	return "Send telegraf metrics to Azure Application Insights"
+	return "Send metrics to Azure Application Insights"
 }
 
 func (a *ApplicationInsights) Connect() error {