diff --git a/cmd/geth/blocktest.go b/cmd/geth/blocktest.go
index 343a0bf28c..5c80ad07eb 100644
--- a/cmd/geth/blocktest.go
+++ b/cmd/geth/blocktest.go
@@ -104,7 +104,7 @@ func runOneBlockTest(ctx *cli.Context, test *tests.BlockTest) (*eth.Ethereum, er
 	ethereum.ResetWithGenesisBlock(test.Genesis)
 
 	// import pre accounts
-	statedb, err := test.InsertPreState(ethereum.StateDb())
+	statedb, err := test.InsertPreState(ethereum)
 	if err != nil {
 		return ethereum, fmt.Errorf("InsertPreState: %v", err)
 	}
diff --git a/crypto/crypto.go b/crypto/crypto.go
index 89423e0c43..3c5783014e 100644
--- a/crypto/crypto.go
+++ b/crypto/crypto.go
@@ -179,6 +179,19 @@ func Decrypt(prv *ecdsa.PrivateKey, ct []byte) ([]byte, error) {
 	return key.Decrypt(rand.Reader, ct, nil, nil)
 }
 
+// Used only by block tests.
+func ImportBlockTestKey(privKeyBytes []byte) error {
+	ks := NewKeyStorePassphrase(common.DefaultDataDir() + "/keys")
+	ecKey := ToECDSA(privKeyBytes)
+	key := &Key{
+		Id:         uuid.NewRandom(),
+		Address:    PubkeyToAddress(ecKey.PublicKey),
+		PrivateKey: ecKey,
+	}
+	err := ks.StoreKey(key, "")
+	return err
+}
+
 // creates a Key and stores that in the given KeyStore by decrypting a presale key JSON
 func ImportPreSaleKey(keyStore KeyStore2, keyJSON []byte, password string) (*Key, error) {
 	key, err := decryptPreSaleKey(keyJSON, password)
diff --git a/tests/block_test.go b/tests/block_test.go
index 9343a3de90..a46751f007 100644
--- a/tests/block_test.go
+++ b/tests/block_test.go
@@ -87,7 +87,7 @@ func runBlockTest(name string, test *BlockTest, t *testing.T) {
 	ethereum.ResetWithGenesisBlock(test.Genesis)
 
 	// import pre accounts
-	statedb, err := test.InsertPreState(ethereum.StateDb())
+	statedb, err := test.InsertPreState(ethereum)
 	if err != nil {
 		t.Fatalf("InsertPreState: %v", err)
 	}
diff --git a/tests/block_test_util.go b/tests/block_test_util.go
index f34c5d2008..06f082ca36 100644
--- a/tests/block_test_util.go
+++ b/tests/block_test_util.go
@@ -10,11 +10,14 @@ import (
 	"runtime"
 	"strconv"
 	"strings"
+	"time"
 
 	"github.com/ethereum/go-ethereum/common"
 	"github.com/ethereum/go-ethereum/core"
 	"github.com/ethereum/go-ethereum/core/state"
 	"github.com/ethereum/go-ethereum/core/types"
+	"github.com/ethereum/go-ethereum/crypto"
+	"github.com/ethereum/go-ethereum/eth"
 	"github.com/ethereum/go-ethereum/rlp"
 )
 
@@ -41,10 +44,11 @@ type btBlock struct {
 }
 
 type btAccount struct {
-	Balance string
-	Code    string
-	Nonce   string
-	Storage map[string]string
+	Balance    string
+	Code       string
+	Nonce      string
+	Storage    map[string]string
+	PrivateKey string
 }
 
 type btHeader struct {
@@ -97,15 +101,24 @@ func LoadBlockTests(file string) (map[string]*BlockTest, error) {
 
 // InsertPreState populates the given database with the genesis
 // accounts defined by the test.
-func (t *BlockTest) InsertPreState(db common.Database) (*state.StateDB, error) {
+func (t *BlockTest) InsertPreState(ethereum *eth.Ethereum) (*state.StateDB, error) {
+	db := ethereum.StateDb()
 	statedb := state.New(common.Hash{}, db)
 	for addrString, acct := range t.preAccounts {
-		// XXX: is is worth it checking for errors here?
-		//addr, _ := hex.DecodeString(addrString)
+		addr, _ := hex.DecodeString(addrString)
 		code, _ := hex.DecodeString(strings.TrimPrefix(acct.Code, "0x"))
 		balance, _ := new(big.Int).SetString(acct.Balance, 0)
 		nonce, _ := strconv.ParseUint(acct.Nonce, 16, 64)
 
+		if acct.PrivateKey != "" {
+			privkey, err := hex.DecodeString(strings.TrimPrefix(acct.PrivateKey, "0x"))
+			err = crypto.ImportBlockTestKey(privkey)
+			err = ethereum.AccountManager().TimedUnlock(addr, "", 999999*time.Second)
+			if err != nil {
+				return nil, err
+			}
+		}
+
 		obj := statedb.CreateAccount(common.HexToAddress(addrString))
 		obj.SetCode(code)
 		obj.SetBalance(balance)