diff --git a/Godeps/_workspace/src/github.com/huin/goupnp/httpu/httpu.go b/Godeps/_workspace/src/github.com/huin/goupnp/httpu/httpu.go
index 3f4606af0f43e84ad46c9e7a9e803292f6e48341..862c3def42feb5b51e71abfb0f645e3cd4881001 100644
--- a/Godeps/_workspace/src/github.com/huin/goupnp/httpu/httpu.go
+++ b/Godeps/_workspace/src/github.com/huin/goupnp/httpu/httpu.go
@@ -9,8 +9,6 @@ import (
 	"net/http"
 	"sync"
 	"time"
-
-	"github.com/ethereum/go-ethereum/fdtrack"
 )
 
 // HTTPUClient is a client for dealing with HTTPU (HTTP over UDP). Its typical
@@ -27,7 +25,6 @@ func NewHTTPUClient() (*HTTPUClient, error) {
 	if err != nil {
 		return nil, err
 	}
-	fdtrack.Open("upnp")
 	return &HTTPUClient{conn: conn}, nil
 }
 
@@ -36,7 +33,6 @@ func NewHTTPUClient() (*HTTPUClient, error) {
 func (httpu *HTTPUClient) Close() error {
 	httpu.connLock.Lock()
 	defer httpu.connLock.Unlock()
-	fdtrack.Close("upnp")
 	return httpu.conn.Close()
 }
 
diff --git a/Godeps/_workspace/src/github.com/huin/goupnp/soap/soap.go b/Godeps/_workspace/src/github.com/huin/goupnp/soap/soap.go
index 786ce6fa84ab49446b1be96ec69584c6f4fb20a9..815610734cf67e7306f305d168b7679156d83b62 100644
--- a/Godeps/_workspace/src/github.com/huin/goupnp/soap/soap.go
+++ b/Godeps/_workspace/src/github.com/huin/goupnp/soap/soap.go
@@ -7,12 +7,9 @@ import (
 	"encoding/xml"
 	"fmt"
 	"io/ioutil"
-	"net"
 	"net/http"
 	"net/url"
 	"reflect"
-
-	"github.com/ethereum/go-ethereum/fdtrack"
 )
 
 const (
@@ -29,17 +26,6 @@ type SOAPClient struct {
 func NewSOAPClient(endpointURL url.URL) *SOAPClient {
 	return &SOAPClient{
 		EndpointURL: endpointURL,
-		HTTPClient: http.Client{
-			Transport: &http.Transport{
-				Dial: func(network, addr string) (net.Conn, error) {
-					c, err := net.Dial(network, addr)
-					if c != nil {
-						c = fdtrack.WrapConn("upnp", c)
-					}
-					return c, err
-				},
-			},
-		},
 	}
 }
 
diff --git a/Godeps/_workspace/src/github.com/jackpal/go-nat-pmp/natpmp.go b/Godeps/_workspace/src/github.com/jackpal/go-nat-pmp/natpmp.go
index b165c784e3987f6c4a0c52f4f6700d1184fff379..8ce4e8342e2ca91cee9953f3d720875a6ff6ff2b 100644
--- a/Godeps/_workspace/src/github.com/jackpal/go-nat-pmp/natpmp.go
+++ b/Godeps/_workspace/src/github.com/jackpal/go-nat-pmp/natpmp.go
@@ -5,8 +5,6 @@ import (
 	"log"
 	"net"
 	"time"
-
-	"github.com/ethereum/go-ethereum/fdtrack"
 )
 
 // Implement the NAT-PMP protocol, typically supported by Apple routers and open source
@@ -104,8 +102,6 @@ func (n *Client) rpc(msg []byte, resultSize int) (result []byte, err error) {
 	if err != nil {
 		return
 	}
-	fdtrack.Open("natpmp")
-	defer fdtrack.Close("natpmp")
 	defer conn.Close()
 
 	result = make([]byte, resultSize)
diff --git a/Godeps/_workspace/src/github.com/syndtr/goleveldb/leveldb/storage/file_storage.go b/Godeps/_workspace/src/github.com/syndtr/goleveldb/leveldb/storage/file_storage.go
index 6d44f74b3873c155d7f1f1d7e003c3fc09874da8..46cc9d07012e91141cae7c08903f8421c394c412 100644
--- a/Godeps/_workspace/src/github.com/syndtr/goleveldb/leveldb/storage/file_storage.go
+++ b/Godeps/_workspace/src/github.com/syndtr/goleveldb/leveldb/storage/file_storage.go
@@ -18,7 +18,6 @@ import (
 	"sync"
 	"time"
 
-	"github.com/ethereum/go-ethereum/fdtrack"
 	"github.com/syndtr/goleveldb/leveldb/util"
 )
 
@@ -370,8 +369,6 @@ func (fw fileWrap) Close() error {
 	err := fw.File.Close()
 	if err != nil {
 		f.fs.log(fmt.Sprintf("close %s.%d: %v", f.Type(), f.Num(), err))
-	} else {
-		fdtrack.Close("leveldb")
 	}
 	return err
 }
@@ -403,7 +400,6 @@ func (f *file) Open() (Reader, error) {
 		return nil, err
 	}
 ok:
-	fdtrack.Open("leveldb")
 	f.open = true
 	f.fs.open++
 	return fileWrap{of, f}, nil
@@ -422,7 +418,6 @@ func (f *file) Create() (Writer, error) {
 	if err != nil {
 		return nil, err
 	}
-	fdtrack.Open("leveldb")
 	f.open = true
 	f.fs.open++
 	return fileWrap{of, f}, nil
diff --git a/cmd/geth/main.go b/cmd/geth/main.go
index 2dc3c438f605ffc870718e39fa5934810e3286ad..07c4daf60c32812e48550be40a014881b581a35c 100644
--- a/cmd/geth/main.go
+++ b/cmd/geth/main.go
@@ -37,7 +37,6 @@ import (
 	"github.com/ethereum/go-ethereum/core/types"
 	"github.com/ethereum/go-ethereum/eth"
 	"github.com/ethereum/go-ethereum/ethdb"
-	"github.com/ethereum/go-ethereum/fdtrack"
 	"github.com/ethereum/go-ethereum/logger"
 	"github.com/ethereum/go-ethereum/logger/glog"
 	"github.com/ethereum/go-ethereum/metrics"
@@ -546,9 +545,6 @@ func startEth(ctx *cli.Context, eth *eth.Ethereum) {
 	// Start Ethereum itself
 	utils.StartEthereum(eth)
 
-	// Start logging file descriptor stats.
-	fdtrack.Start()
-
 	am := eth.AccountManager()
 	account := ctx.GlobalString(utils.UnlockedAccountFlag.Name)
 	accounts := strings.Split(account, " ")
diff --git a/fdtrack/fdtrack.go b/fdtrack/fdtrack.go
deleted file mode 100644
index 2f5ab57f4411865275f4840b6f3819854893d238..0000000000000000000000000000000000000000
--- a/fdtrack/fdtrack.go
+++ /dev/null
@@ -1,112 +0,0 @@
-// Copyright 2015 The go-ethereum Authors
-// This file is part of the go-ethereum library.
-//
-// The go-ethereum library is free software: you can redistribute it and/or modify
-// it under the terms of the GNU Lesser General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// The go-ethereum library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public License
-// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
-
-// Package fdtrack logs statistics about open file descriptors.
-package fdtrack
-
-import (
-	"fmt"
-	"net"
-	"sort"
-	"sync"
-	"time"
-
-	"github.com/ethereum/go-ethereum/logger/glog"
-)
-
-var (
-	mutex sync.Mutex
-	all   = make(map[string]int)
-)
-
-func Open(desc string) {
-	mutex.Lock()
-	all[desc] += 1
-	mutex.Unlock()
-}
-
-func Close(desc string) {
-	mutex.Lock()
-	defer mutex.Unlock()
-	if c, ok := all[desc]; ok {
-		if c == 1 {
-			delete(all, desc)
-		} else {
-			all[desc]--
-		}
-	}
-}
-
-func WrapListener(desc string, l net.Listener) net.Listener {
-	Open(desc)
-	return &wrappedListener{l, desc}
-}
-
-type wrappedListener struct {
-	net.Listener
-	desc string
-}
-
-func (w *wrappedListener) Accept() (net.Conn, error) {
-	c, err := w.Listener.Accept()
-	if err == nil {
-		c = WrapConn(w.desc, c)
-	}
-	return c, err
-}
-
-func (w *wrappedListener) Close() error {
-	err := w.Listener.Close()
-	if err == nil {
-		Close(w.desc)
-	}
-	return err
-}
-
-func WrapConn(desc string, conn net.Conn) net.Conn {
-	Open(desc)
-	return &wrappedConn{conn, desc}
-}
-
-type wrappedConn struct {
-	net.Conn
-	desc string
-}
-
-func (w *wrappedConn) Close() error {
-	err := w.Conn.Close()
-	if err == nil {
-		Close(w.desc)
-	}
-	return err
-}
-
-func Start() {
-	go func() {
-		for range time.Tick(15 * time.Second) {
-			mutex.Lock()
-			var sum, tracked = 0, []string{}
-			for what, n := range all {
-				sum += n
-				tracked = append(tracked, fmt.Sprintf("%s:%d", what, n))
-			}
-			mutex.Unlock()
-			used, _ := fdusage()
-			sort.Strings(tracked)
-			glog.Infof("fd usage %d/%d, tracked %d %v", used, fdlimit(), sum, tracked)
-		}
-	}()
-}
diff --git a/fdtrack/fdusage.go b/fdtrack/fdusage.go
deleted file mode 100644
index 689625a8f58623cb86c786585c51c29880ad0d62..0000000000000000000000000000000000000000
--- a/fdtrack/fdusage.go
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2015 The go-ethereum Authors
-// This file is part of the go-ethereum library.
-//
-// The go-ethereum library is free software: you can redistribute it and/or modify
-// it under the terms of the GNU Lesser General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// The go-ethereum library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public License
-// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
-
-// +build !linux,!darwin
-
-package fdtrack
-
-import "errors"
-
-func fdlimit() int {
-	return 0
-}
-
-func fdusage() (int, error) {
-	return 0, errors.New("not implemented")
-}
diff --git a/fdtrack/fdusage_darwin.go b/fdtrack/fdusage_darwin.go
deleted file mode 100644
index 04a3a9baf701e8fe882a05cfcf3335e9d6cf03ec..0000000000000000000000000000000000000000
--- a/fdtrack/fdusage_darwin.go
+++ /dev/null
@@ -1,72 +0,0 @@
-// Copyright 2015 The go-ethereum Authors
-// This file is part of the go-ethereum library.
-//
-// The go-ethereum library is free software: you can redistribute it and/or modify
-// it under the terms of the GNU Lesser General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// The go-ethereum library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public License
-// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
-
-// +build darwin
-
-package fdtrack
-
-import (
-	"os"
-	"syscall"
-	"unsafe"
-)
-
-// #cgo CFLAGS: -lproc
-// #include <libproc.h>
-// #include <stdlib.h>
-import "C"
-
-func fdlimit() int {
-	var nofile syscall.Rlimit
-	if err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &nofile); err != nil {
-		return 0
-	}
-	return int(nofile.Cur)
-}
-
-func fdusage() (int, error) {
-	pid := C.int(os.Getpid())
-	// Query for a rough estimate on the amout of data that
-	// proc_pidinfo will return.
-	rlen, err := C.proc_pidinfo(pid, C.PROC_PIDLISTFDS, 0, nil, 0)
-	if rlen <= 0 {
-		return 0, err
-	}
-	// Load the list of file descriptors. We don't actually care about
-	// the content, only about the size. Since the number of fds can
-	// change while we're reading them, the loop enlarges the buffer
-	// until proc_pidinfo says the result fitted.
-	var buf unsafe.Pointer
-	defer func() {
-		if buf != nil {
-			C.free(buf)
-		}
-	}()
-	for buflen := rlen; ; buflen *= 2 {
-		buf, err = C.reallocf(buf, C.size_t(buflen))
-		if buf == nil {
-			return 0, err
-		}
-		rlen, err = C.proc_pidinfo(pid, C.PROC_PIDLISTFDS, 0, buf, buflen)
-		if rlen <= 0 {
-			return 0, err
-		} else if rlen == buflen {
-			continue
-		}
-		return int(rlen / C.PROC_PIDLISTFD_SIZE), nil
-	}
-	panic("unreachable")
-}
diff --git a/fdtrack/fdusage_linux.go b/fdtrack/fdusage_linux.go
deleted file mode 100644
index d9a856a0ca7ba6a5fe4d1f6a46f62cae4c6de7cd..0000000000000000000000000000000000000000
--- a/fdtrack/fdusage_linux.go
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright 2015 The go-ethereum Authors
-// This file is part of the go-ethereum library.
-//
-// The go-ethereum library is free software: you can redistribute it and/or modify
-// it under the terms of the GNU Lesser General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// The go-ethereum library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public License
-// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
-
-// +build linux
-
-package fdtrack
-
-import (
-	"io"
-	"os"
-	"syscall"
-)
-
-func fdlimit() int {
-	var nofile syscall.Rlimit
-	if err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &nofile); err != nil {
-		return 0
-	}
-	return int(nofile.Cur)
-}
-
-func fdusage() (int, error) {
-	f, err := os.Open("/proc/self/fd")
-	if err != nil {
-		return 0, err
-	}
-	defer f.Close()
-	const batchSize = 100
-	n := 0
-	for {
-		list, err := f.Readdirnames(batchSize)
-		n += len(list)
-		if err == io.EOF {
-			break
-		} else if err != nil {
-			return 0, err
-		}
-	}
-	return n, nil
-}
diff --git a/p2p/dial.go b/p2p/dial.go
index 8b210bacd29f1188eb37928818a742d37a1ab5d8..0fd3a4cf52df83bfd46a68abf376691e9600d289 100644
--- a/p2p/dial.go
+++ b/p2p/dial.go
@@ -23,7 +23,6 @@ import (
 	"net"
 	"time"
 
-	"github.com/ethereum/go-ethereum/fdtrack"
 	"github.com/ethereum/go-ethereum/logger"
 	"github.com/ethereum/go-ethereum/logger/glog"
 	"github.com/ethereum/go-ethereum/p2p/discover"
@@ -213,7 +212,6 @@ func (t *dialTask) Do(srv *Server) {
 		glog.V(logger.Detail).Infof("dial error: %v", err)
 		return
 	}
-	fd = fdtrack.WrapConn("p2p", fd)
 	mfd := newMeteredConn(fd, false)
 
 	srv.setupConn(mfd, t.flags, t.dest)
diff --git a/p2p/discover/udp.go b/p2p/discover/udp.go
index 008e63937d6d25609bc1d67ffdcafc13df486eff..e98e8d0ba637c1840b9943e1e51d5512e4f1e15c 100644
--- a/p2p/discover/udp.go
+++ b/p2p/discover/udp.go
@@ -26,7 +26,6 @@ import (
 	"time"
 
 	"github.com/ethereum/go-ethereum/crypto"
-	"github.com/ethereum/go-ethereum/fdtrack"
 	"github.com/ethereum/go-ethereum/logger"
 	"github.com/ethereum/go-ethereum/logger/glog"
 	"github.com/ethereum/go-ethereum/p2p/nat"
@@ -200,7 +199,6 @@ func ListenUDP(priv *ecdsa.PrivateKey, laddr string, natm nat.Interface, nodeDBP
 	if err != nil {
 		return nil, err
 	}
-	fdtrack.Open("p2p")
 	conn, err := net.ListenUDP("udp", addr)
 	if err != nil {
 		return nil, err
@@ -238,7 +236,6 @@ func newUDP(priv *ecdsa.PrivateKey, c conn, natm nat.Interface, nodeDBPath strin
 
 func (t *udp) close() {
 	close(t.closing)
-	fdtrack.Close("p2p")
 	t.conn.Close()
 	// TODO: wait for the loops to end.
 }
diff --git a/p2p/metrics.go b/p2p/metrics.go
index 8ee4ed04b64be4309f8e95b514697f1df1c3ba1d..f98cac2742d708f92f0108a700aeaeda8094334d 100644
--- a/p2p/metrics.go
+++ b/p2p/metrics.go
@@ -34,7 +34,7 @@ var (
 // meteredConn is a wrapper around a network TCP connection that meters both the
 // inbound and outbound network traffic.
 type meteredConn struct {
-	net.Conn
+	*net.TCPConn // Network connection to wrap with metering
 }
 
 // newMeteredConn creates a new metered connection, also bumping the ingress or
@@ -45,13 +45,13 @@ func newMeteredConn(conn net.Conn, ingress bool) net.Conn {
 	} else {
 		egressConnectMeter.Mark(1)
 	}
-	return &meteredConn{conn}
+	return &meteredConn{conn.(*net.TCPConn)}
 }
 
 // Read delegates a network read to the underlying connection, bumping the ingress
 // traffic meter along the way.
 func (c *meteredConn) Read(b []byte) (n int, err error) {
-	n, err = c.Conn.Read(b)
+	n, err = c.TCPConn.Read(b)
 	ingressTrafficMeter.Mark(int64(n))
 	return
 }
@@ -59,7 +59,7 @@ func (c *meteredConn) Read(b []byte) (n int, err error) {
 // Write delegates a network write to the underlying connection, bumping the
 // egress traffic meter along the way.
 func (c *meteredConn) Write(b []byte) (n int, err error) {
-	n, err = c.Conn.Write(b)
+	n, err = c.TCPConn.Write(b)
 	egressTrafficMeter.Mark(int64(n))
 	return
 }
diff --git a/p2p/server.go b/p2p/server.go
index 7351a265441ad1de8737db3401e57094747b1c3d..ba83c55035cf26c3f03e0c063ccc927b86d96927 100644
--- a/p2p/server.go
+++ b/p2p/server.go
@@ -25,7 +25,6 @@ import (
 	"sync"
 	"time"
 
-	"github.com/ethereum/go-ethereum/fdtrack"
 	"github.com/ethereum/go-ethereum/logger"
 	"github.com/ethereum/go-ethereum/logger/glog"
 	"github.com/ethereum/go-ethereum/p2p/discover"
@@ -373,7 +372,7 @@ func (srv *Server) startListening() error {
 	}
 	laddr := listener.Addr().(*net.TCPAddr)
 	srv.ListenAddr = laddr.String()
-	srv.listener = fdtrack.WrapListener("p2p", listener)
+	srv.listener = listener
 	srv.loopWG.Add(1)
 	go srv.listenLoop()
 	// Map the TCP listening port if NAT is configured.
diff --git a/rpc/comms/http.go b/rpc/comms/http.go
index c08b744a13121f239edf5d9df8268faf132236ef..c165aa27e11693bfd9724c5bc054d7a2072cc731 100644
--- a/rpc/comms/http.go
+++ b/rpc/comms/http.go
@@ -29,7 +29,6 @@ import (
 	"io"
 	"io/ioutil"
 
-	"github.com/ethereum/go-ethereum/fdtrack"
 	"github.com/ethereum/go-ethereum/logger"
 	"github.com/ethereum/go-ethereum/logger/glog"
 	"github.com/ethereum/go-ethereum/rpc/codec"
@@ -178,7 +177,6 @@ func listenHTTP(addr string, h http.Handler) (*stopServer, error) {
 	if err != nil {
 		return nil, err
 	}
-	l = fdtrack.WrapListener("rpc", l)
 	s := &stopServer{l: l, idle: make(map[net.Conn]struct{})}
 	s.Server = &http.Server{
 		Addr:         addr,
diff --git a/rpc/comms/ipc_unix.go b/rpc/comms/ipc_unix.go
index 6968fa844788eac901fc06cca378b3d0a3b5a3b4..24aefa5f343947012d068512332efce760fbb312 100644
--- a/rpc/comms/ipc_unix.go
+++ b/rpc/comms/ipc_unix.go
@@ -22,7 +22,6 @@ import (
 	"net"
 	"os"
 
-	"github.com/ethereum/go-ethereum/fdtrack"
 	"github.com/ethereum/go-ethereum/logger"
 	"github.com/ethereum/go-ethereum/logger/glog"
 	"github.com/ethereum/go-ethereum/rpc/codec"
@@ -51,16 +50,15 @@ func (self *ipcClient) reconnect() error {
 func startIpc(cfg IpcConfig, codec codec.Codec, initializer func(conn net.Conn) (shared.EthereumApi, error)) error {
 	os.Remove(cfg.Endpoint) // in case it still exists from a previous run
 
-	l, err := net.Listen("unix", cfg.Endpoint)
+	l, err := net.ListenUnix("unix", &net.UnixAddr{Name: cfg.Endpoint, Net: "unix"})
 	if err != nil {
 		return err
 	}
-	l = fdtrack.WrapListener("ipc", l)
 	os.Chmod(cfg.Endpoint, 0600)
 
 	go func() {
 		for {
-			conn, err := l.Accept()
+			conn, err := l.AcceptUnix()
 			if err != nil {
 				glog.V(logger.Error).Infof("Error accepting ipc connection - %v\n", err)
 				continue