diff --git a/rpcserver.go b/rpcserver.go
index eaaf3d3fd..9f796f095 100644
--- a/rpcserver.go
+++ b/rpcserver.go
@@ -1225,18 +1225,13 @@ func handleRescan(s *rpcServer, cmd btcjson.Cmd,
 		for i := range blkshalist {
 			blk, err := s.server.db.FetchBlockBySha(&blkshalist[i])
 			if err != nil {
+				rpcsLog.Errorf("Error looking up block sha: %v", err)
 				return err
 			}
-			txShaList, err := blk.TxShas()
-			if err != nil {
-				return err
-			}
-			txList := s.server.db.FetchTxByShaList(txShaList)
-			for _, txReply := range txList {
-				if txReply.Err != nil || txReply.Tx == nil {
-					continue
-				}
-				for txOutIdx, txout := range txReply.Tx.TxOut {
+			txs := blk.Transactions()
+			for _, tx := range txs {
+				var txReply *btcdb.TxListReply
+				for txOutIdx, txout := range tx.MsgTx().TxOut {
 					st, txaddrhash, err := btcscript.ScriptToAddrHash(txout.PkScript)
 					if st != btcscript.ScriptAddr || err != nil {
 						continue
@@ -1246,27 +1241,48 @@ func handleRescan(s *rpcServer, cmd btcjson.Cmd,
 						rpcsLog.Errorf("Error encoding address: %v", err)
 						return err
 					}
+
 					if _, ok := rescanCmd.Addresses[txaddr]; ok {
+						// TODO(jrick): This lookup is expensive and can be avoided
+						// if the wallet is sent the previous outpoints for all inputs
+						// of the tx, so any can removed from the utxo set (since
+						// they are, as of this tx, now spent).
+						if txReply == nil {
+							txReplyList, err := s.server.db.FetchTxBySha(tx.Sha())
+							if err != nil {
+								rpcsLog.Errorf("Tx Sha %v not found by db.", tx.Sha())
+								return err
+							}
+							for i := range txReplyList {
+								if txReplyList[i].Height == blk.Height() {
+									txReply = txReplyList[i]
+									break
+								}
+							}
+						}
+
 						reply.Result = struct {
-							Sender    string `json:"sender"`
-							Receiver  string `json:"receiver"`
-							BlockHash string `json:"blockhash"`
-							Height    int64  `json:"height"`
-							TxHash    string `json:"txhash"`
-							Index     uint32 `json:"index"`
-							Amount    int64  `json:"amount"`
-							PkScript  string `json:"pkscript"`
-							Spent     bool   `json:"spent"`
+							Receiver   string `json:"receiver"`
+							Height     int64  `json:"height"`
+							BlockHash  string `json:"blockhash"`
+							BlockIndex int    `json:"blockindex"`
+							BlockTime  int64  `json:"blocktime"`
+							TxID       string `json:"txid"`
+							TxOutIndex uint32 `json:"txoutindex"`
+							Amount     int64  `json:"amount"`
+							PkScript   string `json:"pkscript"`
+							Spent      bool   `json:"spent"`
 						}{
-							Sender:    "Unknown", // TODO(jrick)
-							Receiver:  txaddr,
-							BlockHash: blkshalist[i].String(),
-							Height:    blk.Height(),
-							TxHash:    txReply.Sha.String(),
-							Index:     uint32(txOutIdx),
-							Amount:    txout.Value,
-							PkScript:  btcutil.Base58Encode(txout.PkScript),
-							Spent:     txReply.TxSpent[txOutIdx],
+							Receiver:   txaddr,
+							Height:     blk.Height(),
+							BlockHash:  blkshalist[i].String(),
+							BlockIndex: tx.Index(),
+							BlockTime:  blk.MsgBlock().Header.Timestamp.Unix(),
+							TxID:       tx.Sha().String(),
+							TxOutIndex: uint32(txOutIdx),
+							Amount:     txout.Value,
+							PkScript:   btcutil.Base58Encode(txout.PkScript),
+							Spent:      txReply.TxSpent[txOutIdx],
 						}
 						mreply, _ := json.Marshal(reply)
 						walletNotification <- mreply
@@ -1643,23 +1659,25 @@ func (s *rpcServer) newBlockNotifyCheckTxOut(block *btcutil.Block,
 				}
 				reply := &btcjson.Reply{
 					Result: struct {
-						Sender    string `json:"sender"`
-						Receiver  string `json:"receiver"`
-						BlockHash string `json:"blockhash"`
-						Height    int64  `json:"height"`
-						TxHash    string `json:"txhash"`
-						Index     uint32 `json:"index"`
-						Amount    int64  `json:"amount"`
-						PkScript  string `json:"pkscript"`
+						Receiver   string `json:"receiver"`
+						Height     int64  `json:"height"`
+						BlockHash  string `json:"blockhash"`
+						BlockIndex int    `json:"blockindex"`
+						BlockTime  int64  `json:"blocktime"`
+						TxID       string `json:"txid"`
+						TxOutIndex uint32 `json:"txoutindex"`
+						Amount     int64  `json:"amount"`
+						PkScript   string `json:"pkscript"`
 					}{
-						Sender:    "Unknown", // TODO(jrick)
-						Receiver:  txaddr,
-						BlockHash: blkhash.String(),
-						Height:    block.Height(),
-						TxHash:    tx.Sha().String(),
-						Index:     uint32(i),
-						Amount:    txout.Value,
-						PkScript:  btcutil.Base58Encode(txout.PkScript),
+						Receiver:   txaddr,
+						Height:     block.Height(),
+						BlockHash:  blkhash.String(),
+						BlockIndex: tx.Index(),
+						BlockTime:  block.MsgBlock().Header.Timestamp.Unix(),
+						TxID:       tx.Sha().String(),
+						TxOutIndex: uint32(i),
+						Amount:     txout.Value,
+						PkScript:   btcutil.Base58Encode(txout.PkScript),
 					},
 					Error: nil,
 					Id:    &ctx.id,