diff --git a/rpc/args.go b/rpc/args.go
index d4d807060804b19f0094fffb4dc5d3386ab66b94..2e4e2c7a9520f7136ccac49729b7c105c4f3e448 100644
--- a/rpc/args.go
+++ b/rpc/args.go
@@ -227,11 +227,67 @@ type BlockNumIndexArgs struct {
 	Index       int64
 }
 
+func (args *BlockNumIndexArgs) UnmarshalJSON(b []byte) (err error) {
+	var obj []interface{}
+	r := bytes.NewReader(b)
+	if err := json.NewDecoder(r).Decode(&obj); err != nil {
+		return errDecodeArgs
+	}
+
+	if len(obj) < 1 {
+		return errArguments
+	}
+
+	arg0, ok := obj[0].(string)
+	if !ok {
+		return errDecodeArgs
+	}
+	args.BlockNumber = ethutil.Big(arg0).Int64()
+
+	if len(obj) > 1 {
+		arg1, ok := obj[1].(string)
+		if !ok {
+			return errDecodeArgs
+		}
+		args.Index = ethutil.Big(arg1).Int64()
+	}
+
+	return nil
+}
+
 type HashIndexArgs struct {
 	BlockHash string
 	Index     int64
 }
 
+func (args *HashIndexArgs) UnmarshalJSON(b []byte) (err error) {
+	var obj []interface{}
+	r := bytes.NewReader(b)
+	if err := json.NewDecoder(r).Decode(&obj); err != nil {
+		return errDecodeArgs
+	}
+
+	if len(obj) < 1 {
+		return errArguments
+	}
+
+	arg0, ok := obj[0].(string)
+	if !ok {
+		return errDecodeArgs
+	}
+	args.BlockHash = arg0
+
+	if len(obj) > 1 {
+		arg1, ok := obj[1].(string)
+		if !ok {
+			return errDecodeArgs
+		}
+		args.Index = ethutil.Big(arg1).Int64()
+	}
+
+	return nil
+}
+
 type Sha3Args struct {
 	Data string
 }
diff --git a/rpc/args_test.go b/rpc/args_test.go
index 0276245001425da1e138f0532b91b38d78c9dff9..6650d8d61f993181fe97a7ba89d3b7f0994a6e9c 100644
--- a/rpc/args_test.go
+++ b/rpc/args_test.go
@@ -432,3 +432,43 @@ func TestWhisperIdentityArgs(t *testing.T) {
 		t.Errorf("Identity shoud be %#v but is %#v", expected.Identity, args.Identity)
 	}
 }
+
+func TestBlockNumIndexArgs(t *testing.T) {
+	input := `["0x29a", "0x0"]`
+	expected := new(BlockNumIndexArgs)
+	expected.BlockNumber = 666
+	expected.Index = 0
+
+	args := new(BlockNumIndexArgs)
+	if err := json.Unmarshal([]byte(input), &args); err != nil {
+		t.Error(err)
+	}
+
+	if expected.BlockNumber != args.BlockNumber {
+		t.Errorf("BlockNumber shoud be %#v but is %#v", expected.BlockNumber, args.BlockNumber)
+	}
+
+	if expected.Index != args.Index {
+		t.Errorf("Index shoud be %#v but is %#v", expected.Index, args.Index)
+	}
+}
+
+func TestHashIndexArgs(t *testing.T) {
+	input := `["0xc6ef2fc5426d6ad6fd9e2a26abeab0aa2411b7ab17f30a99d3cb96aed1d1055b", "0x1"]`
+	expected := new(HashIndexArgs)
+	expected.BlockHash = "0xc6ef2fc5426d6ad6fd9e2a26abeab0aa2411b7ab17f30a99d3cb96aed1d1055b"
+	expected.Index = 1
+
+	args := new(HashIndexArgs)
+	if err := json.Unmarshal([]byte(input), &args); err != nil {
+		t.Error(err)
+	}
+
+	if expected.BlockHash != args.BlockHash {
+		t.Errorf("BlockHash shoud be %#v but is %#v", expected.BlockHash, args.BlockHash)
+	}
+
+	if expected.Index != args.Index {
+		t.Errorf("Index shoud be %#v but is %#v", expected.Index, args.Index)
+	}
+}