diff --git a/tree.go b/tree.go
index 8d94d208e..b4d340ee2 100644
--- a/tree.go
+++ b/tree.go
@@ -8,7 +8,6 @@ import (
 	"github.com/restic/restic/backend"
 	"github.com/restic/restic/debug"
 	"github.com/restic/restic/pack"
-	"github.com/restic/restic/repository"
 )
 
 type Tree struct {
@@ -30,7 +29,11 @@ func (t Tree) String() string {
 	return fmt.Sprintf("Tree<%d nodes>", len(t.Nodes))
 }
 
-func LoadTree(repo *repository.Repository, id backend.ID) (*Tree, error) {
+type TreeLoader interface {
+	LoadJSONPack(pack.BlobType, backend.ID, interface{}) error
+}
+
+func LoadTree(repo TreeLoader, id backend.ID) (*Tree, error) {
 	tree := &Tree{}
 	err := repo.LoadJSONPack(pack.Tree, id, tree)
 	if err != nil {
diff --git a/walk.go b/walk.go
index 53b89b748..1e5979328 100644
--- a/walk.go
+++ b/walk.go
@@ -5,7 +5,6 @@ import (
 
 	"github.com/restic/restic/backend"
 	"github.com/restic/restic/debug"
-	"github.com/restic/restic/repository"
 )
 
 type WalkTreeJob struct {
@@ -16,7 +15,7 @@ type WalkTreeJob struct {
 	Tree *Tree
 }
 
-func walkTree(repo *repository.Repository, path string, treeID backend.ID, done chan struct{}, jobCh chan<- WalkTreeJob) {
+func walkTree(repo TreeLoader, path string, treeID backend.ID, done chan struct{}, jobCh chan<- WalkTreeJob) {
 	debug.Log("walkTree", "start on %q (%v)", path, treeID.Str())
 
 	t, err := LoadTree(repo, treeID)
@@ -54,7 +53,7 @@ func walkTree(repo *repository.Repository, path string, treeID backend.ID, done
 // WalkTree walks the tree specified by id recursively and sends a job for each
 // file and directory it finds. When the channel done is closed, processing
 // stops.
-func WalkTree(repo *repository.Repository, id backend.ID, done chan struct{}, jobCh chan<- WalkTreeJob) {
+func WalkTree(repo TreeLoader, id backend.ID, done chan struct{}, jobCh chan<- WalkTreeJob) {
 	debug.Log("WalkTree", "start on %v", id.Str())
 	walkTree(repo, "", id, done, jobCh)
 	close(jobCh)