diff --git a/go/zodb/storage/fs1/fs1tools/tail_test.go b/go/zodb/storage/fs1/fs1tools/dump_test.go
similarity index 100%
rename from go/zodb/storage/fs1/fs1tools/tail_test.go
rename to go/zodb/storage/fs1/fs1tools/dump_test.go
diff --git a/go/zodb/storage/fs1/fs1tools/tail.go b/go/zodb/storage/fs1/fs1tools/tail.go
deleted file mode 100644
index 5d2d6ecf89749958045cefeb108a8e5a2ca08755..0000000000000000000000000000000000000000
--- a/go/zodb/storage/fs1/fs1tools/tail.go
+++ /dev/null
@@ -1,180 +0,0 @@
-// Copyright (C) 2017  Nexedi SA and Contributors.
-//                     Kirill Smelkov <kirr@nexedi.com>
-//
-// This program is free software: you can Use, Study, Modify and Redistribute
-// it under the terms of the GNU General Public License version 3, or (at your
-// option) any later version, as published by the Free Software Foundation.
-//
-// You can also Link and Combine this program with other software covered by
-// the terms of any of the Free Software licenses or any of the Open Source
-// Initiative approved licenses and Convey the resulting work. Corresponding
-// source of such a combination shall include the source code for all other
-// software used.
-//
-// This program is distributed WITHOUT ANY WARRANTY; without even the implied
-// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-//
-// See COPYING file for full licensing terms.
-// See https://www.nexedi.com/licensing for rationale and options.
-
-package fs1tools
-
-import (
-//	"crypto/sha1"
-//	"flag"
-//	"fmt"
-//	"io"
-//	"log"
-//	"os"
-
-//	"lab.nexedi.com/kirr/go123/xbytes"
-//	"lab.nexedi.com/kirr/go123/xerr"
-//	"lab.nexedi.com/kirr/go123/xfmt"
-)
-
-/*
-Tail dumps the last few transactions from a FileStorage.
-
-Format is the same as in fstail/py originally written by Jeremy Hylton:
-
-	https://github.com/zopefoundation/ZODB/blob/master/src/ZODB/scripts/fstail.py
-	https://github.com/zopefoundation/ZODB/commit/551122cc
-*/
-/*
-func Tail(w io.Writer, path string, ntxn int) (err error) {
-	// path & fstail on error context
-	defer xerr.Contextf(&err, "%s: fstail", path)
-
-	// we are not using fs1.Open here, since the file or index could be
-	// e.g. corrupt - we want to iterate directly by FileStorage records
-	// (same logic as in fstail/py)
-	f, err := os.Open(path)
-	if err != nil {
-		return err
-	}
-	defer func() {
-		err2 := f.Close()
-		err = xerr.First(err, err2)
-	}()
-
-	// get file size as topPos
-	fi, err := f.Stat()
-	if err != nil {
-		return err
-	}
-	topPos := fi.Size()
-
-	// txn header & data buffer for iterating
-	txnh := fs1.TxnHeader{}
-	data := []byte{}
-
-	// use sequential IO buffer
-	fSeq := xbufio.NewSeqReaderAt(f)
-
-	// XXX -> LoadPrev starting @ NextPrevStartMagic ?
-	// start iterating at tail.
-	// this should get EOF but read txnh.LenPrev ok.
-	err = txnh.Load(fSeq, topPos, fs1.LoadAll)
-	if err != io.EOF {
-		if err == nil {
-			// XXX or allow this?
-			// though then, if we start not from a txn boundary - there are
-			// high chances further iteration will go wrong.
-			err = fmt.Errorf("@%v: reading past file end was unexpectedly successful: probably the file is being modified simultaneously", topPos)
-		}
-		// otherwise err already has the context
-		return err
-	}
-	if txnh.LenPrev <= 0 {
-		return fmt.Errorf("@%v: previous record could not be read", topPos)
-	}
-
-	// buffer for formatting
-	buf := xfmt.Buffer{}
-
-	// now loop loading transactions backwards until EOF / ntxn limit
-	for i := ntxn; i > 0; i-- {
-		err = txnh.LoadPrev(fSeq, fs1.LoadAll)
-		if err != nil {
-			if err == io.EOF {
-				err = nil	// XXX -> okEOF(err)
-			}
-			break
-		}
-
-		// read raw data inside transaction record
-		dataLen := txnh.DataLen()
-		data = xbytes.Realloc64(data, dataLen)
-		_, err = fSeq.ReadAt(data, txnh.DataPos())
-		if err != nil {
-			// XXX -> txnh.Err(...) ?
-			// XXX err = noEOF(err)
-			err = &fs1.ErrTxnRecord{txnh.Pos, "read data payload", err}
-			break
-		}
-
-		// print information about read txn record
-		buf.Reset()
-
-		dataSha1 := sha1.Sum(data)
-		buf .V(txnh.Tid.Time()) .S(": hash=") .Xb(dataSha1[:])
-
-		// fstail.py uses repr to print user/description:
-		// https://github.com/zopefoundation/ZODB/blob/5.2.0-5-g6047e2fae/src/ZODB/scripts/fstail.py#L39
-		buf .S("\nuser=") .Qpyb(txnh.User) .S(" description=") .Qpyb(txnh.Description)
-
-		// NOTE in zodb/py .length is len - 8, in zodb/go - whole txn record length
-		buf .S(" length=") .D64(txnh.Len - 8)
-		buf .S(" offset=") .D64(txnh.Pos) .S(" (+") .D64(txnh.HeaderLen()) .S(")\n\n")
-
-		_, err = w.Write(buf.Bytes())
-		if err != nil {
-			break
-		}
-	}
-
-	return err
-}
-*/
-
-// ----------------------------------------
-
-/*
-const tailSummary = "dump last few transactions of a database"
-const ntxnDefault = 10
-
-func tailUsage(w io.Writer) {
-	fmt.Fprintf(w,
-`Usage: fs1 tail [options] <storage>
-Dump transactions from a FileStorage in reverse order
-
-<storage> is a path to FileStorage
-
-  options:
-
-	-h --help       this help text.
-	-n <N>	        output the last <N> transactions (default %d).
-`, ntxnDefault)
-}
-
-func tailMain(argv []string) {
-	ntxn := ntxnDefault
-
-	flags := flag.FlagSet{Usage: func() { tailUsage(os.Stderr) }}
-	flags.Init("", flag.ExitOnError)
-	flags.IntVar(&ntxn, "n", ntxn, "output the last <N> transactions")
-	flags.Parse(argv[1:])
-
-	argv = flags.Args()
-	if len(argv) < 1 {
-		flags.Usage()
-		os.Exit(2)
-	}
-	storPath := argv[0]
-
-	err := Tail(os.Stdout, storPath, ntxn)
-	if err != nil {
-		log.Fatal(err)
-	}
-}
-*/