diff --git a/enzevalos_iphone/ContactExtension.swift b/enzevalos_iphone/ContactExtension.swift
index 3b7654639cb59caf57c300e6e5d446cbc2a32b6f..5095a8aa5d4f5872f6438e3b31b3b47434e8f671 100644
--- a/enzevalos_iphone/ContactExtension.swift
+++ b/enzevalos_iphone/ContactExtension.swift
@@ -70,42 +70,5 @@ extension CNContact {
         return UIColor(hue: CGFloat(hash) / CGFloat(653), saturation: 1, brightness: 0.75, alpha: 1)
     }
     
-    func hasKey() -> Bool {
-        let handler = KeyHandler.getHandler()
-        for mail in self.emailAddresses {
-            if handler.addrHasKey(mail.value as! String) {
-                return true
-            }
-        }
-        return false
-    }
-    
-    //TODO check expiration date
-    //TODO add ability to choose different keys
-    func getKey() -> KeyWrapper? {
-        let handler = KeyHandler.getHandler()
-        for mail in self.emailAddresses {
-            if handler.addrHasKey(mail.value as! String) {
-                return handler.getKeyByAddr(mail.value as! String)
-            }
-        }
-        return nil
-    }
     
-    func getKey(mailaddress: String) -> KeyWrapper? {
-        let mail = mailaddress.lowercaseString
-        let handler = KeyHandler.getHandler()
-        return handler.getKeyByAddr(mail)
-    }
-    
-    //TODO fertigmachen
-    func addKey(key: PGPKey, mailaddress: String){
-        let handler = KeyHandler.getHandler()
-        //handler.addKeyForMailaddress(mailaddress, key: key)
-    }
-    
-    func addPGPKey(key: KeyWrapper, mailaddress: String){
-        let handler = KeyHandler.getHandler()
-        handler.addKeyForMailaddress(mailaddress, keyWrapper: key)
-    }
 }
diff --git a/enzevalos_iphone/EnzevalosContact.swift b/enzevalos_iphone/EnzevalosContact.swift
index 6562090d1c77b0f560f5f62587fdcc914d913a0c..8d9d4283ae122e72b1ef7857d1b8572b6abc5534 100644
--- a/enzevalos_iphone/EnzevalosContact.swift
+++ b/enzevalos_iphone/EnzevalosContact.swift
@@ -11,28 +11,65 @@ import Contacts
 
 class EnzevalosContact: Comparable {
     let contact: CNContact
-    let isSecure: Bool
+    internal var isSecure: Bool{
+        get {
+            return self.key != nil
+        }
+    }
     var mails: [Mail] {
         didSet {
             self.mails.sortInPlace()
         }
     }
+    var mail_address : String
     
     var isVerified: Bool {
-        didSet {
-            if !isSecure { // only secure mails can be verified
-                isVerified = false
+        get {
+            if self.isSecure {
+                return self.key!.verified
+            }
+            return false
+        }
+        set(v){
+            if !self.isSecure {
+                //self.isVerified = false
+                return
+            } else {
+                //in key verified setzen
+                self.key!.verified = v
             }
         }
     }
     
-    init(contact: CNContact, mails: [Mail], isSecure: Bool) {
+    var key : KeyWrapper? {
+        get {
+            return KeyHandler.getHandler().getKeyByAddr(mail_address)
+        }
+        set(k) {
+            if k == nil {
+                KeyHandler.getHandler().reset(mail_address)
+            }
+            if k!.address == mail_address {
+                KeyHandler.getHandler().addKeyForMailaddress(mail_address, keyWrapper: k!, completion: nil)
+            }
+        }
+    }
+    
+    init(contact: CNContact, mails: [Mail], mail_address: String) {
         self.contact = contact
         self.mails = mails.sort()
-        self.isSecure = isSecure
-
-        self.isVerified = false
+        self.mail_address = mail_address
+        
+        //self.isSecure = KeyHandler.getHandler().addrHasKey(mail_address)
     }
+    
+    //TODO check expiration date
+    //TODO fertigmachen
+    func addPGPKey(key: PGPKey, completion: ((success: Bool) -> Void)?){
+        let handler = KeyHandler.getHandler()
+        handler.addKeyForMailaddress(mail_address, key: key, completion: completion)
+    }
+    
 }
 
 func ==(lhs: EnzevalosContact, rhs: EnzevalosContact) -> Bool {
diff --git a/enzevalos_iphone/InitViewController.swift b/enzevalos_iphone/InitViewController.swift
index a7a66464a3ad11a10df48106e0bb24e9d6479839..49e61856bd3d52ac35dbd3b337b54bf54c10011b 100644
--- a/enzevalos_iphone/InitViewController.swift
+++ b/enzevalos_iphone/InitViewController.swift
@@ -17,6 +17,7 @@ class InitViewController : UIViewController {
     }
     
     func getDefaultSettings(){
+        //let manager2 = MCOMailProvidersManager.
         let manager = MCOMailProvidersManager.init() //sharedManager()
         print(manager)
         let path = NSBundle.mainBundle().pathForResource("providers", ofType: "json")
diff --git a/enzevalos_iphone/KeyHandler.swift b/enzevalos_iphone/KeyHandler.swift
index f8dfbbf8172b4697a8bebf73f727a91e10f45cb8..0abdbcefd9456d58689e1f5616fe187b005c8533 100644
--- a/enzevalos_iphone/KeyHandler.swift
+++ b/enzevalos_iphone/KeyHandler.swift
@@ -27,6 +27,23 @@ class KeyHandler {
         return KeyHandler.handler!
     }
     
+    static func addressInKey(address: String, key: PGPKey) -> Bool {
+        for user in key.users {
+            if user.userID != nil {
+                var mail: String = user.userID!
+                if user.userID!.containsString("<") {
+                    mail = String(mail.characters.split("<")[1])
+                }
+                mail = mail.stringByReplacingOccurrencesOfString(">", withString: "")
+                mail = mail.lowercaseString
+                if address.lowercaseString == mail {
+                    return true
+                }
+            }
+        }
+        return false
+    }
+    
     /*return the latest key added to the handler*/
     func getKeyByAddr(addr: String) -> KeyWrapper? {
         let mail = addr.lowercaseString
@@ -53,40 +70,32 @@ class KeyHandler {
      }
     */
     
-    //Only for internal use; DO NOT CALL
-    func updateKeyForAddrs(keyWrapper: KeyWrapper, addr: [String]){
-        //key.key.primaryKeyPacket.bodyData
-//        for mail in key.addresses {
-//            if let index = kchain.myObjectForKey(mail+"-index").integerValue{
-//                if index >= 1 {
-//                    kchain.mySetObject(key, forKey: mail+"-"+String(index))
-//                    kchain.writeToKeychain()
-//                }
-//            }
-//        }
-    }
     
+    //Only for internal use; DO NOT CALL
     func updateKey(keyWrapper: KeyWrapper){
-        /*if let index = kchain.myObjectForKey(keyWrapper.address+"-index").integerValue{
-            if index >= 1 {
-                if let key = kchain.myObjectForKey(keyWrapper.address+"-"+String(index)) {
-                    if (key as! KeyWrapper).key.primaryKeyPacket.bodyData == keyWrapper.key.primaryKeyPacket.bodyData {
-                        kchain.mySetObject(keyWrapper, forKey: keyWrapper.address)
-                        kchain.writeToKeychain()
-                    }
-                }
+        
+        var index : Int16 = 0
+        
+        if (try? keychain.getData(keyWrapper.address+"-index")) != nil {
+            if let indexData = (try? keychain.getData(keyWrapper.address+"-index"))!{
+                indexData.getBytes(&index, length: sizeof(Int16))
             }
-        }*/
+        }
+        if index == 0 {
+            return
+        }
+        
+        keychain[data: keyWrapper.address+"-"+String(index)] = NSKeyedArchiver.archivedDataWithRootObject(keyWrapper)
     }
     
     /*only the PGPKey will be used to compare*/
-    func getAddrsByKey(key : KeyWrapper) -> [String] {
+    /*func getAddrsByKey(key : KeyWrapper) -> [String] {
         /*let addrs = kchain.myObjectForKey(key.key.primaryKeyPacket.bodyData!) as? [String]
         if addrs != nil {
             return addrs!
         }*/
         return []
-    }
+    }*/
     
     /*for now only the last key added to the handler will be shown*/
     func getKeysByAddr(addr: String) -> [KeyWrapper] {
@@ -106,7 +115,7 @@ class KeyHandler {
     
     
     //TODO add entry with PGPKey as searchKey -done
-    func addKey(key: PGPKey) {
+    func addKey(key: PGPKey, completion : ((success: Bool) -> Void)?) {
         var users : [String]? = []
         for user in key.users {
             if user.userID != nil {
@@ -118,6 +127,15 @@ class KeyHandler {
                 mail = mail.lowercaseString
                 users!.append(mail)
         
+                let kW = KeyWrapper(key: key, mailaddress: mail)
+                if kW == nil{
+                    if completion != nil {
+                        completion!(success: false)
+                    }
+                    return
+                }
+                
+                let keyWrapper = kW!
                 var index : Int16 = 0
                 
                 if (try? keychain.getData(mail+"-index")) != nil {
@@ -125,25 +143,31 @@ class KeyHandler {
                         indexData.getBytes(&index, length: sizeof(Int16))
                     }
                 }
-                /*if kchain.myObjectForKey(mail+"-index") != nil && kchain.myObjectForKey(mail+"-index").integerValue >= 1{
-                    index = kchain.myObjectForKey(mail+"-index").integerValue
-                }*/
                 index += 1
                 keychain[data: mail+"-index"] = NSData(bytes: &index, length: sizeof(Int16))//NSKeyedArchiver.archivedDataWithRootObject(index)
-                keychain[data: mail+"-"+String(index)] = NSKeyedArchiver.archivedDataWithRootObject(KeyWrapper(key: key, mailaddress: mail))
-                //kchain.mySetObject(index, forKey: mail+"-index")
-                //kchain.mySetObject(KeyWrapper(key: key, mailaddress: mail), forKey: mail+"-"+String(index))
-                //kchain.writeToKeychain()
+                keychain[data: mail+"-"+String(index)] = NSKeyedArchiver.archivedDataWithRootObject(keyWrapper)
             }
         }
         keychain[data: String(key.primaryKeyPacket.bodyData)] = NSKeyedArchiver.archivedDataWithRootObject(users!)
+        if completion != nil {
+            completion!(success: true)
+        }
         //kchain.mySetObject(users, forKey: key.primaryKeyPacket.bodyData!)
         //kchain.writeToKeychain()
     }
     
-    func addPrivateKey(key: PGPKey) {
+    func addPrivateKey(key: PGPKey, completion : ((success: Bool) -> Void)?) {
         let mail = (UserManager.loadUserValue(Attribute.UserAddr) as! String).lowercaseString
         
+        let kW = KeyWrapper(key: key, mailaddress: mail)
+        if kW == nil {
+            if completion != nil {
+                completion!(success: false)
+            }
+            return
+        }
+        let keyWrapper = kW!
+        
         var index : Int16 = 0
         
         if (try? keychain.getData(mail+"-private-index")) != nil {
@@ -158,7 +182,11 @@ class KeyHandler {
         
         index += 1
         keychain[data: mail+"-private-index"] = NSData(bytes: &index, length: sizeof(Int16))
-        keychain[data: mail+"-private-"+String(index)] = NSKeyedArchiver.archivedDataWithRootObject(KeyWrapper(key: key, mailaddress: mail))
+        keychain[data: mail+"-private-"+String(index)] = NSKeyedArchiver.archivedDataWithRootObject(keyWrapper)
+        
+        if completion != nil {
+            completion!(success: true)
+        }
     }
     
     func getPrivateKey() -> KeyWrapper? {
@@ -214,26 +242,59 @@ class KeyHandler {
         }
     }
     
-    //TODO convert to use of keychain instead of kchain
-    func addKeyForMailaddress(address: String, keyWrapper: KeyWrapper) {
-        /*let mail = address.lowercaseString
-        var index = 0
-        if kchain.myObjectForKey(mail+"-index") != nil && kchain.myObjectForKey(mail+"-index").integerValue >= 1{
-            index = kchain.myObjectForKey(mail+"-index").integerValue
+    
+    func addKeyForMailaddress(address: String, key: PGPKey, completion : ((success: Bool) -> Void)?){ 
+        let mail: String = address.lowercaseString
+        
+        //prüfen, ob adresse in Key steht
+        let kW = KeyWrapper(key: key, mailaddress: mail)
+        
+        if kW == nil {
+            if completion != nil {
+                completion!(success: false)
+            }
+            return
+        }
+        let keyWrapper = kW!
+        
+        var index : Int16 = 0
+                
+        if (try? keychain.getData(mail+"-index")) != nil {
+            if let indexData = (try? keychain.getData(mail+"-index"))!{
+                indexData.getBytes(&index, length: sizeof(Int16))
+            }
         }
+        
         index += 1
+        keychain[data: mail+"-index"] = NSData(bytes: &index, length: sizeof(Int16))
+        keychain[data: mail+"-"+String(index)] = NSKeyedArchiver.archivedDataWithRootObject(keyWrapper)
+        //keychain[data: String(key.primaryKeyPacket.bodyData)] = NSKeyedArchiver.archivedDataWithRootObject([mail])
+    }
+    
+    func addKeyForMailaddress(address: String, keyWrapper: KeyWrapper, completion : ((success: Bool) -> Void)?){
+        let mail: String = address.lowercaseString
         
-        var addrsByKey : [String]? = []
-        addrsByKey = kchain.myObjectForKey(keyWrapper.key.primaryKeyPacket.bodyData!) as? [String]
-        if addrsByKey == nil {
-            addrsByKey = Optional([mail])
+        //prüfen, ob adresse in Key steht
+        
+        if keyWrapper.address == mail {
+            if completion != nil {
+                completion!(success: false)
+            }
+            return
         }
         
+        var index : Int16 = 0
         
-        kchain.mySetObject(index, forKey: mail+"-index")
-        kchain.mySetObject(keyWrapper, forKey: mail+"-"+String(index))
-        kchain.mySetObject(addrsByKey, forKey: keyWrapper.key.primaryKeyPacket.bodyData!)
-        kchain.writeToKeychain()*/
+        if (try? keychain.getData(mail+"-index")) != nil {
+            if let indexData = (try? keychain.getData(mail+"-index"))!{
+                indexData.getBytes(&index, length: sizeof(Int16))
+            }
+        }
+        
+        index += 1
+        keychain[data: mail+"-index"] = NSData(bytes: &index, length: sizeof(Int16))
+        keychain[data: mail+"-"+String(index)] = NSKeyedArchiver.archivedDataWithRootObject(keyWrapper)
+        //keychain[data: String(key.primaryKeyPacket.bodyData)] = NSKeyedArchiver.archivedDataWithRootObject([mail])
     }
     
     func addrHasKey(address: String) -> Bool {
diff --git a/enzevalos_iphone/KeyWrapper.swift b/enzevalos_iphone/KeyWrapper.swift
index 531fed54d298f2d883e2977e999acd18b1b15217..35fb314a1c50a7f3d7fa14dce07b00e8f231d43b 100644
--- a/enzevalos_iphone/KeyWrapper.swift
+++ b/enzevalos_iphone/KeyWrapper.swift
@@ -47,32 +47,19 @@ class KeyWrapper : NSObject {
             handler.updateKey(self)
         }
     }
-    let address: String /*[String]{
-        set (newAddrs) {
-            let handler = KeyHandler.createHandler()
-            //oldKey = self.copy()
-            
-            /*for addr in newAddrs {
-                if handler.getKeyByMailaddress(addr) != nil &&  {
-                    
-                }
-            }*/
-            //let handler = KeyHandler.createHandler()
-            handler.updateKey(self)
-        }
-        get {
-            return self.addresses
-        }
-    }*/
+    let address: String
     let timestamp: NSDate
     
-    init(key: PGPKey, mailaddress: String){
+    init?(key: PGPKey, mailaddress: String){
+        if !KeyHandler.addressInKey(mailaddress, key: key) {
+            return nil
+        }
         self.key = key
         //self.oldKey = nil
         revoked = false
         trustlevel = 0
         verified = false
-        self.address = mailaddress
+        self.address = mailaddress.lowercaseString
         self.timestamp = NSDate.init()
         
         /*let handler = KeyHandler.createHandler()
diff --git a/enzevalos_iphone/MailHandler.swift b/enzevalos_iphone/MailHandler.swift
index dc19aec9e14041faaca8dd252c7f332db896b05b..10f799f82fa600b960971530a551882785d89285 100644
--- a/enzevalos_iphone/MailHandler.swift
+++ b/enzevalos_iphone/MailHandler.swift
@@ -315,23 +315,6 @@ class MailHandler {
                             }
                         }
                         /*Jakob prototypeänderung anfang*/
-                        /*ursprünglicher Code :
-                         
-                        let mail = Mail(uid: message.uid, sender: header.from, receivers: rec, cc: cc, time: header.date, received: true, subject: header.subject, body: body, isEncrypted: false, isVerified: false, trouble: false, isUnread: !messageRead, flags: message.flags)
-
-                         */
-                        
-                        /*CryptoHandler.getHandler().pgp.keys.append((KeyHandler.createHandler().getPrivateKey()?.key)!)
-                        
-                        let content = try? CryptoHandler.getHandler().pgp.decryptData(body.dataUsingEncoding(NSUTF8StringEncoding)!, passphrase: nil)
-                        print(content)
-                        
-                        var signed : ObjCBool = false
-                        var valid : ObjCBool = false
-                        var integrityProtected : ObjCBool = false
-                        
-                        print(try? CryptoHandler.getHandler().pgp.decryptData(body.dataUsingEncoding(NSUTF8StringEncoding)!, passphrase: nil, verifyWithPublicKey: KeyHandler.createHandler().getKeyByAddr(header.from.mailbox)?.key, signed: &signed, valid: &valid, integrityProtected: &integrityProtected))*/
-                        
                         
                         var enc = false
                         let ver = false
@@ -344,56 +327,9 @@ class MailHandler {
                             enc = true
                         }
                         
-                        /*if enc {
-                            if !CryptoHandler.getHandler().pgp.keys.contains((KeyHandler.createHandler().getPrivateKey()?.key)!) {
-                                CryptoHandler.getHandler().pgp.keys.append((KeyHandler.createHandler().getPrivateKey()?.key)!)
-                            }
-                            do {
-                                var signed : ObjCBool = false
-                                var valid : ObjCBool = false
-                                var integrityProtected : ObjCBool = false
-                                
-                                //verifyWithPublicKey: KeyHandler.createHandler().getKeyByAddr(header.from.mailbox)?.key
-                                if (try? CryptoHandler.getHandler().pgp.decryptData(body.dataUsingEncoding(NSUTF8StringEncoding)!, passphrase: nil, verifyWithPublicKey: nil, signed: &signed, valid: &valid, integrityProtected: &integrityProtected) as NSData?) != nil && ((try? CryptoHandler.getHandler().pgp.decryptData(body.dataUsingEncoding(NSUTF8StringEncoding)!, passphrase: nil, verifyWithPublicKey: nil, signed: &signed, valid: &valid, integrityProtected: &integrityProtected))! as NSData?) != nil{
-                                    
-                                    decBody = String(data: (try? CryptoHandler.getHandler().pgp.decryptData(body.dataUsingEncoding(NSUTF8StringEncoding)!, passphrase: nil, verifyWithPublicKey: nil, signed: &signed, valid: &valid, integrityProtected: &integrityProtected))! as NSData, encoding: NSUTF8StringEncoding)
-                                    //print(String(data: (try? CryptoHandler.getHandler().pgp.decryptData(body.dataUsingEncoding(NSUTF8StringEncoding)!, passphrase: nil, verifyWithPublicKey: nil, signed: &signed, valid: &valid, integrityProtected: &integrityProtected), encoding: NSUTF8StringEncoding)))
-                                }
-                                //print(try? CryptoHandler.getHandler().pgp.decryptData(body.dataUsingEncoding(NSUTF8StringEncoding)!, passphrase: nil, verifyWithPublicKey: nil, signed: &signed, valid: &valid, integrityProtected: &integrityProtected))
-                                //let content = try? CryptoHandler.getHandler().pgp.decryptData(body.dataUsingEncoding(NSUTF8StringEncoding)!, passphrase: nil)
-                                //print(content)
-                            } catch _ {
-                                
-                                troub = true
-                                print("error while decrypting")
-                            }
-                        }*/ //now done in the MailObject itself
-                            
-                        /*if header.subject != nil {
-                            if header.subject == "Schlüssel" {
-                                enc = true
-                            }
-                            if header.subject == "Re: Prüfung"{
-                                enc = true
-                                troub = true
-                            }
-                            if header.subject == "Test4" {
-                                ver = true
-                                enc = true
-                            }
-                            if header.subject == "Multiple"{
-                                enc = true
-                            }
-                            if header.subject == "Noch ein Test"{
-                                enc = true
-                                ver = true
-                            }
-                            if header.subject == "jetzt du"{
-                                enc = true
-                            }
-                        }*/
                         let mail = Mail(uid: message.uid, sender: header.from, receivers: rec, cc: cc, time: header.date, received: true, subject: header.subject, body: body, decryptedBody: decBody, isEncrypted: enc, isVerified: ver, trouble: troub, isUnread: !messageRead, flags: message.flags)
                         mail.decryptIfPossible()
+                        
                         /*Jakob prototypeänderung Ende*/
                         self.delegate?.addNewMail(mail)
                         
diff --git a/enzevalos_iphone/MailObject.swift b/enzevalos_iphone/MailObject.swift
index 49510a0c989a0400abd44d051a1282cb12853e60..63b12d36ceedd8f1d6a8fba7f363368ba70768d9 100644
--- a/enzevalos_iphone/MailObject.swift
+++ b/enzevalos_iphone/MailObject.swift
@@ -39,7 +39,7 @@ class Mail: Comparable {
     
     var isSecure: Bool {
         get {
-            return isVerified && isEncrypted && !trouble
+            return isVerified && isEncrypted && !unableToDecrypt && !trouble
         }
     }