diff --git a/CHANGELOG.md b/CHANGELOG.md
index 6a862a0dba9aaa1a74213d592f3dd40f421d3355..7480bbb59805836d6a0f500c7e65a2068d2cc8b0 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -62,6 +62,7 @@ should now look like:
 - [#1434](https://github.com/influxdata/telegraf/pull/1434): Add measurement name arg to logparser plugin.
 - [#1479](https://github.com/influxdata/telegraf/pull/1479): logparser: change resp_code from a field to a tag.
 - [#1466](https://github.com/influxdata/telegraf/pull/1466): MongoDB input plugin: adding per DB stats from db.stats()
+- [#1411](https://github.com/influxdata/telegraf/pull/1411): Implement support for fetching hddtemp data
 
 ### Bugfixes
 
diff --git a/README.md b/README.md
index aa8d9e039d360ad0b8fc7ce7b7ead331cb5d5db8..9d2ee3ce1b52e923d3f5c1be3907759d01bcbf44 100644
--- a/README.md
+++ b/README.md
@@ -156,6 +156,7 @@ Currently implemented sources:
 * [exec](https://github.com/influxdata/telegraf/tree/master/plugins/inputs/exec) (generic executable plugin, support JSON, influx, graphite and nagios)
 * [filestat](https://github.com/influxdata/telegraf/tree/master/plugins/inputs/filestat)
 * [haproxy](https://github.com/influxdata/telegraf/tree/master/plugins/inputs/haproxy)
+* [hddtemp](https://github.com/influxdata/telegraf/tree/master/plugins/inputs/hddtemp)
 * [http_response](https://github.com/influxdata/telegraf/tree/master/plugins/inputs/http_response)
 * [httpjson](https://github.com/influxdata/telegraf/tree/master/plugins/inputs/httpjson) (generic JSON-emitting http service plugin)
 * [influxdb](https://github.com/influxdata/telegraf/tree/master/plugins/inputs/influxdb)
diff --git a/plugins/inputs/all/all.go b/plugins/inputs/all/all.go
index 529a13baedb917683f065f6de7f63d24ee7e2251..ddb7d40397382132d0a439c018f767ede1b63e68 100644
--- a/plugins/inputs/all/all.go
+++ b/plugins/inputs/all/all.go
@@ -22,6 +22,7 @@ import (
 	_ "github.com/influxdata/telegraf/plugins/inputs/filestat"
 	_ "github.com/influxdata/telegraf/plugins/inputs/graylog"
 	_ "github.com/influxdata/telegraf/plugins/inputs/haproxy"
+	_ "github.com/influxdata/telegraf/plugins/inputs/hddtemp"
 	_ "github.com/influxdata/telegraf/plugins/inputs/http_response"
 	_ "github.com/influxdata/telegraf/plugins/inputs/httpjson"
 	_ "github.com/influxdata/telegraf/plugins/inputs/influxdb"
diff --git a/plugins/inputs/hddtemp/README.md b/plugins/inputs/hddtemp/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..d87ae625dfc6b1f2e90f1a5a4006929e024e430c
--- /dev/null
+++ b/plugins/inputs/hddtemp/README.md
@@ -0,0 +1,22 @@
+# Hddtemp Input Plugin
+
+This plugin reads data from hddtemp daemon
+
+## Requirements
+
+Hddtemp should be installed and its daemon running
+
+## Configuration
+
+```
+[[inputs.hddtemp]]
+## By default, telegraf gathers temps data from all disks detected by the
+## hddtemp.
+##
+## Only collect temps from the selected disks.
+##
+## A * as the device name will return the temperature values of all disks.
+##
+# address = "127.0.0.1:7634"
+# devices = ["sda", "*"]
+```
diff --git a/plugins/inputs/hddtemp/go-hddtemp/LICENSE b/plugins/inputs/hddtemp/go-hddtemp/LICENSE
new file mode 100644
index 0000000000000000000000000000000000000000..d5aed19c6ef3270f9c168acedd0c2e079accd281
--- /dev/null
+++ b/plugins/inputs/hddtemp/go-hddtemp/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2016 Mendelson Gusmão
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/plugins/inputs/hddtemp/go-hddtemp/hddtemp.go b/plugins/inputs/hddtemp/go-hddtemp/hddtemp.go
new file mode 100644
index 0000000000000000000000000000000000000000..d7d650b79cc9c96fc0373fa671d5ef9fdf4b1ca8
--- /dev/null
+++ b/plugins/inputs/hddtemp/go-hddtemp/hddtemp.go
@@ -0,0 +1,61 @@
+package hddtemp
+
+import (
+	"bytes"
+	"io"
+	"net"
+	"strconv"
+	"strings"
+)
+
+type disk struct {
+	DeviceName  string
+	Model       string
+	Temperature int32
+	Unit        string
+	Status      string
+}
+
+func Fetch(address string) ([]disk, error) {
+	var (
+		err    error
+		conn   net.Conn
+		buffer bytes.Buffer
+		disks  []disk
+	)
+
+	if conn, err = net.Dial("tcp", address); err != nil {
+		return nil, err
+	}
+
+	if _, err = io.Copy(&buffer, conn); err != nil {
+		return nil, err
+	}
+
+	fields := strings.Split(buffer.String(), "|")
+
+	for index := 0; index < len(fields)/5; index++ {
+		status := ""
+		offset := index * 5
+		device := fields[offset+1]
+		device = device[strings.LastIndex(device, "/")+1:]
+
+		temperatureField := fields[offset+3]
+		temperature, err := strconv.ParseInt(temperatureField, 10, 32)
+
+		if err != nil {
+			temperature = 0
+			status = temperatureField
+		}
+
+		disks = append(disks, disk{
+			DeviceName:  device,
+			Model:       fields[offset+2],
+			Temperature: int32(temperature),
+			Unit:        fields[offset+4],
+			Status:      status,
+		})
+	}
+
+	return disks, nil
+}
diff --git a/plugins/inputs/hddtemp/go-hddtemp/hddtemp_test.go b/plugins/inputs/hddtemp/go-hddtemp/hddtemp_test.go
new file mode 100644
index 0000000000000000000000000000000000000000..858e91a904f690a1dc43e961bf912c711f08ee13
--- /dev/null
+++ b/plugins/inputs/hddtemp/go-hddtemp/hddtemp_test.go
@@ -0,0 +1,116 @@
+package hddtemp
+
+import (
+	"net"
+	"reflect"
+	"testing"
+)
+
+func TestFetch(t *testing.T) {
+	l := serve(t, []byte("|/dev/sda|foobar|36|C|"))
+	defer l.Close()
+
+	disks, err := Fetch(l.Addr().String())
+
+	if err != nil {
+		t.Error("expecting err to be nil")
+	}
+
+	expected := []disk{
+		{
+			DeviceName:  "sda",
+			Model:       "foobar",
+			Temperature: 36,
+			Unit:        "C",
+		},
+	}
+
+	if !reflect.DeepEqual(expected, disks) {
+		t.Error("disks' slice is different from expected")
+	}
+}
+
+func TestFetchWrongAddress(t *testing.T) {
+	_, err := Fetch("127.0.0.1:1")
+
+	if err == nil {
+		t.Error("expecting err to be non-nil")
+	}
+}
+
+func TestFetchStatus(t *testing.T) {
+	l := serve(t, []byte("|/dev/sda|foobar|SLP|C|"))
+	defer l.Close()
+
+	disks, err := Fetch(l.Addr().String())
+
+	if err != nil {
+		t.Error("expecting err to be nil")
+	}
+
+	expected := []disk{
+		{
+			DeviceName:  "sda",
+			Model:       "foobar",
+			Temperature: 0,
+			Unit:        "C",
+			Status:      "SLP",
+		},
+	}
+
+	if !reflect.DeepEqual(expected, disks) {
+		t.Error("disks' slice is different from expected")
+	}
+}
+
+func TestFetchTwoDisks(t *testing.T) {
+	l := serve(t, []byte("|/dev/hda|ST380011A|46|C||/dev/hdd|ST340016A|SLP|*|"))
+	defer l.Close()
+
+	disks, err := Fetch(l.Addr().String())
+
+	if err != nil {
+		t.Error("expecting err to be nil")
+	}
+
+	expected := []disk{
+		{
+			DeviceName:  "hda",
+			Model:       "ST380011A",
+			Temperature: 46,
+			Unit:        "C",
+		},
+		{
+			DeviceName:  "hdd",
+			Model:       "ST340016A",
+			Temperature: 0,
+			Unit:        "*",
+			Status:      "SLP",
+		},
+	}
+
+	if !reflect.DeepEqual(expected, disks) {
+		t.Error("disks' slice is different from expected")
+	}
+}
+
+func serve(t *testing.T, data []byte) net.Listener {
+	l, err := net.Listen("tcp", "127.0.0.1:0")
+
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	go func(t *testing.T) {
+		conn, err := l.Accept()
+
+		if err != nil {
+			t.Fatal(err)
+		}
+
+		conn.Write(data)
+		conn.Close()
+	}(t)
+
+	return l
+}
diff --git a/plugins/inputs/hddtemp/hddtemp.go b/plugins/inputs/hddtemp/hddtemp.go
new file mode 100644
index 0000000000000000000000000000000000000000..c1e01c3c68d453def2fdef5f7f4baece955d9df3
--- /dev/null
+++ b/plugins/inputs/hddtemp/hddtemp.go
@@ -0,0 +1,74 @@
+// +build linux
+
+package hddtemp
+
+import (
+	"github.com/influxdata/telegraf"
+	"github.com/influxdata/telegraf/plugins/inputs"
+	gohddtemp "github.com/influxdata/telegraf/plugins/inputs/hddtemp/go-hddtemp"
+)
+
+const defaultAddress = "127.0.0.1:7634"
+
+type HDDTemp struct {
+	Address string
+	Devices []string
+}
+
+func (_ *HDDTemp) Description() string {
+	return "Monitor disks' temperatures using hddtemp"
+}
+
+var hddtempSampleConfig = `
+  ## By default, telegraf gathers temps data from all disks detected by the
+  ## hddtemp.
+  ##
+  ## Only collect temps from the selected disks.
+  ##
+  ## A * as the device name will return the temperature values of all disks.
+  ##
+  # address = "127.0.0.1:7634"
+  # devices = ["sda", "*"]
+`
+
+func (_ *HDDTemp) SampleConfig() string {
+	return hddtempSampleConfig
+}
+
+func (h *HDDTemp) Gather(acc telegraf.Accumulator) error {
+	disks, err := gohddtemp.Fetch(h.Address)
+
+	if err != nil {
+		return err
+	}
+
+	for _, disk := range disks {
+		for _, chosenDevice := range h.Devices {
+			if chosenDevice == "*" || chosenDevice == disk.DeviceName {
+				tags := map[string]string{
+					"device": disk.DeviceName,
+					"model":  disk.Model,
+					"unit":   disk.Unit,
+					"status": disk.Status,
+				}
+
+				fields := map[string]interface{}{
+					disk.DeviceName: disk.Temperature,
+				}
+
+				acc.AddFields("hddtemp", fields, tags)
+			}
+		}
+	}
+
+	return nil
+}
+
+func init() {
+	inputs.Add("hddtemp", func() telegraf.Input {
+		return &HDDTemp{
+			Address: defaultAddress,
+			Devices: []string{"*"},
+		}
+	})
+}
diff --git a/plugins/inputs/hddtemp/hddtemp_nocompile.go b/plugins/inputs/hddtemp/hddtemp_nocompile.go
new file mode 100644
index 0000000000000000000000000000000000000000..0c580167031cdcec7d6422b0d31e23bab925a0d0
--- /dev/null
+++ b/plugins/inputs/hddtemp/hddtemp_nocompile.go
@@ -0,0 +1,3 @@
+// +build !linux
+
+package hddtemp