diff --git a/CHANGELOG.md b/CHANGELOG.md
index 6d6fda00d38c9cee0a5f65d1d3ee19f4cf574239..42ff2964ce639d699afb202a708e804ab9b383f0 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,7 @@
 
 ### Features
 - [#564](https://github.com/influxdata/telegraf/issues/564): features for plugin writing simplification. Internal metric data type.
+- [#603](https://github.com/influxdata/telegraf/pull/603): Aggregate statsd timing measurements into fields. Thanks @marcinbunsch!
 
 ### Bugfixes
 - [#599](https://github.com/influxdata/telegraf/issues/599): datadog plugin tags not working.
diff --git a/plugins/inputs/statsd/statsd.go b/plugins/inputs/statsd/statsd.go
index 7bccd846efe2c264a3db60e600d38b549e42f9b3..a54ec86ec738833dbcfaba25baec3254ee305883 100644
--- a/plugins/inputs/statsd/statsd.go
+++ b/plugins/inputs/statsd/statsd.go
@@ -162,15 +162,17 @@ func (s *Statsd) Gather(acc telegraf.Accumulator) error {
 	defer s.Unlock()
 
 	for _, metric := range s.timings {
-		acc.Add(metric.name+"_mean", metric.stats.Mean(), metric.tags)
-		acc.Add(metric.name+"_stddev", metric.stats.Stddev(), metric.tags)
-		acc.Add(metric.name+"_upper", metric.stats.Upper(), metric.tags)
-		acc.Add(metric.name+"_lower", metric.stats.Lower(), metric.tags)
-		acc.Add(metric.name+"_count", metric.stats.Count(), metric.tags)
+		fields := make(map[string]interface{})
+		fields["mean"] = metric.stats.Mean()
+		fields["stddev"] = metric.stats.Stddev()
+		fields["upper"] = metric.stats.Upper()
+		fields["lower"] = metric.stats.Lower()
+		fields["count"] = metric.stats.Count()
 		for _, percentile := range s.Percentiles {
-			name := fmt.Sprintf("%s_percentile_%v", metric.name, percentile)
-			acc.Add(name, metric.stats.Percentile(percentile), metric.tags)
+			name := fmt.Sprintf("%v_percentile", percentile)
+			fields[name] = metric.stats.Percentile(percentile)
 		}
+		acc.AddFields(metric.name, fields, metric.tags)
 	}
 	if s.DeleteTimings {
 		s.timings = make(map[string]cachedtimings)
diff --git a/plugins/inputs/statsd/statsd_test.go b/plugins/inputs/statsd/statsd_test.go
index 6fc1f693362af7cd06bf9c7104bd1f2015399b86..3a5917ab6b2e6e8e7282abfbdce954562f606df5 100644
--- a/plugins/inputs/statsd/statsd_test.go
+++ b/plugins/inputs/statsd/statsd_test.go
@@ -710,7 +710,7 @@ func TestParse_Timings(t *testing.T) {
 	// Test that counters work
 	valid_lines := []string{
 		"test.timing:1|ms",
-		"test.timing:1|ms",
+		"test.timing:11|ms",
 		"test.timing:1|ms",
 		"test.timing:1|ms",
 		"test.timing:1|ms",
@@ -725,40 +725,17 @@ func TestParse_Timings(t *testing.T) {
 
 	s.Gather(acc)
 
-	tests := []struct {
-		name  string
-		value interface{}
-	}{
-		{
-			"test_timing_mean",
-			float64(1),
-		},
-		{
-			"test_timing_stddev",
-			float64(0),
-		},
-		{
-			"test_timing_upper",
-			float64(1),
-		},
-		{
-			"test_timing_lower",
-			float64(1),
-		},
-		{
-			"test_timing_count",
-			int64(5),
-		},
-		{
-			"test_timing_percentile_90",
-			float64(1),
-		},
+	valid := map[string]interface{}{
+		"90_percentile": float64(11),
+		"count":         int64(5),
+		"lower":         float64(1),
+		"mean":          float64(3),
+		"stddev":        float64(4),
+		"upper":         float64(11),
 	}
 
-	for _, test := range tests {
-		acc.AssertContainsFields(t, test.name,
-			map[string]interface{}{"value": test.value})
-	}
+	acc.AssertContainsFields(t, "test_timing", valid)
+
 }
 
 func TestParse_Timings_Delete(t *testing.T) {