diff --git a/rpc/args.go b/rpc/args.go
index 6e02b65ef3738672c8411d9fa6c6c9f32679cd42..5b655024caa63ec59b498533bbfff887f66987fc 100644
--- a/rpc/args.go
+++ b/rpc/args.go
@@ -467,7 +467,7 @@ func (args *BlockFilterArgs) UnmarshalJSON(b []byte) (err error) {
 
 	switch fromstr {
 	case "latest":
-		args.Earliest = 0
+		args.Earliest = -1
 	default:
 		args.Earliest = int64(common.Big(obj[0].FromBlock.(string)).Int64())
 	}
@@ -479,9 +479,9 @@ func (args *BlockFilterArgs) UnmarshalJSON(b []byte) (err error) {
 
 	switch tostr {
 	case "latest":
-		args.Latest = 0
-	case "pending":
 		args.Latest = -1
+	case "pending":
+		args.Latest = -2
 	default:
 		args.Latest = int64(common.Big(obj[0].ToBlock.(string)).Int64())
 	}
@@ -775,8 +775,7 @@ func (args *SubmitWorkArgs) UnmarshalJSON(b []byte) (err error) {
 		return NewDecodeParamError("Nonce is not a string")
 	}
 
-	args.Nonce = common.BytesToNumber(common.Hex2Bytes(objstr))
-
+	args.Nonce = common.String2Big(objstr).Uint64()
 	if objstr, ok = obj[1].(string); !ok {
 		return NewDecodeParamError("Header is not a string")
 	}
diff --git a/rpc/args_test.go b/rpc/args_test.go
index 2ad53fba2a185e5ce5d989c00a258100821390f2..5cbafd4b2fe9d5fd0237d8b223e4e768ba96d635 100644
--- a/rpc/args_test.go
+++ b/rpc/args_test.go
@@ -5,6 +5,8 @@ import (
 	"encoding/json"
 	"math/big"
 	"testing"
+
+	"github.com/ethereum/go-ethereum/common"
 )
 
 func TestSha3(t *testing.T) {
@@ -440,8 +442,8 @@ func TestBlockFilterArgsWords(t *testing.T) {
   "toBlock": "pending"
   }]`
 	expected := new(BlockFilterArgs)
-	expected.Earliest = 0
-	expected.Latest = -1
+	expected.Earliest = -1
+	expected.Latest = -2
 
 	args := new(BlockFilterArgs)
 	if err := json.Unmarshal([]byte(input), &args); err != nil {
@@ -651,6 +653,10 @@ func TestFilterStringArgs(t *testing.T) {
 		t.Error(err)
 	}
 
+	if err := args.requirements(); err != nil {
+		t.Error(err)
+	}
+
 	if expected.Word != args.Word {
 		t.Errorf("Word shoud be %#v but is %#v", expected.Word, args.Word)
 	}
@@ -720,3 +726,28 @@ func TestHashIndexArgs(t *testing.T) {
 		t.Errorf("Index shoud be %#v but is %#v", expected.Index, args.Index)
 	}
 }
+
+func TestSubmitWorkArgs(t *testing.T) {
+	input := `["0x0000000000000001", "0x1234567890abcdef1234567890abcdef", "0xD1GE5700000000000000000000000000"]`
+	expected := new(SubmitWorkArgs)
+	expected.Nonce = 1
+	expected.Header = common.HexToHash("0x1234567890abcdef1234567890abcdef")
+	expected.Digest = common.HexToHash("0xD1GE5700000000000000000000000000")
+
+	args := new(SubmitWorkArgs)
+	if err := json.Unmarshal([]byte(input), &args); err != nil {
+		t.Error(err)
+	}
+
+	if expected.Nonce != args.Nonce {
+		t.Errorf("Nonce shoud be %d but is %d", expected.Nonce, args.Nonce)
+	}
+
+	if expected.Header != args.Header {
+		t.Errorf("Header shoud be %#v but is %#v", expected.Header, args.Header)
+	}
+
+	if expected.Digest != args.Digest {
+		t.Errorf("Digest shoud be %#v but is %#v", expected.Digest, args.Digest)
+	}
+}