diff --git a/archiver_test.go b/archiver_test.go
index d7ef839eb..8babeed14 100644
--- a/archiver_test.go
+++ b/archiver_test.go
@@ -56,8 +56,8 @@ func BenchmarkChunkEncrypt(b *testing.B) {
 	s := SetupBackend(b)
 	defer TeardownBackend(b, s)
 
-	buf := restic.GetChunkBuf("BenchmarkChunkEncrypt")
-	buf2 := restic.GetChunkBuf("BenchmarkChunkEncrypt")
+	buf := make([]byte, chunker.MaxSize)
+	buf2 := make([]byte, chunker.MaxSize)
 	chunkBuf := make([]byte, chunkerBufSize)
 
 	b.ResetTimer()
@@ -66,9 +66,6 @@ func BenchmarkChunkEncrypt(b *testing.B) {
 	for i := 0; i < b.N; i++ {
 		benchmarkChunkEncrypt(b, buf, buf2, chunkBuf, rd, s.Key())
 	}
-
-	restic.FreeChunkBuf("BenchmarkChunkEncrypt", buf)
-	restic.FreeChunkBuf("BenchmarkChunkEncrypt", buf2)
 }
 
 func benchmarkChunkEncryptP(b *testing.PB, buf, chunkBuf []byte, rd Rdr, key *crypto.Key) {
@@ -93,7 +90,7 @@ func BenchmarkChunkEncryptParallel(b *testing.B) {
 
 	data := Random(23, 10<<20) // 10MiB
 
-	buf := restic.GetChunkBuf("BenchmarkChunkEncryptParallel")
+	buf := make([]byte, chunker.MaxSize)
 	chunkBuf := make([]byte, chunkerBufSize)
 
 	b.ResetTimer()
@@ -105,8 +102,6 @@ func BenchmarkChunkEncryptParallel(b *testing.B) {
 			benchmarkChunkEncryptP(pb, buf, chunkBuf, rd, s.Key())
 		}
 	})
-
-	restic.FreeChunkBuf("BenchmarkChunkEncryptParallel", buf)
 }
 
 func archiveDirectory(b testing.TB) {
diff --git a/cmd/restic/main.go b/cmd/restic/main.go
index d5d7cd169..8b552ae26 100644
--- a/cmd/restic/main.go
+++ b/cmd/restic/main.go
@@ -10,7 +10,6 @@ import (
 	"golang.org/x/crypto/ssh/terminal"
 
 	"github.com/jessevdk/go-flags"
-	"github.com/restic/restic"
 	"github.com/restic/restic/backend"
 	"github.com/restic/restic/backend/local"
 	"github.com/restic/restic/backend/sftp"
@@ -182,7 +181,4 @@ func main() {
 	if err != nil {
 		os.Exit(1)
 	}
-
-	// this prints some statistics for memory management using the debug package
-	restic.PoolAlloc()
 }
diff --git a/crypto/crypto_test.go b/crypto/crypto_test.go
index 8468b6c0f..faba9970c 100644
--- a/crypto/crypto_test.go
+++ b/crypto/crypto_test.go
@@ -8,7 +8,6 @@ import (
 	"os"
 	"testing"
 
-	"github.com/restic/restic"
 	"github.com/restic/restic/chunker"
 	"github.com/restic/restic/crypto"
 	. "github.com/restic/restic/test"
@@ -29,7 +28,9 @@ func TestEncryptDecrypt(t *testing.T) {
 		_, err := io.ReadFull(RandomReader(42, size), data)
 		OK(t, err)
 
-		ciphertext, err := crypto.Encrypt(k, restic.GetChunkBuf("TestEncryptDecrypt"), data)
+		buf := make([]byte, size+crypto.Extension)
+
+		ciphertext, err := crypto.Encrypt(k, buf, data)
 		OK(t, err)
 		Assert(t, len(ciphertext) == len(data)+crypto.Extension,
 			"ciphertext length does not match: want %d, got %d",
@@ -41,8 +42,6 @@ func TestEncryptDecrypt(t *testing.T) {
 			"plaintext length does not match: want %d, got %d",
 			len(data), len(plaintext))
 
-		restic.FreeChunkBuf("TestEncryptDecrypt", ciphertext)
-
 		Equals(t, plaintext, data)
 	}
 }
@@ -226,8 +225,6 @@ func BenchmarkEncryptDecryptReader(b *testing.B) {
 		_, err = io.Copy(ioutil.Discard, r)
 		OK(b, err)
 	}
-
-	restic.PoolAlloc()
 }
 
 func BenchmarkDecrypt(b *testing.B) {
@@ -236,10 +233,8 @@ func BenchmarkDecrypt(b *testing.B) {
 
 	k := crypto.NewRandomKey()
 
-	ciphertext := restic.GetChunkBuf("BenchmarkDecrypt")
-	defer restic.FreeChunkBuf("BenchmarkDecrypt", ciphertext)
-	plaintext := restic.GetChunkBuf("BenchmarkDecrypt")
-	defer restic.FreeChunkBuf("BenchmarkDecrypt", plaintext)
+	plaintext := make([]byte, size)
+	ciphertext := make([]byte, size+crypto.Extension)
 
 	ciphertext, err := crypto.Encrypt(k, ciphertext, data)
 	OK(b, err)
diff --git a/pools.go b/pools.go
deleted file mode 100644
index 151752062..000000000
--- a/pools.go
+++ /dev/null
@@ -1,111 +0,0 @@
-package restic
-
-import (
-	"sync"
-
-	"github.com/restic/restic/chunker"
-	"github.com/restic/restic/crypto"
-	"github.com/restic/restic/debug"
-)
-
-type poolStats struct {
-	m    sync.Mutex
-	mget map[string]int
-	mput map[string]int
-	mmax map[string]int
-
-	new int
-	get int
-	put int
-	max int
-}
-
-const (
-	maxCiphertextSize = crypto.Extension + chunker.MaxSize
-)
-
-func (s *poolStats) Get(k string) {
-	s.m.Lock()
-	defer s.m.Unlock()
-
-	s.get++
-	cur := s.get - s.put
-	if cur > s.max {
-		s.max = cur
-	}
-
-	if k != "" {
-		if _, ok := s.mget[k]; !ok {
-			s.mget[k] = 0
-			s.mput[k] = 0
-			s.mmax[k] = 0
-		}
-
-		s.mget[k]++
-
-		cur = s.mget[k] - s.mput[k]
-		if cur > s.mmax[k] {
-			s.mmax[k] = cur
-		}
-	}
-}
-
-func (s *poolStats) Put(k string) {
-	s.m.Lock()
-	defer s.m.Unlock()
-
-	s.put++
-
-	if k != "" {
-		s.mput[k]++
-	}
-}
-
-func newPoolStats() *poolStats {
-	return &poolStats{
-		mget: make(map[string]int),
-		mput: make(map[string]int),
-		mmax: make(map[string]int),
-	}
-}
-
-var (
-	chunkPool = sync.Pool{New: newChunkBuf}
-
-	chunkStats = newPoolStats()
-	nodeStats  = newPoolStats()
-)
-
-func newChunkBuf() interface{} {
-	chunkStats.m.Lock()
-	defer chunkStats.m.Unlock()
-	chunkStats.new++
-
-	// create buffer for iv, data and mac
-	return make([]byte, maxCiphertextSize)
-}
-
-func GetChunkBuf(s string) []byte {
-	chunkStats.Get(s)
-	return chunkPool.Get().([]byte)
-}
-
-func FreeChunkBuf(s string, buf []byte) {
-	chunkStats.Put(s)
-	chunkPool.Put(buf)
-}
-
-func PoolAlloc() {
-	debug.Log("pools.PoolAlloc", "pool stats for chunk: new %d, get %d, put %d, diff %d, max %d\n",
-		chunkStats.new, chunkStats.get, chunkStats.put, chunkStats.get-chunkStats.put, chunkStats.max)
-	for k, v := range chunkStats.mget {
-		debug.Log("pools.PoolAlloc", "pool stats for chunk[%s]: get %d, put %d, diff %d, max %d\n",
-			k, v, chunkStats.mput[k], v-chunkStats.mput[k], chunkStats.mmax[k])
-	}
-
-	debug.Log("pools.PoolAlloc", "pool stats for node: new %d, get %d, put %d, diff %d, max %d\n",
-		nodeStats.new, nodeStats.get, nodeStats.put, nodeStats.get-nodeStats.put, nodeStats.max)
-	for k, v := range nodeStats.mget {
-		debug.Log("pools.PoolAlloc", "pool stats for node[%s]: get %d, put %d, diff %d, max %d\n", k, v, nodeStats.mput[k], v-nodeStats.mput[k], nodeStats.mmax[k])
-	}
-}