                 return false // TODO: populate NSError
             }
         }
+        for fld in mandatory {
+            if self.body[fld] as? String == nil {
+                // not present, but was mandatory
+                self.header = [:]; self.body = [:] // reset
+                return false // TODO: populate NSError
+            }
+        }
         return true
     }
 
     // convenience method for plain strings as key
-    public func loads(jwt: String, key: String, verify: Bool = true, error: NSErrorPointer = nil) -> Bool {
+    public func loads(jwt: String, key: String, verify: Bool = true, mandatory: [String] = [], error: NSErrorPointer = nil) -> Bool {
         let key_raw = key.dataUsingEncoding(NSUTF8StringEncoding)!
-        return loads(jwt, key: key_raw, verify: verify, error: error)
+        return loads(jwt, key: key_raw, verify: verify, mandatory: mandatory, error: error)
     }
     
     // convenience method for base64 strings as key
-    public func loads(jwt: String, b64key: String, verify: Bool = true, error: NSErrorPointer = nil) -> Bool {
+    public func loads(jwt: String, b64key: String, verify: Bool = true, mandatory: [String] = [], error: NSErrorPointer = nil) -> Bool {
         let key_raw = b64key.base64SafeUrlDecode()
-        return loads(jwt, key: key_raw, verify: verify, error: error)
+        return loads(jwt, key: key_raw, verify: verify, mandatory: mandatory, error: error)
     }
 
     public func dumps(key: NSData? = nil, jti_len: UInt = 16, error: NSErrorPointer = nil) -> String? {

            self.header["alg"] = "none"         // if not present, insert 'alg'
        }
        if let alg = algorithms {
            self.algorithms = implemented(alg) // only add algoritms that are implemented()
        }
        else {

        }
    }

    public func loads(jwt: String, key: NSData? = nil, verify: Bool = true, mandatory: [String] = [], error: NSErrorPointer = nil) -> Bool {
        // load a JWT string into this object
        var sig = ""
        var hdr: [String: AnyObject]?
