diff --git a/CHANGELOG.md b/CHANGELOG.md
index a3df11c1eb57ba99648a9afa0bac3abadd9f2ff7..19240e4283d53a06fb2b55390cae44844f5a5f0b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -147,6 +147,7 @@ consistent with the behavior of `collection_jitter`.
 - [#1323](https://github.com/influxdata/telegraf/issues/1323): Processes plugin: fix potential error with /proc/net/stat directory.
 - [#1322](https://github.com/influxdata/telegraf/issues/1322): Fix rare RHEL 5.2 panic in gopsutil diskio gathering function.
 - [#1586](https://github.com/influxdata/telegraf/pull/1586): Remove IF NOT EXISTS from influxdb output database creation.
+- [#1607](https://github.com/influxdata/telegraf/pull/1607): Massage metric names in Instrumental output plugin
 - [#1600](https://github.com/influxdata/telegraf/issues/1600): Fix quoting with text values in postgresql_extensible plugin.
 - [#1425](https://github.com/influxdata/telegraf/issues/1425): Fix win_perf_counter "index out of range" panic.
 - [#1634](https://github.com/influxdata/telegraf/issues/1634): Fix ntpq panic when field is missing.
diff --git a/plugins/outputs/instrumental/instrumental.go b/plugins/outputs/instrumental/instrumental.go
index 2fcc28cc0a752c300646b825903bc549426c766f..88cdc1ebae0fbfb45309543acc7b2c87cff0679e 100644
--- a/plugins/outputs/instrumental/instrumental.go
+++ b/plugins/outputs/instrumental/instrumental.go
@@ -35,7 +35,8 @@ const (
 )
 
 var (
-	StatIncludesBadChar = regexp.MustCompile("[^[:alnum:][:blank:]-_.]")
+	ValueIncludesBadChar = regexp.MustCompile("[^[:digit:].]")
+	MetricNameReplacer   = regexp.MustCompile("[^-[:alnum:]_.]+")
 )
 
 var sampleConfig = `
@@ -131,8 +132,17 @@ func (i *Instrumental) Write(metrics []telegraf.Metric) error {
 		}
 
 		for _, stat := range stats {
-			if !StatIncludesBadChar.MatchString(stat) {
-				points = append(points, fmt.Sprintf("%s %s", metricType, stat))
+			// decompose "metric.name value time"
+			splitStat := strings.SplitN(stat, " ", 3)
+			metric := splitStat[0]
+			value := splitStat[1]
+			time := splitStat[2]
+
+			// replace invalid components of metric name with underscore
+			clean_metric := MetricNameReplacer.ReplaceAllString(metric, "_")
+
+			if !ValueIncludesBadChar.MatchString(value) {
+				points = append(points, fmt.Sprintf("%s %s %s %s", metricType, clean_metric, value, time))
 			} else if i.Debug {
 				log.Printf("Unable to send bad stat: %s", stat)
 			}
diff --git a/plugins/outputs/instrumental/instrumental_test.go b/plugins/outputs/instrumental/instrumental_test.go
index 9708a25900dad426ea41153697f77511a440dde6..0d1501ac135727b10dc2ba72623ba11e54c09252 100644
--- a/plugins/outputs/instrumental/instrumental_test.go
+++ b/plugins/outputs/instrumental/instrumental_test.go
@@ -49,21 +49,28 @@ func TestWrite(t *testing.T) {
 		map[string]interface{}{"value": float64(3.14)},
 		time.Date(2010, time.November, 10, 23, 0, 0, 0, time.UTC),
 	)
-	// We will drop metrics that simply won't be accepted by Instrumental
+	// We will modify metric names that won't be accepted by Instrumental
 	m4, _ := telegraf.NewMetric(
+		"bad_metric_name",
+		map[string]string{"host": "192.168.0.1:8888::123", "metric_type": "counter"},
+		map[string]interface{}{"value": 1},
+		time.Date(2010, time.November, 10, 23, 0, 0, 0, time.UTC),
+	)
+	// We will drop metric values that won't be accepted by Instrumental
+	m5, _ := telegraf.NewMetric(
 		"bad_values",
 		map[string]string{"host": "192.168.0.1", "metric_type": "counter"},
 		map[string]interface{}{"value": "\" 3:30\""},
 		time.Date(2010, time.November, 10, 23, 0, 0, 0, time.UTC),
 	)
-	m5, _ := telegraf.NewMetric(
+	m6, _ := telegraf.NewMetric(
 		"my_counter",
 		map[string]string{"host": "192.168.0.1", "metric_type": "counter"},
 		map[string]interface{}{"value": float64(3.14)},
 		time.Date(2010, time.November, 10, 23, 0, 0, 0, time.UTC),
 	)
 
-	metrics = []telegraf.Metric{m3, m4, m5}
+	metrics = []telegraf.Metric{m3, m4, m5, m6}
 	i.Write(metrics)
 
 	wg.Wait()
@@ -101,8 +108,15 @@ func TCPServer(t *testing.T, wg *sync.WaitGroup) {
 
 	data3, _ := tp.ReadLine()
 	assert.Equal(t, "increment my.prefix.192_168_0_1.my_histogram 3.14 1289430000", data3)
+
 	data4, _ := tp.ReadLine()
-	assert.Equal(t, "increment my.prefix.192_168_0_1.my_counter 3.14 1289430000", data4)
+	assert.Equal(t, "increment my.prefix.192_168_0_1_8888_123.bad_metric_name 1 1289430000", data4)
+
+	data5, _ := tp.ReadLine()
+	assert.Equal(t, "increment my.prefix.192_168_0_1.my_counter 3.14 1289430000", data5)
+
+	data6, _ := tp.ReadLine()
+	assert.Equal(t, "", data6)
 
 	conn.Close()
 }