diff --git a/project/history.go b/project/history.go
index 9d82ee54f480186a3bdfd996b4fce236037318e4..f740a0a6f49563535470f9bb63f844881d3b3f0b 100644
--- a/project/history.go
+++ b/project/history.go
@@ -28,6 +28,10 @@ func FullVersion() string {
 // To cut a new release add a release to the front of this slice then run the
 // release tagging script: ./scripts/tag_release.sh
 var History relic.ImmutableHistory = relic.NewHistory("Hyperledger Burrow").MustDeclareReleases(
+	"0.18.1",
+	`This is a minor release including:
+- Introduce InputAccount param for RPC/v0 for integration in JS libs
+- Resolve some issues with RPC/tm tests swallowing timeouts and not dealing with reordered events`,
 	"0.18.0",
 	`This is an extremely large release in terms of lines of code changed addressing several years of technical debt. Despite this efforts were made to maintain external interfaces as much as possible and an extended period of stabilisation has taken place on develop.
 
diff --git a/rpc/v0/integration/v0_test.go b/rpc/v0/integration/v0_test.go
index 8c333c7409eaa379788d5fb52baa14fb239e2c74..55590ff15dde438b381f5f5ff2e203388e4257de 100644
--- a/rpc/v0/integration/v0_test.go
+++ b/rpc/v0/integration/v0_test.go
@@ -18,15 +18,12 @@
 package integration
 
 import (
+	"context"
 	"encoding/hex"
 	"fmt"
-	"testing"
-
-	"context"
-
 	"sync"
+	"testing"
 
-	"github.com/hyperledger/burrow/account"
 	"github.com/hyperledger/burrow/binary"
 	"github.com/hyperledger/burrow/consensus/tendermint"
 	"github.com/hyperledger/burrow/execution/evm/abi"
@@ -40,15 +37,13 @@ func TestTransactCallNoCode(t *testing.T) {
 	cli := v0.NewV0Client("http://localhost:1337/rpc")
 
 	// Flip flops between sending private key and input address to test private key and address based signing
-	privKey, inputAddress := privKeyInputAddressAlternator(privateAccounts[0])
 	toAddress := privateAccounts[2].Address()
 
 	numCreates := 1000
 	countCh := committedTxCount(t)
 	for i := 0; i < numCreates; i++ {
 		receipt, err := cli.Transact(v0.TransactParam{
-			PrivKey:      privKey(i),
-			InputAddress: inputAddress(i),
+			InputAccount: inputAccount(i),
 			Address:      toAddress.Bytes(),
 			Data:         []byte{},
 			Fee:          2,
@@ -68,7 +63,6 @@ func TestTransactCreate(t *testing.T) {
 	wg.Add(numGoroutines)
 	cli := v0.NewV0Client("http://localhost:1337/rpc")
 	// Flip flops between sending private key and input address to test private key and address based signing
-	privKey, inputAddress := privKeyInputAddressAlternator(privateAccounts[0])
 	bc, err := hex.DecodeString(strangeLoopBytecode)
 	require.NoError(t, err)
 	countCh := committedTxCount(t)
@@ -76,8 +70,7 @@ func TestTransactCreate(t *testing.T) {
 		go func() {
 			for j := 0; j < numCreates; j++ {
 				create, err := cli.Transact(v0.TransactParam{
-					PrivKey:      privKey(j),
-					InputAddress: inputAddress(j),
+					InputAccount: inputAccount(i),
 					Address:      nil,
 					Data:         bc,
 					Fee:          2,
@@ -98,13 +91,11 @@ func TestTransactCreate(t *testing.T) {
 func BenchmarkTransactCreateContract(b *testing.B) {
 	cli := v0.NewV0Client("http://localhost:1337/rpc")
 
-	privKey, inputAddress := privKeyInputAddressAlternator(privateAccounts[0])
 	bc, err := hex.DecodeString(strangeLoopBytecode)
 	require.NoError(b, err)
 	for i := 0; i < b.N; i++ {
 		create, err := cli.Transact(v0.TransactParam{
-			PrivKey:      privKey(i),
-			InputAddress: inputAddress(i),
+			InputAccount: inputAccount(i),
 			Address:      nil,
 			Data:         bc,
 			Fee:          2,
@@ -119,7 +110,6 @@ func TestTransactAndHold(t *testing.T) {
 	cli := v0.NewV0Client("http://localhost:1337/rpc")
 	bc, err := hex.DecodeString(strangeLoopBytecode)
 	require.NoError(t, err)
-	privKey, inputAddress := privKeyInputAddressAlternator(privateAccounts[0])
 
 	numGoroutines := 5
 	numRuns := 2
@@ -127,8 +117,7 @@ func TestTransactAndHold(t *testing.T) {
 	for i := 0; i < numGoroutines; i++ {
 		for j := 0; j < numRuns; j++ {
 			create, err := cli.TransactAndHold(v0.TransactParam{
-				PrivKey:      privKey(j),
-				InputAddress: inputAddress(j),
+				InputAccount: inputAccount(i),
 				Address:      nil,
 				Data:         bc,
 				Fee:          2,
@@ -138,8 +127,7 @@ func TestTransactAndHold(t *testing.T) {
 			assert.Equal(t, 0, create.StackDepth)
 			functionID := abi.FunctionID("UpsieDownsie()")
 			call, err := cli.TransactAndHold(v0.TransactParam{
-				PrivKey:      privKey(j),
-				InputAddress: inputAddress(j),
+				InputAccount: inputAccount(i),
 				Address:      create.CallData.Callee.Bytes(),
 				Data:         functionID[:],
 				Fee:          2,
@@ -158,12 +146,10 @@ func TestSend(t *testing.T) {
 	cli := v0.NewV0Client("http://localhost:1337/rpc")
 
 	numSends := 1000
-	privKey, inputAddress := privKeyInputAddressAlternator(privateAccounts[0])
 	countCh := committedTxCount(t)
 	for i := 0; i < numSends; i++ {
 		send, err := cli.Send(v0.SendParam{
-			PrivKey:      privKey(i),
-			InputAddress: inputAddress(i),
+			InputAccount: inputAccount(i),
 			Amount:       2003,
 			ToAddress:    privateAccounts[3].Address().Bytes(),
 		})
@@ -176,12 +162,9 @@ func TestSend(t *testing.T) {
 func TestSendAndHold(t *testing.T) {
 	cli := v0.NewV0Client("http://localhost:1337/rpc")
 
-	privKey, inputAddress := privKeyInputAddressAlternator(privateAccounts[0])
-
 	for i := 0; i < 2; i++ {
 		send, err := cli.SendAndHold(v0.SendParam{
-			PrivKey:      privKey(i),
-			InputAddress: inputAddress(i),
+			InputAccount: inputAccount(i),
 			Amount:       2003,
 			ToAddress:    privateAccounts[3].Address().Bytes(),
 		})
@@ -190,6 +173,8 @@ func TestSendAndHold(t *testing.T) {
 	}
 }
 
+// Helpers
+
 var committedTxCountIndex = 0
 
 func committedTxCount(t *testing.T) chan int {
@@ -222,19 +207,15 @@ func committedTxCount(t *testing.T) chan int {
 	return outCh
 }
 
-// Returns a pair of functions that mutually exclusively return the private key bytes or input address bytes of a
-// private account in the same iteration of a loop indexed by an int
-func privKeyInputAddressAlternator(privateAccount account.PrivateAccount) (func(int) []byte, func(int) []byte) {
-	privKey := privateAccount.PrivateKey().RawBytes()
-	inputAddress := privateAccount.Address().Bytes()
-	return alternator(privKey, 0), alternator(inputAddress, 1)
-}
+var inputPrivateKey = privateAccounts[0].PrivateKey().RawBytes()
+var inputAddress = privateAccounts[0].Address().Bytes()
 
-func alternator(ret []byte, res int) func(int) []byte {
-	return func(i int) []byte {
-		if i%2 == res {
-			return ret
-		}
-		return nil
+func inputAccount(i int) v0.InputAccount {
+	ia := v0.InputAccount{}
+	if i%2 == 0 {
+		ia.PrivateKey = inputPrivateKey
+	} else {
+		ia.Address = inputAddress
 	}
+	return ia
 }
diff --git a/rpc/v0/methods.go b/rpc/v0/methods.go
index 346b53148a780d307473f31c106f3a2ab796edf5..0226189e399ed8719d004732b9d0753f95f35232 100644
--- a/rpc/v0/methods.go
+++ b/rpc/v0/methods.go
@@ -147,12 +147,12 @@ func GetMethods(codec rpc.Codec, service *rpc.Service, logger *logging.Logger) m
 			return acm.AsConcretePrivateAccount(pa), 0, nil
 		},
 		GEN_PRIV_ACCOUNT_FROM_KEY: func(request *rpc.RPCRequest, requester interface{}) (interface{}, int, error) {
-			param := &PrivKeyParam{}
+			param := &PrivateKeyParam{}
 			err := codec.DecodeBytes(param, request.Params)
 			if err != nil {
 				return nil, rpc.INVALID_PARAMS, err
 			}
-			pa, err := acm.GeneratePrivateAccountFromPrivateKeyBytes(param.PrivKey)
+			pa, err := acm.GeneratePrivateAccountFromPrivateKeyBytes(param.PrivateKey)
 			if err != nil {
 				return nil, rpc.INTERNAL_ERROR, err
 			}
@@ -214,7 +214,7 @@ func GetMethods(codec rpc.Codec, service *rpc.Service, logger *logging.Logger) m
 			if err != nil {
 				return nil, rpc.INVALID_PARAMS, err
 			}
-			txRet, err := service.Transactor().SignTx(param.Tx, acm.SigningAccounts(param.PrivAccounts))
+			txRet, err := service.Transactor().SignTx(param.Tx, acm.SigningAccounts(param.PrivateAccounts))
 			if err != nil {
 				return nil, rpc.INTERNAL_ERROR, err
 			}
@@ -231,7 +231,7 @@ func GetMethods(codec rpc.Codec, service *rpc.Service, logger *logging.Logger) m
 				return nil, rpc.INVALID_PARAMS, err
 			}
 			// Use mempool state so that transact can generate a run of sequence numbers when formulating transactions
-			inputAccount, err := signingAccount(service.MempoolAccounts(), param.PrivKey, param.InputAddress)
+			inputAccount, err := signingAccount(service.MempoolAccounts(), param.InputAccount)
 			if err != nil {
 				return nil, rpc.INVALID_PARAMS, err
 			}
@@ -251,7 +251,7 @@ func GetMethods(codec rpc.Codec, service *rpc.Service, logger *logging.Logger) m
 			if err != nil {
 				return nil, rpc.INVALID_PARAMS, err
 			}
-			inputAccount, err := signingAccount(service.MempoolAccounts(), param.PrivKey, param.InputAddress)
+			inputAccount, err := signingAccount(service.MempoolAccounts(), param.InputAccount)
 			if err != nil {
 				return nil, rpc.INVALID_PARAMS, err
 			}
@@ -272,7 +272,7 @@ func GetMethods(codec rpc.Codec, service *rpc.Service, logger *logging.Logger) m
 				return nil, rpc.INVALID_PARAMS, err
 			}
 			// Run Send against mempool state
-			inputAccount, err := signingAccount(service.MempoolAccounts(), param.PrivKey, param.InputAddress)
+			inputAccount, err := signingAccount(service.MempoolAccounts(), param.InputAccount)
 			if err != nil {
 				return nil, rpc.INVALID_PARAMS, err
 			}
@@ -293,7 +293,7 @@ func GetMethods(codec rpc.Codec, service *rpc.Service, logger *logging.Logger) m
 				return nil, rpc.INVALID_PARAMS, err
 			}
 			// Run Send against mempool state
-			inputAccount, err := signingAccount(service.MempoolAccounts(), param.PrivKey, param.InputAddress)
+			inputAccount, err := signingAccount(service.MempoolAccounts(), param.InputAccount)
 			if err != nil {
 				return nil, rpc.INVALID_PARAMS, err
 			}
@@ -309,7 +309,7 @@ func GetMethods(codec rpc.Codec, service *rpc.Service, logger *logging.Logger) m
 			if err != nil {
 				return nil, rpc.INVALID_PARAMS, err
 			}
-			inputAccount, err := signingAccount(service.MempoolAccounts(), param.PrivKey, param.InputAddress)
+			inputAccount, err := signingAccount(service.MempoolAccounts(), param.InputAccount)
 			if err != nil {
 				return nil, rpc.INVALID_PARAMS, err
 			}
@@ -444,17 +444,17 @@ func GetMethods(codec rpc.Codec, service *rpc.Service, logger *logging.Logger) m
 }
 
 // Gets signing account from onr of private key or address - failing if both are provided
-func signingAccount(accounts *execution.Accounts, privKey, addressBytes []byte) (*execution.SequentialSigningAccount, error) {
-	if len(addressBytes) > 0 {
-		if len(privKey) > 0 {
+func signingAccount(accounts *execution.Accounts, inputAccount InputAccount) (*execution.SequentialSigningAccount, error) {
+	if len(inputAccount.Address) > 0 {
+		if len(inputAccount.PrivateKey) > 0 {
 			return nil, fmt.Errorf("privKey and address provided but only one or the other should be given")
 		}
-		address, err := acm.AddressFromBytes(addressBytes)
+		address, err := acm.AddressFromBytes(inputAccount.Address)
 		if err != nil {
 			return nil, err
 		}
 		return accounts.SequentialSigningAccount(address), nil
 	}
 
-	return accounts.SequentialSigningAccountFromPrivateKey(privKey)
+	return accounts.SequentialSigningAccountFromPrivateKey(inputAccount.PrivateKey)
 }
diff --git a/rpc/v0/params.go b/rpc/v0/params.go
index 2635308ef25aad3cb2bf01331bfca58763d34709..a93f9a06ef0542956b3240637878f33f3fbb57b4 100644
--- a/rpc/v0/params.go
+++ b/rpc/v0/params.go
@@ -31,8 +31,13 @@ type (
 		Filters []*filters.FilterData `json:"filters"`
 	}
 
-	PrivKeyParam struct {
-		PrivKey []byte `json:"priv_key"`
+	PrivateKeyParam struct {
+		PrivateKey []byte `json:"privateKey"`
+	}
+
+	InputAccount struct {
+		PrivateKey []byte `json:"privateKey"`
+		Address    []byte `json:"address"`
 	}
 
 	// StorageAt
@@ -47,18 +52,18 @@ type (
 	}
 
 	BlocksParam struct {
-		MinHeight uint64 `json:"min_height"`
-		MaxHeight uint64 `json:"max_height"`
+		MinHeight uint64 `json:"minHeight"`
+		MaxHeight uint64 `json:"maxHeight"`
 	}
 
 	// Event Id
 	EventIdParam struct {
-		EventId string `json:"event_id"`
+		EventId string `json:"eventId"`
 	}
 
 	// Event Id
 	SubIdParam struct {
-		SubId string `json:"sub_id"`
+		SubId string `json:"subId"`
 	}
 
 	PeerParam struct {
@@ -81,27 +86,25 @@ type (
 
 	// Used when signing a tx. Uses placeholders just like TxParam
 	SignTxParam struct {
-		Tx           *txs.CallTx                   `json:"tx"`
-		PrivAccounts []*acm.ConcretePrivateAccount `json:"priv_accounts"`
+		Tx              *txs.CallTx                   `json:"tx"`
+		PrivateAccounts []*acm.ConcretePrivateAccount `json:"privateAccounts"`
 	}
 
 	// Used when sending a transaction to be created and signed on the server
 	// (using the private key). This only uses the standard key type for now.
 	TransactParam struct {
-		PrivKey      []byte `json:"priv_key"`
-		InputAddress []byte `json:"input_account"`
-		Data         []byte `json:"data"`
-		Address      []byte `json:"address"`
-		Fee          uint64 `json:"fee"`
-		GasLimit     uint64 `json:"gas_limit"`
+		InputAccount InputAccount `json:"inputAccount"`
+		Data         []byte       `json:"data"`
+		Address      []byte       `json:"address"`
+		Fee          uint64       `json:"fee"`
+		GasLimit     uint64       `json:"gasLimit"`
 	}
 
 	// Used when sending a 'Send' transaction.
 	SendParam struct {
-		PrivKey      []byte `json:"priv_key"`
-		InputAddress []byte `json:"input_account"`
-		ToAddress    []byte `json:"to_address"`
-		Amount       uint64 `json:"amount"`
+		InputAccount InputAccount `json:"inputAccount"`
+		ToAddress    []byte       `json:"toAddress"`
+		Amount       uint64       `json:"amount"`
 	}
 
 	NameRegEntryParam struct {
@@ -111,11 +114,10 @@ type (
 	// Used when sending a namereg transaction to be created and signed on the server
 	// (using the private key). This only uses the standard key type for now.
 	TransactNameRegParam struct {
-		PrivKey      []byte `json:"priv_key"`
-		InputAddress []byte `json:"input_account"`
-		Name         string `json:"name"`
-		Data         string `json:"data"`
-		Fee          uint64 `json:"fee"`
-		Amount       uint64 `json:"amount"`
+		InputAccount InputAccount `json:"inputAccount"`
+		Name         string       `json:"name"`
+		Data         string       `json:"data"`
+		Fee          uint64       `json:"fee"`
+		Amount       uint64       `json:"amount"`
 	}
 )