diff --git a/cmd/ethereum/blocktest.go b/cmd/ethereum/blocktest.go
index e6d701d2c8a8c7e6b90313b40ff74a018cd6c657..d9cdfa83f06156f5ffc10d75bc451e7ee9079356 100644
--- a/cmd/ethereum/blocktest.go
+++ b/cmd/ethereum/blocktest.go
@@ -5,9 +5,9 @@ import (
 
 	"github.com/codegangsta/cli"
 	"github.com/ethereum/go-ethereum/cmd/utils"
+	"github.com/ethereum/go-ethereum/common"
 	"github.com/ethereum/go-ethereum/eth"
 	"github.com/ethereum/go-ethereum/ethdb"
-	"github.com/ethereum/go-ethereum/common"
 	"github.com/ethereum/go-ethereum/tests"
 )
 
@@ -26,10 +26,10 @@ be able to interact with the chain defined by the test.
 }
 
 func runblocktest(ctx *cli.Context) {
-	if len(ctx.Args()) != 2 {
-		utils.Fatalf("This command requires two arguments.")
+	if len(ctx.Args()) != 3 {
+		utils.Fatalf("Usage: ethereum blocktest <path-to-test-file> <test-name> {rpc, norpc}")
 	}
-	file, testname := ctx.Args()[0], ctx.Args()[1]
+	file, testname, startrpc := ctx.Args()[0], ctx.Args()[1], ctx.Args()[2]
 
 	bt, err := tests.LoadBlockTests(file)
 	if err != nil {
@@ -42,6 +42,7 @@ func runblocktest(ctx *cli.Context) {
 
 	cfg := utils.MakeEthConfig(ClientIdentifier, Version, ctx)
 	cfg.NewDB = func(path string) (common.Database, error) { return ethdb.NewMemDatabase() }
+	cfg.MaxPeers = 0 // disable network
 	ethereum, err := eth.New(cfg)
 	if err != nil {
 		utils.Fatalf("%v", err)
@@ -51,7 +52,8 @@ func runblocktest(ctx *cli.Context) {
 	ethereum.ResetWithGenesisBlock(test.Genesis)
 
 	// import pre accounts
-	if err := test.InsertPreState(ethereum.StateDb()); err != nil {
+	statedb, err := test.InsertPreState(ethereum.StateDb())
+	if err != nil {
 		utils.Fatalf("could not insert genesis accounts: %v", err)
 	}
 
@@ -60,7 +62,19 @@ func runblocktest(ctx *cli.Context) {
 	if err := chain.InsertChain(test.Blocks); err != nil {
 		utils.Fatalf("Block Test load error: %v", err)
 	} else {
-		fmt.Println("Block Test chain loaded, starting ethereum.")
+		fmt.Println("Block Test chain loaded")
+	}
+
+	if err := test.ValidatePostState(statedb); err != nil {
+		utils.Fatalf("post state validation failed: %v", err)
+	}
+	fmt.Println("Block Test post state validated, starting ethereum.")
+
+	if startrpc == "rpc" {
+		startEth(ctx, ethereum)
+		utils.StartRPC(ethereum, ctx)
+		ethereum.WaitForShutdown()
+	} else {
+		startEth(ctx, ethereum)
 	}
-	startEth(ctx, ethereum)
 }
diff --git a/cmd/ethtest/main.go b/cmd/ethtest/main.go
index f2f7d27f37b37744504ff7579c3dee6496e54ed6..fdf573fd8ab65923e617d74ff8bebd99d7efcb89 100644
--- a/cmd/ethtest/main.go
+++ b/cmd/ethtest/main.go
@@ -219,7 +219,7 @@ func RunVmTest(r io.Reader) (failed int) {
 }
 
 func main() {
-	helper.Logger.SetLogLevel(5)
+	//helper.Logger.SetLogLevel(5)
 	vm.Debug = true
 
 	if len(os.Args) > 1 {
diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go
index f87d25ce9fc66b7fbc78beeebf6891b6943a4b03..9a4ab58044c5040bfe73ff9a7b64438b7b657dd3 100644
--- a/cmd/utils/flags.go
+++ b/cmd/utils/flags.go
@@ -256,7 +256,7 @@ func StartRPC(eth *eth.Ethereum, ctx *cli.Context) {
 	addr := ctx.GlobalString(RPCListenAddrFlag.Name)
 	port := ctx.GlobalInt(RPCPortFlag.Name)
 	dataDir := ctx.GlobalString(DataDirFlag.Name)
-
+	fmt.Println("Starting RPC on port: ", port)
 	l, err := net.Listen("tcp", fmt.Sprintf("%s:%d", addr, port))
 	if err != nil {
 		Fatalf("Can't listen on %s:%d: %v", addr, port, err)
diff --git a/core/chain_manager.go b/core/chain_manager.go
index 1bc8edea6ffadbe7aa78cdbfc1dfbbd045f929ff..73b68358bb8742b874a196b34d3a50a663faa131 100644
--- a/core/chain_manager.go
+++ b/core/chain_manager.go
@@ -32,8 +32,10 @@ type StateQuery interface {
 func CalcDifficulty(block, parent *types.Header) *big.Int {
 	diff := new(big.Int)
 
-	min := big.NewInt(2048)
-	adjust := new(big.Int).Div(parent.Difficulty, min)
+	diffBoundDiv := big.NewInt(2048)
+	min := big.NewInt(131072)
+
+	adjust := new(big.Int).Div(parent.Difficulty, diffBoundDiv)
 	if (block.Time - parent.Time) < 8 {
 		diff.Add(parent.Difficulty, adjust)
 	} else {
diff --git a/tests/blocktest.go b/tests/blocktest.go
index 44b459c8d66bdb8b1ae21a1b9a402d6115b7d263..5719a835bad25ea71ce0dfbdbe601f5efb624c0c 100644
--- a/tests/blocktest.go
+++ b/tests/blocktest.go
@@ -19,11 +19,11 @@ import (
 )
 
 // Block Test JSON Format
-
 type btJSON struct {
 	Blocks             []btBlock
 	GenesisBlockHeader btHeader
 	Pre                map[string]btAccount
+	PostState          map[string]btAccount
 }
 
 type btAccount struct {
@@ -97,7 +97,7 @@ 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) error {
+func (t *BlockTest) InsertPreState(db common.Database) (*state.StateDB, error) {
 	statedb := state.New(common.Hash{}, db)
 	for addrString, acct := range t.preAccounts {
 		// XXX: is is worth it checking for errors here?
@@ -119,8 +119,33 @@ func (t *BlockTest) InsertPreState(db common.Database) error {
 	// sync trie to disk
 	statedb.Sync()
 
-	if t.Genesis.Root() != statedb.Root() {
-		return errors.New("computed state root does not match genesis block")
+	if !bytes.Equal(t.Genesis.Root().Bytes(), statedb.Root().Bytes()) {
+		return nil, errors.New("computed state root does not match genesis block")
+	}
+	return statedb, nil
+}
+
+func (t *BlockTest) ValidatePostState(statedb *state.StateDB) error {
+	for addrString, acct := range t.preAccounts {
+		// XXX: is is worth it checking for errors here?
+		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)
+
+		// address is indirectly verified by the other fields, as it's the db key
+		code2 := statedb.GetCode(common.BytesToAddress(addr))
+		balance2 := statedb.GetBalance(common.BytesToAddress(addr))
+		nonce2 := statedb.GetNonce(common.BytesToAddress(addr))
+		if !bytes.Equal(code2, code) {
+			return fmt.Errorf("account code mismatch, addr, found, expected: ", addrString, hex.EncodeToString(code2), hex.EncodeToString(code))
+		}
+		if balance2.Cmp(balance) != 0 {
+			return fmt.Errorf("account balance mismatch, addr, found, expected: ", addrString, balance2, balance)
+		}
+		if nonce2 != nonce {
+			return fmt.Errorf("account nonce mismatch, addr, found, expected: ", addrString, nonce2, nonce)
+		}
 	}
 	return nil
 }