diff --git a/openid-connect-common/src/main/java/org/mitre/jwe/model/Jwe.java b/openid-connect-common/src/main/java/org/mitre/jwe/model/Jwe.java
index e240cd3a4..331ac877f 100644
--- a/openid-connect-common/src/main/java/org/mitre/jwe/model/Jwe.java
+++ b/openid-connect-common/src/main/java/org/mitre/jwe/model/Jwe.java
@@ -40,6 +40,7 @@ public class Jwe extends Jwt {
 		this.ciphertext = ciphertext;
 	}
 	
+	/*
 	public Jwe(String headerBase64, String encryptedKeyBase64, String cipherTextBase64, String integrityValueBase64) {
 		byte[] decodedEncryptedKey = Base64.decodeBase64(encryptedKeyBase64.getBytes());
 		byte[] decodedCipherText = Base64.decodeBase64(cipherTextBase64.getBytes());
@@ -48,6 +49,7 @@ public class Jwe extends Jwt {
 		this.ciphertext = decodedCipherText;
 		setSignature(integrityValueBase64);
 	}
+	*/
 	
 	public JweHeader getHeader() {
 		return header;
@@ -75,11 +77,10 @@ public class Jwe extends Jwt {
 
 	@Override
 	public String getSignatureBase() {
-		JsonObject h = header.getAsJsonObject();
 		byte[] c = ciphertext;
 		byte[] e = encryptedKey;
 
-		String h64 = new String(Base64.encodeBase64URLSafe(h.toString().getBytes()));
+		String h64 = new String(Base64.encodeBase64URLSafe(header.toJsonString().getBytes()));
 		String e64 = new String(Base64.encodeBase64URLSafe(e));
 		String c64 = new String(Base64.encodeBase64URLSafe(c));
 		
@@ -106,7 +107,10 @@ public class Jwe extends Jwt {
 		String c64 = parts.get(2);
 		String i64 = parts.get(3);
 
-		Jwe jwe = new Jwe(h64, e64, c64, i64);
+		byte[] decodedEncryptedKey = Base64.decodeBase64(e64.getBytes());
+		byte[] decodedCipherText = Base64.decodeBase64(c64.getBytes());
+		
+		Jwe jwe = new Jwe(new JweHeader(h64), decodedEncryptedKey, decodedCipherText, i64);
 		
 		return jwe;
 		
diff --git a/openid-connect-common/src/main/java/org/mitre/jwt/model/ClaimSet.java b/openid-connect-common/src/main/java/org/mitre/jwt/model/ClaimSet.java
index 9db157700..26c1832d0 100644
--- a/openid-connect-common/src/main/java/org/mitre/jwt/model/ClaimSet.java
+++ b/openid-connect-common/src/main/java/org/mitre/jwt/model/ClaimSet.java
@@ -96,7 +96,7 @@ public class ClaimSet {
      * Set an extension claim
      */
     public void setClaim(String key, Object value) {
-    	jsonString = null;
+    	invalidateString();
     	claims.put(key, value);
     }
 
@@ -104,7 +104,7 @@ public class ClaimSet {
      * Set a primitive claim
      */
     public void setClaim(String key, JsonPrimitive prim) {
-    	jsonString = null;
+    	invalidateString();
     	if (prim == null) {
     		// in case we get here with a primitive null
     		claims.put(key, prim);
@@ -116,12 +116,17 @@ public class ClaimSet {
     		claims.put(key, prim.getAsString());
     	}    	
     	
+    }
+
+	private void invalidateString() {
+	    jsonString = null;
     }
     
     /**
      * Remove an extension claim
      */
     public Object removeClaim(String key) {
+    	invalidateString();
     	return claims.remove(key);
     }
     
@@ -131,6 +136,7 @@ public class ClaimSet {
      * @see java.util.Map#clear()
      */
     public void clear() {
+    	invalidateString();
 	    claims.clear();
     }
 
@@ -197,7 +203,7 @@ public class ClaimSet {
 	}
 
 	/**
-	 * Load a new claims set from a Base64 encoded JSON Object string
+	 * Load a new claims set from a Base64 encoded JSON Object string and caches the string used
 	 */
 	public void loadFromBase64JsonObjectString(String b64) {
 		byte[] b64decoded = Base64.decodeBase64(b64);
@@ -206,9 +212,12 @@ public class ClaimSet {
 		JsonObject json = parser.parse(new InputStreamReader(new ByteArrayInputStream(b64decoded))).getAsJsonObject();
 		
 		loadFromJsonObject(json);
+
+		// save the string we were passed in (decoded from base64)
+		jsonString = new String(b64decoded);
 	}
 	
-	public String toString() {
+	public String toJsonString() {
 		if(jsonString == null) {
 			jsonString = this.getAsJsonObject().toString();
 		}
diff --git a/openid-connect-common/src/main/java/org/mitre/jwt/model/Jwt.java b/openid-connect-common/src/main/java/org/mitre/jwt/model/Jwt.java
index e40e54823..8b85cf880 100644
--- a/openid-connect-common/src/main/java/org/mitre/jwt/model/Jwt.java
+++ b/openid-connect-common/src/main/java/org/mitre/jwt/model/Jwt.java
@@ -124,8 +124,8 @@ public class Jwt {
 	 */
 	public String getSignatureBase() {
 		
-		String h64 = new String(Base64.encodeBase64URLSafe(header.toString().getBytes()));
-		String c64 = new String(Base64.encodeBase64URLSafe(claims.toString().getBytes()));
+		String h64 = new String(Base64.encodeBase64URLSafe(header.toJsonString().getBytes()));
+		String c64 = new String(Base64.encodeBase64URLSafe(claims.toJsonString().getBytes()));
 		
 		return h64 + "." + c64;		
 	}